Задать вопрос
  • Как переписать скрипт чтоб без pgrep?

    @Quqas Автор вопроса
    Кот Абсолютный, спасибо, Кэп
    я изначально и писал что бусибокс даже pgrep не понимает

    а дальше уже ps видать разный

    но и ещё дальше даже без ошибок ps чтото не аллё в строчке эмулирующей pgrep
    Написано
  • Как переписать скрипт чтоб без pgrep?

    @Quqas Автор вопроса
    в итоге я ТОЛЬКО щас смог проверить
    ибо изначально решил по другому и с нормальным pgrep

    ИТОГ :

    ни электронный болван ни живой ум не справились

    на выбор 2е разные ошибки

    ---------------
    ps: unrecognized option: o
    BusyBox v1.24.2 () multi-call binary.

    Usage: ps

    Show list of processes

    w Wide output
    l Long output
    T Show threads
    -----------------
    это что болван надумал

    и ----------------------------------
    ash: out of range
    ash: you need to specify whom to kill
    --------------------------------
    от живых

    так то вот

    своим умом откомбинировать и из2х 1ну но рабочую тоже не получилось
    Написано
  • M$ edge + win11 и таймер сна?

    @Quqas Автор вопроса
    maksam07, ну тем не менее такой настройки в моём варианте win11 кривые хоттервоттеры недодали
    м.б. потому и спит
    с тытрубом х.з. - может иза того что смотрю и полчаса не набирается чтоб мышой не дёргать...
    хотя уж точно 10+ бывает и тогда бы моник гас - но точно нет такого
    Написано
  • M$ edge + win11 и таймер сна?

    @Quqas Автор вопроса
    maksam07, что характерно скрин то снят видать в семёре?
    нету в 11 в той закладке про мультимедию
    в 7 да, вижу

    +не думаю что в хроме дело

    в стародавние времена винампы\фубары также мешали сну - но непомню былили в них спец настройки про это
    Написано
  • Как в полном дампе вычленить mtd6?

    @Quqas Автор вопроса
    не понял кто и зачем потёр мой ответ

    но повторюсь - актуальность отпала

    хоть mtd6 не удалось вытащить - изначально его содержимое и не влияло. это я умозрительно думал что в нём дело

    дело было в незалоченом factory mode

    всем спс.
    Написано
  • Как в полном дампе вычленить mtd6?

    @Quqas Автор вопроса
    Zerg89, "поддельный" в том смысле что ясам на дырлинк лью кинетика bin

    ламп именно дамп а не bin сайта

    если в содержимом файла startup-config ничего кроме /dev/mtdblock/6

    то расцениваю как прямую запись

    но уже не важно
    Написано
  • Как в полном дампе вычленить mtd6?

    @Quqas Автор вопроса
    что такое mtd в принципе?
    или "моё" mtd6 ?

    по идее в нём хранятся настройки. прямая запись. монтируется как файл(судя по fs прошивки)

    конкретное железо zyxel-keenetic omni II

    надо понять почему на "поддельных" не переключается режимы работы роутер \ extender

    чисто эмпирически надежда что разница в труЪ mtd6 оригиналов vs подделок
    Написано
  • Как соединить два роутера с динамическими ip по Wireguard, используя VPS сервер в качестве сервера с белым ip?

    @Quqas
    концептуально никакой разницы между тем что щас и тем что хочешь
    подключаться также к vps
    а на кинетиках просто правильно изменить маршруты и м.б. метрики
    Написано
  • Это баг или фича однонаправленность DP--DVI-D?

    @Quqas Автор вопроса
    rPman, ну допустим.

    другими словами, мониторы DP-- приходящий им с dvi понимать отказываются?
    Написано
  • Это баг или фича однонаправленность DP--DVI-D?

    @Quqas Автор вопроса
    Преобразование hdmi - dp

    такого в вопросе и не спрашивается

    пассивный на 146% dp-dvi

    видать сигнально совместим раз из dp в dvi показывает
    но наеборот уже нет - непонятно что там не хватает в плане сигналу. толи видло недодаёт, толи моники(на разных тестил) не могут "упрощённый" сигнал жрать
    Написано
  • Как переписать скрипт чтоб без pgrep?

    @Quqas Автор вопроса
    ок. спасибо добрый человек. попробую (результат не сразу смогу огласить)

    возможно даже радикально слишком улучшено, аж все if fi ушли. (для моего уровня понимания лихо....)

    т.е. по сути первой строки с присвоением переменной достаточно? а остальное же можно оставить как было... но можно и по новому варику =результат типа 0 или 1 возврат, как мне "видится"
    Написано
  • Как js может управлять службой на хосте?

    @Quqas Автор вопроса
    т.е. не указывая полный путь, просто по имени сервиса, ровно всё тоже самое
    Написано
  • Как js может управлять службой на хосте?

    @Quqas Автор вопроса
    Rsa97, ок
    значит я и в первый раз, умозрительно был прав - вся "польза" от systemctl в "экономии" пути к service-файлу
    Написано
  • Как js может управлять службой на хосте?

    @Quqas Автор вопроса
    Rsa97, дело не в папке\пути
    а в самом принципе
    что типа повторный вызов с аргументом - позволяет рулить
    для этого ессно нужно чтоб файл их понимал

    и казалось бы service или systemctl должны обходить необходимость чтоб "файл" это умел
    но это неточно..
    Написано
  • Как js может управлять службой на хосте?

    @Quqas Автор вопроса
    Rsa97,
    не сталкивался чтоб банально exec и путь к "службе"
    это ж надо чтоб тот файл понимал аргументы и т.п.

    а если это понимание обязательное условие - то на кой тогда systemctl? всё тоже самое но экономия в написании пути?
    Написано
  • Как js может управлять службой на хосте?

    @Quqas Автор вопроса
    каким то бесом непосредственно через сам скрипт

    exec(ROOT_DIR . "/etc/init.d/" . ****

    крайне затейливо. и пока ещё неясно до конца что там в *** прописывать
    Написано
  • Как js может управлять службой на хосте?

    @Quqas Автор вопроса
    вот как это
    $response = nfqwsServiceAction($_POST['cmd']);
    интерпретировать?
    Написано
  • Как js может управлять службой на хосте?

    @Quqas Автор вопроса
    нашёл таки php но не в браузере а как файл

    php

    <?php
    
    ini_set('memory_limit', '32M');
    
    define('ROOT_DIR', file_exists('/opt/etc/nfqws/nfqws.conf') ? '/opt' : '');
    define('SCRIPT_NAME', ROOT_DIR ? 'S51nfqws' : 'nfqws-keenetic');
    
    function normalizeString(string $s): string {
        // Convert all line-endings to UNIX format.
        $s = str_replace(array("\r\n", "\r", "\n"), "\n", $s);
    
        // Don't allow out-of-control blank lines.
        $s = preg_replace("/\n{3,}/", "\n\n", $s);
    
        $lastChar = substr($s, -1);
        if ($lastChar !== "\n" && !empty($s)) {
            $s .= "\n";
        }
    
        return $s;
    }
    
    function getFiles($path = ROOT_DIR . '/etc/nfqws'): array {
        // GLOB_BRACE is unsupported in openwrt
        $files = array_filter(glob($path . '/*'), function ($file) {
            return is_file($file) && preg_match('/\.(list|list-opkg|list-old|conf|conf-opkg|conf-old|apk-new)$/i', $file);
        });
        $logfile = ROOT_DIR . '/var/log/nfqws.log';
        $basenames = array_map(fn($file) => basename($file), $files);
        if (file_exists($logfile)) {
            array_push($basenames, basename($logfile));
        }
    
        $priority = ['nfqws.conf' => -5, 'user.list' => -4, 'exclude.list' => -3, 'auto.list' => -2, 'nfqws.log' => -1];
        usort($basenames, fn($a, $b) => ($priority[$a] ?? 1) - ($priority[$b] ?? -1));
    
        return $basenames;
    }
    
    function getFileContent(string $filename, $path = ROOT_DIR . '/etc/nfqws'): string {
        return file_get_contents($path . '/' . basename($filename));
    }
    
    function getLogContent(string $filename, $path = ROOT_DIR . '/var/log'): string {
        $file = file($path . '/' . basename($filename));
        $file = array_reverse($file);
        return implode("", $file);
    }
    
    function saveFile(string $filename, string $content, $path = ROOT_DIR . '/etc/nfqws') {
        $filename = basename($filename);
        $file = $path . '/' . $filename;
        return file_exists($file) && file_put_contents($file, normalizeString($content)) !== false;
    }
    
    function saveLog(string $filename, string $content, $path = ROOT_DIR . '/var/log') {
        return saveFile($filename, $content, $path);
    }
    
    function removeFile(string $filename, $path = ROOT_DIR . '/etc/nfqws') {
        $filename = basename($filename);
        $file = $path . '/' . $filename;
        if (file_exists($file)) {
            return unlink($file);
        } else {
            return false;
        }
    }
    
    function nfqwsServiceStatus() {
        $output = null;
        exec(ROOT_DIR . "/etc/init.d/" . SCRIPT_NAME . " status", $output);
        return str_contains($output[0] ?? '', 'is running');
    }
    
    function nfqwsServiceAction(string $action) {
        $output = null;
        $retval = null;
        exec(ROOT_DIR . "/etc/init.d/" . SCRIPT_NAME . " $action", $output, $retval);
        return array('output' => $output, 'status' => $retval);
    }
    
    function opkgUpgradeAction() {
        $output = null;
        $retval = null;
        exec("opkg update && opkg upgrade nfqws-keenetic nfqws-keenetic-web", $output, $retval);
        if (empty($output)) {
            $output[] = 'Nothing to update';
        }
        return array('output' => $output, 'status' => $retval);
    }
    
    function apkUpgradeAction() {
        $output = null;
        $retval = null;
        exec("apk --update-cache add nfqws-keenetic nfqws-keenetic-web", $output, $retval);
        if (empty($output)) {
            $output[] = 'Nothing to update';
        }
        return array('output' => $output, 'status' => $retval);
    }
    
    function upgradeAction() {
        return file_exists('/usr/bin/apk') ? apkUpgradeAction() : opkgUpgradeAction();
    }
    
    function authenticate($username, $password) {
        $passwdFile = ROOT_DIR . '/etc/passwd';
        $shadowFile = ROOT_DIR . '/etc/shadow';
    
        $users = file(file_exists($shadowFile) ? $shadowFile : $passwdFile);
        $user = preg_grep("/^$username/", $users);
    
        if ($user) {
            list(, $passwdInDB) = explode(':', array_pop($user));
            if (empty($passwdInDB)) {
                return empty($password);
            }
            if (crypt($password, $passwdInDB) == $passwdInDB) {
                return true;
            }
        }
    
        return false;
    }
    
    function main() {
        if (!isset($_SERVER['REQUEST_METHOD']) || $_SERVER['REQUEST_METHOD'] !== 'POST') {
            http_response_code(302);
            header('Location: index.html');
            exit();
        }
    
        session_start();
        if (!isset($_SESSION['auth']) || !$_SESSION['auth']) {
            if ($_POST['cmd'] !== 'login' || !isset($_POST['user']) || !isset($_POST['password']) || !authenticate($_POST['user'], $_POST['password'])) {
                http_response_code(401);
                exit();
            } else {
                $_SESSION['auth'] = true;
            }
        }
    
        switch ($_POST['cmd']) {
            case 'filenames':
                $files = getFiles();
                $response = array('status' => 0, 'files' => $files, 'service' => nfqwsServiceStatus());
                break;
    
            case 'filecontent':
                if (str_ends_with($_POST['filename'], '.log')) {
                    $content = getLogContent($_POST['filename']);
                } else {
                    $content = getFileContent($_POST['filename']);
                }
                $response = array('status' => 0, 'content' => $content, 'filename' => $_POST['filename']);
                break;
    
            case 'filesave':
                if (str_ends_with($_POST['filename'], '.log')) {
                    $result = saveLog($_POST['filename'], $_POST['content']);
                } else {
                    $result = saveFile($_POST['filename'], $_POST['content']);
                }
                $response = array('status' => $result ? 0 : 1, 'filename' => $_POST['filename']);
                break;
    
            case 'fileremove':
                $result = removeFile($_POST['filename']);
                $response = array('status' => $result ? 0 : 1, 'filename' => $_POST['filename']);
                break;
    
            case 'reload':
            case 'restart':
            case 'stop':
            case 'start':
                $response = nfqwsServiceAction($_POST['cmd']);
                break;
    
            case 'upgrade':
                $response = upgradeAction();
                break;
    
            case 'login':
                $response = array('status' => 0);
                break;
    
            case 'logout':
                $_SESSION['auth'] = false;
                $response = array('status' => 0);
                break;
    
            default:
                http_response_code(405);
                exit();
        }
    
        header('Content-Type: application/json; charset=utf-8');
        http_response_code(200);
        echo json_encode($response);
        exit();
    }
    
    main();

    Написано
  • Как js может управлять службой на хосте?

    @Quqas Автор вопроса
    и ещё скриптик короткий
    const TLN={eventList:{},update_line_numbers:function(e,t){let n=e.value.split("\n").length-t.children.length;if(n>0){const e=document.createDocumentFragment();for(;n>0;){const t=document.createElement("span");t.className="tln-line",e.appendChild(t),n--}t.appendChild(e)}for(;n<0;)t.removeChild(t.lastChild),n++},append_line_numbers:function(e){const t=document.getElementById(e);if(null==t)return console.warn("[tln.js] Couldn't find textarea of id '"+e+"'");if(-1!=t.className.indexOf("tln-active"))return console.warn("[tln.js] textarea of id '"+e+"' is already numbered");t.classList.add("tln-active"),t.style={};const n=document.createElement("div");n.className="tln-wrapper",t.parentNode.insertBefore(n,t),TLN.update_line_numbers(t,n),TLN.eventList[e]=[];const l=["propertychange","input","keydown","keyup"],o=function(e,t){return function(n){(10!=+e.scrollLeft||37!=n.keyCode&&37!=n.which&&"ArrowLeft"!=n.code&&"ArrowLeft"!=n.key)&&36!=n.keyCode&&36!=n.which&&"Home"!=n.code&&"Home"!=n.key&&13!=n.keyCode&&13!=n.which&&"Enter"!=n.code&&"Enter"!=n.key&&"NumpadEnter"!=n.code||(e.scrollLeft=0),TLN.update_line_numbers(e,t)}}(t,n);for(let n=l.length-1;n>=0;n--)t.addEventListener(l[n],o),TLN.eventList[e].push({evt:l[n],hdlr:o});const r=["change","mousewheel","scroll"],s=function(e,t){return function(){t.scrollTop=e.scrollTop}}(t,n);for(let n=r.length-1;n>=0;n--)t.addEventListener(r[n],s),TLN.eventList[e].push({evt:r[n],hdlr:s})},remove_line_numbers:function(e){const t=document.getElementById(e);if(null==t)return console.warn("[tln.js] Couldn't find textarea of id '"+e+"'");if(-1==t.className.indexOf("tln-active"))return console.warn("[tln.js] textarea of id '"+e+"' isn't numbered");t.classList.remove("tln-active");const n=t.previousSibling;if("tln-wrapper"==n.className&&n.remove(),TLN.eventList[e]){for(let n=TLN.eventList[e].length-1;n>=0;n--){const l=TLN.eventList[e][n];t.removeEventListener(l.evt,l.hdlr)}delete TLN.eventList[e]}}};
    Написано
  • Как js может управлять службой на хосте?

    @Quqas Автор вопроса
    php якобы нету
    тока html(f12+sources)
    index

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>nfqws-keenetic</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
        <link rel="shortcut icon" type="image/x-icon" href="favicon.ico">
        <link rel="apple-touch-icon" href="icon.png">
        <link rel="icon" href="icon.png" sizes="192x192">
        <link rel="manifest" href="manifest.json">
        <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
        <meta http-equiv="Pragma" content="no-cache" />
        <meta http-equiv="Expires" content="0" />
    
        <meta name="MobileOptimized" content="320">
        <meta name="HandheldFriendly" content="true">
        <meta name="theme-color" media="(prefers-color-scheme: light)" content="#fff">
        <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b2434">
        <meta name="color-scheme" content="light dark">
    
        <script defer src="tln.min.js?v=v2.8.4"></script>
        <script defer src="script.js?v=v2.8.4" type="module"></script>
    
        <link rel="stylesheet" href="tln.min.css?v=v2.8.4">
        <link rel="stylesheet" href="style.css?v=v2.8.4">
    </head>
    <body class="disabled unknown">
    <script>
        const theme = localStorage.getItem('theme');
        if (theme) {
            const root = document.querySelector(':root');
            root.dataset.theme = theme;
        }
    </script>
    
    <header>
        <h1 class="logo">nfqws-keenetic <span id="status"></span></h1>
        <button class="button red" id="save">Save</button>
        <button class="button" id="restart">Restart</button>
        <button class="button" id="dropdown"></button>
        <ul id="dropdown-menu" class="hidden">
            <li class="dropdown-item" id="reload">Reload</li>
            <li class="dropdown-item" id="stop">Stop</li>
            <li class="dropdown-item" id="start">Start</li>
            <li class="dropdown-item" id="upgrade">Update</li>
        </ul>
    </header>
    
    <nav></nav>
    
    <article>
        <div class="textarea-container">
            <textarea id="config" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" autofocus></textarea>
        </div>
    </article>
    
    <footer>
        <a class="footer-tab" href="https://github.com/Anonym-tsk/nfqws-keenetic/" target="_blank">GitHub</a>
        <a class="footer-tab" href="https://anonym-tsk.github.io/nfqws-keenetic/" target="_blank">Repository</a>
        <span id="theme" class="footer-tab" title="Change theme"></span>
        <span id="logout" class="footer-tab" title="Logout"></span>
        <span id="version">v2.8.4</span>
    </footer>
    
    <div id="overlay"></div>
    
    <div id="alert" class="popup hidden">
        <pre class="popup-content"></pre>
        <div class="popup-footer">
            <button class="popup-yes">Yes</button>
            <button class="popup-no">No</button>
            <button class="popup-close">Close</button>
        </div>
    </div>
    
    <div id="login-form" class="popup hidden">
        <div class="popup-content">
            <input type="text" class="login-input" id="login" autocomplete="false" autofocus placeholder="Login" />
            <input type="password" class="login-input" id="password" placeholder="Password" />
        </div>
        <div class="popup-footer">
            <button class="popup-yes">Login</button>
        </div>
    </div>
    
    </body>
    </html>

    Написано