.DEFAULT_GOAL := run
-.PHONY: run check notify test
-#checksums $(commitinfo.sh)
+.PHONY: run check notify checksums $(commitinfo.sh) test
run: check
-# @echo "[run] start main flow"
+ @echo "[run] exit 0, go to checksums..."
+ @$(MAKE) checksums
+ @echo "[run] checksums.sh exit 0. Go to commitinfo.sh..."
+ @$(MAKE) $(commitinfo.sh)
+ @echo "[run] commitinfo.sh exit 0. Go to repo add, commit and push..."
+ cd $(BUILD_DIR)
+ ls -la .
+ git add .
+ git commit -am '$(COMM_INFO)'
+ git push
@echo "[run] done"
check:
checksums: checksums.json
checksums.json: bin/checksums.sh $(ALL_RSC)
- bin/checksums.sh > html/tmp/checksums.json
+ bin/checksums.sh > html/tmp/$@
$(commitinfo.sh): $(GLOB_RSC)
- $(commitinfo.sh) $< > $<~
- mv $<~ $<
+ $(commitinfo.sh) $< > $<~
+ mv $<~ $<
test:
@bash -n bin/check_repo.sh
diff="$(git diff --quiet && git diff --cached --quiet || true)"
lsfiles="$(git ls-files --others --exclude-standard || true)"
-if [[ -n "$diff" && -z "$lsfiles" ]]; then
- echo "[check] repo diff, go to proclean check."
+if [[ -n "$diff" && -n "$lsfiles" ]]; then
+ echo "[check_repo] repo diff, go to proclean check."
if [[ -n "$dirty" ]]; then
- echo "[check] repo dirty, stop"
+ echo "[check_repo] repo dirty, stop"
bash scripts/notify_telegram.sh "STOP: repo dirty in $(pwd)"
exit 1
else
- echo "[check] repo clean"
+ echo "[check_repo] repo clean"
fi
else
- echo "[check] not clean. Go to autocommit him."
- if [[ -z "$lsfiles" ]]; then
- echo "[check] Git add..."
- git add .
- git commit -m "${COMM_INFO}"
- else
- echo "[check] Git -v branch..."
- git -v brnch
- git commit -am "${COMM_INFO}"
- fi
- git push
+ echo "[check_repo] not clean. Exit 0 from check_repo.sh."
+ exit 0
fi
--- /dev/null
+#!/usr/bin/env bash
+
+cd "${REPO_DIR:-.}"
+
+dirty="$(git status --porcelain || true)"
+diff="$(git diff --quiet && git diff --cached --quiet || true)"
+lsfiles="$(git ls-files --others --exclude-standard || true)"
+
+if [[ -n "$lsfiles" ]]; then
+ echo "[check] Git add..."
+fi
--- /dev/null
+<!DOCTYPE html>
+<html>
+<head>
+<title>Error 404</title>
+<style>
+html { color-scheme: light dark; }
+body { width: 35em; margin: 0 auto;
+font-family: Tahoma, Verdana, Arial, sans-serif; }
+</style>
+</head>
+<body>
+<h1>An error occurred. 404</h1>
+<p>Sorry, the page you are looking for is currently unavailable.<br/>
+Please try again later.</p>
+<p>If you are the system administrator of this resource then you should check
+the error log for details.</p>
+<p><em>Faithfully yours, nginx.</em></p>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html>
+<head>
+<title>Error 404</title>
+<style>
+html { color-scheme: light dark; }
+body { width: 35em; margin: 0 auto;
+font-family: Tahoma, Verdana, Arial, sans-serif; }
+</style>
+</head>
+<body>
+<h1>An error occurred. 404</h1>
+<p>Sorry, the page you are looking for is currently unavailable.<br/>
+Please try again later.</p>
+<p>If you are the system administrator of this resource then you should check
+the error log for details.</p>
+<p><em>Faithfully yours, nginx.</em></p>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html>
+<head>
+<title>Error</title>
+<style>
+html { color-scheme: light dark; }
+body { width: 35em; margin: 0 auto;
+font-family: Tahoma, Verdana, Arial, sans-serif; }
+</style>
+</head>
+<body>
+<h1>An error occurred.</h1>
+<p>Sorry, the page you are looking for is currently unavailable.<br/>
+Please try again later.</p>
+<p>If you are the system administrator of this resource then you should check
+the error log for details.</p>
+<p><em>Faithfully yours, nginx.</em></p>
+</body>
+</html>
--- /dev/null
+ <!-- End of nginx output -->
+ </div>
+ </div>
+ <div id="footer" class="row">
+ <!-- This footer will change depending on your settings in top.html -->
+
+ </div>
+ </div>
+</body>
+
+</html>
--- /dev/null
+
+<p class="foot">RouterOS Scripts documentation generated on <i>__DATE__</i> for <i>__VERSION__</i><br />
+Copyright © 2013-2026 Christian Hesse <mail@eworm.de></p>
+
+</body></html>
--- /dev/null
+<!DOCTYPE html><html lang="en">
+<head><meta http-equiv="content-type" content="text/html; charset=UTF-8">
+<link rel="stylesheet" type="text/css" href="__INCLUDE__/css/style.css">
+<link rel="icon" type="image/png" href="__INCLUDE__/img/logo.png">
+<script type="text/javascript" src="__INCLUDE__/js/clipboard.js"></script>
+</head><body>
+
+ <span align="center" width="60%">
+ <table>
+ <tr>
+ <td class="head"><span class="top">[Amster] RouterOS Scripts</span><br />
+ <span class="bottom">Welcome to new, optimized and fixed RouterOS scripts!</span>
+ </td>
+ <td class="head"><span class="top"><br /></span>
+ </td>
+ <td class="head"><span class="bottom"></span><br />
+ <span class="bottom"></span>
+ </td>
+ </tr>
+ </table>
+ <hr />
+ <span width="50" align="left">
+ <div class="menu">
+ <h2>Main Menu</h2>
+ <p><a href="/README.md"> ⬅️ [ Main README.md ]</a></p>
+ <p><a href="/logo/"> ℹ️ [ logo ]</a></p>
+ <p><a href="/logo/notification.html"> 💡️ [ Notifications ]</a></p>
+ <p><a href="/func-collection/README.md"> ℹ️ [ Functions collection ]</a></p>
+ </div>
+ <p> </p>
+ <div class="root">
--- /dev/null
+<!DOCTYPE html>
+<html>
+<head>
+<title>Welcome to Amster!</title>
+<style>
+html { color-scheme: light dark; }
+body { width: 60%; margin: 0 auto;
+font-family: Tahoma, Verdana, Arial, sans-serif; }
+</style>
+</head>
+<body>
+<span align="center" width="60%">
+<span width="50" align="left">
+<h1>Welcome to Amster!</h1>
+<p>If you see this page, Amster web server is successfully installed and
+working. Further configuration is required.</p>
+
+<p>For online documentation and support please refer to
+<a href="http://nginx.org/">nginx.org</a>.<br/>
+Commercial support is available at
+<a href="http://nginx.com/">nginx.com</a>.</p>
+
+<p><em>Thank you for using nginx.</em></p>
+<br />
+<p><a href="/amster-scripts/">>>> amster-scripts <<<</a></p>
+<p><a href="/logo/">>>> logo <<<</a></p>
+<p><a href="/logo/notification.html">>>> notifications <<<</a></p>
+</span></span>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+ <link rel="stylesheet" type="text/css" href="/.include/css/style.css">
+ <link rel="icon" type="image/png" href="/.include/img/logo.png">
+ <script src="/.include/js/clipboard.js"></script>
+</head>
+
+<body>
+ <span align="center" width="60%">
+ <table>
+ <tr>
+ <td class="head"><span class="top">[Amster] RouterOS Scripts</span><br />
+ <span class="bottom">Welcome to new, optimized and fixed RouterOS scripts!</span>
+ </td>
+ <td class="head"><span class="top"><br /></span>
+ </td>
+ <td class="head"><span class="bottom"></span><br />
+ <span class="bottom"></span>
+ </td>
+ </tr>
+ </table>
+ <hr />
+ <span width="50" align="left">
+ <div class="menu">
+ <h2>Main Menu</h2>
+ <p><a href="/README.md"> ⬅️ [ Main README.md ]</a></p>
+ <p><a href="/logo/"> ℹ️ [ logo ]</a></p>
+ <p><a href="/logo/notification.html"> 💡️ [ Notifications ]</a></p>
+ <p><a href="/func-collection/README.md"> ℹ️ [ Functions collection ]</a></p>
+ </div>
+ <p> </p>
+ <div class="root">
+ {{content}}
+ </div>
+ <script>
+ (function () {
+ // try to set document title
+ var l = ['h1', 'h2', 'h3'];
+ for (var i = 0; i < l.length; i++) {
+ var h = document.getElementsByTagName(l[i]);
+ if (h.length > 0) {
+ document.title = '[Amster] RouterOS Scripts :: ' + h[0].innerText;
+ break;
+ }
+ }
+ })();
+ </script>
+ <br />
+ <div class="menu">
+ <h2>Main Menu</h2>
+ <p><a href="/README.md"> ⬅️ [ Main README.md ]</a></p>
+ <p><a href="/logo/"> ℹ️ [ logo ]</a></p>
+ <p><a href="/logo/notification.html"> 💡️ [ Notifications ]</a></p>
+ <p><a href="/func-collection/README.md"> ℹ️ [ Functions collection ]</a></p>
+ </div>
+ </span>
+ </span>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+
+<!-- BetterListing - devCoster.com -->
+<!-- Coster coster@devcoster.com -->
+<!-- Version 1.0a -->
+
+<html lang="ru-RU" prefix="og: http://ogp.me/ns#">
+<head>
+ <!-- Adjust title in settings below
+ <title>Directory Listing :: </title>-->
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <!-- Bootstrap Core CSS -->
+ <link rel="stylesheet" href="./include/css/bootstrap.min.css">
+
+ <!-- Styles -->
+ <link rel="stylesheet" href="/.include/css/dirlisting.css">
+ <script>
+ (function () {
+ // try to set document title
+ var l = ['h1', 'h2', 'h3'];
+ for (var i = 0; i < l.length; i++) {
+ var h = document.getElementsByTagName(l[i]);
+ if (h.length > 0) {
+ document.title = '[Amster] RouterOS Scripts :: ' + h[0].innerText;
+ break;
+ }
+ }
+ })();
+ </script>
+ <!-- jQuery -->
+ <script src="/.include/js/jquery.min.js"></script>
+ <script>
+ //
+ //
+ //
+ //
+ // Configure BetterListing here:
+ var websiteName = 'Загрузки';
+ var websiteURL = '*URL сайта*';
+ // End of normal settings.
+ //
+
+ $(document).ready(function(){
+
+ // Working on nginx HTML and applying settings.
+ var text = $("h1").text();
+ var array = text.split('/');
+ var last = array[array.length-2];
+ var dirStructure = $("a").text();
+ var dirStructure = document.getElementsByTagName('a')[0].href;
+ var dir = text.substring(10);
+ var currentDir = last.charAt(0).toUpperCase() + last.slice(1);
+ var dirTrun;
+
+ // Truncate long folder names.
+ if (currentDir.length > 19){
+ var currentDir = currentDir.substring(0, 18) + '...';
+ }
+
+ // Updating page title.
+ document.title = websiteName;
+
+ // Add back button.
+ $("h1").html('<p><img alt="логотип" style="margin-top: 7px; margin-left: 0px; padding: -1px; border-radius: 5px; border: 1px solid #aaa;" src="/.include/img/logo.png"></p>');
+
+ if (dir.length > 90) {
+ dirTrun = dir.replace(/(.{90})/g, "$1\n")
+ } else {
+ dirTrun = dir.substring(0, dir.length - 1);
+ }
+
+ // Add subtitle and back arrow.
+ $("h1").append('<h4><a href="' + dirStructure + '"></a><b>Загрузить: </b>' + dirTrun.slice(0) + '</h4>');
+
+ // Add search box.
+ $("h1").prepend('<form id="custom-search-form" class="form-inline pull-right"><div class="btn-group"><input id="searchBox" placeholder="Найти на странице" type="search" class="form-control"> <span id="searchclear" class="glyphicon glyphicon-remove-circle"></span></div></form>');
+
+ // Add parent directory bit.
+ $("a").eq(1).html('Parent Directory');
+
+ // Add titles.
+ $("pre").prepend('<div class="header">Name Time Size</div>');
+
+ // Establish supported formats.
+ var list = new Array();
+ var formats = ["bin", "jpg", "gif", "png", "html", "css", "zip", "iso", "tiff", "ico", "psd", "pdf", "exe", "rar", "deb", "swf", "7z", "doc", "docx", "xls", "xlsx", "pptx", "ppt", "txt", "php", "js", "c", "c++", "torrent", "sql", "wmv", "avi", "mp4", "mp3", "wma", "ogg", "msg", "wav", "py", "java", "gzip", "jpeg", "raw"];
+
+ // Run when text is entered in the search box.
+ $('#custom-search-form').on('input',function(e){
+ e.preventDefault();
+ var target = $('#searchBox').val();
+ filter(target);
+ });
+
+ // Instant search.
+ function filter(target){
+ var parent_directory = 'parent directory';
+ $('pre a').each(function(){
+ var arraySearch = $(this).attr('href');
+ var arraySearch = decodeURIComponent( arraySearch )
+ // Check the href data for searched term. Using href because the link label truncates if the file or folder name is too long.
+ // Special handling for 'Parent Directory' as the href data doesn't contain that word.
+ if (arraySearch.toLowerCase().indexOf(target.toLowerCase()) > -1 || (($(this).text() == 'Parent Directory') && (parent_directory.indexOf(target.toLowerCase()) > -1))){
+ $(this).show();
+ $($(this)[0].nextSibling).css('display', 'inline');
+ } else {
+ $(this).hide();
+ if($($(this)[0].nextSibling).hasClass('hideMe')) {
+ $($(this)[0].nextSibling).css('display', 'none');
+ } else {
+ $($(this)[0].nextSibling).wrap('<span class="hideMe" style="display:none"></style>');
+ }
+ }
+ });
+ }
+
+ // Runs when clear button is hit.
+ $("#searchclear").click(function(){
+ $("#searchBox").val('');
+ filter('');
+ });
+
+ // Scan all files in the directory, check the extensions and show the right MIME-type image.
+ $('pre a').each(function(){
+ var found = 0;
+ var arraySplit = $(this).attr('href').split(".");
+ var fileExt = arraySplit[arraySplit.length - 1];
+
+ for (var i = 0; i < formats.length; i++) {
+ if (fileExt.toLowerCase() == formats[i].toLowerCase()) {
+ var found = 1;
+ var oldText = $(this).text();
+ $(this).html('<img class="icons" src="/.include/icons/' + formats[i] + '.png"></img></a>' + oldText);
+ return;
+ }
+ }
+
+ // Add an icon for the go-back link.
+ if ($(this).text().indexOf("Parent Directory") >= 0) {
+ var found = 1;
+ var oldText = $(this).text();
+ $(this).html('<img class="icons" src="/.include/icons/home.png">' + oldText);
+ return;
+ }
+
+ // Check for folders as they don't have extensions.
+ if ($(this).attr('href').substr($(this).attr('href').length - 1) == '/') {
+ var found = 1;
+ var oldText = $(this).text();
+ $(this).html('<img class="icons" src="/.include/icons/folder.png">' + oldText.substring(0, oldText.length - 1));
+
+ // Fix for annoying jQuery behaviour where inserted spaces are treated as new elements -- which breaks my search.
+ var string = ' ' + $($(this)[0].nextSibling).text();
+
+ // Copy the original meta-data string, append a space char and save it over the old string.
+ $($(this)[0].nextSibling).remove();
+ $(this).after(string);
+ return;
+ }
+
+ // File format not supported by Better Listings, so let's load a generic icon.
+ if (found == 0){
+ var oldText = $(this).text();
+ $(this).html('<img class="icons" src="/.include/icons/error.png">' + oldText);
+ return;
+ }
+ });
+ });
+</script>
+
+ </head>
+
+ <body>
+ <div class="wasContainer">
+ <div class="row">
+ <div class="col-xs-11 col-centered" id="mainBox">
+ <!-- Start of nginx output -->
:global GlobalFuncReady false;
# Git commit id & info, expected configuration version
-:global CommitId "main/80/71f092a6";
+:global CommitId "main/83/1548044b";
:global CommitTAG "unknown";
-:global CommitInfo "Autocommit in repo: ros.vados.ru, generated by owner: root, in 14:51:02 09.03.2026.";
+:global CommitInfo "Autocommit in repo: ros.vados.ru, generated by owner: root, in 02:05:36 12.03.2026.";
# The variables are received right here.
:global GlobalConfVersion 138;
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+ <link rel="stylesheet" type="text/css" href="/.include/css/style.css">
+ <link rel="icon" type="image/png" href="/.include/img/logo.png">
+ <script src="/.include/js/clipboard.js"></script>
+ <script src="/.include/js/color.js"></script>
+</head>
+
+<body>
+ <span align="center" width="60%">
+ <table>
+ <tr>
+ <td class="head"><span class="top">[Amster] RouterOS Scripts</span><br />
+ <span class="bottom">Welcome to new, optimized and fixed RouterOS scripts!</span>
+ </td>
+ <td class="head"><span class="top"><br /></span>
+ </td>
+ <td class="head"><span class="bottom"></span><br />
+ <span class="bottom"></span>
+ </td>
+ </tr>
+ </table>
+ <hr />
+ <span width="50" align="left">
+ <div class="menu">
+ <h2>Main Menu</h2>
+ <p><a href="/README.md"> ⬅️ [ Main README.md ]</a></p>
+ <p><a href="/logo/"> ℹ️ [ logo ]</a></p>
+ <p><a href="/logo/notification.html"> 💡️ [ Notifications ]</a></p>
+ <p><a href="/func-collection/README.md"> ℹ️ [ Functions collection ]</a></p>
+ </div>
+ <p> </p>
+ <div class="root">
+
+ <h1>Logo Color Changer</h1>
+ <embed class="logo" src="/.include/img/logo.svg" width="192" height="192" type="image/svg+xml">
+
+ <p>Select the colors here:
+ <input id="color1" type="color" value="#222222" onchange="color();">
+ <input id="color2" type="color" value="#444444" onchange="color();">
+ <input id="color3" type="color" value="#ffffff" onchange="color();">
+ </p>
+ </div>
+<a href="#top">⬆️ Go back to top</a></p>
+<script>
+ (function () {
+ // try to set document title
+ var l = ['h1', 'h2', 'h3'];
+ for (var i = 0; i < l.length; i++) {
+ var h = document.getElementsByTagName(l[i]);
+ if (h.length > 0) {
+ document.title = '[Amster] RouterOS Scripts :: ' + h[0].innerText;
+ break;
+ }
+ }
+ })();
+ </script>
+ <br />
+ <div class="menu">
+ <h2>Main Menu</h2>
+ <p><a href="/README.md"> ⬅️ [ Main README.md ]</a></p>
+ <p><a href="/logo/"> ℹ️ [ logo ]</a></p>
+ <p><a href="/logo/notification.html"> 💡️ [ Notifications ]</a></p>
+ <p><a href="/func-collection/README.md"> ℹ️ [ Functions collection ]</a></p>
+ </div>
+ </span></span>
+</body></html>
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+ <link rel="stylesheet" type="text/css" href="/.include/css/style.css">
+ <link rel="icon" type="image/png" href="/.include/img/logo.png">
+ <script src="/.include/js/clipboard.js"></script>
+ <script src="/.include/js/notif.js"></script>
+</head>
+
+<body>
+ <span align="center" width="60%">
+ <table>
+ <tr>
+ <td class="head"><span class="top">[Amster] RouterOS Scripts</span><br />
+ <span class="bottom">Welcome to new, optimized and fixed RouterOS scripts!</span>
+ </td>
+ <td class="head"><span class="top"><br /></span>
+ </td>
+ <td class="head"><span class="bottom"></span><br />
+ <span class="bottom"></span>
+ </td>
+ </tr>
+ </table>
+ <hr />
+ <span width="50" align="left">
+ <div class="menu">
+ <h2>Main Menu</h2>
+ <p><a href="/README.md"> ⬅️ [ Main README.md ]</a></p>
+ <p><a href="/logo/"> ℹ️ [ logo ]</a></p>
+ <p><a href="/logo/notification.html"> 💡️ [ Notifications ]</a></p>
+ <p><a href="/func-collection/README.md"> ℹ️ [ Functions collection ]</a></p>
+ </div>
+ <p> </p>
+ <div class="root">
+
+ <h1>Notification Generator</h1>
+ <hr />
+ <div class="notification">
+ <img src="/logo/img/logo.svg" alt="logo" class="logo" width=48 height=48>
+ <div class="content">
+ <p id="heading" class="heading">[<span id="hostname">MikroTik</span>] <span id="subject">ℹ️ Subject</span>
+ </p>
+ <pre id="message">Message</pre>
+ <p id="link" class="hint"> 🔗 <span id="link-text" class="link">/logo/</span></p>
+ <p id="queued" class="hint"> ⏰ This message was queued since <i><span id="queued-since">2026-02-10
+ 10:21:11</span></i> and may be obsolete.</p>
+ <p id="cut" class="hint">✂️ The message was too long and has been truncated, cut off <i><span
+ id="cut-percent">13</span>%</i>!</p>
+ </div>
+ </div>
+
+ <p>Hostname: <input type="text" value="MikroTik" onchange="update(this, 'hostname')"></p>
+ <p>Subject: <input type="text" size=50 value="ℹ️ Subject" onchange="update(this, 'subject')"></p>
+ <p>Message: <textarea id="w3review" name="w3review" rows="4" cols="50"
+ onchange="update(this, 'message')">Message</textarea></p>
+ <p><input type="checkbox" onclick="visible(this, 'link')"> Show link: <input type="text" value="/logo/"
+ onchange="update(this, 'link-text')"></p>
+ <p><input type="checkbox" onclick="visible(this, 'queued')"> Queued since <input type="text"
+ value="2026-02-10 10:21:11" onchange="update(this, 'queued-since')"></p>
+ <p><input type="checkbox" onclick="visible(this, 'cut')"> Cut-off with <input type="number" min=1 max=99
+ value=13 onchange="update(this, 'cut-percent')"> percent</p>
+
+ <p>Then right-click, click "<i>Take Screenshot</i>" and finally select the
+ notification and download it.</p>
+
+ <p><a href="#top">⬆️ Go back to top</a></p>
+ </div>
+ <script>
+ (function () {
+ // try to set document title
+ var l = ['h1', 'h2', 'h3'];
+ for (var i = 0; i < l.length; i++) {
+ var h = document.getElementsByTagName(l[i]);
+ if (h.length > 0) {
+ document.title = '[Amster] RouterOS Scripts :: ' + h[0].innerText;
+ break;
+ }
+ }
+ })();
+ </script>
+ <br />
+ <div class="menu">
+ <h2>Main Menu</h2>
+ <p><a href="/README.md"> ⬅️ [ Main README.md ]</a></p>
+ <p><a href="/logo/"> ℹ️ [ logo ]</a></p>
+ <p><a href="/logo/notification.html"> 💡️ [ Notifications ]</a></p>
+ <p><a href="/func-collection/README.md"> ℹ️ [ Functions collection ]</a></p>
+ </div>
+ </span>
+ </span>
+</body>
+</html>