Решение возникло из необходимости включения и выключения интернета ребенку, например.
Выключить интернет прямо сейчас (и соответственно включить обратно), не ожидая расписания
Включить инет на 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>