diff options
Diffstat (limited to 'localwebsite/handlers/ModemHandler.php')
-rw-r--r-- | localwebsite/handlers/ModemHandler.php | 128 |
1 files changed, 112 insertions, 16 deletions
diff --git a/localwebsite/handlers/ModemHandler.php b/localwebsite/handlers/ModemHandler.php index 88fe463..a874a94 100644 --- a/localwebsite/handlers/ModemHandler.php +++ b/localwebsite/handlers/ModemHandler.php @@ -1,5 +1,9 @@ <?php +use libphonenumber\NumberParseException; +use libphonenumber\PhoneNumberFormat; +use libphonenumber\PhoneNumberUtil; + class ModemHandler extends RequestHandler { @@ -34,11 +38,39 @@ class ModemHandler extends RequestHandler ajax_ok([ 'html' => $this->tpl->render('modem_data.twig', [ 'loading' => false, + 'modem' => $id, 'modem_data' => $modem_data ]) ]); } + public function GET_verbose_page() { + global $config; + + list($modem) = $this->input('modem'); + if (!$modem) + $modem = array_key_first($config['modems']); + + list($signal, $status, $traffic, $device, $dialup_conn) = self::getModemData( + $config['modems'][$modem]['ip'], + $config['modems'][$modem]['legacy_token_auth'], + true); + + $data = [ + ['Signal', $signal], + ['Connection', $status], + ['Traffic', $traffic], + ['Device info', $device], + ['Dialup connection', $dialup_conn] + ]; + $this->tpl->set([ + 'data' => $data, + 'modem_name' => $config['modems'][$modem]['label'], + ]); + $this->tpl->set_title('Подробная информация о модеме '.$modem); + $this->tpl->render_page('modem_verbose_page.twig'); + } + public function GET_routing_smallhome_page() { global $config; @@ -122,41 +154,105 @@ class ModemHandler extends RequestHandler $this->tpl->render_page('routing_dhcp_page.twig'); } - public function GET_sms_page() { + public function GET_sms() { global $config; - list($selected) = $this->input('modem'); + list($selected, $is_outbox, $error, $sent) = $this->input('modem, b:outbox, error, b:sent'); if (!$selected) $selected = array_key_first($config['modems']); $cfg = $config['modems'][$selected]; $e3372 = new E3372($cfg['ip'], $cfg['legacy_token_auth']); - $messages = $e3372->getSMSList(); + $messages = $e3372->getSMSList(1, 20, $is_outbox); $this->tpl->set([ 'modems_list' => array_keys($config['modems']), 'modems' => $config['modems'], 'selected_modem' => $selected, - 'messages' => $messages - ]); - $this->tpl->set_title('Модемы: SMS-сообщения'); + 'messages' => $messages, + 'is_outbox' => $is_outbox, + 'error' => $error, + 'is_sent' => $sent + ]); + + $direction = $is_outbox ? 'исходящие' : 'входящие'; + $this->tpl->set_title('SMS-сообщения ('.$direction.', '.$selected.')'); $this->tpl->render_page('sms_page.twig'); } - protected static function getModemData(string $ip, bool $need_auth = true): array { + public function POST_sms() { + global $config; + + list($selected, $is_outbox, $phone, $text) = $this->input('modem, b:outbox, phone, text'); + if (!$selected) + $selected = array_key_first($config['modems']); + + $return_url = '/sms/?modem='.$selected; + if ($is_outbox) + $return_url .= '&outbox=1'; + + $go_back = function(?string $error = null) use ($return_url) { + if (!is_null($error)) + $return_url .= '&error='.urlencode($error); + else + $return_url .= '&sent=1'; + redirect($return_url); + }; + + $phone = preg_replace('/\s+/', '', $phone); + $country = null; + if (!startsWith($phone, '+')) + $country = 'RU'; + + $phoneUtil = PhoneNumberUtil::getInstance(); + try { + $number = $phoneUtil->parse($phone, $country); + } catch (NumberParseException $e) { + debugError(__METHOD__.': failed to parse number '.$phone.': '.$e->getMessage()); + $go_back('Неверный номер ('.$e->getMessage().')'); + return; + } + + if (!$phoneUtil->isValidNumber($number)) { + $go_back('Неверный номер'); + return; + } + + $phone = $phoneUtil->format($number, PhoneNumberFormat::E164); + + $cfg = $config['modems'][$selected]; + $e3372 = new E3372($cfg['ip'], $cfg['legacy_token_auth']); + + $result = $e3372->sendSMS($phone, $text); + debugLog($result); + + $go_back(); + } + + protected static function getModemData(string $ip, + bool $need_auth = true, + bool $get_raw_data = false): array { $modem = new E3372($ip, $need_auth); + $signal = $modem->getDeviceSignal(); $status = $modem->getMonitoringStatus(); $traffic = $modem->getTrafficStats(); - return [ - 'type' => e3372::getNetworkTypeLabel($status['CurrentNetworkType']), - 'level' => $status['SignalIcon'] ?? 0, - 'rssi' => $signal['rssi'], - 'sinr' => $signal['sinr'], - 'connected_time' => secondsToTime($traffic['CurrentConnectTime']), - 'downloaded' => bytesToUnitsLabel(gmp_init($traffic['CurrentDownload'])), - 'uploaded' => bytesToUnitsLabel(gmp_init($traffic['CurrentUpload'])), - ]; + + if ($get_raw_data) { + $device_info = $modem->getDeviceInformation(); + $dialup_conn = $modem->getDialupConnection(); + return [$signal, $status, $traffic, $device_info, $dialup_conn]; + } else { + return [ + 'type' => e3372::getNetworkTypeLabel($status['CurrentNetworkType']), + 'level' => $status['SignalIcon'] ?? 0, + 'rssi' => $signal['rssi'], + 'sinr' => $signal['sinr'], + 'connected_time' => secondsToTime($traffic['CurrentConnectTime']), + 'downloaded' => bytesToUnitsLabel(gmp_init($traffic['CurrentDownload'])), + 'uploaded' => bytesToUnitsLabel(gmp_init($traffic['CurrentUpload'])), + ]; + } } protected static function getCurrentSmallHomeUpstream() { |