From 754d9090b001e635a168c7a2c03d95c1ac09d492 Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Wed, 22 May 2024 09:10:53 -0700 Subject: [PATCH 01/20] Update version - Version bump (24.06) --- Fire-Tools/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Fire-Tools/version b/Fire-Tools/version index 0312909..7d9d1a1 100644 --- a/Fire-Tools/version +++ b/Fire-Tools/version @@ -1 +1 @@ -24.05 +24.06 From ea5c9a893166d64915b3cf3b966d255f52685fea Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Wed, 22 May 2024 09:25:37 -0700 Subject: [PATCH 02/20] Update main.py - Appinstaller can now install specified apps instead of all apps in a folder --- Fire-Tools/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Fire-Tools/main.py b/Fire-Tools/main.py index 48a8d0e..b0b9256 100644 --- a/Fire-Tools/main.py +++ b/Fire-Tools/main.py @@ -70,7 +70,7 @@ def set_dns(): # Get all .apk(m) Files from Selected Folder & Pass to AppInstaller Script def appinstaller(folder): - search = f"{os.getcwd()}{folder}/*.apk*" + search = f"{os.getcwd()}/{folder}*.apk*" for app in glob.iglob(search): os.system(f"{path}appinstaller{extension} \"{app}\"") @@ -154,10 +154,10 @@ def switch(option): label2 = ctk.CTkLabel(window, text="Utilities", font=("default",25)) label2.grid(row=0, column=1, padx=60, pady=15) -googleservices = ctk.CTkButton(window, text="Install Google Services", width=200, height=50, command=lambda: appinstaller("/Gapps")) +googleservices = ctk.CTkButton(window, text="Install Google Services", width=200, height=50, command=lambda: appinstaller("Gapps/")) googleservices.grid(row=1, column=1, padx=60, pady=15) -batchinstall = ctk.CTkButton(window, text="Batch Install", width=200, height=50, command=lambda: appinstaller("/Batch")) +batchinstall = ctk.CTkButton(window, text="Batch Install", width=200, height=50, command=lambda: appinstaller("Batch/")) batchinstall.grid(row=2, column=1, padx=60, pady=15) ota = ctk.CTkButton(window, text="Disable OTA", width=200, height=50, command=disableota) From 6a2065bb7d44e6981caa646062a26e04380bd95f Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Wed, 22 May 2024 09:29:05 -0700 Subject: [PATCH 03/20] Update main.py - Updated version number - Moved debloat & appinstaller functions higher because other functions depend on them - Updated comment for appinstaller function --- Fire-Tools/main.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Fire-Tools/main.py b/Fire-Tools/main.py index b0b9256..897a038 100644 --- a/Fire-Tools/main.py +++ b/Fire-Tools/main.py @@ -4,7 +4,7 @@ import customtkinter as ctk # Platform & Device Variables -version = "24.05" +version = "24.06" platform = "Linux/macOS" path = f"{os.getcwd()}/Scripts/Posix/" extension = ".sh" @@ -24,6 +24,16 @@ window.title(f"Fire Tools v{version} - ({platform}) | {device[0]}") window.geometry("980x550") +# Run Debloat with Disable/Enable Option & Package Name +def debloat(option,package): + os.system(f"{path}debloat{extension} {option} {package}") + +# Pass Folder or .apk(m) to Appinstaller Script for Installation +def appinstaller(folder): + search = f"{os.getcwd()}/{folder}*.apk*" + for app in glob.iglob(search): + os.system(f"{path}appinstaller{extension} \"{app}\"") + # On Update, Delete 'ft-identifying-tablet-devices.html', Update Modules, and Make Scripts Executable (Linux/macOS) def update_tool(): print("Checking for Updates...\n") @@ -47,10 +57,6 @@ def update_tool(): else: print("No Update Needed\n") -# Run Debloat with Disable/Enable Option & Package Name -def debloat(option,package): - os.system(f"{path}debloat{extension} {option} {package}") - # Open Debloat.txt in Preferred Text Editor def editfile(): if platform != "Windows": @@ -68,12 +74,6 @@ def set_dns(): os.system("adb shell settings put global private_dns_mode hostname") os.system(f"adb shell \"settings put global private_dns_specifier {dnsprovider} && printf 'Successfully Set Private DNS to: {dnsprovider}\\n\\n'\"") -# Get all .apk(m) Files from Selected Folder & Pass to AppInstaller Script -def appinstaller(folder): - search = f"{os.getcwd()}/{folder}*.apk*" - for app in glob.iglob(search): - os.system(f"{path}appinstaller{extension} \"{app}\"") - # Attempt to Disable OTA Packages def disableota(): ota_packages = "com.amazon.device.software.ota", "com.amazon.device.software.ota.override", "com.amazon.kindle.otter.oobe.forced.ota" From 4dc487e4b3eca100ab52ef9c66afbb3fdaada97d Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Wed, 22 May 2024 09:39:05 -0700 Subject: [PATCH 04/20] Update main.py - Replaced os.system calls with subprocess.run because it's deprecated --- Fire-Tools/main.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Fire-Tools/main.py b/Fire-Tools/main.py index 897a038..8732acd 100644 --- a/Fire-Tools/main.py +++ b/Fire-Tools/main.py @@ -1,6 +1,7 @@ import glob import os import requests +import subprocess import customtkinter as ctk # Platform & Device Variables @@ -26,13 +27,13 @@ # Run Debloat with Disable/Enable Option & Package Name def debloat(option,package): - os.system(f"{path}debloat{extension} {option} {package}") + subprocess.run(f"{path}debloat{extension} {option} {package}") # Pass Folder or .apk(m) to Appinstaller Script for Installation def appinstaller(folder): search = f"{os.getcwd()}/{folder}*.apk*" for app in glob.iglob(search): - os.system(f"{path}appinstaller{extension} \"{app}\"") + subprocess.run(f"{path}appinstaller{extension} \"{app}\"") # On Update, Delete 'ft-identifying-tablet-devices.html', Update Modules, and Make Scripts Executable (Linux/macOS) def update_tool(): @@ -60,7 +61,7 @@ def update_tool(): # Open Debloat.txt in Preferred Text Editor def editfile(): if platform != "Windows": - os.system("xdg-open Debloat.txt >/dev/null 2>&1 || open -e Debloat.txt") + subprocess.run("xdg-open Debloat.txt >/dev/null 2>&1 || open -e Debloat.txt") else: os.startfile('Debloat.txt') @@ -68,11 +69,11 @@ def editfile(): def set_dns(): dnsprovider = customdns.get() if dnsprovider == "None": - os.system("adb shell \"settings put global private_dns_mode off && printf 'Disabled Private DNS\\n\\n'\"") - os.system("adb shell settings delete global private_dns_specifier") + subprocess.run("adb shell \"settings put global private_dns_mode off && printf 'Disabled Private DNS\\n\\n'\"") + subprocess.run("adb shell settings delete global private_dns_specifier") elif dnsprovider != "Select or Enter DNS Server": - os.system("adb shell settings put global private_dns_mode hostname") - os.system(f"adb shell \"settings put global private_dns_specifier {dnsprovider} && printf 'Successfully Set Private DNS to: {dnsprovider}\\n\\n'\"") + subprocess.run("adb shell settings put global private_dns_mode hostname") + subprocess.run(f"adb shell \"settings put global private_dns_specifier {dnsprovider} && printf 'Successfully Set Private DNS to: {dnsprovider}\\n\\n'\"") # Attempt to Disable OTA Packages def disableota(): @@ -85,11 +86,11 @@ def set_launcher(): if customlauncher.get() == "Custom": launcher = ctk.filedialog.askopenfilename(title="Select Launcher .apk(m) File",filetypes=(("APK","*.apk"),("Split APK","*.apkm"),("all files","*.*"))) if launcher: - os.system(f"{path}appinstaller{extension} \"{launcher}\" Launcher") + subprocess.run(f"{path}appinstaller{extension} \"{launcher}\" Launcher") elif customlauncher.get() != "Select Launcher": search = f"{os.getcwd()}/{customlauncher.get()}*.apk" for launcher in glob.iglob(search): - os.system(f"{path}appinstaller{extension} \"{launcher}\" Launcher") + subprocess.run(f"{path}appinstaller{extension} \"{launcher}\" Launcher") # Extract Selected Package to Extracted/{package} If not Already Present def extract(package): @@ -97,7 +98,7 @@ def extract(package): print("Extracting:", package) os.mkdir(f"Extracted/{package}") for packagelocation in os.popen(f"adb shell \"pm path {package} | cut -f2 -d:\"").read().splitlines(): - os.system(f"adb pull {packagelocation} ./Extracted/{package}") + subprocess.run(f"adb pull {packagelocation} ./Extracted/{package}") if not os.listdir(f"Extracted/{package}"): os.rmdir(f"Extracted/{package}") else: From 0791805cc21f8cc88e837b3853d0a91101ce5f8b Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Wed, 22 May 2024 10:34:16 -0700 Subject: [PATCH 05/20] Update main.py - Replaced os.popen with subprocess as it's also deprecated - Swapped to Python's os.chmod for marking scripts executable after updates - Replaced single quotes with double quotes to keep consistency --- Fire-Tools/main.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Fire-Tools/main.py b/Fire-Tools/main.py index 8732acd..84033c3 100644 --- a/Fire-Tools/main.py +++ b/Fire-Tools/main.py @@ -17,7 +17,7 @@ shell = "PowerShell" # Get Device Name & Fire OS Version from identify Script, then Print Fire Tools Version, Platform, Device Name, and Software Version -device = os.popen(f"{path}identify{extension}").read().splitlines() +device = subprocess.check_output(f"{path}identify{extension}", universal_newlines=True).splitlines() print(f"Fire Tools Version: {version}\nPlatform: {platform}\nDevice: {device[0]}\nSoftware: {device[1]}\n") # Window Config @@ -35,7 +35,7 @@ def appinstaller(folder): for app in glob.iglob(search): subprocess.run(f"{path}appinstaller{extension} \"{app}\"") -# On Update, Delete 'ft-identifying-tablet-devices.html', Update Modules, and Make Scripts Executable (Linux/macOS) +# On Update, Delete "ft-identifying-tablet-devices.html", Update Modules, and Make Scripts Executable (Linux/macOS) def update_tool(): print("Checking for Updates...\n") try: @@ -52,7 +52,8 @@ def update_tool(): with open(f"{module}", "wb") as file: file.write(requests.get(f"https://github.com/mrhaydendp/Fire-Tools/raw/main/Fire-Tools/{module}", timeout=10).content) if platform == "Linux/macOS": - os.popen("chmod +x Scripts/Posix/*.sh") + for script in glob.glob(f"{os.getcwd()}/Scripts/Posix/*.sh"): + os.chmod(script, 0o775 ) print("\nUpdates Complete, Please Re-launch Application") quit() else: @@ -63,7 +64,7 @@ def editfile(): if platform != "Windows": subprocess.run("xdg-open Debloat.txt >/dev/null 2>&1 || open -e Debloat.txt") else: - os.startfile('Debloat.txt') + os.startfile("Debloat.txt") # Set DNS Mode to Hostname, then Set Selected Provider as Private DNS def set_dns(): @@ -97,21 +98,21 @@ def extract(package): if not os.path.exists(f"Extracted/{package}"): print("Extracting:", package) os.mkdir(f"Extracted/{package}") - for packagelocation in os.popen(f"adb shell \"pm path {package} | cut -f2 -d:\"").read().splitlines(): + for packagelocation in subprocess.check_output(f"adb shell \"pm path {package} | cut -f2 -d:\"", universal_newlines=True).splitlines(): subprocess.run(f"adb pull {packagelocation} ./Extracted/{package}") if not os.listdir(f"Extracted/{package}"): os.rmdir(f"Extracted/{package}") else: print(f"Found at: /Extracted/{package}") -# Add Selected Packages to 'customlist' & Remove if Package is Already Found +# Add Selected Packages to "customlist" & Remove if Package is Already Found def add_package(package): if package in customlist: customlist.remove(package) else: customlist.append(package) -# Read Packages from 'customlist' & Pass to Debloat or Extract Function +# Read Packages from "customlist" & Pass to Debloat or Extract Function def custom(option): for package in customlist: if option == "Extract": @@ -199,9 +200,9 @@ def switch(option): customlist = [] if device[0] != "Unknown/Undetected": - for enabled_package in os.popen("adb shell \"pm list packages -e | cut -f2 -d:\"").read().splitlines(): + for enabled_package in subprocess.check_output("adb shell \"pm list packages -e | cut -f2 -d:\"", universal_newlines=True).splitlines(): checkbox = ctk.CTkCheckBox(enabled_list, text=enabled_package, command = lambda param = enabled_package: add_package(param)).pack() - for disabled_package in os.popen("adb shell \"pm list packages -d | cut -f2 -d:\"").read().splitlines(): + for disabled_package in subprocess.check_output("adb shell \"pm list packages -d | cut -f2 -d:\"", universal_newlines=True).splitlines(): checkbox = ctk.CTkCheckBox(disabled_list, text=disabled_package, command = lambda param = disabled_package: add_package(param)).pack() window.mainloop() From 656279c3507e0b45d493822b8e6045d769b1cb4a Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Mon, 27 May 2024 09:42:45 -0700 Subject: [PATCH 06/20] Update main.py - Fixed most broken commands - Debloat now won't run with empty variables --- Fire-Tools/main.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/Fire-Tools/main.py b/Fire-Tools/main.py index 84033c3..425d50e 100644 --- a/Fire-Tools/main.py +++ b/Fire-Tools/main.py @@ -27,13 +27,16 @@ # Run Debloat with Disable/Enable Option & Package Name def debloat(option,package): - subprocess.run(f"{path}debloat{extension} {option} {package}") + if package: + subprocess.run(f"{path}debloat{extension} {option} {package}".split()) + else: + subprocess.run(f"{path}debloat{extension} {option}".split()) # Pass Folder or .apk(m) to Appinstaller Script for Installation def appinstaller(folder): search = f"{os.getcwd()}/{folder}*.apk*" for app in glob.iglob(search): - subprocess.run(f"{path}appinstaller{extension} \"{app}\"") + subprocess.run(f"{path}appinstaller{extension} \"{app}\"".split()) # On Update, Delete "ft-identifying-tablet-devices.html", Update Modules, and Make Scripts Executable (Linux/macOS) def update_tool(): @@ -62,7 +65,7 @@ def update_tool(): # Open Debloat.txt in Preferred Text Editor def editfile(): if platform != "Windows": - subprocess.run("xdg-open Debloat.txt >/dev/null 2>&1 || open -e Debloat.txt") + subprocess.run("xdg-open Debloat.txt >/dev/null 2>&1 || open -e Debloat.txt", shell=True) else: os.startfile("Debloat.txt") @@ -70,11 +73,11 @@ def editfile(): def set_dns(): dnsprovider = customdns.get() if dnsprovider == "None": - subprocess.run("adb shell \"settings put global private_dns_mode off && printf 'Disabled Private DNS\\n\\n'\"") - subprocess.run("adb shell settings delete global private_dns_specifier") + subprocess.run("adb shell \"settings put global private_dns_mode off && printf 'Disabled Private DNS\\n\\n'\"".split()) + subprocess.run("adb shell settings delete global private_dns_specifier".split()) elif dnsprovider != "Select or Enter DNS Server": - subprocess.run("adb shell settings put global private_dns_mode hostname") - subprocess.run(f"adb shell \"settings put global private_dns_specifier {dnsprovider} && printf 'Successfully Set Private DNS to: {dnsprovider}\\n\\n'\"") + subprocess.run("adb shell settings put global private_dns_mode hostname".split)() + subprocess.run(f"adb shell \"settings put global private_dns_specifier {dnsprovider} && printf 'Successfully Set Private DNS to: {dnsprovider}\\n\\n'\"".split()) # Attempt to Disable OTA Packages def disableota(): @@ -87,11 +90,11 @@ def set_launcher(): if customlauncher.get() == "Custom": launcher = ctk.filedialog.askopenfilename(title="Select Launcher .apk(m) File",filetypes=(("APK","*.apk"),("Split APK","*.apkm"),("all files","*.*"))) if launcher: - subprocess.run(f"{path}appinstaller{extension} \"{launcher}\" Launcher") + subprocess.run(f"{path}appinstaller{extension} \"{launcher}\" Launcher".split()) elif customlauncher.get() != "Select Launcher": search = f"{os.getcwd()}/{customlauncher.get()}*.apk" for launcher in glob.iglob(search): - subprocess.run(f"{path}appinstaller{extension} \"{launcher}\" Launcher") + subprocess.run(f"{path}appinstaller{extension} \"{launcher}\" Launcher".split()) # Extract Selected Package to Extracted/{package} If not Already Present def extract(package): @@ -99,7 +102,7 @@ def extract(package): print("Extracting:", package) os.mkdir(f"Extracted/{package}") for packagelocation in subprocess.check_output(f"adb shell \"pm path {package} | cut -f2 -d:\"", universal_newlines=True).splitlines(): - subprocess.run(f"adb pull {packagelocation} ./Extracted/{package}") + subprocess.run(["adb", "pull", {packagelocation}, f"./Extracted/{package}"]) if not os.listdir(f"Extracted/{package}"): os.rmdir(f"Extracted/{package}") else: @@ -200,9 +203,9 @@ def switch(option): customlist = [] if device[0] != "Unknown/Undetected": - for enabled_package in subprocess.check_output("adb shell \"pm list packages -e | cut -f2 -d:\"", universal_newlines=True).splitlines(): + for enabled_package in subprocess.check_output("adb shell \"pm list packages -e | cut -f2 -d:\"", universal_newlines=True, shell=True).splitlines(): checkbox = ctk.CTkCheckBox(enabled_list, text=enabled_package, command = lambda param = enabled_package: add_package(param)).pack() - for disabled_package in subprocess.check_output("adb shell \"pm list packages -d | cut -f2 -d:\"", universal_newlines=True).splitlines(): + for disabled_package in subprocess.check_output("adb shell \"pm list packages -d | cut -f2 -d:\"", universal_newlines=True, shell=True).splitlines(): checkbox = ctk.CTkCheckBox(disabled_list, text=disabled_package, command = lambda param = disabled_package: add_package(param)).pack() window.mainloop() From e35c2cc2ca2b713156078f30857e52ad2ec8b95c Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Thu, 30 May 2024 09:38:50 -0700 Subject: [PATCH 07/20] Update requirements.txt - Updated "requests" to 2.32.0 to mitigate CVE-2024-35195 --- Fire-Tools/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Fire-Tools/requirements.txt b/Fire-Tools/requirements.txt index f3327a2..36c63f4 100644 --- a/Fire-Tools/requirements.txt +++ b/Fire-Tools/requirements.txt @@ -3,5 +3,5 @@ charset-normalizer==3.3.2 customtkinter==5.2.2 darkdetect==0.8.0 packaging==24.0 -requests==2.31.0 +requests==2.32.0 urllib3==2.2.1 From 37fad80ff43716184742ba404ee5cc4263242050 Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Thu, 30 May 2024 11:31:13 -0700 Subject: [PATCH 08/20] Update main.py - Fixed Custom DNS commands and made it adhere to better coding practices --- Fire-Tools/main.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Fire-Tools/main.py b/Fire-Tools/main.py index 425d50e..f16974a 100644 --- a/Fire-Tools/main.py +++ b/Fire-Tools/main.py @@ -73,11 +73,16 @@ def editfile(): def set_dns(): dnsprovider = customdns.get() if dnsprovider == "None": - subprocess.run("adb shell \"settings put global private_dns_mode off && printf 'Disabled Private DNS\\n\\n'\"".split()) - subprocess.run("adb shell settings delete global private_dns_specifier".split()) + subprocess.run("adb shell settings put global private_dns_mode off", shell=True) + subprocess.run("adb shell settings delete global private_dns_specifier", shell=True) + print("Disabled Private DNS\n") elif dnsprovider != "Select or Enter DNS Server": - subprocess.run("adb shell settings put global private_dns_mode hostname".split)() - subprocess.run(f"adb shell \"settings put global private_dns_specifier {dnsprovider} && printf 'Successfully Set Private DNS to: {dnsprovider}\\n\\n'\"".split()) + try: + subprocess.check_output("adb shell settings put global private_dns_mode hostname", stderr=subprocess.PIPE, shell=True) + subprocess.check_output(f"adb shell settings put global private_dns_specifier {dnsprovider}", shell=True) + print(f"Successfully Set DNS Provider to: {dnsprovider}\n") + except subprocess.CalledProcessError: + print("Failed to Set Private DNS\n") # Attempt to Disable OTA Packages def disableota(): From b0b2e6365bbe9e61adef75320a9020667de4da2b Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Thu, 30 May 2024 12:05:12 -0700 Subject: [PATCH 09/20] Update main.py - Got rid of .split() command workaround and rewrite commands correctly - Simplified "customlauncher" by calling appinstaller script once --- Fire-Tools/main.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Fire-Tools/main.py b/Fire-Tools/main.py index f16974a..fe2c9900a 100644 --- a/Fire-Tools/main.py +++ b/Fire-Tools/main.py @@ -28,15 +28,15 @@ # Run Debloat with Disable/Enable Option & Package Name def debloat(option,package): if package: - subprocess.run(f"{path}debloat{extension} {option} {package}".split()) + subprocess.run([f"{path}debloat{extension}", option, package]) else: - subprocess.run(f"{path}debloat{extension} {option}".split()) + subprocess.run([f"{path}debloat{extension}", option]) # Pass Folder or .apk(m) to Appinstaller Script for Installation def appinstaller(folder): search = f"{os.getcwd()}/{folder}*.apk*" for app in glob.iglob(search): - subprocess.run(f"{path}appinstaller{extension} \"{app}\"".split()) + subprocess.run([f"{path}appinstaller{extension}", app]) # On Update, Delete "ft-identifying-tablet-devices.html", Update Modules, and Make Scripts Executable (Linux/macOS) def update_tool(): @@ -94,12 +94,12 @@ def disableota(): def set_launcher(): if customlauncher.get() == "Custom": launcher = ctk.filedialog.askopenfilename(title="Select Launcher .apk(m) File",filetypes=(("APK","*.apk"),("Split APK","*.apkm"),("all files","*.*"))) - if launcher: - subprocess.run(f"{path}appinstaller{extension} \"{launcher}\" Launcher".split()) + if not launcher: + return elif customlauncher.get() != "Select Launcher": - search = f"{os.getcwd()}/{customlauncher.get()}*.apk" - for launcher in glob.iglob(search): - subprocess.run(f"{path}appinstaller{extension} \"{launcher}\" Launcher".split()) + for app in glob.iglob(f"{os.getcwd()}/{customlauncher.get()}*.apk"): + launcher = app + subprocess.run([f"{path}appinstaller{extension}", launcher, "Launcher"]) # Extract Selected Package to Extracted/{package} If not Already Present def extract(package): From ce27893195214aec97384739e47af6681c3a3fde Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Thu, 30 May 2024 12:16:30 -0700 Subject: [PATCH 10/20] Update main.py - Added brackets around subprocess commands - Fixed "apk extractor" command by adding shell=True because it's running with an android sub-shell --- Fire-Tools/main.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Fire-Tools/main.py b/Fire-Tools/main.py index fe2c9900a..2fc3220 100644 --- a/Fire-Tools/main.py +++ b/Fire-Tools/main.py @@ -17,7 +17,7 @@ shell = "PowerShell" # Get Device Name & Fire OS Version from identify Script, then Print Fire Tools Version, Platform, Device Name, and Software Version -device = subprocess.check_output(f"{path}identify{extension}", universal_newlines=True).splitlines() +device = subprocess.check_output([f"{path}identify{extension}"], universal_newlines=True).splitlines() print(f"Fire Tools Version: {version}\nPlatform: {platform}\nDevice: {device[0]}\nSoftware: {device[1]}\n") # Window Config @@ -65,7 +65,7 @@ def update_tool(): # Open Debloat.txt in Preferred Text Editor def editfile(): if platform != "Windows": - subprocess.run("xdg-open Debloat.txt >/dev/null 2>&1 || open -e Debloat.txt", shell=True) + subprocess.run(["xdg-open Debloat.txt >/dev/null 2>&1 || open -e Debloat.txt"], shell=True) else: os.startfile("Debloat.txt") @@ -73,13 +73,13 @@ def editfile(): def set_dns(): dnsprovider = customdns.get() if dnsprovider == "None": - subprocess.run("adb shell settings put global private_dns_mode off", shell=True) - subprocess.run("adb shell settings delete global private_dns_specifier", shell=True) + subprocess.run(["adb shell settings put global private_dns_mode off"], shell=True) + subprocess.run(["adb shell settings delete global private_dns_specifier"], shell=True) print("Disabled Private DNS\n") elif dnsprovider != "Select or Enter DNS Server": try: - subprocess.check_output("adb shell settings put global private_dns_mode hostname", stderr=subprocess.PIPE, shell=True) - subprocess.check_output(f"adb shell settings put global private_dns_specifier {dnsprovider}", shell=True) + subprocess.check_output(["adb shell settings put global private_dns_mode hostname"], stderr=subprocess.PIPE, shell=True) + subprocess.check_output([f"adb shell settings put global private_dns_specifier {dnsprovider}"], shell=True) print(f"Successfully Set DNS Provider to: {dnsprovider}\n") except subprocess.CalledProcessError: print("Failed to Set Private DNS\n") @@ -106,8 +106,8 @@ def extract(package): if not os.path.exists(f"Extracted/{package}"): print("Extracting:", package) os.mkdir(f"Extracted/{package}") - for packagelocation in subprocess.check_output(f"adb shell \"pm path {package} | cut -f2 -d:\"", universal_newlines=True).splitlines(): - subprocess.run(["adb", "pull", {packagelocation}, f"./Extracted/{package}"]) + for packagelocation in subprocess.check_output([f"adb shell \"pm path {package} | cut -f2 -d:\""], universal_newlines=True, shell=True).splitlines(): + subprocess.run([f"adb pull {packagelocation} ./Extracted/{package}"], shell=True) if not os.listdir(f"Extracted/{package}"): os.rmdir(f"Extracted/{package}") else: From f4ae89b324e1af8b797153dd23cb0bf2e4c2b34a Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Thu, 30 May 2024 12:47:20 -0700 Subject: [PATCH 11/20] Update Changelog.md --- Changelog.md | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/Changelog.md b/Changelog.md index 51e3ac0..8e68691 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,19 +1,10 @@ -## Updated main.py, identify, version 05/01/2024 -- Version bump (24.05) -- Updated & cleaned up code comments -- Removed parenthesis from platform names -- Removed `window.columnconfigure` as it's implied and not needed -- Added shell variable to determine which scripts to install during updates -- Added Fire OS version, Fire Tools version, and platform output to terminal -- Made update tool more resilient to internet issues -- Update tool now uses `with` context manager to ensure files are fully downloaded and written before closing -- Cached "ft-identifying-fire-tablets.html" is now deleted during updates -- "requirements.txt" will now get updated -- Remade update tool and it now tells you which files are being updated and can now add or remove files in future updates -- Simplified folder deletion during failed package extraction -- Sped up package list generation by pre-formatting list on device -- Made package list bigger and scaled the scrollable frame better -- Temporary "packagelist" files are now deleted when application closes -- Cleaned up code by using some suggestions from Pylint -- Made custom disable/enable/extract terminal output cleaner by adding a blank line at the end -- Disable DNS will now remove "private_dns_specifier" key from device +## Updated main.py, requirements.txt, version 06/01/2024 +- Version bump (24.06) +- Updated "requests" version requirent to `2.32.0` because of CVE-2024-35195 +- Fixed some formatting inconsistancies (blank spaces, single quotes, command format) +- Updated code comments +- Replaced `os.system` & `os.popen` commands with `subprocess` equivalents since they are deprecated +- Update tool now uses Python's `os.chmod` instead of running chmod as a shell command +- Appinstaller function can now accept individual applications instead of installing all apps in a folder +- Simplified "customlauncher" function by only calling appinstaller script once +- Custom DNS check now uses try/except instead of Bash/Posix operators inside ADB shell From 9763b830e588110778de05868fadc5650f671077 Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Thu, 30 May 2024 12:48:55 -0700 Subject: [PATCH 12/20] Update Screenshot for new Version --- Screenshot.png | Bin 19802 -> 63812 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Screenshot.png b/Screenshot.png index 0016cd72b6989f5639350db040092b9ee946dab8..72e1513ae777f387c209e2d3eceb86e011f2f896 100644 GIT binary patch literal 63812 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

