commit 6100a3221f8760cf94495285cbd54c9ba7df0645 Author: Raphael Roberts Date: Fri Apr 13 23:35:38 2018 -0500 initial commit diff --git a/adb.py b/adb.py new file mode 100644 index 0000000..3b1018c --- /dev/null +++ b/adb.py @@ -0,0 +1,181 @@ +import datetime +import json +import os +import re +import shutil +import subprocess +import time + +debug = True +with open('defaults.json') as d,open('keycodes.json') as k: + defaults = json.load(d) + keycodes = json.load(k) +exe = defaults['exe'] +for key,value in defaults['local'].items(): + defaults['local'][key] = os.path.expandvars(value) + +#I can't lmao +exists = '''if [ -e {} ] +then + echo "True" +else + echo "False" +fi''' + +def merge(src, dst,log = False): + if not os.path.exists(dst): + return False + ok = True + for path, dirs, files in os.walk(src): + relPath = os.path.relpath(path, src) + destPath = os.path.join(dst, relPath) + if not os.path.exists(destPath): + os.makedirs(destPath) + for file in files: + destFile = os.path.join(destPath, file) + if os.path.isfile(destFile): + if log: + print("Skipping existing file: " + os.path.join(relPath, file)) + ok = False + continue + srcFile = os.path.join(path, file) + shutil.move(srcFile, destFile) + for path, dirs, files in os.walk(src, False): + if len(files) == 0 and len(dirs) == 0: + os.rmdir(path) + return ok + +def _adb(*args,out = False): + args = [exe] + list(args) + if out: + return subprocess.check_output(args,shell = False).decode().rstrip('\r\n') + else: + subprocess.call(args,shell = False) + +def get_info(): + thing = _adb("devices","-l",out = True) + formed = list(filter(bool,thing.split("\r\n")))[1:] + main = {} + for device in formed: + categories = re.split(" +",device) + device_dict = { + "serial":categories[0], + "mode":categories[1] + } + + device_dict.update(dict(category.split(":") for category in categories[2:])) + main[categories[0]] = device_dict + return main + +class device: + + + def prim_device(): + while True: + prim_device_serial = get_info() + if len(prim_device_serial.keys()) > 0: + return device(list(prim_device_serial.keys())[0]) + + def __init__(self,serial=None): + if serial: + self.serial = serial + self.info = get_info()[serial] + else: + self.serial,self.info = get_info().items()[0] + + def adb(self,*args,out = False): + args = ['-s',self.serial]+ list(args) + return _adb(*args,out = out) + + def sudo(self,*args,out = False): + args = '"{}"'.format(" ".join(args)) + return self.adb("shell","su","-c",args,out = out) + + def exists(self,file): + e = exists.format(file) + res = self.sudo(e,out=True) + return res == "True" + + def reboot(self,mode = None): + if mode: + if mode == "soft": + pid = self.adb("shell","pidof","zygote",out = True) + return self.sudo("kill",pid,out=True) + + else: + self.adb("reboot",mode) + else: + self.adb("reboot") + + def delete(self,path): + self.sudo("rm","-rf",path) + + def copy(self,remote,local,del_duplicate = True): + if os.path.exists(computer): + last = os.path.split(computer)[-1] + real_dir = computer + computer = os.path.join(defaults['temp'],last) + flag = True + self.adb("pull","-a",phone,computer) + if flag: + shutil.merge(computer,real_dir) + if os.path.exists(computer) and delete_dups: + shutil.rmtree(computer) + + def send_keycode(self,code): + try: + keycode = keycodes[code] + except KeyError: + keycode = str(code) + self.adb("shell","input","keyevent",keycode) + + def move(self,remote,local,del_duplicate = True): + self.copy(remote,local,del_duplicate = del_duplicate) + self.delete(remote) + + def push(self,local,remote): + self.adb('push',local,remote) + + def backup(*partitions,name = None,backupdir): + + options_dict = { + "system": "S", + "data": "D", + "cache": "C", + "recovery": "R", + "spec_part_1": "1", + "spec_part_2": "2", + "spec_part_3": "3", + "boot": "B", + "as": "A" + } + options = "".join(options_dict[option] for option in partitions) + + if not name: + name = "backup_"+datetime.datetime.today().strftime(defaults['date_format']) + + filename = os.path.join(backupdir,name) + self.adb("shell","twrp","backup",options,name) + phone_dir = "/data/media/0/TWRP/BACKUPS/{serial}/{name}".format(serial = self.serial,name = name) + self.move(phone_dir,filename) + + def unlock_phone(self,pin): + self.send_keycode('power') + self.send_keycode('space') + self.adb("shell","input","text",str(pin)) + self.send_keycode('enter') + + def install(self,name): + if os.path.exists(name): + local_name = name + name = os.path.split(name)[-1] + update_path = '{}/{}'.format(defaults['remote']['updates'],name) + if not self.exists(update_path): + self.push(local_name,defaults['remote']['updates']) + + else: + update_path = '{}/{}'.format(defaults['remote']['updates'],name) + self.adb("shell","twrp","install",update_path) + +if __name__ == "__main__" and debug: + d = device.prim_device() diff --git a/defaults.json b/defaults.json new file mode 100644 index 0000000..99f29d7 --- /dev/null +++ b/defaults.json @@ -0,0 +1,16 @@ +{ + "exe": "c:\\Program Files (x86)\\ADB\\adb.exe", + "date_format":"%Y-%m-%d_%H.%M.%S", + "local": { + "TWRP": "%userprofile%\\Android\\TWRP", + "TitaniumBackup": "%userprofile%\\Android\\TitaniumBackup", + "temp": "%userprofile%\\Android\\harbor", + "screenshots": "%userprofile%\\Pictures\\Screenshots", + "updates": "%userprofile%\\Downloads\\sort\\phone_updates" + }, + "remote": { + "screenshots": "/sdcard/Pictures/Screenshots", + "titanium_backup": "/sdcard/TitaniumBackup", + "updates": "/data/lineageos_updates" + } +} \ No newline at end of file diff --git a/keycodes.json b/keycodes.json new file mode 100644 index 0000000..c1c9a1e --- /dev/null +++ b/keycodes.json @@ -0,0 +1,287 @@ +{ + "unknown": "0", + "soft_left": "1", + "soft_right": "2", + "home": "3", + "back": "4", + "call": "5", + "endcall": "6", + "0": "7", + "1": "8", + "2": "9", + "3": "10", + "4": "11", + "5": "12", + "6": "13", + "7": "14", + "8": "15", + "9": "16", + "star": "17", + "pound": "18", + "dpad_up": "19", + "dpad_down": "20", + "dpad_left": "21", + "dpad_right": "22", + "dpad_center": "23", + "volume_up": "24", + "volume_down": "25", + "power": "26", + "camera": "27", + "clear": "28", + "a": "29", + "b": "30", + "c": "31", + "d": "32", + "e": "33", + "f": "34", + "g": "35", + "h": "36", + "i": "37", + "j": "38", + "k": "39", + "l": "40", + "m": "41", + "n": "42", + "o": "43", + "p": "44", + "q": "45", + "r": "46", + "s": "47", + "t": "48", + "u": "49", + "v": "50", + "w": "51", + "x": "52", + "y": "53", + "z": "54", + "comma": "55", + "period": "56", + "alt_left": "57", + "alt_right": "58", + "shift_left": "59", + "shift_right": "60", + "tab": "61", + "space": "62", + "sym": "63", + "explorer": "64", + "envelope": "65", + "enter": "66", + "del": "67", + "grave": "68", + "minus": "69", + "equals": "70", + "left_bracket": "71", + "right_bracket": "72", + "backslash": "73", + "semicolon": "74", + "apostrophe": "75", + "slash": "76", + "at": "77", + "num": "78", + "headsethook": "79", + "focus": "80", + "plus": "81", + "menu": "82", + "notification": "83", + "search": "84", + "media_play_pause": "85", + "media_stop": "86", + "media_next": "87", + "media_previous": "88", + "media_rewind": "89", + "media_fast_forward": "90", + "mute": "91", + "page_up": "92", + "page_down": "93", + "pictsymbols": "94", + "switch_charset": "95", + "button_a": "96", + "button_b": "97", + "button_c": "98", + "button_x": "99", + "button_y": "100", + "button_z": "101", + "button_l1": "102", + "button_r1": "103", + "button_l2": "104", + "button_r2": "105", + "button_thumbl": "106", + "button_thumbr": "107", + "button_start": "108", + "button_select": "109", + "button_mode": "110", + "escape": "111", + "forward_del": "112", + "ctrl_left": "113", + "ctrl_right": "114", + "caps_lock": "115", + "scroll_lock": "116", + "meta_left": "117", + "meta_right": "118", + "function": "119", + "sysrq": "120", + "break": "121", + "move_home": "122", + "move_end": "123", + "insert": "124", + "forward": "125", + "media_play": "126", + "media_pause": "127", + "media_close": "128", + "media_eject": "129", + "media_record": "130", + "f1": "131", + "f2": "132", + "f3": "133", + "f4": "134", + "f5": "135", + "f6": "136", + "f7": "137", + "f8": "138", + "f9": "139", + "f10": "140", + "f11": "141", + "f12": "142", + "num_lock": "143", + "numpad_0": "144", + "numpad_1": "145", + "numpad_2": "146", + "numpad_3": "147", + "numpad_4": "148", + "numpad_5": "149", + "numpad_6": "150", + "numpad_7": "151", + "numpad_8": "152", + "numpad_9": "153", + "numpad_divide": "154", + "numpad_multiply": "155", + "numpad_subtract": "156", + "numpad_add": "157", + "numpad_dot": "158", + "numpad_comma": "159", + "numpad_enter": "160", + "numpad_equals": "161", + "numpad_left_paren": "162", + "numpad_right_paren": "163", + "volume_mute": "164", + "info": "165", + "channel_up": "166", + "channel_down": "167", + "zoom_in": "168", + "zoom_out": "169", + "tv": "170", + "window": "171", + "guide": "172", + "dvr": "173", + "bookmark": "174", + "captions": "175", + "settings": "176", + "tv_power": "177", + "tv_input": "178", + "stb_power": "179", + "stb_input": "180", + "avr_power": "181", + "avr_input": "182", + "prog_red": "183", + "prog_green": "184", + "prog_yellow": "185", + "prog_blue": "186", + "app_switch": "187", + "button_1": "188", + "button_2": "189", + "button_3": "190", + "button_4": "191", + "button_5": "192", + "button_6": "193", + "button_7": "194", + "button_8": "195", + "button_9": "196", + "button_10": "197", + "button_11": "198", + "button_12": "199", + "button_13": "200", + "button_14": "201", + "button_15": "202", + "button_16": "203", + "language_switch": "204", + "manner_mode": "205", + "3d_mode": "206", + "contacts": "207", + "calendar": "208", + "music": "209", + "calculator": "210", + "zenkaku_hankaku": "211", + "eisu": "212", + "muhenkan": "213", + "henkan": "214", + "katakana_hiragana": "215", + "yen": "216", + "ro": "217", + "kana": "218", + "assist": "219", + "brightness_down": "220", + "brightness_up": "221", + "media_audio_track": "222", + "sleep": "223", + "wakeup": "224", + "pairing": "225", + "media_top_menu": "226", + "11": "227", + "12": "228", + "last_channel": "229", + "tv_data_service": "230", + "voice_assist": "231", + "tv_radio_service": "232", + "tv_teletext": "233", + "tv_number_entry": "234", + "tv_terrestrial_analog": "235", + "tv_terrestrial_digital": "236", + "tv_satellite": "237", + "tv_satellite_bs": "238", + "tv_satellite_cs": "239", + "tv_satellite_service": "240", + "tv_network": "241", + "tv_antenna_cable": "242", + "tv_input_hdmi_1": "243", + "tv_input_hdmi_2": "244", + "tv_input_hdmi_3": "245", + "tv_input_hdmi_4": "246", + "tv_input_composite_1": "247", + "tv_input_composite_2": "248", + "tv_input_component_1": "249", + "tv_input_component_2": "250", + "tv_input_vga_1": "251", + "tv_audio_description": "252", + "tv_audio_description_mix_up": "253", + "tv_audio_description_mix_down": "254", + "tv_zoom_mode": "255", + "tv_contents_menu": "256", + "tv_media_context_menu": "257", + "tv_timer_programming": "258", + "help": "259", + "navigate_previous": "260", + "navigate_next": "261", + "navigate_in": "262", + "navigate_out": "263", + "stem_primary": "264", + "stem_1": "265", + "stem_2": "266", + "stem_3": "267", + "dpad_up_left": "268", + "dpad_down_left": "269", + "dpad_up_right": "270", + "dpad_down_right": "271", + "media_skip_forward": "272", + "media_skip_backward": "273", + "media_step_forward": "274", + "media_step_backward": "275", + "soft_sleep": "276", + "cut": "277", + "copy": "278", + "paste": "279", + "system_navigation_up": "280", + "system_navigation_down": "281", + "system_navigation_left": "282", + "system_navigation_right": "283", + "all_apps": "284" +} \ No newline at end of file