<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="lt">
	<id>https://wiki.eofnet.lt/w//index.php?action=history&amp;feed=atom&amp;title=Nut-upsd-fake</id>
	<title>Nut-upsd-fake - Versijų istorija</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.eofnet.lt/w//index.php?action=history&amp;feed=atom&amp;title=Nut-upsd-fake"/>
	<link rel="alternate" type="text/html" href="https://wiki.eofnet.lt/w//index.php?title=Nut-upsd-fake&amp;action=history"/>
	<updated>2026-05-09T12:46:45Z</updated>
	<subtitle>Šio puslapio versijų istorija projekte</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://wiki.eofnet.lt/w//index.php?title=Nut-upsd-fake&amp;diff=9859&amp;oldid=prev</id>
		<title>\dev\null: Naujas puslapis: Jeigu taip atsitiko ir network ups'as sugrybavo, arba dėl kažkokių priežaščių reikia raportuoti, kad upsas gyvas ir online, galima pasinaudoti šiuo fake nut-upsd daemonu....</title>
		<link rel="alternate" type="text/html" href="https://wiki.eofnet.lt/w//index.php?title=Nut-upsd-fake&amp;diff=9859&amp;oldid=prev"/>
		<updated>2026-03-22T22:25:23Z</updated>

		<summary type="html">&lt;p&gt;Naujas puslapis: Jeigu taip atsitiko ir network ups&amp;#039;as sugrybavo, arba dėl kažkokių priežaščių reikia raportuoti, kad upsas gyvas ir online, galima pasinaudoti šiuo fake nut-upsd daemonu....&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Naujas puslapis&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Jeigu taip atsitiko ir network ups'as sugrybavo, arba dėl kažkokių priežaščių reikia raportuoti, kad upsas gyvas ir online, galima pasinaudoti šiuo fake nut-upsd daemonu...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import socket&lt;br /&gt;
