winlinkFunkruf.php
<?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; */ ?>