160 lines
4.1 KiB
Python
160 lines
4.1 KiB
Python
#!/usr/bin/env python3
|
|
|
|
if __name__ == "__main__":
|
|
print("this is supposed to be imported")
|
|
exit()
|
|
|
|
print("opus-nt api says hello world")
|
|
import os
|
|
import subprocess
|
|
import winreg
|
|
p = os.path.join
|
|
|
|
target = {
|
|
"type": False, # "wim", "offline" - whether to target a wim file or an offline installed windows
|
|
"path": False, # the path to the wim or windows installation
|
|
"index": 1, # the index of the wim to target, if a wim is selected
|
|
"maxIndex": 1
|
|
}
|
|
|
|
tmpPath = "tmp"
|
|
regTmpPath = "HKEY_LOCAL_MACHINE\\opus-nt_"
|
|
|
|
def runReg(cmd,check = True):
|
|
cmd = ["reg"] + cmd
|
|
try:
|
|
subprocess.run(cmd,stdout=subprocess.DEVNULL,check=True)
|
|
except Exception as e:
|
|
if check == True: raise e
|
|
|
|
def getModlist(path):
|
|
modList = []
|
|
for root,dirs,files in os.walk(path):
|
|
for file in dirs:
|
|
ffile = p(root,file)
|
|
lfile = ffile.replace(path + os.path.sep,"",1)
|
|
if lfile[0] == "-": continue
|
|
if lfile[0] == "[" and lfile[-1] == "]":
|
|
modList = modList + sorted(getModlist(ffile))
|
|
continue
|
|
|
|
modList.append(ffile)
|
|
break
|
|
|
|
return modList
|
|
|
|
def addFiles(path):
|
|
if target["type"] == "offline":
|
|
for root,dirs,files in os.walk(path):
|
|
for file in dirs:
|
|
ffile = p(root,file)
|
|
lfile = ffile.replace(path + os.path.sep,"",1)
|
|
ofile = p(target["path"],lfile)
|
|
if not os.path.isdir(ofile): os.makedirs(ofile)
|
|
|
|
for file in files:
|
|
ffile = p(root,file)
|
|
lfile = ffile.replace(path + os.path.sep,"",1)
|
|
ofile = p(target["path"],lfile)
|
|
if os.path.isfile(ofile): os.remove(ofile)
|
|
fhandle = open(ffile,"rb")
|
|
ofhandle = open(ofile,"wb")
|
|
bytes = fhandle.read(1000000)
|
|
while bytes:
|
|
ofhandle.write(bytes)
|
|
bytes = fhandle.read(1000000)
|
|
|
|
ofhandle.close()
|
|
fhandle.close()
|
|
|
|
if target["type"] == "wim":
|
|
subprocess.run([
|
|
"wimlib-imagex","update",
|
|
target["path"],str(target["index"]),
|
|
"--command=add '" +path+ "' '\\'"
|
|
],check=True,stdout=subprocess.DEVNULL)
|
|
|
|
def readyFile(path):
|
|
if target["type"] == "offline": return
|
|
|
|
if target["type"] == "wim":
|
|
subprocess.run([
|
|
"wimlib-imagex","extract",
|
|
target["path"],str(target["index"]),
|
|
path,"--dest-dir=" +tmpPath,
|
|
"--preserve-dir-structure"
|
|
],check=True)
|
|
|
|
def renameFile(path,newpath):
|
|
if target["type"] == "offline":
|
|
os.rename(filePath(path),filePath(newpath))
|
|
|
|
if target["type"] == "wim":
|
|
os.rename(filePath(path),filePath(newpath))
|
|
subprocess.run([
|
|
"wimlib-imagex","update",
|
|
target["path"],str(target["index"]),
|
|
"--command=delete '" +path+ "'"
|
|
],check=True)
|
|
|
|
def filePath(path):
|
|
if target["type"] == "offline": return p(target["path"],path)
|
|
if target["type"] == "wim": return p(tmpPath,path)
|
|
|
|
def mountReg(path,regFile):
|
|
runReg(["load",path,regFile])
|
|
|
|
def unmountReg(path):
|
|
runReg(["unload",path])
|
|
|
|
def getVersion(hkey,SOFTWARE):
|
|
versionData = {}
|
|
key = winreg.OpenKey(hkey,SOFTWARE + "\\Microsoft\\Windows NT\\CurrentVersion")
|
|
|
|
isTen = False
|
|
try:
|
|
winreg.QueryValueEx(key,"CurrentMajorVersionNumber")[0]
|
|
isTen = True
|
|
except:
|
|
pass
|
|
|
|
if isTen == False:
|
|
version = winreg.QueryValueEx(key,"CurrentVersion")[0].split(".")
|
|
versionData["versionMajor"] = int(version[0])
|
|
versionData["versionMinor"] = int(version[1])
|
|
|
|
if isTen == True:
|
|
versionData["versionMajor"] = int(winreg.QueryValueEx(key,"CurrentMajorVersionNumber")[0])
|
|
versionData["versionMinor"] = int(winreg.QueryValueEx(key,"CurrentMinorVersionNumber")[0])
|
|
|
|
versionData["edition"] = winreg.QueryValueEx(key,"EditionID")[0]
|
|
versionData["build"] = int(winreg.QueryValueEx(key,"CurrentBuildNumber")[0])
|
|
buildLabEx = winreg.QueryValueEx(key,"BuildLabEx")[0]
|
|
if "x86" in buildLabEx:
|
|
versionData["architecture"] = "x86"
|
|
elif "amd64" in buildLabEx:
|
|
versionData["architecture"] = "amd64"
|
|
else: # this sucks
|
|
versionData["architecture"] = "ia64"
|
|
|
|
global target
|
|
target["version"] = versionData
|
|
|
|
def getMaxIndex():
|
|
ind = 2
|
|
while True:
|
|
try:
|
|
subprocess.run([
|
|
"wimlib-imagex","info",
|
|
target["path"],str(ind)
|
|
],check=True)
|
|
ind += 1
|
|
except Exception as e:
|
|
target["maxIndex"] = ind - 1
|
|
return
|
|
|
|
def regQueryKeys(rp):
|
|
output = subprocess.check_output(["reg","query",rp,"/f","*","/k"]).decode("utf-8")
|
|
output = output.split("\r\n")
|
|
output = output[1:-2]
|
|
return output |