import threading&lt;br /&gt;
import datetime&lt;br /&gt;
&lt;br /&gt;
HOST = &amp;quot;0.0.0.0&amp;quot;&lt;br /&gt;
PORT = 3493&lt;br /&gt;
&lt;br /&gt;
PRIMARY_UPSNAME = &amp;quot;qnapups&amp;quot;&lt;br /&gt;
UPS_ALIASES = {&amp;quot;qnapups&amp;quot;, &amp;quot;ups&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
USERNAME = &amp;quot;monuser&amp;quot;&lt;br /&gt;
PASSWORD = &amp;quot;secret&amp;quot;&lt;br /&gt;
&lt;br /&gt;
VARS = {&lt;br /&gt;
    &amp;quot;ups.status&amp;quot;: &amp;quot;OL&amp;quot;,&lt;br /&gt;
    &amp;quot;battery.charge&amp;quot;: &amp;quot;100&amp;quot;,&lt;br /&gt;
    &amp;quot;battery.charge.low&amp;quot;: &amp;quot;10&amp;quot;,&lt;br /&gt;
    &amp;quot;battery.charge.warning&amp;quot;: &amp;quot;20&amp;quot;,&lt;br /&gt;
    &amp;quot;battery.runtime&amp;quot;: &amp;quot;3600&amp;quot;,&lt;br /&gt;
    &amp;quot;battery.runtime.low&amp;quot;: &amp;quot;300&amp;quot;,&lt;br /&gt;
    &amp;quot;battery.voltage&amp;quot;: &amp;quot;26.9&amp;quot;,&lt;br /&gt;
    &amp;quot;battery.voltage.nominal&amp;quot;: &amp;quot;24&amp;quot;,&lt;br /&gt;
    &amp;quot;input.voltage&amp;quot;: &amp;quot;230.0&amp;quot;,&lt;br /&gt;
    &amp;quot;input.voltage.nominal&amp;quot;: &amp;quot;230&amp;quot;,&lt;br /&gt;
    &amp;quot;output.voltage&amp;quot;: &amp;quot;230.0&amp;quot;,&lt;br /&gt;
    &amp;quot;ups.load&amp;quot;: &amp;quot;25&amp;quot;,&lt;br /&gt;
    &amp;quot;ups.mfr&amp;quot;: &amp;quot;FakeNUT&amp;quot;,&lt;br /&gt;
    &amp;quot;ups.model&amp;quot;: &amp;quot;FakeQNAPUPS&amp;quot;,&lt;br /&gt;
    &amp;quot;device.type&amp;quot;: &amp;quot;ups&amp;quot;,&lt;br /&gt;
    &amp;quot;device.model&amp;quot;: &amp;quot;FakeQNAPUPS&amp;quot;,&lt;br /&gt;
    &amp;quot;driver.name&amp;quot;: &amp;quot;dummy-ups&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
def ts():&lt;br /&gt;
    return datetime.datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def log(msg):&lt;br /&gt;
    print(f&amp;quot;[{ts()}] {msg}&amp;quot;, flush=True)&lt;br /&gt;
&lt;br /&gt;
def send_line(conn, addr, line):&lt;br /&gt;
    log(f&amp;quot;{addr} &amp;lt;&amp;lt; {line}&amp;quot;)&lt;br /&gt;
    conn.sendall((line + &amp;quot;\n&amp;quot;).encode())&lt;br /&gt;
&lt;br /&gt;
def normalize_ups_name(name: str) -&amp;gt; str:&lt;br /&gt;
    if name in UPS_ALIASES:&lt;br /&gt;
        return name&lt;br /&gt;
    return PRIMARY_UPSNAME&lt;br /&gt;
&lt;br /&gt;
def handle_client(conn, addr_tuple):&lt;br /&gt;
    addr = f&amp;quot;{addr_tuple[0]}:{addr_tuple[1]}&amp;quot;&lt;br /&gt;
    log(f&amp;quot;[+] CONNECT {addr}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    authed_user = None&lt;br /&gt;
    authed_pass = None&lt;br /&gt;
    logged_in = False&lt;br /&gt;
    tls_started = False&lt;br /&gt;
&lt;br /&gt;
    f = conn.makefile(&amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;, newline=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    try:&lt;br /&gt;
        for raw in f:&lt;br /&gt;
            line = raw.strip()&lt;br /&gt;
            if not line:&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            log(f&amp;quot;{addr} &amp;gt;&amp;gt; {line}&amp;quot;)&lt;br /&gt;
            parts = line.split()&lt;br /&gt;
            cmd = parts[0].upper()&lt;br /&gt;
&lt;br /&gt;
            if cmd == &amp;quot;VER&amp;quot;:&lt;br /&gt;
                send_line(conn, addr, &amp;quot;Network UPS Tools upsd 2.8.0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif cmd == &amp;quot;NETVER&amp;quot;:&lt;br /&gt;
                send_line(conn, addr, &amp;quot;2.8.0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif cmd == &amp;quot;PROTVER&amp;quot;:&lt;br /&gt;
                send_line(conn, addr, &amp;quot;1.3&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif cmd == &amp;quot;STARTTLS&amp;quot;:&lt;br /&gt;
                tls_started = True&lt;br /&gt;
                send_line(conn, addr, &amp;quot;ERR FEATURE-NOT-CONFIGURED&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif cmd == &amp;quot;LIST&amp;quot; and len(parts) &amp;gt;= 2 and parts[1].upper() == &amp;quot;UPS&amp;quot;:&lt;br /&gt;
                send_line(conn, addr, &amp;quot;BEGIN LIST UPS&amp;quot;)&lt;br /&gt;
                send_line(conn, addr, f'UPS qnapups &amp;quot;Fake QNAP UPS&amp;quot;')&lt;br /&gt;
                send_line(conn, addr, f'UPS ups &amp;quot;Fake Synology Default UPS&amp;quot;')&lt;br /&gt;
                send_line(conn, addr, &amp;quot;END LIST UPS&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif cmd == &amp;quot;USERNAME&amp;quot; and len(parts) &amp;gt;= 2:&lt;br /&gt;
                authed_user = parts[1]&lt;br /&gt;
                send_line(conn, addr, &amp;quot;OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif cmd == &amp;quot;PASSWORD&amp;quot; and len(parts) &amp;gt;= 2:&lt;br /&gt;
                authed_pass = parts[1]&lt;br /&gt;
                send_line(conn, addr, &amp;quot;OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif cmd == &amp;quot;LOGIN&amp;quot; and len(parts) &amp;gt;= 2:&lt;br /&gt;
                upsname = parts[1]&lt;br /&gt;
                if upsname in UPS_ALIASES and authed_user == USERNAME and authed_pass == PASSWORD:&lt;br /&gt;
                    logged_in = True&lt;br /&gt;
                    send_line(conn, addr, &amp;quot;OK&amp;quot;)&lt;br /&gt;
                else:&lt;br /&gt;
                    send_line(conn, addr, &amp;quot;ERR ACCESS-DENIED&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif cmd in (&amp;quot;MASTER&amp;quot;, &amp;quot;PRIMARY&amp;quot;) and len(parts) &amp;gt;= 2:&lt;br /&gt;
                upsname = parts[1]&lt;br /&gt;
                if logged_in and upsname in UPS_ALIASES:&lt;br /&gt;
                    send_line(conn, addr, &amp;quot;OK&amp;quot;)&lt;br /&gt;
                else:&lt;br /&gt;
                    send_line(conn, addr, &amp;quot;ERR ACCESS-DENIED&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif cmd == &amp;quot;GET&amp;quot; and len(parts) &amp;gt;= 4 and parts[1].upper() == &amp;quot;VAR&amp;quot;:&lt;br /&gt;
                ups = parts[2]&lt;br /&gt;
                var = &amp;quot; &amp;quot;.join(parts[3:])&lt;br /&gt;
&lt;br /&gt;
                if ups not in UPS_ALIASES:&lt;br /&gt;
                    send_line(conn, addr, &amp;quot;ERR UNKNOWN-UPS&amp;quot;)&lt;br /&gt;
                elif var in VARS:&lt;br /&gt;
                    resp_ups = normalize_ups_name(ups)&lt;br /&gt;
                    send_line(conn, addr, f'VAR {resp_ups} {var} &amp;quot;{VARS[var]}&amp;quot;')&lt;br /&gt;
                else:&lt;br /&gt;
                    send_line(conn, addr, &amp;quot;ERR VAR-NOT-SUPPORTED&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif cmd == &amp;quot;LIST&amp;quot; and len(parts) &amp;gt;= 3 and parts[1].upper() == &amp;quot;VAR&amp;quot;:&lt;br /&gt;
                ups = parts[2]&lt;br /&gt;
&lt;br /&gt;
                if ups not in UPS_ALIASES:&lt;br /&gt;
                    send_line(conn, addr, &amp;quot;ERR UNKNOWN-UPS&amp;quot;)&lt;br /&gt;
                else:&lt;br /&gt;
                    resp_ups = normalize_ups_name(ups)&lt;br /&gt;
                    send_line(conn, addr, f&amp;quot;BEGIN LIST VAR {resp_ups}&amp;quot;)&lt;br /&gt;
                    for k, v in VARS.items():&lt;br /&gt;
                        send_line(conn, addr, f'VAR {resp_ups} {k} &amp;quot;{v}&amp;quot;')&lt;br /&gt;
                    send_line(conn, addr, f&amp;quot;END LIST VAR {resp_ups}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif cmd == &amp;quot;HELP&amp;quot;:&lt;br /&gt;
                send_line(conn, addr, &amp;quot;OK Commands: VER NETVER PROTVER STARTTLS LIST USERNAME PASSWORD LOGIN GET LOGOUT&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            elif cmd == &amp;quot;LOGOUT&amp;quot;:&lt;br /&gt;
                send_line(conn, addr, &amp;quot;OK Goodbye&amp;quot;)&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
            else:&lt;br /&gt;
                send_line(conn, addr, &amp;quot;ERR UNKNOWN-COMMAND&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        log(f&amp;quot;[!] ERROR {addr}: {e}&amp;quot;)&lt;br /&gt;
    finally:&lt;br /&gt;
        log(f&amp;quot;[-] DISCONNECT {addr} tls={tls_started} logged_in={logged_in}&amp;quot;)&lt;br /&gt;
        try:&lt;br /&gt;
            conn.close()&lt;br /&gt;
        except Exception:&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    log(f&amp;quot;Starting Fake NUT DEBUG server on {HOST}:{PORT}&amp;quot;)&lt;br /&gt;
    log(f&amp;quot;Accepted UPS names: {', '.join(sorted(UPS_ALIASES))}&amp;quot;)&lt;br /&gt;
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    s.bind((HOST, PORT))&lt;br /&gt;
    s.listen(20)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        conn, addr = s.accept()&lt;br /&gt;
        threading.Thread(target=handle_client, args=(conn, addr), daemon=True).start()&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripts]]&lt;/div&gt;</summary>
		<author><name>\dev\null</name></author>
	</entry>
</feed>