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