Portál AbcLinuxu, 9. května 2025 15:36
Zdravím všechny čtenáře. S linuxem sem tam pracuji už několik let. Většinou se jedná o věci spojené s PHP a v současnosti hlavně SAMBA, jelikož mám na starost síť s několika desítkami win stanic. Před nějakou dobou firma kde pracuji pořídila telefonní ústřednu panasonic tde-200, která umožňuje připojení přes telnet a načítání dat o hovorech. Se starou ústřednou byl zakoupen program tardat, který jsem k tomuto účelu zkoušel použít i s novou ústřednou, nicméně mi moc nevyhovoval už jenom proto, že musel být spuštěn sw na windowsech a ještě to chtělo HW klíč do LPT portu. Tak jsem začal vymýšlet nějaké linuxové řešení. Nikdy jsem ovšem neřešil skripty v BASHi, tak bych se rád podělil o funkční řešení a současně bych rád čtenáře požádal o radu, jestli to lze udělat lépe, nebo jinak.
V současné době to mám nastaveno tak, že existují dva skripty. Jeden v BASHi, který spustí na pozadí nc. Ten se stará o načítání dat z ústředny a jejich ukládání do souboru. Soubor se vytváří jiný pro každý měsíc. V tomto skriptu pak běží smyčka, která každých 5 sekund spustí PHP skript, který data ze souboru načte a ukládá do databáze MySQL. Tento PHP skript si vždy po skončení uloží do souboru s příponou last číslo posledního načteného řádku, aby při dalším spuštění pokračoval až od dalšího. Smyčka testuje, jestli už neskončil den a když už je jiný den, tak se skript ukončí. Cron pak skript zase spustí v jednu hodinu ráno.
Bash skript pbxtodb.sh:
#!/bin/bash echo -e -n "smdr\r\nPCCSMDR\r\n" | nc -t 192.168.2.15 2300 >> /var/www/tardat/pbxdata_`date '+%Y%m'`.txt & PID=$! MIN=`date '+%d'` TEST=`date '+%d'` while [ $MIN -eq $TEST ]; do MIN=`date '+%d'` /usr/bin/php5 /var/www/tardat/pbxtodb.php >> /var/www/tardat/pbxtodb.php.log sleep 5 done kill $PID
PHP skript pbxtodb.php pro uložení dat do DB:
<?php $filename = "/var/www/tardat/pbxdata_".date("Ym").".txt"; $lastfile = "/var/www/tardat/pbxdata_".date("Ym").".last"; $dbprefix = ""; $link = connect_db(); sql_query("SET NAMES 'utf8'",$link); sql_query("SET CHARACTER SET utf8",$link); sql_query("SET COLLATION_CONNECTION='utf8_bin'",$link); function sql_query($query,$link) { if (!$result = mysql_query($query, $link)) { echo mysql_errno() . ": " . mysql_error(). "\r\n"; $result = 0; die("db query error...\r\n".$query); } return $result; } function connect_db() { $DB_HOST="localhost"; $DB_USER="pbx"; $DB_PASS="pbx"; $DB_NAME="pbx"; // Connect to DB if (!$link = mysql_connect($DB_HOST, $DB_USER, $DB_PASS)) { echo mysql_errno() . ": " . mysql_error(). "\r\n"; $result = 0; die("db connect error"); } else { // Select DB if (!mysql_select_db($DB_NAME, $link)) { echo mysql_errno() . ": " . mysql_error(). "\r\n"; $result = 0; die("db select error"); } else { return $link; } } } function disconnect_db($link) { @mysql_close($link); } function pocetsekund($mystr) { $sekund = 0; $sekund += substr($mystr,0,2) * 60 * 60; $sekund += substr($mystr,3,2) * 60; $sekund += substr($mystr,6,2) * 1; return $sekund; } function pocetsekund2($mystr) { $sekund = 0; $sekund += substr($mystr,0,1) * 60; $sekund += substr($mystr,2,2) * 1; return $sekund; } $waslast = ""; if (file_exists($lastfile)) { $fp = @fopen($lastfile, "r"); $waslast = fread($fp, 4096); fclose($fp ); } //echo "PZ>$waslast\r\n"; $handle = @fopen($filename, "r"); //$query = sql_query("DELETE FROM tardat",$link); $lastrecord = ""; if(empty($waslast)) $write=true; if ($handle) { $count = 0; $lines = 0; while (!feof($handle)) { $lines++; $buffer = fgets($handle, 4096); if(substr($buffer,2,1)=="/" AND $waslast<$lines) { $lastrecord = $lines; // echo "$count: $buffer"; $echo = false; $pos1 = 0; $pos2 = 0; $pos3 = 0; $pos4 = 0; $findme = '<D>'; $pos1 = strpos($buffer, $findme); $findme = '<I>'; $pos2 = strpos($buffer, $findme); $findme = ' '; $pos3 = strpos($buffer, $findme, $pos2); $pos4 = strpos($buffer, $findme, 28); $linka = substr($buffer,23,4); $smer = 0; $kam = ""; if($pos2>0) { $smer = 1; if($pos1>0) { $kam = substr($buffer,$pos1+3,$pos2-$pos1-3); } if($linka == "0021") { $kam = "123456789"; //cislo GSM brany } $kdo = substr($buffer,$pos2+3,$pos3-$pos2-3); } else { $kam = substr($buffer,28,$pos4-28); $kdo = ""; } $predvolba = "420"; if(substr($kam,0,2)=="00") { $predvolba = ""; switch($kam[2]) { case "3": switch($kam[3]) { case "0": case "3": case "6": $predvolba = $kam[2].$kam[3]; break; case "5": case "7": case "8": $predvolba = $kam[2].$kam[3].$kam[4]; break; } break; case "4": switch($kam[3]) { case "2": $predvolba = $kam[2].$kam[3].$kam[4]; break; case "3": case "4": case "6": case "7": case "8": case "9": $predvolba = $kam[2].$kam[3]; break; } break; } $kam = substr($kam,strlen($predvolba)+2,99); } if(substr($kam,0,3)=="EXT") { $kam = substr($kam,3,9); $predvolba = "0"; } $datum = substr($buffer,0,8); $datum_pole = explode("/",$datum); $datum = "".$datum_pole[2]."/".$datum_pole[1]."/".$datum_pole[0]; $cas = substr($buffer,9,7); $klapka = substr($buffer,19,3); $zvoneni = pocetsekund2(substr($buffer,80,4));; $trvani = pocetsekund(substr($buffer,84,8)); $cd = ""; $cd = substr($buffer,116,2); $count++; $query = sql_query("INSERT INTO tardat (datum,cas,klapka,predvolba,kam,kdo,trvani,zvoneni,smer,linka,cd,vlozeno) VALUES ('$datum', '$cas', '$klapka', '$predvolba', '$kam', '$kdo', '$trvani', '$zvoneni', '$smer', '$linka', '$cd','".date("Y-m-d H:i:s")."')",$link); } } // echo "LR>$lastrecord\r\n"; // echo "Lines read: $lines\r\n"; if($count>0) { $fp = @fopen($lastfile, "w"); fwrite($fp , $lastrecord ); fclose($fp ); // echo "Do DB bylo ulozeno $count zaznamu\r\n"; flush(); $query = sql_query("INSERT INTO tardat_log (vlozeno,text) VALUES ('".date("Y-m-d H:i:s")."','skript probehl - Do DB bylo ulozeno $count zaznamu - Lines read: $lines')",$link); } fclose($handle); } return 1; ?>
Tiskni
Sdílej:
Ještě by možná někdo uvítal i seznam předvoleb, který používám v aplikaci pro zobrazování dat.
Pokud by se nekomu hodila i ta webova aplikace, ktera data zobrazuje, tak mu ji poskytnu, ale vzhledem k jejimu stavu bych to moc nezverejnoval :)
Máš tu nějaký křivý komentáře...
Sakra, už ne...
A tak jo, je to jenom když se zobrazí blogpost, v samotné diskuzi ne. Asi chybí </i> v blogpostu...
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.