From 661d1ff21e6b62914a8d7e468e2bcc5ddb0feb88 Mon Sep 17 00:00:00 2001 From: rlbr Date: Tue, 6 Nov 2018 10:33:07 -0600 Subject: [PATCH] added files --- path_append.py | 128 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 path_append.py diff --git a/path_append.py b/path_append.py new file mode 100644 index 0000000..77ddd55 --- /dev/null +++ b/path_append.py @@ -0,0 +1,128 @@ +from winreg import * +import argparse +import win32con +import win32gui +import re +import saveto +import itertools + +user = 'Environment' +system = r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment' + +class regkey(object): + + def __init__(self,root, path): + self.path = path + self.root = root + reg = ConnectRegistry(None, root) + self.key = OpenKey(reg, path, 0, KEY_ALL_ACCESS) + + def set_value(self, name, value,t=REG_EXPAND_SZ): + SetValueEx(self.key, name, 0, t, value) + win32gui.SendMessage(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, 'Environment') + + def get_value(self, name, ret_type = False): + value, type_id = QueryValueEx(self.key, name) + if ret_type: + return value, type_id + else: + return value + +class path_key(regkey): + + def __init__(self,root=HKEY_CURRENT_USER, path=user): + super(path_key,self).__init__(root,path) + self.path_set = self.get_path_setobj() + + def get_path_setobj(self): + path = self.get_value('Path') + path = set(path.split(';')) + return path + + def format_path(self): + path = self.path_set + return ';'.join(sorted(path)) + + def add(self, path): + self.path_set.add(path) + + def remove(self, path): + self.path_set.discard(path) + + def commit(self): + path = self.format_path() + self.set_value('Path', path) + + def check(self,path): + return path in self.path_set + +def search_remove(pathobj,pattern,action,regex=False,negate=False,dry_run=False): + if negate: + flt = itertools.filterfalse + else: + flt = filter + if regex: + pattern = re.compile(pattern,re.IGNORECASE) + results = flt(lambda path: pattern.search(path),pathobj.path_set) + else: + pattern = pattern.lower() + results = flt(lambda path: pattern in path.lower(),pathobj.path_set) + for path in list(results): + if dry_run: + print('REM: {path}'.format(path=path)) + else: + action(path) + +if __name__ == "__main__": + parser = argparse.ArgumentParser(prog='path') + + parser.add_argument('-l','--list',action = 'store_true',help = 'list path entries') + parser.add_argument('-s','--system',action = 'store_true',help = 'use system enviroment instead of current user') + alts = parser.add_subparsers(dest='command') + + mod = alts.add_parser('mod') + group = mod.add_mutually_exclusive_group(required=True) + group.add_argument('-a', dest='add', action= 'store_true', help='add to PATH') + group.add_argument('-r', dest='remove', action ='store_true', help='remove from PATH') + mod.add_argument('-d',dest='dry_run',action='store_true',help='dry run') + mod.add_argument('path', help = 'Path to be appended to PATH') + + search = alts.add_parser('map') + search.add_argument('--regex',action='store_true',help='use regex') + search.add_argument('-n',action = 'store_true',help = 'negate pattern') + search.add_argument('-d',dest='dry_run',action='store_true',help='dry run') + search.add_argument('pattern', help = 'pattern to search through path and remove matches') + + args = parser.parse_args() + + if args.system: + try: + path = path_key(HKEY_LOCAL_MACHINE,system) + except PermissionError: + print('Must be admin to view system keys') + exit() + else: + path = path_key() + + if args.list: + print('\n'.join(sorted(path.path_set))) + elif args.command == 'mod': + if args.dry_run: + if args.add: + print('ADD: {path}'.format(path=args.path)) + else: + assert(path.check(args.path)) + print('REM: {path}'.format(path=args.path)) + else: + if args.add: + path.add(args.path) + else: + assert(path.check(args.path)) + path.remove(args.path) + path.commit() + elif args.command == 'map': + search_remove(path,args.pattern,path.remove,args.regex,args.n,args.dry_run) + if not args.dry_run: + path.commit() + else: + parser.parse_args(['-h'])