Перейти к содержанию

Рекомендуемые сообщения

Опубликовано

Решение возникло из необходимости включения и выключения интернета ребенку, например.

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

 

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...

Важная информация

На этом сайте используются файлы cookie. Нажимая "Я принимаю" или продолжая просмотр сайта, вы разрешаете их использование: Политика конфиденциальности.