#!/usr/bin/env python3 from __future__ import annotations import ftplib import io import os import sys from pathlib import Path import paramiko ROOT = Path(r"c:\laragon\www\light-otantik-nux") sys.path.insert(0, str(ROOT / "scripts")) from mk_client import connect as mk_connect, ok, replies_to_rows, talk, trap_msg # noqa: E402 SSH_HOST = "10.15.15.89" SSH_USER = "ubuntu" SSH_PASS = "ubuntu" MK_HOST = os.environ.get("MK_HOST", "10.15.15.1") MK_USER = os.environ.get("MK_USER", "admin") MK_PASS = os.environ.get("MK_PASS", "") FILES = [ (ROOT / "deploy/nux-custom/system/controllers/portal.php", "/var/www/phpnuxbill/system/controllers/portal.php"), (ROOT / "deploy/nux-custom/system/paymentgateway/mesomb.php", "/var/www/phpnuxbill/system/paymentgateway/mesomb.php"), (ROOT / "deploy/nux-custom/ui/ui/portal/index.tpl", "/var/www/phpnuxbill/ui/ui/portal/index.tpl"), (ROOT / "deploy/nux-custom/ui/ui/portal/voucher.tpl", "/var/www/phpnuxbill/ui/ui/portal/voucher.tpl"), (ROOT / "deploy/nux-custom/ui/ui/portal/pppoe.tpl", "/var/www/phpnuxbill/ui/ui/portal/pppoe.tpl"), (ROOT / "deploy/nux-custom/ui/ui/portal/wait.tpl", "/var/www/phpnuxbill/ui/ui/portal/wait.tpl"), (ROOT / "deploy/php-fpm-woyla.conf", "/tmp/php-fpm-woyla.conf"), (ROOT / "deploy/apache-woyla.conf", "/tmp/apache-woyla.conf"), ] def sudo(client, cmd, timeout=120): wrapped = f"sudo -S -p '' bash -lc {repr(cmd)}" stdin, stdout, stderr = client.exec_command(wrapped, timeout=timeout, get_pty=True) stdin.write(SSH_PASS + "\n") stdin.flush() out = stdout.read().decode("utf-8", "replace") code = stdout.channel.recv_exit_status() lines = [ln for ln in out.splitlines() if ln.strip() != SSH_PASS] return code, "\n".join(lines) def main() -> int: client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(SSH_HOST, username=SSH_USER, password=SSH_PASS, timeout=20, allow_agent=False, look_for_keys=False) sftp = client.open_sftp() for i, (local, remote) in enumerate(FILES): tmp = f"/home/ubuntu/woyla_fix_{i}_{local.name}" with sftp.file(tmp, "wb") as f: f.write(local.read_bytes().replace(b"\r\n", b"\n")) print("up", local.name) sftp.close() sh = r""" set -e install -m 644 /home/ubuntu/woyla_fix_0_portal.php /var/www/phpnuxbill/system/controllers/portal.php install -m 644 /home/ubuntu/woyla_fix_1_mesomb.php /var/www/phpnuxbill/system/paymentgateway/mesomb.php install -m 644 /home/ubuntu/woyla_fix_2_index.tpl /var/www/phpnuxbill/ui/ui/portal/index.tpl install -m 644 /home/ubuntu/woyla_fix_3_voucher.tpl /var/www/phpnuxbill/ui/ui/portal/voucher.tpl install -m 644 /home/ubuntu/woyla_fix_4_pppoe.tpl /var/www/phpnuxbill/ui/ui/portal/pppoe.tpl install -m 644 /home/ubuntu/woyla_fix_5_wait.tpl /var/www/phpnuxbill/ui/ui/portal/wait.tpl PHP_VER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;') install -m 644 /home/ubuntu/woyla_fix_6_php-fpm-woyla.conf /etc/php/${PHP_VER}/fpm/pool.d/zz-woyla.conf a2enmod headers >/dev/null python3 - <<'PY' from pathlib import Path p = Path("/etc/apache2/sites-available/phpnuxbill.conf") t = p.read_text() if "pay.woyla.net" not in t: t = t.replace("ServerAlias", "ServerAlias pay.woyla.net", 1) if "Access-Control-Allow-Origin" not in t: t = t.replace("DocumentRoot /var/www/phpnuxbill", "DocumentRoot /var/www/phpnuxbill\n Header always set Access-Control-Allow-Origin \"*\"\n Header always set Access-Control-Allow-Methods \"GET, POST, OPTIONS\"") p.write_text(t) print(t) PY php -l /var/www/phpnuxbill/system/controllers/portal.php php -l /var/www/phpnuxbill/system/paymentgateway/mesomb.php find /var/www/phpnuxbill/ui/compiled -type f -delete || true chown -R www-data:www-data /var/www/phpnuxbill/ui/ui/portal /var/www/phpnuxbill/system/controllers/portal.php /var/www/phpnuxbill/system/paymentgateway/mesomb.php apache2ctl configtest systemctl reload apache2 systemctl reload php${PHP_VER}-fpm || systemctl restart php${PHP_VER}-fpm echo DEPLOY_OK """ sftp = client.open_sftp() with sftp.file("/home/ubuntu/woyla-fix-deploy.sh", "w") as f: f.write(sh.replace("\r\n", "\n")) sftp.close() code, out = sudo(client, "bash /home/ubuntu/woyla-fix-deploy.sh", timeout=90) print(out) client.close() if code != 0: return code sock = mk_connect() wg = replies_to_rows(talk(sock, ["/ip/hotspot/walled-garden/print"])) if not any(e.get("dst-host") == "pay.woyla.net" for e in wg): r = talk(sock, ["/ip/hotspot/walled-garden/add", "=dst-host=pay.woyla.net", "=action=allow", "=comment=phpnuxbill"]) print("walled pay", "OK" if ok(r) else trap_msg(r)) dns = replies_to_rows(talk(sock, ["/ip/dns/static/print"])) for d in dns: if d.get("name") in ("pay.woyla.net", "pppoe.woyla.net", "billing.woyla.net") and d.get("comment") == "phpnuxbill": rid = d.get(".id") if rid: r = talk(sock, ["/ip/dns/static/remove", f"=.id={rid}"]) print("dns remove", d.get("name"), "OK" if ok(r) else trap_msg(r)) talk(sock, ["/ip/dns/cache/flush"]) sock.close() html = (ROOT / "deploy/nux-custom/hotspot/login.html").read_bytes().replace(b"\r\n", b"\n") ftp = ftplib.FTP() ftp.encoding = "latin-1" ftp.connect(MK_HOST, 21, timeout=20) ftp.login(MK_USER, MK_PASS) ftp.set_pasv(True) ftp.cwd("woylaHotspot") ftp.storbinary("STOR login.html", io.BytesIO(html)) ftp.quit() print("ftp login.html", len(html)) print("DONE") return 0 if __name__ == "__main__": raise SystemExit(main())