Source code for bbarchivist.utilities
#!/usr/bin/env python3
import os
import argparse
import platform
import shutil
from calendar import leapdays
[docs]def file_exists(file):
"""
Check if file exists. Used for parsing file inputs from command line.
:param file: Path to a file, including extension.
:type file: str
"""
if not os.path.exists(file):
raise argparse.ArgumentError("{0} does not exist.".format(file))
return file
[docs]def positive_integer(inputint):
"""
Check if number > 0. Used for parsing integer inputs from command line.
:param inputint: Integer to check.
:type inputint: int
"""
if int(inputint) <= 0:
raise argparse.ArgumentError("{0} is too low.".format(str(inputint)))
return str(inputint)
[docs]def escreens_pin(pin):
"""
Check if given PIN is valid (8 character hexadecimal)
:param pin: PIN to check.
:type pin: str
"""
if len(pin) == 8:
try:
int(pin, 16) # hexadecimal-ness
except ValueError:
raise argparse.ArgumentError("Invalid PIN.")
else:
return pin.lower()
else:
raise argparse.ArgumentError("Invalid PIN.")
[docs]def escreens_duration(duration):
"""
Check if escreens duration is valid.
:param duration: Duration to check.
:type duration: int
"""
if int(duration) in (1, 3, 6, 15, 30):
return int(duration)
else:
raise argparse.ArgumentError("Invalid duration.")
[docs]def str2bool(v):
"""
Parse bool from string input.
:param v: String to check if it means True or False.
:type v: str
"""
return str(v).lower() in ("yes", "true", "t", "1", "y")
[docs]def is_amd64():
"""
Returns true if script is running on an AMD64 system
"""
amd64 = platform.machine().endswith("64")
return amd64
[docs]def is_windows():
"""
Returns true if script is running on Windows.
"""
windows = platform.system() == "Windows"
return windows
[docs]def is_mac():
"""
Returns true if script is running on OSX.
"""
mac = platform.system() == "Darwin"
return mac
[docs]def is_linux():
"""
Returns true if script is running on Linux.
"""
linux = platform.system() == "Linux"
return linux
[docs]def get_seven_zip(talkative=False):
"""
Return name of 7-Zip executable.
On POSIX, it MUST be 7za.
On Windows, it can be installed or supplied with the script.
:func:`win_seven_zip` is used to determine if it's installed.
:param talkative: Whether to output to screen. False by default.
:type talkative: bool
"""
if is_windows():
smeg = win_seven_zip(talkative)
return smeg
else:
return "7za"
[docs]def win_seven_zip(talkative=False):
"""
For Windows, checks where 7-Zip is.
Consults registry first for any installed instances of 7-Zip.
If it's not there, it falls back onto the supplied executables.
If *those* aren't there, return "error".
:param talkative: Whether to output to screen. False by default.
:type talkative: bool
"""
if talkative:
print("CHECKING INSTALLED FILES...")
try:
import winreg # windows registry
hk7z = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\7-Zip")
path = winreg.QueryValueEx(hk7z, "Path")
except Exception as e:
if talkative:
print("SOMETHING WENT WRONG")
print(str(e))
print("TRYING LOCAL FILES...")
listdir = os.listdir(os.getcwd())
filecount = 0
for i in listdir:
if i == "7za.exe" or i == "7za64.exe":
filecount += 1
if filecount == 2:
if talkative:
print("7ZIP USING LOCAL FILES")
if is_amd64():
return "7za64.exe"
else:
return "7za.exe"
else:
if talkative:
print("NO LOCAL FILES")
return "error"
else:
if talkative:
print("7ZIP USING INSTALLED FILES")
return '"' + os.path.join(path[0], "7z.exe") + '"'
[docs]def get_core_count():
"""
Find out how many CPU cores this system has.
Good for multicore compression.
"""
cores = str(os.cpu_count()) # thank you Python 3.4
if os.cpu_count() is None:
cores = str(1)
return cores
[docs]def prep_seven_zip():
"""
Check for presence of 7-Zip.
On POSIX, checks for p7zip.
On Windows, checks for 7-Zip.
Returns False if not found, True if found.
"""
if is_mac():
path = shutil.which("7za")
if path is None:
print("NO 7ZIP")
print("PLEASE INSTALL p7zip FROM SOURCE/HOMEBREW/MACPORTS")
return False
else:
print("7ZIP FOUND AT", path)
return True
elif is_linux():
path = shutil.which("7za")
if path is None:
print("NO 7ZIP")
print("PLEASE INSTALL p7zip AND ANY RELATED PACKAGES")
print("CONSULT YOUR PACKAGE MANAGER, OR GOOGLE IT")
return False
else:
print("7ZIP FOUND AT", path)
return True
elif is_windows():
smeg = get_seven_zip(True)
if smeg == "error":
return False
else:
return True
[docs]def return_model(index):
"""
Return device model from selected HWID/variant index.
Lists found in bbconstants module.
:param index: The index to look up.
:type index: int
"""
if 0 <= index <= 3:
return(0) # Z10
elif 4 <= index <= 5:
return(1) # P9982
elif 6 <= index <= 10:
return(2) # Q10
elif 11 <= index <= 13:
return(3) # Q5
elif 14 <= index <= 15:
return(4) # P9983
elif 16 <= index <= 21:
return(5) # Z30
elif 22 <= index <= 26:
return(6) # Classic
elif 27 <= index <= 28:
return(7) # Leap
elif 29 <= index <= 30:
return(8) # Z3
elif 31 <= index <= 33:
return(9) # Passport
[docs]def return_family(index):
"""
Return device family from selected HWID.
Lists found in bbconstants module.
:param index: The index to look up.
:type index: int
"""
if index == 0: # STL100-1
return(0)
elif 1 <= index <= 5: # STL100-2/3/4, P9982
return(1)
elif 6 <= index <= 15: # Q10, Q5, P9983
return(2)
elif 16 <= index <= 28: # Z30, Classic, Leap
return(3)
elif 29 <= index <= 30: # Z3
return(4)
elif 31 <= index <= 33: # Passport
return(5)