Add files via upload
parent
dd04a11932
commit
aa0af2eab8
@ -0,0 +1,221 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
# Copyright 2017 @ 4thebadwoofsky
|
||||||
|
import sys,os,subprocess,re,json,base64
|
||||||
|
from time import sleep
|
||||||
|
class IPAddress:
|
||||||
|
A = 0
|
||||||
|
B = 0
|
||||||
|
C = 0
|
||||||
|
D = 0
|
||||||
|
Text = ""
|
||||||
|
def __init__(self,a,b = -1,c = 0,d = 0):
|
||||||
|
if b == -1:
|
||||||
|
ints = str(a).split('.')
|
||||||
|
if len(ints) == 4:
|
||||||
|
self.__create(int(ints[0]),int(ints[1]),int(ints[2]),int(ints[3]));
|
||||||
|
else:
|
||||||
|
self.__create(a,b,c,d)
|
||||||
|
def __create(self,a,b,c,d):
|
||||||
|
self.A = a
|
||||||
|
self.B = b
|
||||||
|
self.C = c
|
||||||
|
self.D = d
|
||||||
|
self.Text = str(a)+"."+str(b)+"."+str(c)+"."+str(d)
|
||||||
|
class WindowsPhone_App:
|
||||||
|
Name = ""
|
||||||
|
PackageRelativeId = ""
|
||||||
|
PackageFullName = ""
|
||||||
|
def __init__(self,package):
|
||||||
|
self.Name = package["Name"]
|
||||||
|
self.PackageRelativeId = package["PackageRelativeId"]
|
||||||
|
self.PackageFullName = package["PackageFullName"]
|
||||||
|
def Start(self,phone):
|
||||||
|
os.system("curl --http1.1 \"http://" + phone.IPAddress.Text + "/api/taskmanager/app?appid=" + base64.b64encode(self.PackageRelativeId) + "\" -d \"\"")
|
||||||
|
def Stop(self,phone):
|
||||||
|
os.system("curl --http1.1 \"http://" + phone.IPAddress.Text + "/api/taskmanager/app?package=" + base64.b64encode(self.PackageFullName) + "\" -X DELETE")
|
||||||
|
class WindowsPhone_Power:
|
||||||
|
PluggedIn = 0
|
||||||
|
Battery = 0
|
||||||
|
Charging = 0
|
||||||
|
MaxCapacity = 0
|
||||||
|
CurCapacity = 0
|
||||||
|
EstimatedTime = 0
|
||||||
|
def Percentage(self):
|
||||||
|
return (self.CurCapacity / self.MaxCapacity) * 100
|
||||||
|
class NetworkConfig:
|
||||||
|
Static = None
|
||||||
|
Broadcast = None
|
||||||
|
Mask = None
|
||||||
|
def __init__(self,static,broadcast,subnet):
|
||||||
|
self.Static = IPAddress(static)
|
||||||
|
self.Broadcast = IPAddress(broadcast)
|
||||||
|
self.Mask = IPAddress(subnet)
|
||||||
|
class WindowsPhone:
|
||||||
|
IPAddress = {}
|
||||||
|
|
||||||
|
Name = ""
|
||||||
|
Language = ""
|
||||||
|
OsEdition = ""
|
||||||
|
OsEditionId = 0
|
||||||
|
OsVersion = ""
|
||||||
|
Type = ""
|
||||||
|
|
||||||
|
Power = WindowsPhone_Power()
|
||||||
|
Apps = {}
|
||||||
|
def __init__(self,ip):
|
||||||
|
self.IPAddress = ip
|
||||||
|
self.init()
|
||||||
|
def init(self):
|
||||||
|
os_info = self.__callRest("/os/info")
|
||||||
|
os_devicefamily = self.__callRest("/os/devicefamily")
|
||||||
|
power_battery = self.__callRest("/power/battery")
|
||||||
|
|
||||||
|
self.Name = os_info["ComputerName"]
|
||||||
|
self.Language = os_info["Language"]
|
||||||
|
self.OsEdition = os_info["OsEdition"]
|
||||||
|
self.OsEditionId = int(os_info["OsEditionId"])
|
||||||
|
self.OsVersion = os_info["OsVersion"]
|
||||||
|
self.Type = os_devicefamily["DeviceType"]
|
||||||
|
|
||||||
|
self.Power = WindowsPhone_Power()
|
||||||
|
self.Power.PluggedIn = int(power_battery["AcOnline"])
|
||||||
|
self.Power.Battery = (int(power_battery["BatteryPresent"]) == 1)
|
||||||
|
self.Power.Charging = int(power_battery["Charging"])
|
||||||
|
self.Power.MaxCapacity = float(power_battery["MaximumCapacity"])
|
||||||
|
self.Power.CurCapacity = float(power_battery["RemainingCapacity"])
|
||||||
|
self.Power.EstimatedTime = int(power_battery["EstimatedTime"])
|
||||||
|
def __callRest(self,fn):
|
||||||
|
output = subprocess.check_output("curl http://" + self.IPAddress.Text + "/api" + fn + " -s",shell=True,stderr=None)
|
||||||
|
return json.loads(output)
|
||||||
|
def __callRestPost(self,fn):
|
||||||
|
output = subprocess.check_output("curl http://" + self.IPAddress.Text + "/api" + fn + " -d \"\" -X POST -s",shell=True,stderr=None)
|
||||||
|
return json.loads(output) if output.find("{") == 0 else output
|
||||||
|
def SaveFile(self,filename):
|
||||||
|
file = open(filename,"w")
|
||||||
|
file.write(self.IPAddress.Text)
|
||||||
|
file.close()
|
||||||
|
def Shutdown(self,restart=False):
|
||||||
|
self.__callRestPost("/control/" + ("restart" if restart else "shutdown"))
|
||||||
|
def StartApp(self,app):
|
||||||
|
app.Start(self)
|
||||||
|
def StopApp(self,app):
|
||||||
|
app.Stop(self)
|
||||||
|
def GetApps(self):
|
||||||
|
data = self.__callRest("/app/packagemanager/packages")
|
||||||
|
for package in data["InstalledPackages"]:
|
||||||
|
self.Apps[package["PackageFamilyName"]] = WindowsPhone_App(package)
|
||||||
|
def PrintInfoTrace(self):
|
||||||
|
print "Windows Phone ist erreichbar: " + self.IPAddress.Text
|
||||||
|
print "Geraete-Informationen:"
|
||||||
|
print "\tName => " + self.Name
|
||||||
|
print "\tType => " + self.Type
|
||||||
|
print "\tLanguage => " + self.Language
|
||||||
|
print "\tPower:"
|
||||||
|
print "\t\tPluggedIn => " + str(self.Power.PluggedIn)
|
||||||
|
print "\t\tBattery => " + str(self.Power.Battery)
|
||||||
|
print "\t\tCharging => " + str(self.Power.Charging)
|
||||||
|
print "\t\tMaxCapacity => " + str(self.Power.MaxCapacity) + " mWh"
|
||||||
|
print "\t\tCurCapacity => " + str(self.Power.CurCapacity) + " mWh"
|
||||||
|
print "\t\tPercentage => " + str(self.Power.Percentage()) + "%"
|
||||||
|
print "\t\tEstimatedTime => " + str(self.Power.EstimatedTime)
|
||||||
|
class WindowsPhoneLocator:
|
||||||
|
Phones = {}
|
||||||
|
def LoadFile(self,filename):
|
||||||
|
file = open(filename,"r")
|
||||||
|
ip = file.readline()
|
||||||
|
file.close()
|
||||||
|
ip = IPAddress(ip)
|
||||||
|
id = ip.D + ip.C*100 + ip.B*10000 + ip.A*1000000
|
||||||
|
self.Phones[id] = WindowsPhone(ip)
|
||||||
|
return id
|
||||||
|
def Locate(self,multi=False):
|
||||||
|
networks = self.__readnetcfg()
|
||||||
|
for ifName in networks.keys():
|
||||||
|
network = networks[ifName]
|
||||||
|
self.Phones = self.__scanNetwork(network,multi)
|
||||||
|
def __ifnames(self):
|
||||||
|
return subprocess.check_output("ifconfig",shell=True)
|
||||||
|
def __getips(self,line):
|
||||||
|
return re.findall(r"\b(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9][0-9]|[0-9])(?:\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9][0-9]|[0-9])){3}\b",line)
|
||||||
|
def __readnetcfg(self):
|
||||||
|
networks = {}
|
||||||
|
interfaceName = ""
|
||||||
|
for line in self.__ifnames().split("\n"):
|
||||||
|
if line.find("Hardware") > 2:
|
||||||
|
interfaceName = line[0:line.find(" ")]
|
||||||
|
if interfaceName != "":
|
||||||
|
if line.find("inet ") > 2:
|
||||||
|
interfaceAddresses = self.__getips(line)
|
||||||
|
if len(interfaceAddresses) != 3:
|
||||||
|
continue
|
||||||
|
interfaceIP = interfaceAddresses[0]
|
||||||
|
interfaceBroadcast = interfaceAddresses[1]
|
||||||
|
interfaceSubmask = interfaceAddresses[2]
|
||||||
|
networks[interfaceName] = NetworkConfig(interfaceIP,interfaceBroadcast,interfaceSubmask)
|
||||||
|
return networks
|
||||||
|
def __checkPhone(self,a,b,c,d):
|
||||||
|
ip = str(a) +"."+ str(b) +"."+ str(c) +"."+ str(d)
|
||||||
|
try:
|
||||||
|
output = subprocess.check_output("curl http://" + ip + "/api/os/machinename --max-time 2 -s",shell=True,stderr=None)
|
||||||
|
if output.find("{") == 0:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
except Exception as e:
|
||||||
|
return False
|
||||||
|
def __scanNetwork(self,net,multi = False):
|
||||||
|
phones = {}
|
||||||
|
mask = net.Mask
|
||||||
|
broadcast = net.Broadcast
|
||||||
|
ip = net.Static
|
||||||
|
|
||||||
|
broadcastBlockA = broadcast.A
|
||||||
|
broadcastBlockB = broadcast.B
|
||||||
|
broadcastBlockC = broadcast.C
|
||||||
|
broadcastBlockD = broadcast.D
|
||||||
|
|
||||||
|
scanBlockA = (mask.A != 255)
|
||||||
|
scanBlockB = (mask.B != 255)
|
||||||
|
|
||||||
|
scanBlockC = (mask.C != 255)
|
||||||
|
scanBlockD = (mask.D != 255)
|
||||||
|
|
||||||
|
blockA = 0 if scanBlockA else broadcastBlockA
|
||||||
|
blockB = 0 if scanBlockB else broadcastBlockB
|
||||||
|
blockC = 0 if scanBlockC else broadcastBlockC
|
||||||
|
blockD = 0 if scanBlockD else broadcastBlockD
|
||||||
|
|
||||||
|
targetA = 255 if scanBlockA else broadcastBlockA
|
||||||
|
targetB = 255 if scanBlockB else broadcastBlockB
|
||||||
|
targetC = 255 if scanBlockC else broadcastBlockC
|
||||||
|
targetD = 255 if scanBlockD else broadcastBlockD
|
||||||
|
while (blockA == targetA & blockB == targetB & blockC == targetC & blockD == targetD) == False:
|
||||||
|
if self.__checkPhone(blockA,blockB,blockC,blockD):
|
||||||
|
id = blockD + blockC*100 + blockB*10000 + blockA*1000000
|
||||||
|
phones[id] = WindowsPhone(IPAddress(blockA,blockB,blockC,blockD))
|
||||||
|
if multi == False:
|
||||||
|
return phones
|
||||||
|
if scanBlockD:
|
||||||
|
blockD = blockD + 1
|
||||||
|
if blockD > 255:
|
||||||
|
blockD = 0
|
||||||
|
if scanBlockC:
|
||||||
|
blockC = blockC + 1
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
if blockC > 255:
|
||||||
|
blockC = 0
|
||||||
|
if scanBlockB:
|
||||||
|
blockB = blockB + 1
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
if blockB > 255:
|
||||||
|
blockB = 0
|
||||||
|
if scanBlockA:
|
||||||
|
blockA = blockA + 1
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
if blockA > 255:
|
||||||
|
break
|
||||||
|
return phones
|
||||||
|
|
Loading…
Reference in New Issue