#!/usr/bin/env python3 from asyncio.log import logger import paho.mqtt.client as mqtt from getmac import get_mac_address import platform import socket import re import subprocess import os import json import sys import time import json import datetime import ctypes import getopt import random import requests import shutil if os.path.exists("/etc/mqtt_srv/mqtt_srv.cfg"): with open("/etc/mqtt_srv/mqtt_srv.cfg") as json_file: config = json.load(json_file) print(config) else: config = {} #import psutil stats = {} VERSION = "1.0.37" curos = platform.system() host = platform.node().lower().replace(".home.lan","") if curos == "Windows": log_path = "c:\\Program Files\\jaydee\\jaydee.log" else: log_path = "/tmp/mqtt_srv.log" def writeLog(msg, svr="INFO"): ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") ts2 = datetime.datetime.now().strftime("%Y%m%d%H%M%S") f = open(log_path, "a") f.write(ts + " | " + svr + " | " + str(msg) + "\n") f.close() writeLog(host) if curos == "Windows": import winreg def uptime(): try: f = open( "/proc/uptime" ) contents = f.read().split() f.close() except: return "Cannot open uptime file: /proc/uptime" total_seconds = float(contents[0]) # Helper vars: MINUTE = 60 HOUR = MINUTE * 60 DAY = HOUR * 24 # Get the days, hours, etc: days = int( total_seconds / DAY ) hours = int( ( total_seconds % DAY ) / HOUR ) minutes = int( ( total_seconds % HOUR ) / MINUTE ) seconds = int( total_seconds % MINUTE ) # Build up the pretty string (like this: "N days, N hours, N minutes, N seconds") string = "" # if days > 0: # string += str(days) + " " + (days == 1 and "d" or "d" ) + ", " # if len(string) > 0 or hours > 0: # string += str(hours) + " " + (hours == 1 and "h" or "h" ) + ", " # if len(string) > 0 or minutes > 0: # string += str(minutes) + " " + (minutes == 1 and "m" or "m" ) + ", " if days > 0: string += str(days) + " " + (days == 1 and "d" or "d" ) + ", " if len(string) > 0 or hours > 0: string += str(hours) + ":" if len(string) > 0 or minutes > 0: string += str(minutes) + ":" string += str(seconds) return string; ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") ts2 = datetime.datetime.now().strftime("%Y%m%d%H%M%S") if os.path.exists(log_path): shutil.move(log_path, log_path + "." + ts2) def check_router(): stats["uptime"] = uptime() stats["version"] = VERSION stats["status"] = "on" cmnd = "crontab -l" status, output = subprocess.getstatusoutput(cmnd) if "#Skynet_banmalware#" in output: stats["skynet"] = "On" else: stats["skynet"] = "Off" if "#Diversion_CountAds#" in output: stats["diversion"] = "On" else: stats["diversion"] = "Off" cmnd = "nvram get vpn_client1_state" status, output = subprocess.getstatusoutput(cmnd) writeLog("VpnClient1 Status : " + str(output)) stats["vpnclient1"] = "On" if output == "2" else "Off" cmnd = "nvram get vpn_client2_state" status, output = subprocess.getstatusoutput(cmnd) writeLog("VpnClient2 Status : " + str(output)) stats["vpnclient2"] = "On" if output == "2" else "Off" cmnd = "nvram get vpn_server1_state" status, output = subprocess.getstatusoutput(cmnd) writeLog("VpnServer1 Status : " + str(output)) stats["vpnserver1"] = "On" if output == "2" else "Off" cmnd = "ncat -z 192.168.77.106 25" status, output = subprocess.getstatusoutput(cmnd) if status == 0: stats["mail_nas"] = "available" else: stats["mail_nas"] = "unavailable" cmnd = "ncat -z 192.168.77.246 25" status, output = subprocess.getstatusoutput(cmnd) if status == 0: stats["mail_rasp"] = "available" else: stats["mail_rasp"] = "unavailable" cmnd = "nvram get vts_rulelist" status, output = subprocess.getstatusoutput(cmnd) rule_data = output.split("<") serv_d = {} for l in rule_data: rul = l.split(">") if len(rul) > 3: if rul[0] == "HTTPS": serv_d[rul[0]] = {"src_port":rul[1],"dest_ip":rul[2],"dest_port":rul[3],"prot":rul[4]} stats["serv_dest"] = rul[2] break #stats["serv_dest"] = json.dumps(serv_d) #stats["serv_dest"] = json.dumps(serv_d) #out = subprocess.Popen(cmnd.split()) #status, output = subprocess.getstatusoutput(cmnd) ''' print("Getting fw info") cmnd = "/root/router_cmd.sh -t firewall -n TOSHIBA-WIFI -m get" #out = subprocess.Popen(cmnd.split()) status, output = subprocess.getstatusoutput(cmnd) print(output) stats["fw"] = output #client.publish("sectorq/systems/router/fw", payload=str(output), qos=0, retain=True) print("Getting wifi info") cmnd = "/root/router_cmd.sh -t wireless -m get" #out = subprocess.Popen(cmnd.split()) status, output = subprocess.getstatusoutput(cmnd) print(output) if output != 'allow': output = 'off' stats["macfilter"] = output # if output == "allow":\ writeLog("Payload : " + str(json.dumps(stats))) ''' client.publish("home-assistant/router/hwstats", json.dumps(stats), qos=0, retain=True) #client.publish("sectorq/systems/router/stats", payload=json.dumps(stats), qos=0, retain=True) #else: # client.publish("sectorq/systems/router/macfilter", payload=0, qos=0, retain=True) if host != "router" and host != "nas": import psutil processes = list(p.name() for p in psutil.process_iter()) # print(processes) count = processes.count("mqtt_srv.exe") if int(count) >= 3: writeLog("script exist") sys.exit() else: cmnd = "ps |grep mqtt_srv.py|grep -v grep |wc -l" status, output = subprocess.getstatusoutput(cmnd) count = output if int(count) >= 2: writeLog("script exist") sys.exit() # Stops duplicate instance from running writeLog(count) writeLog("Starting : " + str(VERSION)) writeLog("Getting running proccesses", "DEBUG") writeLog("done", "DEBUG") FILE_TIMESTAMP = os.path.getmtime(sys.argv[0]) def get_sys_env(name): key = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE, r"System\CurrentControlSet\Control\Session Manager\Environment") return winreg.QueryValueEx(key, name)[0] def get_user_env(name): key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, r"Environment") return winreg.QueryValueEx(key, name)[0] _PUBLISH = _SETVAR = False try: opts, args = getopt.getopt(sys.argv[1:], "Sspmt:", ["command=", "help", "output="]) except getopt.GetoptError as err: # print help information and exit: writeLog(str(err)) # will print something like "option -a not recognized" #usage() sys.exit(2) output = None # QJ : getopts for o, a in opts: if o == "-d": _ACTION = True elif o in ("-p", "--publish"): _PUBLISH = True elif o in ("-m", "--publish"): _MESSAGE = a elif o in ("-t", "--publish"): _TOPIC = a elif o in ("-S", "--setvar"): _SETVAR = True _THR_NAME = sys.argv[2] _THR_VAL = sys.argv[3] else: _WIZZARD = True MQTT_HOST = "mqtt.home.lan" MQTT_PORT = 1883 if _PUBLISH: # generate client ID with pub prefix randomly #client_id = f'python-mqtt-{random.randint(0, 1000)}' client_id = 'python-mqtt-1004' username = 'jaydee' password = 'jaydee1' def connect_mqtt(): def on_connect(client, userdata, flags, rc): if rc == 0: print("Connected to MQTT Broker!") else: print("Failed to connect, return code %d\n", rc) client = mqtt.Client(client_id) client.username_pw_set(username, password) client.on_connect = on_connect client.connect(MQTT_HOST, MQTT_PORT) return client def publish(client): result = client.publish(_TOPIC, _MESSAGE) # result: [0, 1] status = result[0] if status == 0: writeLog(f"Send `{_MESSAGE}` to topic `{_TOPIC}`") else: writeLog(f"Failed to send message to topic {_TOPIC}") client = connect_mqtt() publish(client) sys.exit() if _SETVAR: #myCmd = "setx " + _THR_NAME + " " + _THR_VAL + " -m" myCmd = "setx " + _THR_NAME + " " + _THR_VAL subprocess.Popen(myCmd.split(), shell=True) sys.exit() from ping3 import ping, verbose_ping ''' curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python get-pip.py pip3 install getmac pip3 install paho.mqttdasdas """ ''' writeLog("Starting daemon in versin : " + VERSION) VERS = '1.3' ''' print("pinging") lala = ping(MQTT_HOST) connected = 0 while connected == 0: if type(lala) == float: print("Oleee connected") writeLog("Mqtt connected", "INFO") connected = 1 else: print("blaaah not connected, waiting...(5)") writeLog("blaaah not connected, waiting...(5)") time.sleep(5) lala = ping(MQTT_HOST) ''' # Function to display hostname and # IP address def get_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # doesn't even have to be reachable s.connect(('192.168.77.1', 1)) IP = s.getsockname()[0] except ValueError: IP = '127.0.0.1' finally: s.close() return IP ex = 0 while ex == 0: try: IP = get_ip() ex = 1 except: time.sleep(5) writeLog("OS : " + curos) if curos != "Windows": import autorandr else: import winreg if host == "raspberrypi": mac = str(get_mac_address("eth0")) elif host == "SERVER": mac = str(get_mac_address("enp2s0")) elif host == "ASUS" and curos != "Windows": mac = str(get_mac_address("enp3s0f1")) elif host == "morefine" and curos != "Windows": mac = str(get_mac_address("eno1")) else: mac = str(get_mac_address("Ethernet")) writeLog("MAC : " + mac) writeLog("SYSTEM : " + host) writeLog("IP : " + IP) flag_connected = 0 # The callback for when the client receives a CONNACK response from the server. def on_connect(client, userdata, flags, rc): writeLog("Connected with result code " + str(rc)) global flag_connected flag_connected = 1 # Subscribing in on_connect() means that if we lose the connection and # reconnect then subscriptions will be renewed. topic = "sectorq/systems/" + host.lower() topic2 = "sectorq/systems/all" MQTT_TOPIC = [(topic,0),(topic2,0)] writeLog(topic) time.sleep(1) client.publish("sectorq/status", payload="{'action':'connect', 'system':'" + host.lower() + "', 'ip': '" + IP + "', 'mac':'" + mac + "', 'ver':'" + VERS + "'}", qos=0, retain=False) client.publish("sectorq/systems/" + host.lower() + "/stat", payload="on", qos=0, retain=True) if host.lower() == "router": check_router() if host.lower() == "nas": cmnd = "/share/ZFS532_DATA/.qpkg/QKVM/usr/bin/virsh list --all" writeLog(cmnd) status, output = subprocess.getstatusoutput(cmnd) l = 1 lines = output.splitlines() VMS = {} for i in lines: l = l + 1 if l < 4: continue line = re.split(r" {2,}", i) writeLog(str(line[0].strip()) + " " + str(line[1].strip()) + " " + str(line[2].strip())) VMS[str(line[1].strip())] = str(line[2].strip()) for m in VMS: cmnd = "/share/ZFS532_DATA/.qpkg/QKVM/usr/bin/virsh domstate " + m #out = subprocess.Popen(cmnd.split()) writeLog(cmnd) status, output = subprocess.getstatusoutput(cmnd) writeLog(output) if output.strip() == "running": client.publish("sectorq/systems/nas/" + m, payload=1, qos=0, retain=True) else: client.publish("sectorq/systems/nas/" + m, payload=0, qos=0, retain=True) client.subscribe(MQTT_TOPIC) def on_disconnect(client, userdata, rc): writeLog("disconnecting reason " +str(rc)) client.connected_flag=False client.disconnect_flag=True global flag_connected flag_connected = 0 # The callback for when a PUBLISH message is received from the server. def on_message(client, userdata, msg): writeLog(msg.topic) writeLog(msg.payload) myObj = msg.payload.decode('utf-8') # command = re.sub(r"^b\'|\'$", "", str(msg.payload)) # command = json.loads(msg.payload.decode("utf-8")) try: myObj = json.loads(msg.payload) try: writeLog(myObj["action"]) except: writeLog("Action not set", "WARNING") try: writeLog(myObj["cmd"]) except: writeLog("Cmd not set", "WARNING") try: writeLog(myObj["target"]) except: writeLog("Target Not Set", "WARNING") try: writeLog(myObj["status"]) except: writeLog("Status Not Set") try: writeLog(myObj["command"]) except: writeLog("Command Not Set") try: writeLog(myObj["cmd_line"]) except: writeLog("Cmd_line Not Set") if myObj["cmd"] == "command": writeLog("Executing " + myObj["cmd_line"]) #os.system('start /b "' + myObj["cmd_line"] + '"') try: subprocess.Popen(myObj["cmd_line"].split(), shell=True) #subprocess.Popen(myObj["cmd_line"].split()) # ctypes.windll.user32.MessageBoxW(0, myObj["cmd_line"], "Executed", 64) except: ctypes.windll.user32.MessageBoxW(0, "Your text", "Your title", 16) writeLog("Executed " + myObj["cmd_line"]) if myObj["cmd"] == "nas_cmd": writeLog("Executing NAS") #cmnd = "/share/ZFS530_DATA/.qpkg/QKVM/usr/bin/virsh domstate " + str(myObj["target"]) cmnd = "/share/ZFS532_DATA/.qpkg/QKVM/usr/bin/virsh domstate " + str(myObj["target"]) writeLog(cmnd) status, output = subprocess.getstatusoutput(cmnd) writeLog(output) cmd_type = myObj["command"] if myObj["command"] == "start": if output.strip() == "paused": writeLog("System suspended") cmd_type = "resume" else: writeLog("System Off") cmd_type = "start" if myObj["command"] == "suspend": cmd_type = "shutdown" cmnd = "/share/ZFS532_DATA/.qpkg/QKVM/usr/bin/virsh " + cmd_type + " " + str(myObj["target"]) subprocess.Popen(cmnd.split()) writeLog(cmnd) if myObj["command"] == "start": try: writeLog("sending") client.publish("sectorq/systems/nas/" + str(myObj["target"]), payload=1, qos=0, retain=False) except: writeLog("failed to execute!") client.publish("sectorq/systems/nas/" + str(myObj["target"]), payload="failed", qos=0, retain=False) else: try: writeLog("sending") client.publish("sectorq/systems/nas/" + str(myObj["target"]), payload=0, qos=0, retain=False) except: writeLog("failed to execute!") client.publish("sectorq/systems/nas/" + str(myObj["target"]), payload="failed", qos=0, retain=False) if myObj["cmd"] == "distrib": writeLog("distributin313g") # os.startfile(sys.argv[0]) #sys.exit() subprocess.Popen(['/bin/systemctl', 'restart', 'mqtt']) if myObj["cmd"] == "uci": print("uci1") print("Executing " + myObj["cmd_line"]) writeLog("Executing " + myObj["cmd_line"]) if myObj["cmd_line"] == "wireless1": cmnd = "/root/router_cmd.sh -t wireless -v 1 -m set" try: subprocess.Popen(cmnd.split()) print("sending") stats["macfilter"] = "allow" client.publish("sectorq/systems/router/stats", payload=json.dumps(stats), qos=0, retain=False) writeLog("Payload : " + json.dumps(stats)) except: print("failed to execute!") client.publish("sectorq/systems/router/stats", payload="failed", qos=0, retain=False) elif myObj["cmd_line"] == "wireless0": cmnd = "/root/router_cmd.sh -t wireless -v 0 -m set" try: subprocess.Popen(cmnd.split()) print("sending") stats["macfilter"] = "off" client.publish("sectorq/systems/router/stats", payload=json.dumps(stats), qos=0, retain=False) writeLog("Payload : " + json.dumps(stats)) except: print("failed to execute!") client.publish("sectorq/systems/router/stats", payload="failed", qos=0, retain=False) elif myObj["cmd_line"] == "fw0": cmnd = "/root/router_cmd.sh -t firewall -n TOSHIBA-WIFI -p enabled -v 0 -m set" try: subprocess.Popen(cmnd.split()) print("sending") stats["fw"] = 0 client.publish("sectorq/systems/router/stats", payload=json.dumps(stats), qos=0, retain=False) writeLog("Payload : " + json.dumps(stats)) except: print("failed to execute!") client.publish("sectorq/systems/router/stats", payload="failed", qos=0, retain=False) elif myObj["cmd_line"] == "fw1": cmnd = "/root/router_cmd.sh -t firewall -n TOSHIBA-WIFI -p enabled -v 1 -m set" try: #subprocess.Popen(myObj["cmd_line"].split(), shell=True) subprocess.Popen(cmnd.split()) # ctypes.windll.user32.MessageBoxW(0, myObj["cmd_line"], "Executed", 64) print("sending") stats["fw"] = 1 client.publish("sectorq/systems/router/stats", payload=json.dumps(stats), qos=0, retain=False) writeLog("Payload : " + json.dumps(stats)) except: print("failed to execute!") client.publish("sectorq/systems/router/stats", payload="failed", qos=0, retain=False) elif myObj["cmd_line"] == "openvpn": cmnd = "service {}".format(myObj["target"]) print(cmnd) status, output = subprocess.getstatusoutput(cmnd) elif myObj["cmd_line"] == "serv_dest": writeLog("Payload111111 : " + myObj["target"].lower()) cmnd = "nvram get vts_rulelist" status, output = subprocess.getstatusoutput(cmnd) rule_data = output.split("<") serv_d = {} writeLog("Payload111112") for l in rule_data: rul = l.split(">") if len(rul) > 3: serv_d[rul[0]] = {"src_port":rul[1],"dest_ip":rul[2],"dest_port":rul[3],"prot":rul[4]} stats["serv_dest"] = rul[2] writeLog("Payload111113") rules = {"HTTPS":{"dest_ip":"192.168.77.106","src_port":443,"dest_port":443,"prot":"TCP"}, "HTTP":{"dest_ip":"192.168.77.106","src_port":80,"dest_port":80,"prot":"TCP"}, "EMAIL_25":{"dest_ip":"192.168.77.106","src_port":25,"dest_port":25,"prot":"TCP"}, "EMAIL_465":{"dest_ip":"192.168.77.106","src_port":465,"dest_port":465,"prot":"TCP"}, "EMAIL_993":{"dest_ip":"192.168.77.106","src_port":993,"dest_port":993,"prot":"TCP"}, "EMAIL_995":{"dest_ip":"192.168.77.106","src_port":995,"dest_port":995,"prot":"TCP"}, "EMAIL_587":{"dest_ip":"192.168.77.106","src_port":587,"dest_port":587,"prot":"TCP"}, "EMAIL_143":{"dest_ip":"192.168.77.106","src_port":143,"dest_port":143,"prot":"TCP"}} writeLog("Payload1111135") print(json.dumps(serv_d)) for r in rules: print(r) try: serv_d[r]["dest_ip"] = myObj["target"] except: serv_d[r] = rules[r] lala = [] for sr in serv_d: lala.append("{}>{}>{}>{}>{}>".format(sr,serv_d[sr]["src_port"],serv_d[sr]["dest_ip"],serv_d[sr]["dest_port"],serv_d[sr]["prot"])) la = "<".join(lala) la = "<{}".format(la) print(la) cmnd = "nvram set vts_rulelist=\"{}\"".format(la) print(cmnd) status, output = subprocess.getstatusoutput(cmnd) cmnd = "nvram commit" status, output = subprocess.getstatusoutput(cmnd) cmnd = "service restart_firewall" status, output = subprocess.getstatusoutput(cmnd) writeLog("Payload111114") writeLog(output) print(json.dumps(serv_d)) if myObj["cmd"] == "banip": if myObj["status"] == "ban": cmnd = "echo " + str(myObj["target"]) + " >> /etc/banip/banip.blacklist; /etc/init.d/banip refresh" elif myObj["status"] == "enable": cmnd = "/etc/init.d/banip resume" stats["banip"] = "enabled" elif myObj["status"] == "disable": cmnd = "/etc/init.d/banip suspend" stats["banip"] = "paused" writeLog(cmnd) status, output = subprocess.getstatusoutput(cmnd) client.publish("sectorq/systems/router/stats", payload=json.dumps(stats), qos=0, retain=True) if myObj["cmd"] == "vnc": print(myObj["target"]) writeLog(myObj["target"]) # os.startfile(sys.argv[0]) #sys.exit() myCmd = 'c:\\Program Files\\RealVNC\\VNC Viewer\\vncviewer.exe C:\\Users\\jaydee\\' + myObj["target"].upper() + '.vnc' writeLog(myCmd) subprocess.Popen(myCmd.split()) if myObj["cmd"] == "getstats": print("lalaa1") try: client.publish("sectorq/monitor/" + host.lower(), payload="{\"mb_temp\":" + get_user_env('mb_temp') + ",\"mem_usage\":" + get_user_env('mem_usage') + ",\"cpu_temp\":" + get_user_env('cpu_temp') + ",\"cpu_usage\":" + get_user_env('cpu_usage') + ",\"gpu_temp\":" + get_user_env('gpu_temp') + ",\"gpu_usage\":" + get_user_env('gpu_usage') + "}", qos=0, retain=False) print("ok") except: print("failed") client.publish("sectorq/monitor/" + host.lower(), payload="{\"mb_temp\":0,\"mem_usage\":0,\"cpu_temp\":0,\"cpu_usage\":0,\"gpu_temp\":0,\"gpu_usage\":0}", qos=0, retain=False) print("lalaa2") if myObj["cmd"] == "openrgb": myCmd = 'powershell.exe -windowstyle hidden -command Stop-ScheduledTask -TaskName "jaydee\\OpenRGB"' writeLog(myCmd) subprocess.Popen(myCmd.split()) time.sleep(2) myCmd = 'powershell.exe -windowstyle hidden -command Start-ScheduledTask -TaskName "jaydee\\OpenRGB"' writeLog(myCmd) subprocess.Popen(myCmd.split()) if myObj["cmd"] == "hyperion": myCmd = 'powershell.exe -windowstyle hidden -command Start-ScheduledTask -TaskName "jaydee\\hyperion"' writeLog(myCmd) subprocess.Popen(myCmd.split()) if myObj["cmd"] == "hyperiond": myCmd = 'powershell.exe -windowstyle hidden -command Start-ScheduledTask -TaskName "jaydee\\hyperiond"' writeLog(myCmd) subprocess.Popen(myCmd.split()) if myObj["cmd"] == "assist": writeLog("Starting Assist") if curos == "Windows": if myObj['target'] == "start": myCmd =f'powershell "& ""c:\\Program Files\\jaydee\\vol_control.ps1""" 0.2' else: myCmd =f'powershell "& ""c:\\Program Files\\jaydee\\vol_control.ps1""" 1' else: if myObj['target'] == "start": myCmd =f'amixer set Master mute' else: myCmd =f'amixer set Master unmute' output = subprocess.run(["amixer", "sset", "Master", "mute"], check=True) writeLog(output) writeLog(myCmd) output = subprocess.Popen(myCmd, shell=True) writeLog(output) if myObj["cmd"] == "display": if curos == "Windows": myCmd =f"powershell -w h -command \" Import-Module DisplayConfig ; Import-Clixml $home\\monitors\\{myObj['target']}.xml | Use-DisplayConfig -UpdateAdapterIds \"" writeLog(myCmd) #myCmd = f"MultiMonitorTool.exe /LoadConfig \"c:\\Program Files\\jaydee\\Monitors\\{myObj["target"]}.cfg\"" #writeLog(myCmd) #print(myCmd) output = subprocess.Popen(myCmd, shell=True) #output = subprocess.Popen(myCmd.split()) writeLog(output) else: ''' myCmd = "" if myObj["target"] == "mid": myCmd = "xrandr --output HDMI-2 --primary --auto --mode 1920x1080 --output DVI-I-2-1 --off --output HDMI-1 --off --output eDP-1 --off" elif myObj["target"] == "all": myCmd = "xrandr --output HDMI-2 --primary --auto --mode 1920x1080 --output DVI-I-2-1 --auto --above HDMI-2 --mode 1920x1080 --output HDMI-1 --auto --left-of HDMI-2 --mode 1920x1080 --output eDP-1 --auto --right-of HDMI-2 --mode 1920x1080" elif myObj["target"] == "midleft": myCmd = "xrandr --output HDMI-2 --primary --auto --mode 1920x1080 --output DVI-I-2-1 --off --output HDMI-1 --auto --left-of HDMI-2 --mode 1920x1080 --output eDP-1 --off" elif myObj["target"] == "midtop": myCmd = "xrandr --output HDMI-2 --primary --auto --mode 1920x1080 --output DVI-I-2-1 --auto --above HDMI-2 --mode 1920x1080 --output HDMI-1 --off --output eDP-1 --off" elif myObj["target"] == "midleftbuild": myCmd = "xrandr --output HDMI-2 --primary --auto --mode 1920x1080 --output DVI-I-2-1 --off --output HDMI-1 --auto --left-of HDMI-2 --mode 1920x1080 --output eDP-1 --auto --right-of HDMI-2 --mode 1920x1080" elif myObj["target"] == "midbuild": myCmd = "xrandr --output HDMI-2 --primary --auto --mode 1920x1080 --output DVI-I-2-1 --off --output HDMI-1 --off --output eDP-1 --auto --right-of HDMI-2 --mode 1920x1080" elif myObj["target"] == "midlefttop": myCmd = "xrandr --output HDMI-2 --primary --auto --mode 1920x1080 --output DVI-I-2-1 --auto --above HDMI-2 --mode 1920x1080 --output HDMI-1 --auto --left-of HDMI-2 --mode 1920x1080 --output eDP-1 --off" else: pass if myCmd != "": print(myCmd) subprocess.Popen(myCmd.split()) ''' myCmd = "" writeLog(myObj["target"]) if curos == "Windows1": myCmd = "DisplayFusionCommand.exe -monitorloadprofile {}".format(myObj["target"]) else: ''' mon1 = "HDMI-1-1" mon2 = "HDMI-1-2" mon3 = "DisplayPort-0" mon4 = "DisplayPort-8" ''' # right = ["HDMI-A-0", "1920x1080"] # tleft = ["DisplayPort-6", "1920x1080"] # tright = ["DisplayPort-8", "1920x1080"] # left = ["DisplayPort-7", "2560x1440"] # mid = ["DisplayPort-0", "3440x1440"] right = config['morefine']['right'] tleft = config['morefine']['tleft'] tright = config['morefine']['tright'] left = config['morefine']['left'] mid = config['morefine']['mid'] myCmd = "bash /myapps/mqtt_srv/get_monitors.sh" status, output = subprocess.getstatusoutput(myCmd) f = open( "/tmp/monitors.txt" ) contents = f.read().splitlines() f.close() writeLog(contents) for i in contents: writeLog(i) d = i.split(";") if len(d) < 2: continue writeLog(d[1]) if d[1] == "DELL P3421W": mid[0] = d[0] elif d[1] == "VG27WQ": left[0] = d[0] elif d[1] == "PHL 243V5": tleft[0] = d[0] elif d[1] == "PHL 273V7": tright[0] = d[0] writeLog("dpc") writeLog(contents) #xrandr --output DisplayPort-1 --primary --auto --mode 3440x1440 --output HDMI-A-0 --auto --left-of DVI-I-1-1 --mode 1920x1080 --output DisplayPort-0 --auto --left-of DisplayPort-1 --mode 2560x1440 --output DVI-I-1-1 --above DisplayPort-1 --mode 1920x1080 if myObj["target"] == "mid": myCmd = f"xrandr --output {mid[0]} --primary --auto --mode {mid[1]} --output {left[0]} --off --output {tleft[0]} --off --output {tright[0]} --off" elif myObj["target"] == "left": myCmd = f"xrandr --output {left[0]} --primary --auto --mode {left[1]} --output {mid[0]} --off --output {tleft[0]} --off --output {tright[0]} --off" elif myObj["target"] == "all": myCmd = f"xrandr --output {mid[0]} --primary --auto --mode {mid[1]} --pos 0x0 --output {tleft[0]} --auto --pos -1920x-1080 --mode {tleft[1]} --output {left[0]} --auto --left-of {mid[0]} --mode {left[1]} --output {tright[0]} --above {mid[0]} --mode {tright[1]}" elif myObj["target"] == "midtright": myCmd = f"xrandr --output {mid[0]} --primary --auto --mode {mid[1]} --pos 0x0 --output {tleft[0]} --off --output {left[0]} --off --output {tright[0]} --above {mid[0]} --mode {tright[1]}" #myCmd = f"xrandr --output {mid[0]} --primary --auto --mode {mid[1]} --output {right[0]} --auto --right-of {mid[0]} --mode {right[1]} --output {left[0]} --auto --left-of {mid[0]} --mode {left[1]}" elif myObj["target"] == "midleft": myCmd = f"xrandr --output {mid[0]} --primary --auto --mode {mid[1]} --output {tleft[0]} --off --output {left[0]} --auto --left-of {mid[0]} --mode {left[1]} --output {tright[0]} --off" elif myObj["target"] == "midtop": myCmd = f"xrandr --output {mid[0]} --primary --auto --mode {mid[1]} --output {tright[0]} --auto --above {mid[0]} --mode {tright[1]} --output {left[0]} --off --output {tleft[0]} --off" elif myObj["target"] == "midlefttleft": myCmd = f"xrandr --output {mid[0]} --primary --auto --mode {mid[1]} --pos 0x0 --output {tright[0]} --off --output {left[0]} --auto --left-of {mid[0]} --mode {left[1]} --output {tleft[0]} --auto --pos -1920x-1080 --mode {tleft[1]}" elif myObj["target"] == "lefttlefttright": myCmd = f"xrandr --output {mid[0]} --off --output {tleft[0]} --auto --pos 640x-1080 --mode {tright[1]} --output {left[0]} --primary --auto --mode {left[1]} --pos 0x0 --output {tright[0]} --right-of {tleft[0]} --mode {tright[1]}" elif myObj["target"] == "lefttleft": myCmd = f"xrandr --output {mid[0]} --off --output {tleft[0]} --auto --pos 640x-1080 --mode {tright[1]} --output {left[0]} --primary --auto --mode {left[1]} --pos 0x0 --output {tright[0]} --off" else: pass writeLog(myCmd) if myCmd != "": print(myCmd) writeLog("Executing : {myCmd}") #subprocess.Popen(myCmd.split()) for i in [1,2,3]: status, output = subprocess.getstatusoutput(myCmd) writeLog(output) writeLog(status) time.sleep(1) if myObj["cmd"] == "display2": # os.startfile(sys.argv[0]) #sys.exit() #print("reconfigure") subprocess.Popen(['MultiMonitorTool.exe', '/SaveConfig', 'c:\\Program Files\\jaydee\\switcher.cfg']) myCmd = "powershell switcher.ps1 " + str(myObj["target"]) + " " + str(myObj["status"]) writeLog(myCmd) subprocess.Popen(myCmd.split()) time.sleep(1) subprocess.Popen(['MultiMonitorTool.exe', '/LoadConfig', 'c:\\Program Files\\jaydee\\switcher.cfg']) client.publish("sectorq/feedback", payload='{"action":"resp", "source":"ASUS", "dev":{"display' + str(myObj["target"]) + '":'+ str(myObj["status"]) +'} }' , qos=0, retain=False) if myObj["cmd"] == "displ": print("Display") # os.startfile(sys.argv[0]) #sys.exit() subprocess.Popen(['/usr/bin/xrandr', '--output', 'HDMI-1-1', '--off']) if myObj["cmd"] == "xrandr": if curos == "Windows": subprocess.Popen(['MultiMonitorTool.exe', '/LoadConfig', 'c:\\Program Files\\jaydee\\all_on.cfg']) else: print("Display") # os.startfile(sys.argv[0]) #sys.exit() os.system("export DISPLAY=:0") subprocess.Popen(['/usr/bin/xrandr']) if myObj["cmd"] == "suspend": writeLog("suspending") if curos == "Windows": if host == "amd" or host == "amd1" or host == "morefine": #os.system("shutdown /s /t 1") os.system("shutdown /h") else: os.system("rundll32.exe powrprof.dll,SetSuspendState 0,1,0") #cmnd = "psshutdown -d -t 1" writeLog(cmnd) #status, output = subprocess.getstatusoutput(cmnd) #subprocess.Popen(["psshutdown", "-d", "-t", "1"]) #writeLog(output) else: if host == "nas" or host == "octopi": cmnd = "/sbin/poweroff" elif host in ["openmediavault", "omv","amd","rack"]: cmnd = "poweroff" elif host == "amd" or host == "ryzen": cmnd = "systemctl suspend" else: #subprocess.Popen(["/bin/systemctl", "suspend", "-i"]) #subprocess.Popen(["sudo", "pm-suspend"]) cmnd = "pm-suspend" writeLog(cmnd) #subprocess.Popen(cmnd) status, output = subprocess.getstatusoutput(cmnd) print(output) print(status) if myObj["cmd"] == "stats": grep = subprocess.Popen(['grep', 'cpu', '/proc/stat'], stdout=subprocess.PIPE, ) awk = subprocess.Popen(['awk', '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'], stdin=grep.stdout, stdout=subprocess.PIPE, ) # cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}' end_of_pipe = awk.stdout for line in end_of_pipe: # print(line.strip()) # usage = re.sub(r"^b\'|\'$", "", (line.strip())) cpu = round(float(line.strip().decode("utf-8"))) free = subprocess.Popen(['free'], stdout=subprocess.PIPE, ) grep = subprocess.Popen(['grep', 'Mem'], stdout=subprocess.PIPE, stdin=free.stdout, ) awk = subprocess.Popen(['awk', '{print $3/$2 * 100.0}'], stdin=grep.stdout, stdout=subprocess.PIPE, ) end_of_pipe = awk.stdout for line in end_of_pipe: # print(line.strip()) # mem = re.sub(r"^b\'|\'$", "", (line.strip())) mem = round(float(line.strip().decode("utf-8"))) # mem = re.sub(r"^b\'|\'$", "", mem) # cpu = re.sub(r"^b\'|\'$", "", cpu) # print(mem) jn = {"cpu": cpu, "mem": mem} jn = json.dumps(jn) client.publish("sectorq/status/" + host, payload=jn, qos=0, retain=False) except: print("not a json!") print(msg.payload) client = mqtt.Client() payload = '{"status": "off"}' client.username_pw_set("jaydee", password="jaydee1") client.will_set("home-assistant/" + host.lower() + "/hwstats", payload=payload, qos=0, retain=True) client.on_connect = on_connect client.on_message = on_message writeLog(MQTT_HOST) connected = False while not connected: try: client.connect(MQTT_HOST, MQTT_PORT, 25) connected = True except: writeLog("Failed to connect repeating...") time.sleep(10) # client.publish("sectorq/status", payload="{'action':'connect', 'system':'" + host + "', 'ip': '" + IP + "', 'mac':'" + mac + "', 'ver':'?'}", qos=0, retain=False) # Blocking call that processes network traffic, dispatches callbacks and # handles reconnecting. # Other loop*() functions are available that give a threaded interface and a # manual interface. def checkIfProcessRunning(processName): ''' Check if there is any running process that contains the given name processName. ''' #Iterate over the all the running process for proc in psutil.process_iter(): try: # Check if process name contains the given name string. if processName.lower() in proc.name().lower(): return True except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): pass return False; if curos == "Windows": #client.loop_forever() client.loop_start() NEXT_CHECK = 0 while True: time.sleep(5) try: mtime = os.path.getmtime(sys.argv[0]) except OSError: mtime = 0 if NEXT_CHECK < int(time.time()): NEXT_CHECK = int(time.time()) + 10 if curos == "Windows": if checkIfProcessRunning("aida64.exe"): aide_refs = { 'TPCHDIO':"MB_TEMP", 'TCPU':'CPU_TEMP', 'SMEMUTI': 'MEM_UTIL', 'SVIRTMEMUTI': 'VMEM_UTIL', 'SCPUUTI': 'CPU_UTIL', 'FCPU': 'FAN_CPU', 'TGPU1DIO': 'GPU_TEMP', 'SGPU1BIUTI': 'GPU_UTIL', 'TMOBO':'MB_TEMP' } #ks = ["TCPU", "TPCHDIO", "SMEMUTI", "SVIRTMEMUTI", "SCPUUTI", "FCPU", "TGPU1DIO", "SGPU1BIUTI"] path = winreg.HKEY_CURRENT_USER try: key = winreg.OpenKeyEx(path, r"SOFTWARE\\FinalWire\\AIDA64\\SensorValues") results = {} results["status"] = "on" for k in aide_refs: k2 = "Value." + str(k) try: value = winreg.QueryValueEx(key,k2) print("{} : {}".format(k, value[0])) results[aide_refs[k]] = value[0] except: pass except: print("aida initializing...") results = {"status":"init"} else: print("CPU Cnt : {}".format(psutil.cpu_count())) print(psutil.virtual_memory()) cpu_usage = psutil.cpu_percent(interval=None) swap_data = psutil.swap_memory() print("CPU : {}".format(cpu_usage)) mem_data = psutil.virtual_memory() print(mem_data) print(swap_data) print("MEM : {}".format(mem_data.percent)) print(psutil.getloadavg()) #lodctr /R try: print(psutil.sensors_temperatures()) except: pass try: print(psutil.sensors_fans()) except: pass results = {"status":"on","version":VERSION,"MB_TEMP":"NA", "MEM_UTIL":str(mem_data.percent), "CPU_TEMP":"NA", "FAN_CPU":"NA", "VMEM_UTIL":swap_data.percent, "CPU_UTIL":cpu_usage, "GPU_TEMP":"NA", "GPU_UTIL":"NA"} print(json.dumps(results)) r = json.dumps(results) #client.publish("home-assistant/" + host + "/hwstats", payload='{"TPCHDIO":"' + str(results["TPCHDIO"]) + '", "SMEMUTI":"' + str(results["SMEMUTI"]) + '", "TCPU":"' + str(results["TCPU"]) + '", "TGPU1DIO":"' + str(results["TGPU1DIO"]) + '", "SGPU1BIUTI":"' + str(results["SGPU1BIUTI"]) + '", "FCPU":"' + str(results["FCPU"]) + '", "SVIRTMEMUTI":"' + str(results["SVIRTMEMUTI"]) + '", "SCPUUTI":"' + str(results["SCPUUTI"]) + '"}', qos=0, retain=False) client.publish("home-assistant/" + host + "/hwstats", payload=r, qos=0, retain=False) client.publish("sectorq/systems/" + host.lower() + "/stat", payload="on", qos=0, retain=True) #print(json.dumps(stats)) #writeLog(json.dumps(stats)) writeLog(FILE_TIMESTAMP) writeLog(mtime) #writeLog(sys.argv[0]) if FILE_TIMESTAMP != mtime: writeLog("Script updated ! restarting...") #os.execv(sys.executable, ['python'] + sys.argv) #os.system("/share/ZFS530_DATA/.qpkg/QPython39/bin/python3 mqtt_srv.py") if host.lower() == "morefine": mycmd = 'powershell -w h -command Start-ScheduledTask -TaskName "jaydee\\restart_mqtt_srv"' writeLog(mycmd) status,output = subprocess.Popen(mycmd.split(),shell=True) if host.lower() == "router" or host.lower() == "omv": #sys.stdout.flush() #os.execv(sys.argv, "") print("argv was",sys.argv) print("sys.executable was", sys.executable) print("restart now") os.execv(sys.executable, ['python3'] + sys.argv) #os.startfile(sys.argv[0]) sys.exit() else: client.loop_start() NEXT_CHECK = 0 while True: #print(VERSION) time.sleep(5) try: mtime = os.path.getmtime(sys.argv[0]) writeLog(sys.argv[0]) except OSError: mtime = 0 #print(mtime) if NEXT_CHECK < int(time.time()): NEXT_CHECK = int(time.time()) + 20 #writeLog("Blalala : Next : " + str(NEXT_CHECK)) if host.lower() == "rpi5": #writeLog("Blalala : AAA") print(psutil.sensors_temperatures()) #print(psutil.sensors_fans()) sences = psutil.sensors_temperatures() print("SENCES") print(sences) print("#"*40) try: cpu_data = sences["cpu_thermal"][0] except: try: cpu_data = sences["k10temp"][0] except: cpu_data = "None" writeLog(cpu_data) print("CPUDATA") print(cpu_data) print("#"*40) print("MBDATA") try: mb_data = sences["acpitz"][0] print(mb_data) print(mb_data.current) mb_data = mb_data.current except: mb_data = 0 print("#"*40) try: print(psutil.sensors_fans()) fan_data = psutil.sensors_fans()["pwmfan"][0].current except: fan_data = "None" mem_data = psutil.virtual_memory() swap_data = psutil.swap_memory() #cpu_usage = psutil.cpu_percent(interval=1) load1, load5, load15 = psutil.getloadavg() cpu_usage = round((load1/os.cpu_count()) * 100, 1) print(mem_data) print(mem_data.percent) print(psutil.disk_usage('/')) #print(psutil.virtual_memory()) #print(dict(psutil.virtual_memory()._asdict())) #cmnd = "sensors -j|grep -v \"Can't read\"" #status, output = subprocess.getstatusoutput(cmnd) #print(output) #print(type(output)) #jn1 = json.loads(output) #print(str(jn1["coretemp-isa-0000"]["Package id 0"]["temp1_input"])) #print(str(jn1["asus-isa-0000"]["cpu_fan"]["fan1_input"])) #client.publish("sectorq/monitor/" + host.lower(), payload="{\"mb_temp\":0,\"mem_usage\":0,\"cpu_temp\":0,\"cpu_usage\":0,\"gpu_temp\":0,\"gpu_usage\":0}", qos=0, retain=False) writeLog('{"status":"on", "version":"' + VERSION + '","TCPU":"NA", "MB_TEMP":' + str(mb_data) + ', "MEM_UTIL":' + str(mem_data.percent) + ', "CPU_TEMP":' + str(cpu_data.current) + ', "GPU_TEMP":0, "GPU_UTIL":0, "FAN_CPU":"' + str(fan_data) + '", "VMEM_UTIL":' + str(swap_data.percent) + ', "CPU_UTIL":' + str(cpu_usage) + '}') client.publish("home-assistant/" + host + "/hwstats", payload='{"status":"on", "version":"' + VERSION + '","TCPU":"NA", "MB_TEMP":' + str(mb_data) + ', "MEM_UTIL":' + str(mem_data.percent) + ', "CPU_TEMP":' + str(cpu_data.current) + ', "GPU_TEMP":0, "GPU_UTIL":0, "FAN_CPU":"' + str(fan_data) + '", "VMEM_UTIL":' + str(swap_data.percent) + ', "CPU_UTIL":' + str(cpu_usage) + '}', qos=0, retain=False) client.publish("sectorq/systems/" + host.lower() + "/stat", payload="on", qos=0, retain=True) if host.lower() == "asus" or host.lower() == "morefine" or host.lower() == "ryzen" or host.lower() == "amd" or host.lower() == "rack": #writeLog("Blalala : AAA") print(psutil.sensors_temperatures()) #print(psutil.sensors_fans()) sences = psutil.sensors_temperatures() print("SENCES") print(sences) print("#"*40) try: cpu_data = sences["coretemp"][0] except: try: cpu_data = sences["k10temp"][0] except: cpu_data = "None" writeLog(cpu_data) print("CPUDATA") print(cpu_data) print("#"*40) print("MBDATA") try: mb_data = sences["acpitz"][0] print(mb_data) print(mb_data.current) mb_data = mb_data.current except: mb_data = 0 print("#"*40) try: print(psutil.sensors_fans()) fan_data = psutil.sensors_fans()["asus"][0].current except: fan_data = "None" mem_data = psutil.virtual_memory() swap_data = psutil.swap_memory() #cpu_usage = psutil.cpu_percent(interval=1) load1, load5, load15 = psutil.getloadavg() cpu_usage = round((load1/os.cpu_count()) * 100, 1) print(mem_data) print(mem_data.percent) print(psutil.disk_usage('/')) #print(psutil.virtual_memory()) #print(dict(psutil.virtual_memory()._asdict())) #cmnd = "sensors -j|grep -v \"Can't read\"" #status, output = subprocess.getstatusoutput(cmnd) #print(output) #print(type(output)) #jn1 = json.loads(output) #print(str(jn1["coretemp-isa-0000"]["Package id 0"]["temp1_input"])) #print(str(jn1["asus-isa-0000"]["cpu_fan"]["fan1_input"])) #client.publish("sectorq/monitor/" + host.lower(), payload="{\"mb_temp\":0,\"mem_usage\":0,\"cpu_temp\":0,\"cpu_usage\":0,\"gpu_temp\":0,\"gpu_usage\":0}", qos=0, retain=False) writeLog('{"status":"on", "version":"' + VERSION + '","TCPU":"NA", "MB_TEMP":' + str(mb_data) + ', "MEM_UTIL":' + str(mem_data.percent) + ', "CPU_TEMP":' + str(cpu_data.current) + ', "GPU_TEMP":0, "GPU_UTIL":0, "FAN_CPU":"' + str(fan_data) + '", "VMEM_UTIL":' + str(swap_data.percent) + ', "CPU_UTIL":' + str(cpu_usage) + '}') client.publish("home-assistant/" + host + "/hwstats", payload='{"status":"on", "version":"' + VERSION + '","TCPU":"NA", "MB_TEMP":' + str(mb_data) + ', "MEM_UTIL":' + str(mem_data.percent) + ', "CPU_TEMP":' + str(cpu_data.current) + ', "GPU_TEMP":0, "GPU_UTIL":0, "FAN_CPU":"' + str(fan_data) + '", "VMEM_UTIL":' + str(swap_data.percent) + ', "CPU_UTIL":' + str(cpu_usage) + '}', qos=0, retain=False) client.publish("sectorq/systems/" + host.lower() + "/stat", payload="on", qos=0, retain=True) elif host.lower() == "openmediavault" or host.lower() == "omv": #print(psutil.sensors_temperatures()) #print(psutil.sensors_fans()) sences = psutil.sensors_temperatures() #print(sences) cpu_data = sences["coretemp"][0] mb_data = sences["acpitz"][0] mem_data = psutil.virtual_memory() swap_data = psutil.swap_memory() #cpu_usage = psutil.cpu_percent(interval=1) load1, load5, load15 = psutil.getloadavg() cpu_usage = round((load1/os.cpu_count()) * 100, 1) print(psutil.getloadavg()) print("CPU Util : {}".format(cpu_usage)) print(mem_data) print(mem_data.percent) raid_data = psutil.disk_usage('/srv/dev-disk-by-uuid-2f843500-95b6-43b0-bea1-9b67032989b8') #print(psutil.virtual_memory()) #print(dict(psutil.virtual_memory()._asdict())) #cmnd = "sensors -j|grep -v \"Can't read\"" #status, output = subprocess.getstatusoutput(cmnd) #print(output) #print(type(output)) #jn1 = json.loads(output) stat_rsync = subprocess.call(["systemctl", "is-active", "--quiet", "rsync"]) if(stat_rsync == 0): # if 0 (active), print "Active" stat_rsync = "on" else: stat_rsync = "off" #sdiskusage = psutil.disk_partitions() disk_usage = raid_data[3] print(disk_usage) sys_uptime = str(datetime.timedelta(seconds=round(time.time() - psutil.boot_time(), 0))) reboot_pending = False if os.path.exists("/var/run/reboot-required"): reboot_pending = True #str(datetime.timedelta(seconds=666)) #print(str(jn1["coretemp-isa-0000"]["Package id 0"]["temp1_input"])) #print(str(jn1["asus-isa-0000"]["cpu_fan"]["fan1_input"])) #client.publish("sectorq/monitor/" + host.lower(), payload="{\"mb_temp\":0,\"mem_usage\":0,\"cpu_temp\":0,\"cpu_usage\":0,\"gpu_temp\":0,\"gpu_usage\":0}", qos=0, retain=False) client.publish("home-assistant/" + host + "/hwstats", payload='{"status":"on", "version":"' + VERSION + '","reboot":"' + str(reboot_pending) + '", "uptime":"' + str(sys_uptime) + '", "raid_usage": ' + str(disk_usage) + ',"rsync":"' + str(stat_rsync) +'", "MB_TEMP":' + str(mb_data.current) + ', "MEM_UTIL":' + str(mem_data.percent) + ', "CPU_TEMP":' + str(cpu_data.current) + ', "GPU_TEMP":0, "GPU_UTIL":0, "FAN_CPU":0, "VMEM_UTIL":' + str(swap_data.percent) + ', "CPU_UTIL":' + str(cpu_usage) + '}', qos=0, retain=False) writeLog("lalal") elif host.lower() == "router": check_router() elif host.lower() == "nas": #print("Getting VM info") payload = {"status":"on"} cmnd = "/share/ZFS532_DATA/.qpkg/QKVM/usr/bin/virsh list --all" writeLog(cmnd) status, output = subprocess.getstatusoutput(cmnd) l = 1 lines = output.splitlines() VMS = {} for i in lines: l = l + 1 if l < 4: continue line = re.split(r" {2,}", i) writeLog(str(line[0].strip()) + " " + str(line[1].strip()) + " " + str(line[2].strip())) VMS[str(line[1].strip())] = str(line[2].strip()) for m in VMS: cmnd = "/share/ZFS532_DATA/.qpkg/QKVM/usr/bin/virsh domstate " + m #out = subprocess.Popen(cmnd.split()) writeLog(cmnd) status, output = subprocess.getstatusoutput(cmnd) writeLog(output) if output.strip() == "running": payload[m] = 1 else: payload[m] = 0 client.publish( "home-assistant/" + host + "/hwstats", payload=json.dumps(payload), qos=0, retain=True) writeLog(FILE_TIMESTAMP) writeLog(mtime) if FILE_TIMESTAMP != mtime: writeLog("Script updated ! restarting...") #os.execv(sys.executable, ['python'] + sys.argv) #os.system("/share/ZFS530_DATA/.qpkg/QPython39/bin/python3 mqtt_srv.py") if host.lower() == "nas": sys.stdout.flush() os.execv("/share/ZFS530_DATA/.qpkg/QPython39/bin/python3", sys.argv) if host.lower() == "router" or host.lower() == "omv": #sys.stdout.flush() #os.execv(sys.argv, "") print("argv was",sys.argv) print("sys.executable was", sys.executable) print("restart now") os.execv(sys.executable, ['python3'] + sys.argv) #os.startfile(sys.argv[0]) sys.exit()