<?php /****************************************************************************** * Funkrufbenachrichtigung bei eingehenden WinLink-Mails in PAT ins DAPNET * * Jürgen, DL8MA - www.DL8MA.de * * 20.12.2017 JM * * Dieses Script muss zyklisch z.B. über einen Cronjob aufgerufen werden. */ $dbZugangsdaten = array( "host" => "localhost", "port" => 3306, "user" => "......", // hier MySQL-Username und Passwort eintragen "pass" => "......", "name" => "winlinkFunkruf", ); $zielCall = "DL8MA"; // im DAPNET registrierter Pager $patServer = "192.168.178.60:8088"; // Adresse der aktiven PAT-Installation $dapnetLogin = "....:...."; // Loginname und Passwort im DAPNET z.B. "DL8MA:meinpasswort" $transmitterGroupNames = "dl-all"; // Sendebereich (bitte lokal anpassen) $dapnetServer = "http://www.hampager.de"; // DAPNET-Server $db = new mysqlMapper( $dbZugangsdaten ); $ch = curl_init(); // PAT-Mailbox auslesen curl_setopt($ch, CURLOPT_URL, $patServer . "/api/mailbox/in"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); $mailIn = json_decode( $output ); $neuZaehler = 0; for( $i = 0; $i < count( $mailIn ); $i++ ) { $query = "select mid from mails where active = 1 and mid = '" . $mailIn[$i]->MID . "'"; $sql = $db->query($query); $neu = 0; if ( $sql->rowCount() == 0 ) { $cols = array( "mid" => $mailIn[$i]->MID, "date" => $mailIn[$i]->Date, "subject" => $mailIn[$i]->Subject, "fromAddr" => $mailIn[$i]->From->Addr, "active" => 1 ); $db->insertDBRow("mails", "id", $cols); // Mail speichern, sonst Doppelaussendungen $neuZaehler++; $neu = 1; } if( $neu ) { $von = trim( $mailIn[$i]->From->Addr ); // Funkruf absetzen $text = str_replace( "//WL2K", "", $mailIn[$i]->Subject ); $funkrufText = $von . " : " . $text; $funkrufText = substr( $funkrufText, 0, 80 ); $text = $funkrufText; $curlString = "curl -H \"Content-Type: application/json\" -X POST -u " . $dapnetLogin . " -d '{ \"text\": \"" . $text . "\", \"callSignNames\": [\"" . $zielCall . "\"], \"transmitterGroupNames\": [\"" . $transmitterGroupNames . "\"], \"emergency\": false }' " . $dapnetServer . ":8080/calls"; echo "<hr>"; echo shell_exec( $curlString ); echo "<hr>"; } } echo $neuZaehler . " Mails";
/** * Wrapper-Klasse für MySQL * * @date 02.12.2017 * @author Jürgen Mayer, DL8MA */ class mysqlMapper { private $pdo; public function __construct( $dbZugangsdaten ) { try { $this->pdo = new PDO("mysql:host=" . $dbZugangsdaten[ "host" ] . ";dbname=" . $dbZugangsdaten[ "name" ] . ";charset=utf8", $dbZugangsdaten[ "user" ], $dbZugangsdaten[ "pass" ], array(PDO::ATTR_PERSISTENT => true) ); } catch(PDOException $e) { echo $e->getMessage(); } } public function query( $query ) { $sql = $this->pdo->prepare( $query ); if( $sql->execute() ) { return( $sql ); } else { echo "Datenbankfehler :-(<br />"; } } /** * Datensatz neu anlegen * * @date 14.04.2004 * @author jmayer * * 02.12.2017 JM in MySQL-Wrapper-Klasse übernommen * * @param $tabname Tabellenname * @param $idname Feldname des ID-Felds * @param $cols Array mit Auflistung der Felder und Werte die geändert werden */ public function insertDBRow($tabname, $idname, $cols ) { $query = "insert into " . $tabname . " ("; $flag = 0; foreach ($cols as $k => $v) { if( $flag ) $query = $query . ", "; $query = $query . $k; $flag = 1; } $query = $query . " ) values ( "; $flag = 0; foreach ($cols as $k => $v) { if( $flag ) $query = $query . ", "; if (is_string ($v)) $v = $this->toDBString($v); if ($v == null || !isset($v)) $v = "''"; $query = $query . $v; $flag = 1; } $query = $query . " )"; $sql = $this->pdo->prepare( $query ); if( !$sql->execute()) { echo "Datenbankfehler :-(<br />"; } return( $this->pdo->lastInsertId() ); } /** * Datensatz updaten * * @date 14.04.2004 * @author jmayer * * 02.12.2017 JM in MySQL-Wrapper-Klasse übernommen * * @param $tabname Tabellenname * @param $idname Feldname des ID-Felds * @param $idval ID des zu �ndernden Datensatzes * @param $cols Array mit Auflistung der Felder und Werte die ge�ndert werden */ function updateDBRow ($tabname, $idname, $idval, $cols ) { $query = "update " . $tabname . " set "; $flag = 0; foreach ($cols as $k => $v) { if( $flag ) $query = $query . ", "; if( is_string( $v )) $v = $this->toDBString($v); if ($v == null || !isset($v)) $v = "''"; $query = $query . $k . "=" . $v; $flag = 1; } $query = $query . " where " . $idname . "=" . $idval; $sql = $this->pdo->prepare( $query ); if( !$sql->execute()) { echo "Datenbankfehler :-(<br />"; } } /** * wandelt eine Zeichenkette in einen Datenbankzeichenkette um. * Die Zeichenkette wird dabei gequotet. * Ist die Zeichenkette gleich 'null' oder null, dann wird nicht gequotet. * @param $str Zeichenkette * @return gequotete Zeichenkette */ function toDBString ($str) { if ($str == null || !isset($str) || $str == 'null') return "null"; return "'" . $this->quoteDBString($str) . "'"; } /** * bereitet den übergebenen String für das Eintragen in die Datenbank mittels SQL-Anweisung vor. * Dabei werden Hochkommas in der Zeichenkette entsprechend gequotet bzw. mit Escape-Zeichen versehen. * * @param $str Zeichenkette, die gequotet bzw. escaped werden soll. * @return Die übergebene und für eine SQL-Anweisung konvertierte Zeichenkette */ function quoteDBString ($str) { return preg_replace ("/'/m", "''", $str); } } /********************************************************************* -- Datenbank: `winlinkFunkruf` CREATE TABLE IF NOT EXISTS `mails` ( `id` int(11) NOT NULL, `mid` varchar(16) DEFAULT NULL, `date` varchar(20) NOT NULL, `subject` varchar(200) NOT NULL, `fromAddr` varchar(120) NOT NULL, `active` tinyint(4) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; ALTER TABLE `mails` ADD PRIMARY KEY (`id`); ALTER TABLE `mails` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1; */ ?>