j5sT0C~1_XeAE9MOgQ5 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 A6951J literal 19802 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 Date: Thu, 30 May 2024 12:52:10 -0700 Subject: [PATCH 13/20] Add my GitHub Sponsors Account to Support Section --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 4aa5943..ae817c1 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,3 @@ # These are supported funding model platforms - +github: mrhaydendp ko_fi: mrhaydendp From 378cc55e89920149778ed51b3ff7a856712e7c37 Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Thu, 30 May 2024 12:58:30 -0700 Subject: [PATCH 14/20] Update main.py - Silenced output of command that removes "private_dns_specifier" --- Fire-Tools/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Fire-Tools/main.py b/Fire-Tools/main.py index 2fc3220..d9aedba 100644 --- a/Fire-Tools/main.py +++ b/Fire-Tools/main.py @@ -74,7 +74,7 @@ def set_dns(): dnsprovider = customdns.get() if dnsprovider == "None": subprocess.run(["adb shell settings put global private_dns_mode off"], shell=True) - subprocess.run(["adb shell settings delete global private_dns_specifier"], shell=True) + subprocess.run(["adb shell settings delete global private_dns_specifier"], stdout=subprocess.PIPE, shell=True) print("Disabled Private DNS\n") elif dnsprovider != "Select or Enter DNS Server": try: From 40a0c1937b4fbea55a9b55a2e5f48c9998bb993f Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Thu, 30 May 2024 13:04:33 -0700 Subject: [PATCH 15/20] Update main.py - Fix Play Store issues by re-installing during Gapps install --- Fire-Tools/main.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Fire-Tools/main.py b/Fire-Tools/main.py index d9aedba..f10b267 100644 --- a/Fire-Tools/main.py +++ b/Fire-Tools/main.py @@ -84,6 +84,11 @@ def set_dns(): except subprocess.CalledProcessError: print("Failed to Set Private DNS\n") +# Install Gapps in Gapps Folder then Re-install Play Store +def install_gapps(): + appinstaller("Gapps/") + appinstaller("Gapps/Google Play Store") + # Attempt to Disable OTA Packages def disableota(): ota_packages = "com.amazon.device.software.ota", "com.amazon.device.software.ota.override", "com.amazon.kindle.otter.oobe.forced.ota" @@ -164,7 +169,7 @@ def switch(option): label2 = ctk.CTkLabel(window, text="Utilities", font=("default",25)) label2.grid(row=0, column=1, padx=60, pady=15) -googleservices = ctk.CTkButton(window, text="Install Google Services", width=200, height=50, command=lambda: appinstaller("Gapps/")) +googleservices = ctk.CTkButton(window, text="Install Google Services", width=200, height=50, command=install_gapps) googleservices.grid(row=1, column=1, padx=60, pady=15) batchinstall = ctk.CTkButton(window, text="Batch Install", width=200, height=50, command=lambda: appinstaller("Batch/")) From 1f46a7de110a41e3fd2f507f6d23ca943a3639dc Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Thu, 30 May 2024 13:06:50 -0700 Subject: [PATCH 16/20] Update Changelog.md --- Changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.md b/Changelog.md index 8e68691..232f4fc 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,7 @@ - Updated "requests" version requirent to `2.32.0` because of CVE-2024-35195 - Fixed some formatting inconsistancies (blank spaces, single quotes, command format) - Updated code comments +- Added Play Store crashing fix by re-installing after initial Gapps install - Replaced `os.system` & `os.popen` commands with `subprocess` equivalents since they are deprecated - Update tool now uses Python's `os.chmod` instead of running chmod as a shell command - Appinstaller function can now accept individual applications instead of installing all apps in a folder From 614e25b47086361b95d36859842da3824ae1dddd Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Thu, 30 May 2024 15:45:37 -0700 Subject: [PATCH 17/20] Update main.py - Added missing brackets to package list commands --- Fire-Tools/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Fire-Tools/main.py b/Fire-Tools/main.py index f10b267..7db8052 100644 --- a/Fire-Tools/main.py +++ b/Fire-Tools/main.py @@ -213,9 +213,9 @@ def switch(option): customlist = [] if device[0] != "Unknown/Undetected": - for enabled_package in subprocess.check_output("adb shell \"pm list packages -e | cut -f2 -d:\"", universal_newlines=True, shell=True).splitlines(): + for enabled_package in subprocess.check_output(["adb shell \"pm list packages -e | cut -f2 -d:\""], universal_newlines=True, shell=True).splitlines(): checkbox = ctk.CTkCheckBox(enabled_list, text=enabled_package, command = lambda param = enabled_package: add_package(param)).pack() - for disabled_package in subprocess.check_output("adb shell \"pm list packages -d | cut -f2 -d:\"", universal_newlines=True, shell=True).splitlines(): + for disabled_package in subprocess.check_output(["adb shell \"pm list packages -d | cut -f2 -d:\""], universal_newlines=True, shell=True).splitlines(): checkbox = ctk.CTkCheckBox(disabled_list, text=disabled_package, command = lambda param = disabled_package: add_package(param)).pack() window.mainloop() From c47e621e52e8544193de249781e6eab0d73b03d9 Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Wed, 5 Jun 2024 17:56:46 -0700 Subject: [PATCH 18/20] Windows Subprocess Fixes - Reverted to `.split()` method for some commands - Moved brackets to correct places and removed then for some commands that are already formatted as a list - Debloat package will now be appended to command instead of running a seperate one - Added default empty package for debloat function - Removed shell=True for all commands - Enabled/disabled variable will now be used to generate buttons instead of direct command (might be easier to package lists in the future) - Made xdg-open/open commands more propperly by using try/except instead of Bash/Posix operators and shell=True --- Fire-Tools/main.py | 49 +++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/Fire-Tools/main.py b/Fire-Tools/main.py index 7db8052..10dab16 100644 --- a/Fire-Tools/main.py +++ b/Fire-Tools/main.py @@ -17,7 +17,7 @@ shell = "PowerShell" # Get Device Name & Fire OS Version from identify Script, then Print Fire Tools Version, Platform, Device Name, and Software Version -device = subprocess.check_output([f"{path}identify{extension}"], universal_newlines=True).splitlines() +device = subprocess.check_output(f"{path}identify{extension}".split(), universal_newlines=True).splitlines() print(f"Fire Tools Version: {version}\nPlatform: {platform}\nDevice: {device[0]}\nSoftware: {device[1]}\n") # Window Config @@ -26,17 +26,20 @@ window.geometry("980x550") # Run Debloat with Disable/Enable Option & Package Name -def debloat(option,package): +def debloat(option, package=""): + cmdlist = f"{path}debloat{extension} {option}".split() if package: - subprocess.run([f"{path}debloat{extension}", option, package]) - else: - subprocess.run([f"{path}debloat{extension}", option]) + cmdlist.append(package) + subprocess.run(cmdlist) # Pass Folder or .apk(m) to Appinstaller Script for Installation def appinstaller(folder): + cmdlist = f"{path}appinstaller{extension}".split() search = f"{os.getcwd()}/{folder}*.apk*" for app in glob.iglob(search): - subprocess.run([f"{path}appinstaller{extension}", app]) + cmdlist.append(app) + subprocess.run(cmdlist) + cmdlist.remove(app) # On Update, Delete "ft-identifying-tablet-devices.html", Update Modules, and Make Scripts Executable (Linux/macOS) def update_tool(): @@ -65,7 +68,10 @@ def update_tool(): # Open Debloat.txt in Preferred Text Editor def editfile(): if platform != "Windows": - subprocess.run(["xdg-open Debloat.txt >/dev/null 2>&1 || open -e Debloat.txt"], shell=True) + try: + subprocess.run(["xdg-open", "Debloat.txt"], check=True, stderr=subprocess.PIPE) + except subprocess.CalledProcessError: + subprocess.run(["open", "-e", "Debloat.txt"], check=True, stderr=subprocess.PIPE) else: os.startfile("Debloat.txt") @@ -73,13 +79,13 @@ def editfile(): def set_dns(): dnsprovider = customdns.get() if dnsprovider == "None": - subprocess.run(["adb shell settings put global private_dns_mode off"], shell=True) - subprocess.run(["adb shell settings delete global private_dns_specifier"], stdout=subprocess.PIPE, shell=True) + subprocess.run(["adb", "shell", "settings", "put", "global", "private_dns_mode", "off"]) + subprocess.run(["adb", "shell", "settings", "delete", "global", "private_dns_specifier"], stdout=subprocess.PIPE) print("Disabled Private DNS\n") elif dnsprovider != "Select or Enter DNS Server": try: - subprocess.check_output(["adb shell settings put global private_dns_mode hostname"], stderr=subprocess.PIPE, shell=True) - subprocess.check_output([f"adb shell settings put global private_dns_specifier {dnsprovider}"], shell=True) + subprocess.check_output(["adb", "shell", "settings", "put", "global", "private_dns_mode", "hostname"], stderr=subprocess.PIPE) + subprocess.check_output(["adb", "shell", "settings", "put", "global", "private_dns_specifier", dnsprovider]) print(f"Successfully Set DNS Provider to: {dnsprovider}\n") except subprocess.CalledProcessError: print("Failed to Set Private DNS\n") @@ -104,17 +110,18 @@ def set_launcher(): elif customlauncher.get() != "Select Launcher": for app in glob.iglob(f"{os.getcwd()}/{customlauncher.get()}*.apk"): launcher = app - subprocess.run([f"{path}appinstaller{extension}", launcher, "Launcher"]) + subprocess.run(f"{path}appinstaller{extension} {launcher} Launcher".split()) # Extract Selected Package to Extracted/{package} If not Already Present def extract(package): if not os.path.exists(f"Extracted/{package}"): print("Extracting:", package) os.mkdir(f"Extracted/{package}") - for packagelocation in subprocess.check_output([f"adb shell \"pm path {package} | cut -f2 -d:\""], universal_newlines=True, shell=True).splitlines(): - subprocess.run([f"adb pull {packagelocation} ./Extracted/{package}"], shell=True) + for packagelocation in subprocess.check_output(["adb", "shell", "pm", "path", package], universal_newlines=True).splitlines(): + subprocess.run(["adb", "pull", packagelocation.replace("package:",""), f"./Extracted/{package}"]) if not os.listdir(f"Extracted/{package}"): os.rmdir(f"Extracted/{package}") + print("") else: print(f"Found at: /Extracted/{package}") @@ -146,10 +153,10 @@ def switch(option): label = ctk.CTkLabel(window, text="Debloat", font=("default",25)) label.grid(row=0, column=0, padx=60, pady=15) -disable = ctk.CTkButton(window, text="Debloat", width=200, height=50, command=lambda: debloat("Disable","")) +disable = ctk.CTkButton(window, text="Debloat", width=200, height=50, command=lambda: debloat("Disable")) disable.grid(row=1, column=0, padx=60, pady=15) -undo = ctk.CTkButton(window, text="Undo", width=200, height=50, command=lambda: debloat("Enable","")) +undo = ctk.CTkButton(window, text="Undo", width=200, height=50, command=lambda: debloat("Enable")) undo.grid(row=2, column=0, padx=60, pady=15) edit = ctk.CTkButton(window, text="Edit", width=200, height=50, command=editfile) @@ -213,10 +220,12 @@ def switch(option): customlist = [] if device[0] != "Unknown/Undetected": - for enabled_package in subprocess.check_output(["adb shell \"pm list packages -e | cut -f2 -d:\""], universal_newlines=True, shell=True).splitlines(): - checkbox = ctk.CTkCheckBox(enabled_list, text=enabled_package, command = lambda param = enabled_package: add_package(param)).pack() - for disabled_package in subprocess.check_output(["adb shell \"pm list packages -d | cut -f2 -d:\""], universal_newlines=True, shell=True).splitlines(): - checkbox = ctk.CTkCheckBox(disabled_list, text=disabled_package, command = lambda param = disabled_package: add_package(param)).pack() + enabled = [package.replace("package:","") for package in subprocess.check_output(["adb", "shell", "pm", "list", "packages", "-e"], universal_newlines=True).splitlines()] + disabled = [package.replace("package:","") for package in subprocess.check_output(["adb", "shell", "pm", "list", "packages", "-d"], universal_newlines=True).splitlines()] + for package in enabled: + checkbox = ctk.CTkCheckBox(enabled_list, text=package, command = lambda param = package: add_package(param)).pack() + for package in disabled: + checkbox = ctk.CTkCheckBox(disabled_list, text=package, command = lambda param = package: add_package(param)).pack() window.mainloop() From 14e699c3176226d1a8d3cfb0e35e62a066d62def Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Wed, 5 Jun 2024 18:02:49 -0700 Subject: [PATCH 19/20] Update Changelog.md --- Changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.md b/Changelog.md index 232f4fc..493c999 100644 --- a/Changelog.md +++ b/Changelog.md @@ -9,3 +9,5 @@ - Appinstaller function can now accept individual applications instead of installing all apps in a folder - Simplified "customlauncher" function by only calling appinstaller script once - Custom DNS check now uses try/except instead of Bash/Posix operators inside ADB shell +- xdg-open/open -e commands now use try/except instead of Bash/Posix operators +- Enabled/disabled packages on the UI are now generated by enabled & disabled list (might be easier to update lists on the fly) From 2939aa824bd0330ed416e2b42a12bee573045fe6 Mon Sep 17 00:00:00 2001 From: Hayden Plumley Date: Wed, 5 Jun 2024 18:13:49 -0700 Subject: [PATCH 20/20] Update main.py - Fixed the launcher command so filenames with spaces will work --- Fire-Tools/main.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Fire-Tools/main.py b/Fire-Tools/main.py index 10dab16..fe4c0c1 100644 --- a/Fire-Tools/main.py +++ b/Fire-Tools/main.py @@ -110,7 +110,10 @@ def set_launcher(): elif customlauncher.get() != "Select Launcher": for app in glob.iglob(f"{os.getcwd()}/{customlauncher.get()}*.apk"): launcher = app - subprocess.run(f"{path}appinstaller{extension} {launcher} Launcher".split()) + cmdlist = f"{path}appinstaller{extension}".split() + cmdlist.append(launcher) + cmdlist.append("Launcher") + subprocess.run(cmdlist) # Extract Selected Package to Extracted/{package} If not Already Present def extract(package):