|
|
|
@ -2,21 +2,70 @@
|
|
|
|
|
namespace SmsGateway\Sender; |
|
|
|
|
|
|
|
|
|
use SmsGateway\SenderInterface; |
|
|
|
|
use SmsGateway\LoggerInterface; |
|
|
|
|
|
|
|
|
|
class GnokiiSender implements SenderInterface |
|
|
|
|
{ |
|
|
|
|
/** |
|
|
|
|
* |
|
|
|
|
* @var SmsGateway\LoggerInterface $logger |
|
|
|
|
*/ |
|
|
|
|
private $logger; |
|
|
|
|
|
|
|
|
|
private $gnokiiPath; |
|
|
|
|
|
|
|
|
|
public function __construct($gnokiiPath) |
|
|
|
|
{ |
|
|
|
|
$this->gnokiiPath = $gnokiiPath; |
|
|
|
|
|
|
|
|
|
if (!is_executable($this->gnokiiPath)) { |
|
|
|
|
throw new \Exception('Specified Gnokii executable is not executable by me!'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$this->gnokiiPath = $gnokiiPath; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function send($recipient, $message) |
|
|
|
|
public function send($username, $recipient, $message, array $passwordLocations) |
|
|
|
|
{ |
|
|
|
|
if ($this->logger === null) { |
|
|
|
|
throw new \LogicException('Logger is not defined!'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$descriptors = array( |
|
|
|
|
0 => array('pipe', 'r'), |
|
|
|
|
1 => array('pipe', 'w'), |
|
|
|
|
2 => array('pipe', 'w'), |
|
|
|
|
); |
|
|
|
|
$cmd = escapeshellcmd($this->gnokiiPath . ' --sendsms ' . escapeshellarg($recipient)); |
|
|
|
|
$pipes = array(); |
|
|
|
|
$process = proc_open($cmd, $descriptors, $pipes, null, array('LANG' => 'en_US.UTF-8')); |
|
|
|
|
if (is_resource($process)) { |
|
|
|
|
fwrite($pipes[0], $message); |
|
|
|
|
fclose($pipes[0]); |
|
|
|
|
|
|
|
|
|
$stdout = stream_get_contents($pipes[1]); |
|
|
|
|
$stderr = stream_get_contents($pipes[2]); |
|
|
|
|
$returnValue = proc_close($process); |
|
|
|
|
|
|
|
|
|
if ($returnValue != 0) { |
|
|
|
|
throw new \RuntimeException('Unable to send SMS: ' . $stderr . '; ' . $stdout); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$this->logger->messageLog($username, $recipient, $message, $passwordLocations); |
|
|
|
|
} else { |
|
|
|
|
throw new \RuntimeException('Unable to start Gnokii.'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function setLogger(LoggerInterface $logger) { |
|
|
|
|
if ($logger === null) { |
|
|
|
|
throw new \RuntimeException('A logger interface must be specified!'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$this->logger = $logger; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function getLogger() { |
|
|
|
|
return $this->logger; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|