mirror of
https://github.com/corpnewt/gibMacOS.git
synced 2024-11-12 10:04:11 +01:00
273 lines
9.9 KiB
Python
273 lines
9.9 KiB
Python
import sys, os, time, re, json, datetime, ctypes, subprocess
|
|
|
|
if os.name == "nt":
|
|
# Windows
|
|
import msvcrt
|
|
else:
|
|
# Not Windows \o/
|
|
import select
|
|
|
|
class Utils:
|
|
|
|
def __init__(self, name = "Python Script"):
|
|
self.name = name
|
|
# Init our colors before we need to print anything
|
|
cwd = os.getcwd()
|
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
|
if os.path.exists("colors.json"):
|
|
self.colors_dict = json.load(open("colors.json"))
|
|
else:
|
|
self.colors_dict = {}
|
|
os.chdir(cwd)
|
|
|
|
def check_admin(self):
|
|
# Returns whether or not we're admin
|
|
try:
|
|
is_admin = os.getuid() == 0
|
|
except AttributeError:
|
|
is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0
|
|
return is_admin
|
|
|
|
def elevate(self, file):
|
|
# Runs the passed file as admin
|
|
if self.check_admin():
|
|
return
|
|
if os.name == "nt":
|
|
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, file, None, 1)
|
|
else:
|
|
try:
|
|
p = subprocess.Popen(["which", "sudo"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
c = p.communicate()[0].decode("utf-8", "ignore").replace("\n", "")
|
|
os.execv(c, [ sys.executable, 'python'] + sys.argv)
|
|
except:
|
|
exit(1)
|
|
|
|
def compare_versions(self, vers1, vers2, **kwargs):
|
|
# Helper method to compare ##.## strings
|
|
#
|
|
# vers1 < vers2 = True
|
|
# vers1 = vers2 = None
|
|
# vers1 > vers2 = False
|
|
|
|
# Sanitize the pads
|
|
pad = str(kwargs.get("pad", ""))
|
|
sep = str(kwargs.get("separator", "."))
|
|
|
|
ignore_case = kwargs.get("ignore_case", True)
|
|
|
|
# Cast as strings
|
|
vers1 = str(vers1)
|
|
vers2 = str(vers2)
|
|
|
|
if ignore_case:
|
|
vers1 = vers1.lower()
|
|
vers2 = vers2.lower()
|
|
|
|
# Split and pad lists
|
|
v1_parts, v2_parts = self.pad_length(vers1.split(sep), vers2.split(sep))
|
|
|
|
# Iterate and compare
|
|
for i in range(len(v1_parts)):
|
|
# Remove non-numeric
|
|
v1 = ''.join(c.lower() for c in v1_parts[i] if c.isalnum())
|
|
v2 = ''.join(c.lower() for c in v2_parts[i] if c.isalnum())
|
|
# Equalize the lengths
|
|
v1, v2 = self.pad_length(v1, v2)
|
|
# Compare
|
|
if str(v1) < str(v2):
|
|
return True
|
|
elif str(v1) > str(v2):
|
|
return False
|
|
# Never differed - return None, must be equal
|
|
return None
|
|
|
|
def pad_length(self, var1, var2, pad = "0"):
|
|
# Pads the vars on the left side to make them equal length
|
|
pad = "0" if len(str(pad)) < 1 else str(pad)[0]
|
|
if not type(var1) == type(var2):
|
|
# Type mismatch! Just return what we got
|
|
return (var1, var2)
|
|
if len(var1) < len(var2):
|
|
if type(var1) is list:
|
|
var1.extend([str(pad) for x in range(len(var2) - len(var1))])
|
|
else:
|
|
var1 = "{}{}".format((pad*(len(var2)-len(var1))), var1)
|
|
elif len(var2) < len(var1):
|
|
if type(var2) is list:
|
|
var2.extend([str(pad) for x in range(len(var1) - len(var2))])
|
|
else:
|
|
var2 = "{}{}".format((pad*(len(var1)-len(var2))), var2)
|
|
return (var1, var2)
|
|
|
|
def check_path(self, path):
|
|
# Loop until we either get a working path - or no changes
|
|
count = 0
|
|
while count < 100:
|
|
count += 1
|
|
if not len(path):
|
|
# We uh.. stripped out everything - bail
|
|
return None
|
|
if os.path.exists(path):
|
|
# Exists!
|
|
return os.path.abspath(path)
|
|
# Check quotes first
|
|
if (path[0] == '"' and path[-1] == '"') or (path[0] == "'" and path[-1] == "'"):
|
|
path = path[1:-1]
|
|
continue
|
|
# Check for tilde
|
|
if path[0] == "~":
|
|
test_path = os.path.expanduser(path)
|
|
if test_path != path:
|
|
# We got a change
|
|
path = test_path
|
|
continue
|
|
# If we have no spaces to trim - bail
|
|
if not (path[0] == " " or path[0] == " ") and not(path[-1] == " " or path[-1] == " "):
|
|
return None
|
|
# Here we try stripping spaces/tabs
|
|
test_path = path
|
|
t_count = 0
|
|
while t_count < 100:
|
|
t_count += 1
|
|
t_path = test_path
|
|
while len(t_path):
|
|
if os.path.exists(t_path):
|
|
return os.path.abspath(t_path)
|
|
if t_path[-1] == " " or t_path[-1] == " ":
|
|
t_path = t_path[:-1]
|
|
continue
|
|
break
|
|
if test_path[0] == " " or test_path[0] == " ":
|
|
test_path = test_path[1:]
|
|
continue
|
|
break
|
|
# Escapes!
|
|
test_path = "\\".join([x.replace("\\", "") for x in path.split("\\\\")])
|
|
if test_path != path and not (path[0] == " " or path[0] == " "):
|
|
path = test_path
|
|
continue
|
|
if path[0] == " " or path[0] == " ":
|
|
path = path[1:]
|
|
return None
|
|
|
|
def grab(self, prompt, **kwargs):
|
|
# Takes a prompt, a default, and a timeout and shows it with that timeout
|
|
# returning the result
|
|
timeout = kwargs.get("timeout", 0)
|
|
default = kwargs.get("default", None)
|
|
# If we don't have a timeout - then skip the timed sections
|
|
if timeout <= 0:
|
|
if sys.version_info >= (3, 0):
|
|
return input(prompt)
|
|
else:
|
|
return str(raw_input(prompt))
|
|
# Write our prompt
|
|
sys.stdout.write(prompt)
|
|
sys.stdout.flush()
|
|
if os.name == "nt":
|
|
start_time = time.time()
|
|
i = ''
|
|
while True:
|
|
if msvcrt.kbhit():
|
|
c = msvcrt.getche()
|
|
if ord(c) == 13: # enter_key
|
|
break
|
|
elif ord(c) >= 32: #space_char
|
|
i += c
|
|
if len(i) == 0 and (time.time() - start_time) > timeout:
|
|
break
|
|
else:
|
|
i, o, e = select.select( [sys.stdin], [], [], timeout )
|
|
if i:
|
|
i = sys.stdin.readline().strip()
|
|
print('') # needed to move to next line
|
|
if len(i) > 0:
|
|
return i
|
|
else:
|
|
return default
|
|
|
|
def cls(self):
|
|
os.system('cls' if os.name=='nt' else 'clear')
|
|
|
|
def cprint(self, message, **kwargs):
|
|
strip_colors = kwargs.get("strip_colors", False)
|
|
if os.name == "nt":
|
|
strip_colors = True
|
|
reset = u"\u001b[0m"
|
|
# Requires sys import
|
|
for c in self.colors:
|
|
if strip_colors:
|
|
message = message.replace(c["find"], "")
|
|
else:
|
|
message = message.replace(c["find"], c["replace"])
|
|
if strip_colors:
|
|
return message
|
|
sys.stdout.write(message)
|
|
print(reset)
|
|
|
|
# Needs work to resize the string if color chars exist
|
|
'''# Header drawing method
|
|
def head(self, text = None, width = 55):
|
|
if text == None:
|
|
text = self.name
|
|
self.cls()
|
|
print(" {}".format("#"*width))
|
|
len_text = self.cprint(text, strip_colors=True)
|
|
mid_len = int(round(width/2-len(len_text)/2)-2)
|
|
middle = " #{}{}{}#".format(" "*mid_len, len_text, " "*((width - mid_len - len(len_text))-2))
|
|
if len(middle) > width+1:
|
|
# Get the difference
|
|
di = len(middle) - width
|
|
# Add the padding for the ...#
|
|
di += 3
|
|
# Trim the string
|
|
middle = middle[:-di]
|
|
newlen = len(middle)
|
|
middle += "...#"
|
|
find_list = [ c["find"] for c in self.colors ]
|
|
|
|
# Translate colored string to len
|
|
middle = middle.replace(len_text, text + self.rt_color) # always reset just in case
|
|
self.cprint(middle)
|
|
print("#"*width)'''
|
|
|
|
# Header drawing method
|
|
def head(self, text = None, width = 55):
|
|
if text == None:
|
|
text = self.name
|
|
self.cls()
|
|
print(" {}".format("#"*width))
|
|
mid_len = int(round(width/2-len(text)/2)-2)
|
|
middle = " #{}{}{}#".format(" "*mid_len, text, " "*((width - mid_len - len(text))-2))
|
|
if len(middle) > width+1:
|
|
# Get the difference
|
|
di = len(middle) - width
|
|
# Add the padding for the ...#
|
|
di += 3
|
|
# Trim the string
|
|
middle = middle[:-di] + "...#"
|
|
print(middle)
|
|
print("#"*width)
|
|
|
|
def resize(self, width, height):
|
|
print('\033[8;{};{}t'.format(height, width))
|
|
|
|
def custom_quit(self):
|
|
self.head()
|
|
print("by CorpNewt\n")
|
|
print("Thanks for testing it out, for bugs/comments/complaints")
|
|
print("send me a message on Reddit, or check out my GitHub:\n")
|
|
print("www.reddit.com/u/corpnewt")
|
|
print("www.github.com/corpnewt\n")
|
|
# Get the time and wish them a good morning, afternoon, evening, and night
|
|
hr = datetime.datetime.now().time().hour
|
|
if hr > 3 and hr < 12:
|
|
print("Have a nice morning!\n\n")
|
|
elif hr >= 12 and hr < 17:
|
|
print("Have a nice afternoon!\n\n")
|
|
elif hr >= 17 and hr < 21:
|
|
print("Have a nice evening!\n\n")
|
|
else:
|
|
print("Have a nice night!\n\n")
|
|
exit(0)
|