Jump to content

Googleboom

Forum Members
  • Posts

    1
  • Joined

  • Last visited

Equipment

  • Keenetic
    Viva

Googleboom's Achievements

Newbie

Newbie (1/5)

1

Reputation

  1. Решение возникло из необходимости включения и выключения интернета ребенку, например. Выключить интернет прямо сейчас (и соответственно включить обратно), не ожидая расписания Включить инет на 5/15/30 минут Не нашел готового решения, пришлось колхозить. Решение простое - крон и список команд для выполнения ndmq с указанием их времени (в примере ниже /opt/home/scheduler_list). Список команд заполняется PHP скриптом с простой веб страницы. Установить: крон, любой веб сервер (у меня lighttpd), php (для вебсервера). Я написал скрипт на питоне, но это чтобы изучить его, можно обойтись php (скрипт переписать, 20 строк всего) Крон конфигурируется на выполнение следующего скрипта каждую минуту: import re from datetime import datetime import os file_name = '/opt/home/scheduler_list' file_content = open(file_name, 'r').readlines() keep = [] modified = False for line in file_content: parts = line.rstrip().split('|') if datetime.strptime(parts[0], '%Y-%m-%d %H:%M:%S') <= datetime.now(): os.system(parts[1]) modified = True else: keep.append(line) if modified: list_file = open(file_name, 'w') for line in keep: list_file.write(line) PHP скрипт для веб страницы <?php $status = []; $fname = '/opt/home/scheduler_list'; if (isset($_POST['amount']) && isset($_POST['device'])) { $time = new DateTime('now'); $off_time = $on_time = $time->format('Y-m-d H:i:s'); if ($_POST["amount"] != "on" && $_POST["amount"] != "off") { $time = $time->add(new DateInterval($_POST["amount"])); $off_time = $time->format('Y-m-d H:i:s'); } $cmd = ""; $content = file_get_contents($fname); foreach ($_POST['device'] as $key => $value) { $content = preg_replace('/.+ ' . $value . ' .+[\n]/iu', '', $content); if ($_POST["amount"] != 'off') { $cmd .= $on_time . '|ndmq -p "ip hotspot host ' . $value . ' permit"' . "\n"; $status[$value] = "permit"; } if ($_POST["amount"] != 'on') { $cmd .= $off_time . '|ndmq -p "ip hotspot host ' . $value . ' deny"' . "\n"; if ($_POST["amount"] == 'off') $status[$value] = "deny"; } } $content .= $cmd; $fp = fopen($fname, 'w'); fwrite($fp, $content); fclose($fp); exec('python /opt/home/scheduler.py'); } function status($mac) { global $status, $off_time; if (isset($status[$mac])) { $time = ''; if ($_POST["amount"] != "on" && $_POST["amount"] != "off") { $time = preg_split('/ /', $off_time)[1]; } return array("status" => $status[$mac], "time" => $time); } $cmd = 'ndmq -p "show ip hotspot ' . $mac . '" -P host/access'; exec($cmd, $output, $retval); global $content, $fname; if (!isset($content)) $content = file_get_contents($fname); preg_match('/\d{4}\-\d{2}\-\d{2} (\d{2}:\d{2}:\d{2})\|.*' . $mac . ' deny/iu', $content, $m); return array("status" => $output[0], "time" => isset($m[1]) ? $m[1] : ""); } $devices = [ "20:e2:a8:27:00:00" => "Телефон 1", "d4:fb:8e:8f:00:00" => "Телефон 2", ]; ?> <html> <head> <title>Access setup page</title> <style> body,table { font-size: 5.5rem; background-color: black; color: white; } input[type=checkbox],input[type=radio]{ width: 70px; height: 70px; } input[type=submit]{ font-size:5rem; } td { vertical-align-:top; border: lightgray 1px solid; padding: 0px 20px; } .status-deny { color: red; } .status-permit { color: green; } .offtime { color: white; font-size:2rem; } </style> </head> <body> <form method="post"> <table border="0" style="border-collapse: collapse;"> <?php foreach ($devices as $key => $value) { $device_status = status($key); ?> <tr> <td><input type="checkbox" name="device[]" value="<?= $key; ?>"></td> <td> <span class="status-<?= $device_status['status']; ?>"><?= $value ?></span> <?php if ($device_status["time"] != '') { ?><span class="offtime">[<?= $device_status['time'] ?>]</span><?php } ?> </td> <tr> <?php } ?> <tr><td colspan="2" style="height:3rem"></td></tr> <tr><td><input type="radio" name="amount" value="PT5M"></td><td>5 минут</td><tr> <tr><td><input type="radio" name="amount" value="PT15M"></td><td>15 минут</td><tr> <tr><td><input type="radio" name="amount" value="PT30M"></td><td>30 минут</td><tr> <tr><td><input type="radio" name="amount" value="PT1H"></td><td>1 час</td><tr> <tr><td><input type="radio" name="amount" value="on"></td><td>Включить</td><tr> <tr><td><input type="radio" name="amount" value="off"></td><td>Выключить</td><tr> </table> <input type="submit" style="margin-top:30px"> </form> </body> </html>
×
×
  • Create New...