SHOW:
|
|
- or go back to the newest paste.
1 | - | #!/usr/bin/python |
1 | + | #!/usr/bin/env python |
2 | - | ### HALF-ASSED ONE + ONE TOOLKIT v1.3b BETA BLOCKERS |
2 | + | ### HALF-ASSED ONE + ONE TOOLKIT |
3 | - | ##### AUTHOR: vvn |
3 | + | ##### VERSION: 1.3.1 STABLE |
4 | - | ##### RELEASE DATE: AUGUST 26, 2014 |
4 | + | ##### RELEASE DATE: SEPTEMBER 13, 2014 |
5 | - | ##### REQUIREMENTS: Python 2.7, Android SDK (or at minimum, adb and fastboot), pyadb.py library |
5 | + | ##### AUTHOR: vvn [eudemonics on xda-developers] |
6 | ##### DESCRIPTION: a spontaneously created but hopefully comprehensive Android toolkit, | |
7 | ##### built originally for the OnePlus One but can be used with most Android devices | |
8 | ##### (DO NOT FLASH INCLUDED ONEPLUS ONE DEVICE FILES ON OTHER DEVICES!), that will or | |
9 | - | ##### PYTHON SCRIPTS AVAILABLE FOR DOWNLOAD ON MY SITE: |
9 | + | ##### will not be irregularly maintained at the developer's whim. |
10 | - | ##### notworth (dot) it /opo/opotoolkit.py -AND- notworth (dot) it /opo/pyadb.py |
10 | + | ##### REQUIREMENTS: Python 2.7, Android SDK tools, USB drivers, pyadb.py library, opointro.py |
11 | - | ##### until the github repo cooperates, check for latest updates on my pastebin: |
11 | + | |
12 | ##### HOLY SHIT I HAVE A README FILE! | |
13 | - | ### DOWNLOAD LINKS (piece 'em together if you're not a robot): |
13 | + | |
14 | - | ## PYTHON SCRIPTS AND ADB/FASTBOOT BINARIES: notworth (dot) it /opo/1plus1-halfassedtoolkit.zip |
14 | + | ##### source code for stable releases should be available on my pastebin: |
15 | - | ## SHA1(1plus1-halfassedtoolkit.zip)= c86bfba7da78a5a435adf01dd4e69c479f7d8d21 |
15 | + | |
16 | ################################################## | |
17 | - | import subprocess, sys, re, os, os.path, time, datetime, urllib, urllib2 |
17 | + | ################################################## |
18 | ##### USER LICENSE AGREEMENT & DISCLAIMER | |
19 | ##### copyright (C) 2014 vvn <vvn@eudemonics.org> | |
20 | - | def intro(): |
20 | + | ##### |
21 | ##### This program is FREE software: you can use it, redistribute it and/or modify | |
22 | - | print ("\033[41m\033[37;1m#################################################################\033[0m") |
22 | + | ##### it as you wish. Copying and distribution of this file, with or without modification, |
23 | - | time.sleep(0.1) |
23 | + | ##### are permitted in any medium without royalty provided the copyright |
24 | - | print ("\033[41m\033[37;1m#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#\033[0m") |
24 | + | ##### notice and this notice are preserved. This program is offered AS-IS, |
25 | - | time.sleep(0.1) |
25 | + | ##### WITHOUT ANY WARRANTY; without even the implied warranty of |
26 | - | print ("\033[41m\033[37;1m#~~~~~~~~~~~~~~~~~~~~~~ \033[40m\033[33;1mTHE HALF-ASSED\033[41m\033[37;1m ~~~~~~~~~~~~~~~~~~~~~~~~~#\033[0m") |
26 | + | ##### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
27 | - | time.sleep(0.1) |
27 | + | ##### GNU General Public License for more details. |
28 | - | print ("\033[41m\033[37;1m#~~~~~~~~~~~~~~~~~~~~ \033[40m\033[33mONEPLUS ONE TOOLKIT\033[41m\033[37m ~~~~~~~~I\033[41m\033[37;1m 7~~~~~~~~~#\033[0m") |
28 | + | ##### |
29 | - | time.sleep(0.1) |
29 | + | ##### For more information, please refer to the "LICENSE AND NOTICE" file that should |
30 | - | print ("\033[41m\033[37;1m#~~~~~~~~~~~~~~~~~~~~~~~~~ \033[41m\033[40;1mv1.3 BETA\033[41m\033[37;1m ~~~~~~~~~~~~~I 7~~~~~~~~~#\033[0m") |
30 | + | ##### accompany all official download releases of this program. |
31 | - | time.sleep(0.1) |
31 | + | ################################################## |
32 | - | print ("\033[41m\033[37;1m#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~I 7~~~~~~~~~#\033[0m") |
32 | + | ################################################## |
33 | - | time.sleep(0.1) |
33 | + | ##### don't ask about the arbitrary versioning. i am totally making this shit up. |
34 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 77~~~~~I 7~~~#\033[0m") |
34 | + | ##### getting credited for my work is nice. so are donations. |
35 | - | time.sleep(0.1) |
35 | + | ##### BTC: 1M511j1CHR8x7RYgakNdw1iF3ike2KehXh |
36 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~I 7~~~~~~~~~#\033[0m") |
36 | + | ##### https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=26PWMPCNKN28L |
37 | - | time.sleep(0.1) |
37 | + | ##### but to really show your appreciation, you should buy my EP instead! |
38 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~I 7~~~~~~~~~#\033[0m") |
38 | + | ##### you can stream and purchase it at: dreamcorp.bandcamp.com |
39 | - | time.sleep(0.1) |
39 | + | ##### (you might even enjoy listening to it) |
40 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~I 7~~~~~~~~~#\033[0m") |
40 | + | ##### questions, comments, feedback, bugs, complaints, death threats, marriage proposals? |
41 | - | time.sleep(0.1) |
41 | + | ##### contact me at: |
42 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~~I 7~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#\033[0m") |
42 | + | ##### vvn (at) notworth (dot) it |
43 | - | time.sleep(0.2) |
43 | + | ##### latest version will always be available HERE: |
44 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~~~~~~~~I 7~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#\033[0m") |
44 | + | ##### http://notworth.it/opo/opotoolkit.py |
45 | - | time.sleep(0.2) |
45 | + | ##### if above link is not able to download, use this one: |
46 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~~~~~~~~I 7~~~~~~~~~~~~~~~I 7~~~~~~~~~#\033[0m") |
46 | + | ##### http://notworth.it/opo/opotoolkit.py.txt (rename from *.py.txt to *.py) |
47 | - | time.sleep(0.2) |
47 | + | ##### there be only code after this --> |
48 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~~~~~~~~I 7~~~~~~~~~~~~~~~I 7~~~~~~~~~#\033[0m") |
48 | + | |
49 | - | time.sleep(0.2) |
49 | + | import subprocess, sys, re, os, os.path, time, datetime, urllib |
50 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~~~~~~~~I 7~~~~~~~~~~~~~~~I 7~~~~~~~~~#\033[0m") |
50 | + | from opointro import * |
51 | - | time.sleep(0.1) |
51 | + | |
52 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~~~~~~~~I 7~~~~~~~~~~~~~~~I 7~~~~~~~~~#\033[0m") |
52 | + | if os.name == 'nt' or sys.platform == 'win32': |
53 | - | time.sleep(0.1) |
53 | + | try: |
54 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~~~~~~~~I 7~~~~~~~~~~~~~~~I 7~~~~~~~~~#\033[0m") |
54 | + | import colorama |
55 | - | time.sleep(0.1) |
55 | + | colorama.init() |
56 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~~~~~~~~I 7~~~~~~~~~~~~~~~I 7~~~~~~~~~#\033[0m") |
56 | + | s = opointro() |
57 | - | time.sleep(0.1) |
57 | + | s.colorlogo() |
58 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~~I 7~~~~~~~~~I 7~~~~~~~~~#\033[0m") |
58 | + | startmenu = s.colormenu |
59 | - | time.sleep(0.1) |
59 | + | except: |
60 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~I 7~~~~~~~~~#\033[0m") |
60 | + | try: |
61 | - | time.sleep(0.1) |
61 | + | import tendo.ansiterm |
62 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~ SUPPORT MY WORK! BUY MY EP! ~~~I 7~~~~~~~~~#\033[0m") |
62 | + | s = opointro() |
63 | - | time.sleep(0.1) |
63 | + | s.colorlogo() |
64 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~ http://dreamcorp.bandcamp.com ~~~I 7~~~~~~~~~#\033[0m") |
64 | + | startmenu = s.colormenu |
65 | - | time.sleep(0.1) |
65 | + | except: |
66 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~I 7~~~~~~~~~#\033[0m") |
66 | + | s = opointro() |
67 | - | time.sleep(0.1) |
67 | + | s.cleanlogo() |
68 | - | print ("\033[41m\033[37;1m#~~~~~~~~I 7~~~~~~~~~#\033[0m") |
68 | + | startmenu = s.cleanmenu |
69 | - | time.sleep(0.1) |
69 | + | pass |
70 | - | print ("\033[41m\033[37;1m#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#\033[0m") |
70 | + | else: |
71 | - | time.sleep(0.1) |
71 | + | s = opointro() |
72 | - | print ("\033[41m\033[37;1m#~~~~~~~~~~~~~~~~~~~~~~~~~ \033[40m\033[35;1mAUTHOR: VVN \033[41m\033[37;1m~~~~~~~~~~~~~~~~~~~~~~~~~#\033[0m") |
72 | + | s.colorlogo() |
73 | - | time.sleep(0.1) |
73 | + | startmenu = s.colormenu |
74 | - | print ("\033[41m\033[37;1m#~~~~~~~~~~~~~~~~ \033[40m\033[36;1mRELEASE DATE: AUGUST 26, 2014 \033[41m\033[37;1m~~~~~~~~~~~~~~~~#\033[0m") |
74 | + | |
75 | - | time.sleep(0.1) |
75 | + | def mainmenu(): |
76 | - | print ("\033[41m\033[37;1m#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#\033[0m") |
76 | + | print(startmenu) |
77 | - | time.sleep(0.1) |
77 | + | |
78 | - | print ("\033[41m\033[37;1m#################################################################\033[0m") |
78 | + | |
79 | - | time.sleep(4.5) |
79 | + | os.system('cls' if os.name == 'nt' else 'clear') |
80 | - | print("\n\n") |
80 | + | mainmenu() |
81 | ||
82 | global option | |
83 | - | """menu output user input""" |
83 | + | option = raw_input('Select an option 0-11 --> ') |
84 | - | quotes = [ |
84 | + | |
85 | - | '\nvvn@notworth.it\n' |
85 | + | while not re.search(r'^[0-9]$', option) and not re.search(r'^1[0-1]$', option): |
86 | - | ] |
86 | + | option = raw_input('Invalid selection. Please select an option 0-11 --> ') |
87 | - | print (''' |
87 | + | |
88 | - | \033[40m\033[34m***********************************************************\033[0m |
88 | + | |
89 | - | \033[40m\033[34m************ \033[36mTHE HALF-ASSED ONEPLUS ONE TOOLKIT \033[34m***********\033[0m |
89 | + | |
90 | - | \033[40m\033[34m*************** \033[37mVERSION: 1.3b BETA \033[34m* \033[35mby vvn \033[34m***************\033[0m |
90 | + | |
91 | - | \033[40m\033[34m***********************************************************\033[0m |
91 | + | |
92 | - | \033[40m\033[34m*** \033[33mthis is a FREE program, released AS-IS: NO WARRANTY \033[34m***\033[0m |
92 | + | |
93 | - | \033[40m\033[34m****************** \033[32mUSE AT YOUR OWN RISK! \033[34m******************\033[0m |
93 | + | |
94 | - | \033[40m\033[34m***********************************************************\033[0m |
94 | + | |
95 | - | \033[40m\033[34m*************** \033[37msupport my work: buy my EP! \033[34m***************\033[0m |
95 | + | |
96 | - | \033[40m\033[34m************** \033[37mhttp://dreamcorp.bandcamp.com \033[34m**************\033[0m |
96 | + | |
97 | - | \033[40m\033[34m***********************************************************\033[0m \n''') |
97 | + | |
98 | rbtype = "android" | |
99 | - | print("\033[33mDEVICE MUST BE CONNECTED VIA USB WITH ANDROID DEBUGGING ENABLED. \033[0m\n") |
99 | + | |
100 | rbtype = "bootloader" | |
101 | - | print ('''\033[32mMAIN MENU:\033[0m |
101 | + | |
102 | - | -\033[31m[1]\033[37m reboot into android, bootloader, or recovery\033[0m |
102 | + | |
103 | - | -\033[31m[2]\033[37m wipe device or flash partitions\033[0m |
103 | + | |
104 | - | -\033[31m[3]\033[37m boot once into custom recovery without flashing\033[0m |
104 | + | |
105 | - | -\033[31m[4]\033[37m install or uninstall APK\033[0m |
105 | + | |
106 | - | -\033[31m[5]\033[37m copy files between computer and device, or sync\033[0m |
106 | + | |
107 | - | -\033[31m[6]\033[37m backup or restore device\033[0m |
107 | + | |
108 | - | -\033[31m[7]\033[37m root device and/or install ZIP in fastboot\033[0m |
108 | + | |
109 | - | -\033[31m[8]\033[37m unlock bootloader and/or flash custom image\033[0m |
109 | + | |
110 | - | -\033[31m[9]\033[37m run shell command on device\033[0m |
110 | + | |
111 | - | -\033[31m[0]\033[37m quit \033[0m\n''') |
111 | + | |
112 | print("rebooting via fastboot..\n") | |
113 | if rboption == '3': | |
114 | - | option = raw_input('Select an option 0-9 --> ') |
114 | + | |
115 | obj.fastreboot(rbtype) | |
116 | - | while not re.search(r'^[0-9]$', option): |
116 | + | |
117 | - | option = raw_input('Invalid selection. Please select an option 0-9 --> ') |
117 | + | |
118 | elif "unknown" in str(checkdev) and listdev is not None and "device" in str(fastdev): | |
119 | print("rebooting via ADB..\n") | |
120 | obj.reboot(rbtype) | |
121 | time.sleep(0.9) | |
122 | main() | |
123 | elif "recovery" in [str(fastdev), str(listdev)] and checkdev is not None: | |
124 | print("rebooting via ADB...\n") | |
125 | obj.reboot(rbtype) | |
126 | time.sleep(0.9) | |
127 | main() | |
128 | elif "unknown" in str(checkdev) and fastdev is not None and listdev is None: | |
129 | print("rebooting via fastboot...\n") | |
130 | if rboption == '3': | |
131 | rbtype = "bootloader" | |
132 | obj.fastreboot(rbtype) | |
133 | time.sleep(0.9) | |
134 | main() | |
135 | elif "unknown" in str(checkdev) and "unauthorized" in str(listdev): | |
136 | raw_input("verify that DEVICE IS UNLOCKED and COMPUTER IS AUTHORIZED FOR ADB ACCESS, then press ENTER.") | |
137 | print("rebooting via ADB...\n") | |
138 | obj.reboot(rbtype) | |
139 | time.sleep(0.9) | |
140 | main() | |
141 | elif "unknown" in str(checkdev) and listdev is not None and fastdev is None: | |
142 | raw_input("device appears to be in recovery mode. reboot from recovery menu, then press ENTER.") | |
143 | checkstate = obj.get_state() | |
144 | if "device" in str(checkstate): | |
145 | obj.reboot(rbtype) | |
146 | time.sleep(0.9) | |
147 | main() | |
148 | else: | |
149 | print("rebooting via fastboot....\n") | |
150 | if rboption == '3': | |
151 | rbtype = "bootloader" | |
152 | fastreboot = obj.fastreboot(rbtype) | |
153 | if not fastreboot: | |
154 | print("rebooting via ADB after fastboot... \n") | |
155 | obj.reboot(rbtype) | |
156 | if "error" in str(fastreboot): | |
157 | print("rebooting via fastboot second time...\n") | |
158 | obj.fastreboot(rbtype) | |
159 | time.sleep(0.9) | |
160 | main() | |
161 | ||
162 | elif option == '2': #wipe | |
163 | print("\033[35m***WIPING SOME PARTITIONS WILL ERASE YOUR DATA.***\n please make sure to back up any important data before proceeding!\n\n") | |
164 | print('''\033[36mCHOOSE AN OPTION 1-8:\033[32m\n | |
165 | [1]\033[37m perform a full system wipe [system, data, and cache partitions]\033[32m | |
166 | [2]\033[37m wipe only the system partition\033[32m | |
167 | [3]\033[37m wipe only the data partition\033[32m | |
168 | [4]\033[37m wipe only the cache partition\033[32m | |
169 | [5]\033[37m wipe only the boot partition\033[32m | |
170 | [6]\033[37m wipe only the recovery partition\033[32m | |
171 | [7]\033[37m flash device to factory images [flash system, boot, and recovery]\033[32m | |
172 | [8]\033[37m return to main menu\n\n\033[0m''') | |
173 | confirmwipe = raw_input("please enter an option 1-8 --> ") | |
174 | while not re.search(r'^[1-8]$', confirmwipe): | |
175 | confirmwipe = raw_input('not a valid option. please enter a selection between 1-8 from above choices -->') | |
176 | if confirmwipe == '1': | |
177 | obj.wipe('all') | |
178 | raw_input("press ENTER to continue.") | |
179 | time.sleep(0.9) | |
180 | main() | |
181 | elif confirmwipe == '2': | |
182 | obj.wipe('system') | |
183 | raw_input("press ENTER to continue.") | |
184 | time.sleep(0.9) | |
185 | main() | |
186 | elif confirmwipe == '3': | |
187 | obj.wipe('data') | |
188 | raw_input("press ENTER to continue.") | |
189 | time.sleep(0.9) | |
190 | main() | |
191 | elif confirmwipe == '4': | |
192 | obj.wipe('cache') | |
193 | raw_input("press ENTER to continue.") | |
194 | time.sleep(0.9) | |
195 | main() | |
196 | elif confirmwipe == '5': | |
197 | obj.wipe('boot') | |
198 | raw_input("press ENTER to continue.") | |
199 | time.sleep(0.9) | |
200 | main() | |
201 | elif confirmwipe == '6': | |
202 | obj.wipe('recovery') | |
203 | raw_input("press ENTER to continue.") | |
204 | time.sleep(0.9) | |
205 | main() | |
206 | elif confirmwipe == '7': | |
207 | obj.wipe('flashall') | |
208 | raw_input("press ENTER to continue.") | |
209 | time.sleep(0.9) | |
210 | main() | |
211 | elif confirmwipe == '8': | |
212 | time.sleep(0.9) | |
213 | main() | |
214 | else: | |
215 | print("there was a problem connecting to the device. returning to menu..\n") | |
216 | time.sleep(0.9) | |
217 | main() | |
218 | ||
219 | ||
220 | elif option == '3': #boot custom recovery | |
221 | recovery = raw_input("enter 1 for TWRP, 2 for ClockworkMod, or 3 for Philz recovery --> ") | |
222 | while not re.search(r'^[1-3]$', recovery): | |
223 | recovery = raw_input("invalid selection. please choose 1 for TWRP, 2 for CWM, or 3 for Philz --> ") | |
224 | def dlrecov(recovfile): | |
225 | dlfile = "http://notworth.it/opo/" + recovfile | |
226 | dl = urllib.URLopener() | |
227 | dl.retrieve(dlfile, recovfile) | |
228 | site = urllib.urlopen(dlfile) | |
229 | meta = site.info() | |
230 | dlsize = meta.getheaders("Content-Length")[0] | |
231 | fsize = os.path.getsize(recovfile) | |
232 | print("file size: \033[33m") | |
233 | print(dlsize) | |
234 | print("\n\033[0mbytes downloaded: \033[33m") | |
235 | print(fsize) | |
236 | print("\033[0m\n") | |
237 | obj.reboot("bootloader") | |
238 | if recovery == '1': | |
239 | recovfile = "twrp.img" | |
240 | while not os.path.isfile(recovfile): | |
241 | print("file \033[32mtwrp.img \033[0mnot found. attempting download...\n") | |
242 | dlrecov(recovfile) | |
243 | print("file \033[32mtwrp.img \033[0mfound!\n") | |
244 | raw_input("press ENTER to continue booting into TWRP..") | |
245 | obj.bootimg("twrp.img") | |
246 | elif recovery == '2': | |
247 | recovfile = "cwm.img" | |
248 | while not os.path.isfile(recovfile): | |
249 | print("file \033[32mcwm.img \033[0mnot found. attempting download...\n") | |
250 | dlrecov(recovfile) | |
251 | print("file \033[32mcwm.img \033[0mfound!\n") | |
252 | raw_input("press ENTER to continue booting into ClockworkMod Recovery..") | |
253 | obj.bootimg("cwm.img") | |
254 | elif recovery == '3': | |
255 | recovfile = "philz.img" | |
256 | while not os.path.isfile(recovfile): | |
257 | print("file \033[32mphilz.img \033[0mnot found. attempting download...\n") | |
258 | dlrecov(recovfile) | |
259 | print("file \033[32mphilz.img \033[0mfound!\n") | |
260 | raw_input("press ENTER to continue booting into Philz Recovery..") | |
261 | obj.bootimg("philz.img") | |
262 | else: | |
263 | print("unable to connect to device.\n") | |
264 | ||
265 | raw_input("press ENTER to return to main menu..") | |
266 | time.sleep(0.9) | |
267 | main() | |
268 | ||
269 | elif option == '4': #install or uninstall APK | |
270 | whichinstall = raw_input("please enter 1 to install, 2 to uninstall, or 3 to return to main menu. --> ") | |
271 | while not re.search(r'^[1-3]$', whichinstall): | |
272 | whichinstall = raw_input("invalid selection. please enter 1 to install, 2 to uninstall, or 3 to return to main menu. --> ") | |
273 | if not os.path.exists('apps'): | |
274 | os.makedirs('apps') | |
275 | if whichinstall == '1': | |
276 | getapk = raw_input("place the APK file to install in the \"apps\" subdirectory, then type the filename --> ") | |
277 | apkfile = os.path.join('apps', getapk) | |
278 | while not os.path.isfile(apkfile): | |
279 | print("\033[37mfile does not exist. please make sure the APK file is in the \"apps\" subdirectory.\033[0m\n") | |
280 | getapk = raw_input("enter valid filename for the APK you want to install -->") | |
281 | apkfile = os.path.join('apps', getapk) | |
282 | print("installing \033[36m" + getapk + "\033[0m...") | |
283 | obj.install(apkfile) | |
284 | raw_input("press ENTER to continue...") | |
285 | time.sleep(0.9) | |
286 | main() | |
287 | ||
288 | if whichinstall == '2': | |
289 | getunapk = raw_input("please enter the complete path for the app you wish to uninstall --> ") | |
290 | keepcheck = raw_input("would you like to keep your app data? Y or N --> ") | |
291 | while not re.search(r'^[nyNY]$', keepcheck): | |
292 | keepcheck = raw_input("invalid selection. please enter Y to keep app data or N to erase --> ") | |
293 | keepargs = "erase" | |
294 | uninstcmd = "pm uninstall " + getunapk | |
295 | if re.match(r'(?i)Y', keepcheck): | |
296 | keepargs = "keep" | |
297 | uninstcmd = "pm uninstall -k " + getunapk | |
298 | print("uninstalling \033[36m" + getunapk + "\033[0m...\n") | |
299 | obj.uninstall(getunapk, keepargs) | |
300 | obj.shell(uninstcmd) | |
301 | raw_input("press ENTER to continue...") | |
302 | time.sleep(0.9) | |
303 | main() | |
304 | ||
305 | if whichinstall == '3': | |
306 | main() | |
307 | ||
308 | else: | |
309 | print("could not connect to device.\n") | |
310 | time.sleep(0.9) | |
311 | main() | |
312 | ||
313 | elif option == '5': #copy and/or sync between computer and device | |
314 | copytype = raw_input("to push file from computer to device, enter T. to pull file from device to computer, enter F. to sync, enter S --> ") | |
315 | matchT = re.search(r'(?i)T', copytype) | |
316 | matchF = re.search(r'(?i)F', copytype) | |
317 | matchS = re.search(r'(?i)S', copytype) | |
318 | while not re.search(r'^[FfSsTt]$', copytype): | |
319 | copytype = raw_input("invalid option. please enter T to push file, F to pull file, or S to sync --> ") | |
320 | ||
321 | if matchT: | |
322 | getpushfile = raw_input("please enter the file or directory you wish to copy as the RELATIVE path from the script location --> ") | |
323 | while not os.path.exists(getpushfile): | |
324 | getpushfile = raw_input("file does not exist. please enter valid path --> ") | |
325 | getpushremote = raw_input("please enter destination path for copied file(s) on the device --> ") | |
326 | obj.push(getpushfile, getpushremote) | |
327 | raw_input("file transfer complete. press ENTER to continue...") | |
328 | ||
329 | elif matchF: | |
330 | getpullfile = raw_input("please enter path for the file or directory on your device to copy --> ") | |
331 | getpulllocal = raw_input("please enter the copy destination folder as a RELATIVE path from the script location --> ") | |
332 | if not os.path.exists(getpulllocal): | |
333 | print("copy destination \033[35m" + getpulllocal + " \033[0mdoes not exist! creating new directory...") | |
334 | os.makedirs(getpulllocal) | |
335 | obj.pull(getpullfile, getpulllocal) | |
336 | print("\033[32mtransferred file(s) in destination directory:\n") | |
337 | for fn in next(os.walk(getpulllocal))[2]: | |
338 | fullpath = os.path.join(getpulllocal, fn) | |
339 | if os.path.getmtime(fullpath) >= os.path.getctime(getpulllocal): | |
340 | print(fullpath) | |
341 | print("\033[0m\n") | |
342 | raw_input("file transfer complete. press ENTER to continue...") | |
343 | ||
344 | elif matchS: | |
345 | syncargs = raw_input("enter 1 to set sync directory, or 2 to sync the default system and data directories. --> ") | |
346 | while not re.search(r'^[12]$', syncargs): | |
347 | syncargs = raw_input("invalid selection. please enter 1 to set sync directory, or 2 to use default. --> ") | |
348 | if syncargs == '1': | |
349 | syncdir = raw_input("please enter sync directory --> ") | |
350 | localargs = raw_input("enter 1 to set local sync directory, or 2 to use default ANDROID_PRODUCT_OUT --> ") | |
351 | while not re.search(r'^[12]$',localargs): | |
352 | localargs = raw_input("invalid selection. enter 1 to set local sync directory or 2 to use default ANDROID_PRODUCT_OUT --> ") | |
353 | if localargs == '1': | |
354 | localdir = raw_input("please enter relative path for local directory to sync device --> ") | |
355 | while not os.path.exists(localdir): | |
356 | print("the path you entered does not exist. would you like to create " + localdir + " as a new directory?\n") | |
357 | crlocaldir = raw_input("enter 1 to create new directory or 2 to enter another location. --> ") | |
358 | - | raw_input("file copy complete. press ENTER to continue...") |
358 | + | while not re.search(r'^[12]$', crlocaldir): |
359 | crlocaldir = raw_input("invalid selection. please enter 1 to create directory, or 2 to enter another location. --> ") | |
360 | if crlocaldir == '1': | |
361 | os.makedirs(localdir, 0755) | |
362 | else: | |
363 | localdir = raw_input("please enter relative path for local directory to sync device with --> ") | |
364 | localsyncdir = os.path.join(localdir, syncdir) | |
365 | while not os.path.exists(localsyncdir): | |
366 | - | # obj.pull(getpullfile, getpulllocal) |
366 | + | os.makedirs(localsyncdir, 0755) |
367 | - | def getprogress(n): |
367 | + | print(localsyncdir + " created\n") |
368 | - | tenths = n/10 |
368 | + | |
369 | - | for i in range(n): |
369 | + | localdir = "none" |
370 | - | obj.pull(getpullfile, getpulllocal) |
370 | + | obj.sync(localdir, syncdir) |
371 | - | if i%tenths == 0: |
371 | + | if "none" not in localdir: |
372 | - | print(str(i) + "% ") |
372 | + | print("\033[32mfile(s) in sync directory:\n") |
373 | - | sys.stdout.flush() |
373 | + | for fn in next(os.walk(localdir))[2]: |
374 | - | print("\n\033[0m ..TRANSFER COMPLETE!") |
374 | + | fullpath = os.path.join(localdir, fn) |
375 | - | print("transferring files... \033[37m"), |
375 | + | if os.path.getmtime(fullpath) >= os.path.getctime(localdir): |
376 | - | sys.stdout.flush() |
376 | + | print(fullpath) |
377 | - | getprogress(100) |
377 | + | print("\033[0m\n") |
378 | - | print("\033[32mfile\(s\) in destination directory:\n\033[0m") |
378 | + | |
379 | elif syncargs == '2': | |
380 | # obj.sync() | |
381 | - | print(fullpath) |
381 | + | localargs = raw_input("enter 1 to set local sync directory, or 2 to use default ANDROID_PRODUCT_OUT --> ") |
382 | - | raw_input("file copy complete. press ENTER to continue...") |
382 | + | while not re.search(r'^[12]$',localargs): |
383 | localargs = raw_input("invalid selection. enter 1 to set local sync directory or 2 to use default ANDROID_PRODUCT_OUT --> ") | |
384 | if localargs == '1': | |
385 | localdir = raw_input("please enter relative path for local directory to sync device --> ") | |
386 | while not os.path.exists(localdir): | |
387 | print("the path you entered does not exist. would you like to create " + localdir + " as a new directory?\n") | |
388 | crlocaldir = raw_input("enter 1 to create new directory or 2 to enter another location. --> ") | |
389 | - | syncdir = raw_input("please enter relative path for local directory to sync device with --> ") |
389 | + | while not re.search(r'^[12]$', crlocaldir): |
390 | - | while not os.path.exists(syncdir): |
390 | + | crlocaldir = raw_input("invalid selection. please enter 1 to create directory, or 2 to enter another location. --> ") |
391 | - | print("the path you entered does not exist. would you like to create " + syncdir + " as a new directory?\n") |
391 | + | if crlocaldir == '1': |
392 | - | crsyncdir = raw_input("enter 1 to create new directory or 2 to enter another location. --> ") |
392 | + | os.makedirs(localdir, 0755) |
393 | - | while not re.search(r'^[12]$', crsyncdir): |
393 | + | |
394 | - | crsyncdir = raw_input("invalid selection. please enter 1 to create directory, or 2 to enter another location. --> ") |
394 | + | localdir = raw_input("please enter relative path for local directory to sync device with --> ") |
395 | - | if crsyncdir == '1': |
395 | + | |
396 | - | os.makedirs(syncdir, 0755) |
396 | + | localdir = "none" |
397 | obj.sync(localdir, "none") | |
398 | - | syncdir = raw_input("please enter relative path for local directory to sync device with --> ") |
398 | + | |
399 | - | obj.sync(syncdir) |
399 | + | |
400 | print("could not connect to device.\n") | |
401 | ||
402 | - | obj.sync() |
402 | + | |
403 | print("could not connect to device.\n") | |
404 | ||
405 | time.sleep(0.9) | |
406 | main() | |
407 | ||
408 | elif option == '6': #backup | |
409 | whichbackup = raw_input("to backup, enter 1. to restore, enter 2 --> ") | |
410 | while not re.search(r'^[12]$', whichbackup): | |
411 | whichbackup = raw_input("invalid selection. please enter 1 to backup or 2 to restore. --> ") | |
412 | if whichbackup == '1': | |
413 | fullbackup = raw_input("would you like to do a full backup, including system apps and sdcard contents? enter Y or N --> ") | |
414 | while not re.search(r'^[yYnN]$', fullbackup): | |
415 | fullbackup = raw_input("invalid selection. please enter Y for full backup or N for other options --> ") | |
416 | if fullbackup.lower() == 'y': | |
417 | backapk = "apk" | |
418 | backobb = "obb" | |
419 | - | obj.backup(backupfile) |
419 | + | backshared = "shared" |
420 | backall = "full" | |
421 | backsys = "sys" | |
422 | else: | |
423 | checkapk = raw_input("enter 1 to include APK files, or 2 to exclude --> ") | |
424 | while not re.search(r'^[12]$', checkapk): | |
425 | checkapk = raw_input("invalid selection. enter 1 to include APK files, or 2 to exclude --> ") | |
426 | if checkapk == '1': | |
427 | backapk = "apk" | |
428 | checkobb = raw_input("enter 1 to include APK expansion files, or 2 to exclude --> ") | |
429 | while not re.search(r'^[12]$', checkobb): | |
430 | checkobb = raw_input("invalid selection. enter 1 to include APK expansion files, or 2 to exclude --> ") | |
431 | if checkobb == '1': | |
432 | backobb = "obb" | |
433 | else: | |
434 | backobb = "no" | |
435 | else: | |
436 | backapk = "no" | |
437 | checkshared = raw_input("enter 1 to backup sdcard [userdata] contents, or 2 to exclude --> ") | |
438 | while not re.search(r'^[12]$', checkshared): | |
439 | checkshared = raw_input("invalid selection. enter 1 to backup sdcard contents, or 2 to exclude --> ") | |
440 | if checkshared == '1': | |
441 | backshared = "shared" | |
442 | checkall = raw_input("enter 1 to backup all installed applications, or 2 to exclude --> ") | |
443 | while not re.search(r'^[12]$', checkall): | |
444 | checkall = raw_input("invalid selection. enter 1 to backup all installed applications, or 2 to exclude --> ") | |
445 | if checkall == '1': | |
446 | backall = "all" | |
447 | else: | |
448 | backall = "no" | |
449 | else: | |
450 | backshared = "no" | |
451 | backall = "all" | |
452 | checksys = raw_input("enter 1 to backup system apps, or 2 to exclude --> ") | |
453 | while not re.search(r'^[12]$',checksys): | |
454 | checksys = raw_input("invalid selection. enter 1 to backup system apps, or 2 to exclude --> ") | |
455 | if checksys == '1': | |
456 | backsys = "sys" | |
457 | else: | |
458 | backsys = "no" | |
459 | backupfile = 'backup-' + str(datetime.date.today()) + '.ab' | |
460 | raw_input("to continue with backup, press ENTER. then check device and follow prompts to continue. the backup process may take awhile.") | |
461 | obj.backup(backupfile, backapk, backobb, backshared, backall, backsys) | |
462 | raw_input("backup complete! backup file saved as: \033[35m" + backupfile + "\033[0m. press ENTER to return to main menu.") | |
463 | elif whichbackup == '2': | |
464 | restorefile = raw_input("please enter path to backup file on your computer [ex. \'backup-yyyy-mm-dd.ab\'] --> ") | |
465 | while not os.path.isfile(restorefile): | |
466 | restorefile = raw_input("file does not exist. please enter valid path --> ") | |
467 | obj.restore(restorefile) | |
468 | raw_input("restore complete! press ENTER to reboot and continue..") | |
469 | obj.reboot("android") | |
470 | else: | |
471 | print("unable to connect to device. returning to main menu..") | |
472 | time.sleep(0.9) | |
473 | - | superSU = 'UPDATE-SuperSU-v2.02.zip' |
473 | + | |
474 | ||
475 | - | URLsuperSU = "http://download.chainfire.eu/452/SuperSU/UPDATE-SuperSU-v2.02.zip?retrieve_file=1" |
475 | + | |
476 | ||
477 | def twrpdl(): # DOWNLOAD TWRP CUSTOM RECOVERY | |
478 | TWRPurl = "http://notworth.it/opo/twrp.img" | |
479 | dl = urllib.URLopener() | |
480 | dl.retrieve(TWRPurl, "twrp.img") | |
481 | site = urllib.urlopen(TWRPurl) | |
482 | meta = site.info() | |
483 | dlsize = meta.getheaders("Content-Length")[0] | |
484 | fsize = os.path.getsize("twrp.img") | |
485 | print("file size: \033[33m") | |
486 | print(dlsize) | |
487 | print("\n\033[0mbytes downloaded: \033[33m") | |
488 | print(fsize) | |
489 | print("\033[0m\n") | |
490 | ||
491 | def recovdl(recovimg): # DOWNLOAD IMAGE FROM SITE | |
492 | recovurl = "http://notworth.it/opo/" + recovimg | |
493 | dl = urllib.URLopener() | |
494 | dl.retrieve(recovurl, recovimg) | |
495 | site = urllib.urlopen(recovurl) | |
496 | meta = site.info() | |
497 | dlsize = meta.getheaders("Content-Length")[0] | |
498 | fsize = os.path.getsize(recovimg) | |
499 | print("file size: \033[33m") | |
500 | print(dlsize) | |
501 | print("\n\033[0mbytes downloaded: \033[33m") | |
502 | print(fsize) | |
503 | print("\033[0m\n") | |
504 | ||
505 | def chooserec(): # CHOOSE WHICH CUSTOM RECOVERY TO BOOT INTO ONCE | |
506 | - | remotesuperSU = '/sdcard/UPDATE-SuperSU-v2.02.zip' |
506 | + | |
507 | pickrecov = raw_input("press 1 to flash superSU in TWRP Recovery, 2 to use Philz Recovery, or 3 to use CWM. --> ") | |
508 | while not re.search(r'^[123]$', pickrecov): | |
509 | pickrecov = raw_input("invalid selection. press 1 to flash superSU in TWRP Recovery, 2 for Philz, or 3 for CWM. --> ") | |
510 | if pickrecov == '1': # SUPERSU TWRP | |
511 | recovimg = "twrp.img" | |
512 | elif pickrecov == '2': # SUPERSU PHILZ | |
513 | recovimg = "philz.img" | |
514 | elif pickrecov == '3': # SUPERSU CWM | |
515 | recovimg = "cwm.img" | |
516 | else: | |
517 | print("unable to connect to device. returning to main menu..\n") | |
518 | return recovimg | |
519 | ||
520 | superSU = 'UPDATE-SuperSU-v2.16.zip' | |
521 | def sudl(): # DOWNLOAD SUPERSU ZIP | |
522 | URLsuperSU = "http://download.chainfire.eu/452/SuperSU/UPDATE-SuperSU-v2.16.zip?retrieve_file=1" | |
523 | ||
524 | dl = urllib.URLopener() | |
525 | dl.retrieve(URLsuperSU, superSU) | |
526 | ||
527 | site = urllib.urlopen(URLsuperSU) | |
528 | meta = site.info() | |
529 | dlsize = meta.getheaders("Content-Length")[0] | |
530 | fsize = os.path.getsize(superSU) | |
531 | print("file size: \033[33m") | |
532 | print(dlsize) | |
533 | print("\n\033[0mbytes downloaded: \033[33m") | |
534 | print(fsize) | |
535 | print("\033[0m\n") | |
536 | if dlsize != fsize: | |
537 | with open(superSU, "r+b") as f: | |
538 | f.write(site.read()) | |
539 | f.flush() | |
540 | os.fsync(f.fileno()) | |
541 | f.close() | |
542 | ||
543 | def suroot(recovimg): | |
544 | while not os.path.isfile(superSU): | |
545 | print("file \033[32m" + superSU + " \033[0mnot found. attempting download...\n") | |
546 | sudl() | |
547 | print("file \033[32m" + superSU + " \033[0mfound!\n") | |
548 | while not os.path.isfile(recovimg): | |
549 | print("file \033[32m" + recovimg + " \033[0mnot found. attempting download...\n") | |
550 | recovdl(recovimg) | |
551 | print("file \033[32m" + recovimg + " \033[0mfound!\n") | |
552 | raw_input("press ENTER to copy file to device, then reboot into bootloader.") | |
553 | remotesuperSU = '/sdcard/UPDATE-SuperSU-v2.16.zip' | |
554 | obj.push(superSU, remotesuperSU) | |
555 | obj.reboot("bootloader") | |
556 | raw_input("press ENTER to boot into custom recovery.") | |
557 | obj.bootimg(recovimg) | |
558 | print("check that device is connected and booted into custom recovery. on device, choose the ADB SIDELOAD option [sometimes under ADVANCED].\n") | |
559 | raw_input("press ENTER to continue with flashing superSU file via ADB sideload.") | |
560 | obj.sideload(superSU) | |
561 | sidefail = raw_input("if install failed, press 1 to attempt install from device. else, reboot into system from device recovery menu and press ENTER. --> ") | |
562 | if sidefail == '1': | |
563 | print("on device recovery menu, choose INSTALL, then select file \033[36m" + superSU + "\033[0m from the \033[36m/SDCARD\033[0m root directory.\n") | |
564 | raw_input("swipe to install - this may take a moment. if install is successful, select REBOOT from recovery menu. press ENTER to continue.") | |
565 | obj.reboot("android") | |
566 | ||
567 | superusr = 'Superuser-3.1.3-arm-signed.zip' | |
568 | def susrdl(): # DOWNLOAD SUPERUSER ZIP | |
569 | URLsuperusr = "http://notworth.it/opo/Superuser-3.1.3-arm-signed.zip" | |
570 | dl = urllib.URLopener() | |
571 | dl.retrieve(URLsuperusr, superusr) | |
572 | site = urllib.urlopen(URLsupusr) | |
573 | meta = site.info() | |
574 | dlsize = meta.getheaders("Content-Length")[0] | |
575 | fsize = os.path.getsize(superusr) | |
576 | - | print("\033[36m\nif APK installed successfully, locate TR [towelroot] in app drawer on device and run.\n\033[0m") |
576 | + | |
577 | print(dlsize) | |
578 | print("\n\033[0mbytes downloaded: \033[33m") | |
579 | - | print("\033[36mif the firmware release date for your device is before june 2014, there is a chance the towelroot exploit may work.\n") |
579 | + | |
580 | - | print("\033[35mhowever, superSU is a safer and more widely confirmed root method for the ONEPLUS ONE. ATTEMPT AT YOUR OWN RISK!\033[0m\n\n") |
580 | + | |
581 | - | rootcheck = raw_input("which root method would you like to try? enter 1 for towelroot or 2 for superSU [recommended for oneplus one], or 3 for Superuser. --> ") |
581 | + | |
582 | - | while not re.search(r'^[123]$', rootcheck): |
582 | + | |
583 | - | rootcheck = raw_input("invalid selection. enter 1 to install towelroot exploit, 2 to install superSU package, or 3 to install Superuser package. --> ") |
583 | + | |
584 | print("file \033[32m" + superusr + " \033[0mnot found. attempting download...\n") | |
585 | susrdl() | |
586 | print("file \033[32m" + superusr + " \033[0mfound!\n") | |
587 | while not os.path.isfile(recovimg): | |
588 | print("file \033[32m" + recovimg + " \033[0mnot found. attempting download...\n") | |
589 | recovdl(recovimg) | |
590 | print("file \033[32m" + recovimg + " \033[0mfound!\n") | |
591 | raw_input("press ENTER to copy file to device and reboot into bootloader.") | |
592 | remotesuperusr = '/sdcard/Superuser-3.1.3-arm-signed.zip' | |
593 | obj.push(superusr, remotesuperusr) | |
594 | obj.reboot("bootloader") | |
595 | raw_input("press ENTER to boot into custom recovery.") | |
596 | obj.bootimg(recovimg) | |
597 | print("on device, choose INSTALL from recovery menu, then select file \033[36m" + superusr + "\033[0m in the \033[36m/sdcard\033[0m directory.\n") | |
598 | raw_input("if install is successful, select REBOOT from recovery menu on device. press ENTER to continue.") | |
599 | ||
600 | trfile = 'apps/tr.apk' | |
601 | def trdl(): # DOWNLOAD TOWELROOT APK | |
602 | dl = urllib.URLopener() | |
603 | dl.retrieve("https://towelroot.com/tr.apk", trfile) | |
604 | site = urllib.urlopen("https://towelroot.com/tr.apk") | |
605 | meta = site.info() | |
606 | dlsize = meta.getheaders("Content-Length")[0] | |
607 | fsize = os.path.getsize(trfile) | |
608 | print("file size: \033[33m") | |
609 | print(dlsize) | |
610 | print("\033[0m\nbytes downloaded: \033[33m") | |
611 | print(fsize) | |
612 | print("\033[0m\n") | |
613 | ||
614 | def towroot(): # INSTALL TOWELROOT APK | |
615 | if not os.path.exists('apps'): | |
616 | os.makedirs('apps', 0755) | |
617 | while not os.path.isfile(trfile): | |
618 | print("file \033[32m" + trfile + " \033[0mnot found. attempting download...\n") | |
619 | trdl() | |
620 | print("file \033[32m" + trfile + " \033[0mfound!\n") | |
621 | raw_input("press ENTER to install..") | |
622 | obj.install(trfile) | |
623 | obj.shell('am start -n com.geohot.towelroot/com.geohot.towelroot.TowelRoot') | |
624 | - | obj.sideload("UPDATE-SuperSU-v2.02.zip") |
624 | + | print("if APK installed successfully, it should automatically launch on your device.") |
625 | raw_input("tap on MAKE IT RAIN. the results should appear shortly. follow instructions on device, then press ENTER to continue..") | |
626 | ||
627 | print("\033[36mif the firmware release date for your device is before june 2014, there is a chance the towelroot exploit may work.") | |
628 | print("\033[35mhowever, superSU is a safer and more widely confirmed root method for the ONEPLUS ONE. ATTEMPT AT YOUR OWN RISK!\033[0m\n") | |
629 | rootcheck = raw_input("which root method would you like to try? enter 1 for towelroot, 2 for superSU [recommended for oneplus one], 3 for Superuser, or 4 to install custom ZIP file. --> ") | |
630 | while not re.search(r'^[1-4]$', rootcheck): | |
631 | rootcheck = raw_input("invalid selection. enter 1 to install towelroot exploit, 2 to install superSU package, 3 to install Superuser, or 4 to install custom ZIP file. --> ") | |
632 | ||
633 | if rootcheck == '1': # TOWELROOT | |
634 | towroot() | |
635 | trysuroot = raw_input("if towelroot failed, press 1 to launch superSU method. otherwise, press ENTER to return to main menu. --> ") | |
636 | if trysuroot == '1': # SUPERSU | |
637 | recovimg = chooserec() | |
638 | suroot(recovimg) # SUPERSU CUSTOM RECOVERY | |
639 | time.sleep(0.9) | |
640 | main() | |
641 | else: | |
642 | time.sleep(0.9) | |
643 | main() | |
644 | ||
645 | elif rootcheck == '2': # SUPERSU | |
646 | bootcustom = raw_input("press 1 to install superSU in custom recovery, or 2 to install in fastboot [lower success rate]. --> ") | |
647 | while not re.search(r'^[12]$', bootcustom): | |
648 | bootcustom = raw_input("invalid choice. please enter 1 to load custom recovery or 2 for fastboot. --> ") | |
649 | if bootcustom == '1': # SUPERSU TWRP | |
650 | recovimg = chooserec() | |
651 | suroot(recovimg) # SUPERSU CUSTOM RECOVERY | |
652 | time.sleep(0.9) | |
653 | main() | |
654 | elif bootcustom == '2': # SUPERSU FASTBOOT | |
655 | updatewhich = raw_input("to try installing superSU in fastboot, press 1. else, enter name of ZIP file to install --> ") | |
656 | if updatewhich == '1': # SUPERSU FASTBOOT | |
657 | while not os.path.isfile(superSU): | |
658 | print("file \033[32m" + superSU + " \033[0mnot found. attempting download...\n\n") | |
659 | sudl() | |
660 | raw_input("press ENTER to reboot into bootloader.") | |
661 | obj.reboot("bootloader") | |
662 | print("\033[35mattempting to install superSU via fastboot...\n\033[0m") | |
663 | obj.update(superSU) | |
664 | failsu = raw_input("if installation failed, press 1 to try sideload method. otherwise, press ENTER to continue...") | |
665 | if failsu == '1': # SUPERSU SIDELOAD | |
666 | - | updatewhich = raw_input("to try installing Superuser in fastboot, press 1. else, enter name of ZIP file to install --> ") |
666 | + | |
667 | - | if updatewhich == '1': |
667 | + | |
668 | - | while not os.path.isfile(superusr): |
668 | + | |
669 | - | print("file \033[32m" + superusr + " \033[0mnot found. attempting download...\n\n") |
669 | + | |
670 | obj.reboot("recovery") | |
671 | raw_input("in recovery menu on device, please select APPLY UPDATE, then APPLY FROM ADB. press ENTER when ready.") | |
672 | obj.sideload("UPDATE-SuperSU-v2.16.zip") | |
673 | - | print("\033[35mattempting to install Superuser via fastboot...\n\033[0m") |
673 | + | |
674 | - | obj.update(superusr) |
674 | + | |
675 | if superfail == '1': # SUPERSU TWRP | |
676 | - | if failsu == '1': |
676 | + | |
677 | elif superfail == '2': # SUPERSU PHILZ | |
678 | suroot("philz.img") | |
679 | else: | |
680 | obj.get_state() | |
681 | time.sleep(0.9) | |
682 | main() | |
683 | - | obj.sideload(superusr) |
683 | + | |
684 | - | superfail = raw_input("choose REBOOT SYSTEM from device menu. if update successful, press ENTER. else, press 1 to install Superuser via TWRP or 2 to install Superuser via Philz. --> " ) |
684 | + | |
685 | - | if superfail == '1': |
685 | + | |
686 | - | susrroot("twrp.img") |
686 | + | |
687 | - | elif superfail == '2': |
687 | + | |
688 | - | susrroot("philz.img") |
688 | + | |
689 | if failupd == '1': | |
690 | obj.fastreboot("android") | |
691 | time.sleep(0.9) | |
692 | print("\033[32mmake sure your computer is authorized to access your device over ADB.\033[0m\n") | |
693 | raw_input("press ENTER to continue..") | |
694 | obj.reboot("recovery") | |
695 | raw_input("in recovery menu on device, please select APPLY UPDATE, then APPLY FROM ADB. press ENTER when ready.") | |
696 | obj.sideload(updatewhich) # CUSTOM SIDELOAD | |
697 | raw_input("please follow reboot prompts on device recovery menu, then press ENTER to continue...") | |
698 | - | obj.update(updatewhich) |
698 | + | |
699 | - | raw_input("please press ENTER to continue...") |
699 | + | |
700 | time.sleep(0.9) | |
701 | main() | |
702 | else: | |
703 | print("failed to connect to device. returning to main menu.. \n\n") | |
704 | ||
705 | elif rootcheck == '3': # SUPERUSER or CUSTOM ZIP FILE | |
706 | bootcustom = raw_input("press 1 to install Superuser in TWRP recovery, 2 to install in Philz recovery, or 3 to install in fastboot [lowest success rate]. --> ") | |
707 | while not re.search(r'^[123]$', bootcustom): | |
708 | bootcustom = raw_input("invalid choice. please enter 1 to load TWRP, 2 for Philz, or 3 for fastboot. --> ") | |
709 | if bootcustom == '1': | |
710 | susrroot("twrp.img") | |
711 | elif bootcustom == '2': | |
712 | susrroot("philz.img") | |
713 | elif bootcustom == '3': | |
714 | while not os.path.isfile(superusr): | |
715 | print("file \033[32m" + superusr + " \033[0mnot found. attempting download...\n\n") | |
716 | sudl() | |
717 | raw_input("press ENTER to reboot into bootloader.") | |
718 | obj.reboot("bootloader") | |
719 | print("\033[35mattempting to install Superuser via fastboot...\n\033[0m") | |
720 | obj.update(superusr) | |
721 | failsu = raw_input("if installation failed, press 1 to try sideload method. otherwise, press ENTER to continue...") | |
722 | if failsu == '1': | |
723 | obj.fastreboot("android") | |
724 | time.sleep(0.9) | |
725 | print("\033[32mmake sure your computer is authorized to access your device over ADB.\033[0m\n") | |
726 | raw_input("press ENTER to continue..") | |
727 | obj.reboot("recovery") | |
728 | raw_input("in recovery menu on device, please select APPLY UPDATE, then APPLY FROM ADB. press ENTER when ready.") | |
729 | obj.sideload(superusr) | |
730 | - | flashsel = raw_input("invalid selection. please choose an option between 0 through 9 --> ") |
730 | + | superfail = raw_input("choose REBOOT SYSTEM from device menu. if update successful, press ENTER. else, press 1 to install Superuser via TWRP or 2 to install Superuser via Philz. --> " ) |
731 | if superfail == '1': | |
732 | susrroot("twrp.img") | |
733 | elif superfail == '2': | |
734 | susrroot("philz.img") | |
735 | else: | |
736 | obj.get_state() | |
737 | time.sleep(0.9) | |
738 | main() | |
739 | ||
740 | elif rootcheck == '4': | |
741 | updatefile = raw_input("please enter path of ZIP file to install --> ") | |
742 | while not os.path.isfile(updatefile): | |
743 | updatefile = raw_input("invalid file path. please enter correct path of ZIP file to install --> ") | |
744 | raw_input("press ENTER to reboot into bootloader.") | |
745 | obj.reboot("bootloader") | |
746 | print("attempting to install " + updatefile + "...\n") | |
747 | obj.update(updatefile) | |
748 | raw_input("press ENTER to continue...") | |
749 | obj.fastreboot("android") | |
750 | time.sleep(0.9) | |
751 | main() | |
752 | ||
753 | else: | |
754 | print("failed to connect to device. returning to main menu.. \n\n") | |
755 | ||
756 | else: | |
757 | print("failed to connect to device. returning to main menu.. \n\n") | |
758 | ||
759 | time.sleep(0.9) | |
760 | main() | |
761 | ||
762 | elif option == '8': #flash stock images/partitions | |
763 | ||
764 | def flashmenu(): | |
765 | print ('''\n\033[36mSTOCK IMAGES AVAILABLE TO FLASH - THIS WILL REPLACE YOUR CURRENT PARTITION! | |
766 | \033[37mFLASH IN SEQUENTIAL ORDER IF POSSIBLE - BOOT.IMG SHOULD GO FIRST | |
767 | \033[33;1m***LATEST UPDATE FILES IN YELLOW***\n\033[0m | |
768 | -\033[31m[1]\033[37m XNPH25R stock BOOT.IMG \033[0m -or- \033[33m XNPH30O stock BOOT.IMG \033[0m | |
769 | -\033[31m[2]\033[37m XNPH25R stock USERDATA(_64).IMG \033[35m[WIPES USER DATA!]\033[0m | |
770 | -\033[31m[3]\033[37m XNPH25R stock SYSTEM.IMG \033[0m | |
771 | -\033[31m[4]\033[37m XNPH25R stock RECOVERY.IMG \033[0m | |
772 | -\033[31m[5]\033[37m XNPH25R stock CACHE.IMG \033[0m | |
773 | -\033[31m[6]\033[37m XNPH25R stock radio, modem, aboot, & more \033[34m[flash-radio.sh]\033[0m | |
774 | -\033[31m[7]\033[37m XNPH30O stock radio, modem, sbl1, aboot \033[34m[flash-extras.sh]\033[0m | |
775 | -\033[31m[8]\033[33m XNPH30O stock OTA UPDATES #1 and #2 \033[0m-or- \033[33;1mXNPH33R stock OTA UPDATE\033[0m | |
776 | -\033[31m[9]\033[37m FLASH ENTIRE STOCK OR CUSTOM ROM IMAGE \033[0m | |
777 | -\033[31m[0]\033[37m return to main menu\033[0m\n | |
778 | \033[35mCHECK THAT DEVICE IS UNLOCKED AND COMPUTER IS AUTHORIZED FOR ADB ACCESS.\n\033[0m''') | |
779 | ||
780 | flashsel = raw_input("\033[32mselect an option between 0 through 9 from menu \033[0m--> ") | |
781 | while not re.search(r'^[0-9]$', flashsel): | |
782 | flashsel = raw_input("invalid selection. please choose an option between 0 through 9 --> ") | |
783 | ||
784 | def dlimg(imgfile): | |
785 | dlfile = "http://notworth.it/opo/" + imgfile | |
786 | dl = urllib.URLopener() | |
787 | dl.retrieve(dlfile, imgfile) | |
788 | site = urllib.urlopen(dlfile) | |
789 | meta = site.info() | |
790 | dlsize = meta.getheaders("Content-Length")[0] | |
791 | fsize = os.path.getsize(imgfile) | |
792 | print("file size: \033[33m") | |
793 | print(dlsize) | |
794 | print("\n\033[0mbytes downloaded: \033[33m") | |
795 | print(fsize) | |
796 | print("\033[0m\n") | |
797 | ||
798 | if re.search(r'^[1-7]$', flashsel): | |
799 | print("\n\033[34mrebooting into bootloader...\033[0m\n") | |
800 | obj.reboot("bootloader") | |
801 | ||
802 | if flashsel == '1': | |
803 | whichboot = raw_input("enter 1 to flash boot.img from XNPH25R. enter 2 for boot.img from XNPH30O. --> ") | |
804 | while not re.search(r'^[12]$', whichboot): | |
805 | whichboot = raw_input("invalid selection. enter 1 for XNPH25R boot.img, or 2 for XNPH30O boot.img --> ") | |
806 | if whichboot == '1': | |
807 | imgfile = "XNPH25R/boot.img" | |
808 | while not os.path.isfile(imgfile): | |
809 | if not os.path.exists('XNPH25R'): | |
810 | os.makedirs('XNPH25R', 0755) | |
811 | print("downloading XNPH25R/boot.img...\n") | |
812 | dlimg(imgfile) | |
813 | obj.flashf("boot", imgfile) | |
814 | elif whichboot == '2': | |
815 | imgfile = "XNPH30O/boot.img" | |
816 | while not os.path.isfile(imgfile): | |
817 | if not os.path.exists('XNPH30O'): | |
818 | os.makedirs('XNPH30O', 0755) | |
819 | print("downloading XNPH30O/boot.img..\n") | |
820 | dlimg(imgfile) | |
821 | obj.flashf("boot", imgfile) | |
822 | else: | |
823 | print("an error has occurred. returning to flash menu..\n") | |
824 | flashmenu() | |
825 | raw_input("press ENTER key to continue...") | |
826 | flashmenu() | |
827 | ||
828 | elif flashsel == '2': | |
829 | whichsize = raw_input("IMPORTANT!! choose correct storage capacity: enter 1 for 16gb device, or 2 for 64gb device. --> ") | |
830 | while not re.search(r'^[12]$', whichsize): | |
831 | whichsize = raw_input("invalid selection. enter 1 for 16gb device, or 2 for 64gb device. --> ") | |
832 | if whichsize == '1': | |
833 | imgfile = "XNPH25R/userdata.img" | |
834 | while not os.path.isfile(imgfile): | |
835 | if not os.path.exists('XNPH25R'): | |
836 | os.makedirs('XNPH25R', 0755) | |
837 | print("downloading XNPH25R/userdata.img..\n") | |
838 | dlimg(imgfile) | |
839 | obj.flashf("userdata", "XNPH25R/userdata.img") | |
840 | elif whichsize == '2': | |
841 | imgfile = "XNPH25R/userdata_64G.img" | |
842 | while not os.path.isfile(imgfile): | |
843 | if not os.path.exists('XNPH25R'): | |
844 | os.makedirs('XNPH25R', 0755) | |
845 | print("downloading XNPH25R/userdata_64G.img..\n") | |
846 | dlimg(imgfile) | |
847 | obj.flashf("userdata", "XNPH25R/userdata_64G.img") | |
848 | else: | |
849 | print("ERROR: unable to connect to device.\n") | |
850 | raw_input("press ENTER key to return to flash menu...") | |
851 | flashmenu() | |
852 | ||
853 | elif flashsel == '3': | |
854 | imgfile = "XNPH25R/system.img" | |
855 | while not os.path.isfile(imgfile): | |
856 | if not os.path.exists('XNPH25R'): | |
857 | os.makedirs('XNPH25R', 0755) | |
858 | print("downloading XNPH25R/system.img..\n") | |
859 | dlimg(imgfile) | |
860 | obj.flashf("system", "XNPH25R/system.img") | |
861 | raw_input("press ENTER key to continue...") | |
862 | flashmenu() | |
863 | ||
864 | elif flashsel == '4': | |
865 | imgfile = "XNPH25R/recovery.img" | |
866 | while not os.path.isfile(imgfile): | |
867 | if not os.path.exists('XNPH25R'): | |
868 | os.makedirs('XNPH25R', 0755) | |
869 | print("downloading XNPH25R/recovery.img..\n") | |
870 | dlimg(imgfile) | |
871 | obj.flashf("recovery", "XNPH25R/recovery.img") | |
872 | raw_input("press ENTER key to continue...") | |
873 | flashmenu() | |
874 | ||
875 | elif flashsel == '5': | |
876 | imgfile = "XNPH25R/cache.img" | |
877 | while not os.path.isfile(imgfile): | |
878 | if not os.path.exists('XNPH25R'): | |
879 | os.makedirs('XNPH25R', 0755) | |
880 | print("downloading XNPH25R/cache.img..\n") | |
881 | dlimg(imgfile) | |
882 | obj.flashf("cache", "XNPH25R/cache.img") | |
883 | raw_input("press ENTER key to continue...") | |
884 | flashmenu() | |
885 | ||
886 | elif flashsel == '6': | |
887 | if not os.path.exists('XNPH25R'): | |
888 | os.makedirs('XNPH25R', 0755) | |
889 | imgfile = "XNPH25R/flash-radio.sh" | |
890 | while not os.path.isfile("XNPH25R/flash-radio.sh"): | |
891 | print("downloading XNPH25R/flash-radio.sh..\n") | |
892 | dlimg("XNPH25R/flash-radio.sh") | |
893 | os.chmod("XNPH25R/flash-radio.sh", 0755) | |
894 | while not os.path.isfile("XNPH25R/boot.img"): | |
895 | print("downloading XNPH25R/boot.img..\n") | |
896 | dlimg("XNPH25R/boot.img") | |
897 | while not os.path.isfile("XNPH25R/emmc_appsboot.mbn"): | |
898 | print("downloading XNPH25R/emmc_appsboot.mbn..\n") | |
899 | dlimg("XNPH25R/emmc_appsboot.mbn") | |
900 | while not os.path.isfile("XNPH25R/NON-HLOS.bin"): | |
901 | print("downloading XNPH25R/NON-HLOS.bin..\n") | |
902 | dlimg("XNPH25R/NON-HLOS.bin") | |
903 | while not os.path.isfile("XNPH25R/rpm.mbn"): | |
904 | print("downloading XNPH25R/rpm.mbn..\n") | |
905 | dlimg("XNPH25R/rpm.mbn") | |
906 | while not os.path.isfile("XNPH25R/sbl1.mbn"): | |
907 | print("downloading XNPH25R/sbl1.mbn..\n") | |
908 | dlimg("XNPH25R/sbl1.mbn") | |
909 | while not os.path.isfile("XNPH25R/sdi.mbn"): | |
910 | print("downloading XNPH25R/sdi.mbn..\n") | |
911 | dlimg("XNPH25R/sdi.mbn") | |
912 | while not os.path.isfile("XNPH25R/tz.mbn"): | |
913 | print("downloading XNPH25R/tz.mbn..\n") | |
914 | dlimg("XNPH25R/tz.mbn") | |
915 | while not os.path.isfile("XNPH25R/logo.bin"): | |
916 | print("downloading XNPH25R/logo.bin..\n") | |
917 | dlimg("XNPH25R/logo.bin") | |
918 | subprocess.call(['./flash-radio.sh'], cwd='XNPH25R', shell=True) | |
919 | raw_input("press ENTER key to continue...") | |
920 | flashmenu() | |
921 | ||
922 | elif flashsel == '7': | |
923 | if not os.path.exists('XNPH30O'): | |
924 | os.makedirs('XNPH30O', 0755) | |
925 | while not os.path.isfile("XNPH30O/boot.img"): | |
926 | print("downloading XNPH30O/boot.img..\n") | |
927 | dlimg("XNPH30O/boot.img") | |
928 | while not os.path.isfile("XNPH30O/emmc_appsboot.mbn"): | |
929 | print("downloading XNPH30O/emmc_appsboot.mbn..\n") | |
930 | dlimg("XNPH30O/emmc_appsboot.mbn") | |
931 | while not os.path.isfile("XNPH30O/NON-HLOS.bin"): | |
932 | print("downloading XNPH30O/NON-HLOS.bin..\n") | |
933 | dlimg("XNPH30O/NON-HLOS.bin") | |
934 | while not os.path.isfile("XNPH30O/rpm.mbn"): | |
935 | print("downloading XNPH30O/rpm.mbn..\n") | |
936 | dlimg("XNPH30O/rpm.mbn") | |
937 | while not os.path.isfile("XNPH30O/sbl1.mbn"): | |
938 | print("downloading XNPH30O/sbl1.mbn..\n") | |
939 | dlimg("XNPH30O/sbl1.mbn") | |
940 | while not os.path.isfile("XNPH30O/flash-extras.sh"): | |
941 | print("downloading XNPH30O/flash-extras.sh..\n") | |
942 | dlimg("XNPH30O/flash-extras.sh") | |
943 | os.chmod("XNPH30O/flash-extras.sh", 0755) | |
944 | subprocess.call(['./flash-extras.sh'], cwd='XNPH30O', shell=True) | |
945 | raw_input("press ENTER key to continue...") | |
946 | obj.fastreboot("android") | |
947 | flashmenu() | |
948 | ||
949 | elif flashsel == '8': | |
950 | whichupdate = raw_input("enter 1 for XNPH30O update #1, 2 for XNPH30O update #2, 3 for XNPH33R update, or 4 to return to flash menu --> ") | |
951 | while not re.search(r'^[1-4]$', whichupdate): | |
952 | whichupdate = raw_input("invalid selection. enter 1 for XNPH30O update #1, 2 for XNPH30O update #2, 3 for XNPH33R update, or 4 to return to flash menu --> ") | |
953 | ||
954 | imgfile = "XNPH33R-update1-signed.zip" | |
955 | ||
956 | if whichupdate == '1': # XNPH30O update 1 | |
957 | imgfile = "XNPH30O-update1-signed.zip" | |
958 | while not os.path.isfile(imgfile): | |
959 | print("\033[35mdownloading XNPH30O-update1-signed.zip...\033[0m\n") | |
960 | dlimg(imgfile) | |
961 | print("file \033[32m" + imgfile + " \033[0mfound!\n") | |
962 | ||
963 | elif whichupdate == '2': # XNPH30O update 2 | |
964 | imgfile = "XNPH30O-update2-signed.zip" | |
965 | while not os.path.isfile(imgfile): | |
966 | print("\033[35mdownloading XNPH30O-update2-signed.zip...\033[0m\n") | |
967 | dlimg(imgfile) | |
968 | print("file \033[32m" + imgfile + " \033[0mfound!\n") | |
969 | ||
970 | elif whichupdate == '3': # XNPH33R update 1 | |
971 | imgfile = "XNPH33R-update1-signed.zip" | |
972 | while not os.path.isfile(imgfile): | |
973 | print("\033[35mdownloading XNPH33R-update1-signed.zip...\033[0m\n") | |
974 | dlimg(imgfile) | |
975 | print("file \033[32m" + imgfile + " \033[0mfound!\n") | |
976 | ||
977 | elif whichupdate == '4': # return to flash menu | |
978 | time.sleep(0.9) | |
979 | flashmenu() | |
980 | ||
981 | else: # error, return to flash menu | |
982 | print("unable to connect to device. returning to flash menu..\n") | |
983 | time.sleep(0.9) | |
984 | flashmenu() | |
985 | ||
986 | # choose which recovery [installed or custom] to flash update "imgfile" | |
987 | recflupd = raw_input("enter 1 to flash update in installed recovery [may lose root], or 2 to flash in custom recovery [keep root prompt]. --> ") | |
988 | while not re.search(r'^[12]$', recflupd): | |
989 | recflupd = raw_input("invalid selection. enter 1 to flash in installed recovery, or 2 to flash in custom recovery. --> ") | |
990 | ||
991 | # copy update to device | |
992 | raw_input("make sure device is unlocked and PC is authenticated for ADB access. press ENTER to copy update to device.") | |
993 | rimgfile = "/sdcard/" + imgfile | |
994 | print("\033[32mpushing update file to device..\033[0m\n") | |
995 | obj.push(imgfile, rimgfile) | |
996 | ||
997 | # flash update in installed recovery | |
998 | if recflupd == '1': | |
999 | raw_input("press ENTER to reboot into recovery.") | |
1000 | obj.reboot("recovery") | |
1001 | print("choose APPLY UPDATE from recovery menu and select APPLY FROM ADB.\n") | |
1002 | raw_input("press ENTER to install update now.") | |
1003 | obj.sideload(imgfile) | |
1004 | failside = raw_input("if update did not succeed, press 1 to install from device. else, push POWER button on device to reboot, then press ENTER to continue..") | |
1005 | if failside == '1': | |
1006 | print("choose APPLY UPDATE from recovery menu, then select CHOOSE FROM INTERNAL STORAGE.\n") | |
1007 | print("select \033[32m" + imgfile + " \033[0mfrom root of SDCARD directory and install file.\n") | |
1008 | print("\033[35mif update failed, return to main menu and select option 3 to boot into custom recovery.\033[0m\n\n") | |
1009 | menusel = raw_input("enter 1 to return to flash menu, or 2 to return to main menu.") | |
1010 | while not re.search(r'^[12]$',menusel): | |
1011 | menusel = raw_input("invalid selection. enter 1 for flash menu, or 2 to return to main menu.") | |
1012 | if menusel == '1': | |
1013 | time.sleep(0.9) | |
1014 | flashmenu() | |
1015 | elif menusel == '2': | |
1016 | time.sleep(0.9) | |
1017 | main() | |
1018 | else: | |
1019 | print("error connecting to device. returning to main menu...\n") | |
1020 | time.sleep(0.9) | |
1021 | main() | |
1022 | else: | |
1023 | print("\033[32mreturning to flash menu..\033[0m\n\n") | |
1024 | ||
1025 | # flash update in custom recovery | |
1026 | elif recflupd == '2': | |
1027 | whichcustrec = raw_input("\033[36;1mselect custom recovery:\033[36m 1 for TWRP, 2 for Philz, 3 for CWM \033[0m--> ") | |
1028 | while not re.search(r'^[12]$', whichcustrec): | |
1029 | whichcustrec = raw_input("invalid selection. enter 1 for TWRP, 2 for Philz, 3 for CWM --> ") | |
1030 | v | |
1031 | # TWRP | |
1032 | if whichcustrec == '1': | |
1033 | custimgfile = "twrp.img" | |
1034 | ||
1035 | # PHILZ | |
1036 | elif whichcustrec == '2': | |
1037 | custimgfile = "philz.img" | |
1038 | ||
1039 | # CWM | |
1040 | else: | |
1041 | custimgfile = "cwm.img" | |
1042 | ||
1043 | while not os.path.isfile(custimgfile): | |
1044 | print("file \033[32m" + custimgfile + " \033[0mnot found. attempting download...\n") | |
1045 | dlimg(custimgfile) | |
1046 | print("file \033[32m" + custimgfile + " \033[0mfound!\n") | |
1047 | ||
1048 | raw_input("press ENTER to reboot to bootloader.") | |
1049 | obj.reboot("bootloader") | |
1050 | ||
1051 | raw_input("press ENTER to continue booting into custom recovery..") | |
1052 | obj.bootimg(custimgfile) | |
1053 | ||
1054 | print("choose INSTALL UPDATE from recovery menu and select APPLY FROM ADB SIDELOAD.\n") | |
1055 | raw_input("press ENTER to install update now.") | |
1056 | obj.sideload(imgfile) | |
1057 | ||
1058 | failside = raw_input("if update did not succeed, press 1 to install from device. else, select REBOOT into SYSTEM from TWRP menu on device, then press ENTER..") | |
1059 | if failside == '1': | |
1060 | print("on device, choose INSTALL from recovery menu, then select \033[32m" + imgfile + " \033[0mfrom SDCARD root and swipe to install file.\n") | |
1061 | print("\033[35mwhen finished, select REBOOT into SYSTEM from recovery options on device.\033[0m\n\n") | |
1062 | menusel = raw_input("enter 1 to return to flash menu, or 2 to return to main menu.") | |
1063 | while not re.search(r'^[12]$',menusel): | |
1064 | menusel = raw_input("invalid selection. enter 1 for flash menu, or 2 to return to main menu.") | |
1065 | if menusel == '1': | |
1066 | time.sleep(0.9) | |
1067 | flashmenu() | |
1068 | elif menusel == '2': | |
1069 | time.sleep(0.9) | |
1070 | main() | |
1071 | else: | |
1072 | print("error connecting to device. returning to main menu...\n") | |
1073 | time.sleep(0.9) | |
1074 | main() | |
1075 | else: | |
1076 | print("\033[32mreturning to flash menu..\033[0m\n\n") | |
1077 | else: | |
1078 | print("\033[32mreturning to flash menu..\033[0m\n\n") | |
1079 | ||
1080 | time.sleep(0.9) | |
1081 | flashmenu() | |
1082 | ||
1083 | elif flashsel == '9': | |
1084 | romsel = raw_input("enter 1 to flash XNPH30O stock ROM, 2 to flash XNPH25R stock ROM, or 3 to flash custom ROM. --> ") | |
1085 | while not re.search(r'^[1-3]$', romsel): | |
1086 | romsel = raw_input("invalid selection. enter 1 to flash XNPH30O stock ROM, 2 to flash XNPH25R stock ROM, or 3 to flash custom ROM. --> ") | |
1087 | if romsel != '3': | |
1088 | if romsel == '1': | |
1089 | imgfile = "XNPH30O/cm-11.0-XNPH30O-bacon-signed-fastboot.zip" | |
1090 | if not os.path.exists('XNPH30O'): | |
1091 | os.makedirs('XNPH30O', 0755) | |
1092 | if romsel == '2': | |
1093 | imgfile = "XNPH25R/cm-11.0-XNPH25R-bacon-signed-fastboot.zip" | |
1094 | if not os.path.exists('XNPH25R'): | |
1095 | os.makedirs('XNPH25R', 0755) | |
1096 | while not os.path.isfile(imgfile): | |
1097 | print("file \033[32m" + imgfile + " \033[0mnot found. attempting download...\n") | |
1098 | dlimg(imgfile) | |
1099 | print("file \033[32m" + imgfile + " \033[0mfound!\n") | |
1100 | raw_input("press ENTER to reboot into bootloader..") | |
1101 | obj.reboot("bootloader") | |
1102 | obj.update(imgfile) | |
1103 | failupd = raw_input("if update failed, press 1. otherwise, press ENTER key to continue. --> ") | |
1104 | if failupd == '1': | |
1105 | obj.fastreboot("android") | |
1106 | raw_input("check that device is unlocked and computer is authorized for ADB access. press ENTER to continue..") | |
1107 | imgfileonly = imgfile[8:] | |
1108 | rimgfile = "/sdcard/" + imgfileonly | |
1109 | obj.push(imgfile, rimgfile) | |
1110 | raw_input("press ENTER to reboot into recovery.") | |
1111 | obj.reboot("recovery") | |
1112 | print("choose APPLY UPDATE from recovery menu and select APPLY FROM ADB.\n") | |
1113 | raw_input("press ENTER to install from stock image now.") | |
1114 | obj.sideload(imgfile) | |
1115 | failside = raw_input("if update failed, press 1 to update from device storage. else, push POWER button on device to reboot, then press ENTER to continue. --> ") | |
1116 | if failside == '1': | |
1117 | print("choose APPLY UPDATE from recovery menu, then select CHOOSE FROM INTERNAL STORAGE.\n") | |
1118 | print("select file \033[32m" + imgfileonly + " \033[0mfrom root of SDCARD directory and install.\n") | |
1119 | print("\033[35mif update fails again, return to main menu and choose option 3 to reboot into custom recovery.\033[0m\n\n") | |
1120 | menusel = raw_input("enter 1 to return to flash menu, or 2 to return to main menu. --> ") | |
1121 | while not re.search(r'^[12]$',menusel): | |
1122 | menusel = raw_input("invalid selection. press 1 for flash menu, or 2 to return to main menu. --> ") | |
1123 | if menusel == '1': | |
1124 | time.sleep(0.9) | |
1125 | flashmenu() | |
1126 | elif menusel == '2': | |
1127 | time.sleep(0.9) | |
1128 | main() | |
1129 | else: | |
1130 | print("error connecting to device. returning to main menu...\n") | |
1131 | time.sleep(0.9) | |
1132 | main() | |
1133 | else: | |
1134 | print("\033[32mreturning to flash menu..\033[0m\n\n") | |
1135 | time.sleep(0.9) | |
1136 | flashmenu() | |
1137 | else: | |
1138 | print("\033[32mreturning to flash menu..\033[0m\n\n") | |
1139 | time.sleep(0.9) | |
1140 | flashmenu() | |
1141 | else: | |
1142 | print("\033[31mmake sure device is unlocked and PC is authenticated for ADB access.\033[0m\n") | |
1143 | romname = raw_input("place ROM file into same directory as the script home, then enter filename --> ") | |
1144 | while not os.path.isfile(romname): | |
1145 | romname = raw_input("invalid filename. make sure ROM ZIP file to flash is in correct location, then enter filename --> ") | |
1146 | rimgfile = "/sdcard/" + romname | |
1147 | print("\033[32mpushing update file to device..\033[0m\n") | |
1148 | obj.push(romname, rimgfile) | |
1149 | raw_input("press ENTER to reboot to bootloader.") | |
1150 | obj.reboot("bootloader") | |
1151 | while not os.path.isfile("twrp.img"): | |
1152 | print("file \033[32mtwrp.img \033[0mnot found. attempting download...\n") | |
1153 | dlimg("twrp.img") | |
1154 | print("file \033[32mtwrp.img \033[0mfound!\n") | |
1155 | raw_input("press ENTER to continue booting into TWRP recovery.") | |
1156 | obj.bootimg("twrp.img") | |
1157 | print("on device, choose ADVANCED from TWRP menu, then select INSTALL ZIP and to APPLY VIA ADB SIDELOAD.\n") | |
1158 | raw_input("press ENTER to install the zip file you specified.") | |
1159 | obj.sideload(imgfile) | |
1160 | failside = raw_input("if update failed, enter 1 to try installing from device storage. otherwise, push select REBOOT from device recovery menu, reboot into system, and press ENTER to continue. --> ") | |
1161 | if failside == '1': | |
1162 | print("select INSTALL on device TWRP menu, then find your file \033[32m" + romname + " \033[0min device SDCARD root and swipe to install file.\n") | |
1163 | menusel = raw_input("when flash complete, select REBOOT into SYSTEM from recovery options on device. then enter 1 to return to flash menu, or 2 for main menu.") | |
1164 | while not re.search(r'^[12]$',menusel): | |
1165 | menusel = raw_input("invalid selection. enter 1 for flash menu, or 2 to return to main menu.") | |
1166 | if menusel == '1': | |
1167 | time.sleep(0.9) | |
1168 | flashmenu() | |
1169 | elif menusel == '2': | |
1170 | time.sleep(0.9) | |
1171 | main() | |
1172 | else: | |
1173 | print("error connecting to device. returning to main menu...\n") | |
1174 | time.sleep(0.9) | |
1175 | main() | |
1176 | ||
1177 | elif flashsel == '0': | |
1178 | checkreboot = raw_input("press 1 to reboot device into system, or ENTER to continue.. --> ") | |
1179 | if checkreboot == '1': | |
1180 | obj.fastreboot("android") | |
1181 | main() | |
1182 | else: | |
1183 | print("unable to connect to device.\n") | |
1184 | ||
1185 | def recovflash(): | |
1186 | print("\n") | |
1187 | flashcont = raw_input("select 1 to continue flashing recovery. select 2 to flash a stock or custom image. select 3 to return to flash menu. --> ") | |
1188 | while not re.search(r'^[123]$', flashcont): | |
1189 | flashcont = raw_input("invalid selection. select 1 to continue flashing recovery. select 2 to flash a stock partition image. select 3 to return to flash menu. --> ") | |
1190 | if flashcont == '1': | |
1191 | recovchoice = raw_input("enter 1 for TWRP, 2 for ClockworkMod, or 3 for Philz recovery --> ") | |
1192 | while not re.search(r'^[1-3]$', recovchoice): | |
1193 | recovchoice = raw_input("invalid selection. please choose 1 for TWRP, 2 for CWM, or 3 for Philz --> ") | |
1194 | obj.reboot("bootloader") | |
1195 | if recovchoice == '1': | |
1196 | recovfile = "twrp.img" | |
1197 | while not os.path.isfile(recovfile): | |
1198 | print("file \033[32mtwrp.img \033[0mnot found. attempting download...\n") | |
1199 | dlrecov(recovfile) | |
1200 | print("file \033[32mtwrp.img \033[0mfound!\n") | |
1201 | raw_input("press ENTER to flash twrp.img over current recovery.") | |
1202 | obj.flashf("recovery","twrp.img") | |
1203 | elif recovchoice == '2': | |
1204 | recovfile = "cwm.img" | |
1205 | while not os.path.isfile(recovfile): | |
1206 | print("file \033[32mcwm.img \033[0mnot found. attempting download...\n") | |
1207 | dlrecov(recovfile) | |
1208 | print("file \033[32mcwm.img \033[0mfound!\n") | |
1209 | raw_input("press ENTER to flash cwm.img over current recovery.") | |
1210 | obj.flashf("recovery","cwm.img") | |
1211 | elif recovchoice == '3': | |
1212 | recovfile = "philz.img" | |
1213 | while not os.path.isfile(recovfile): | |
1214 | print("file \033[32mphilz.img \033[0mnot found. attempting download...\n") | |
1215 | dlrecov(recovfile) | |
1216 | print("file \033[32mphilz.img \033[0mfound!\n") | |
1217 | raw_input("press ENTER to flash philz.img over current recovery.") | |
1218 | obj.flashf("recovery","philz.img") | |
1219 | else: | |
1220 | print("unable to connect to device.\n") | |
1221 | ||
1222 | elif flashcont == '2': | |
1223 | flashmenu() | |
1224 | ||
1225 | elif flashcont == '3': | |
1226 | main() | |
1227 | ||
1228 | else: | |
1229 | print("unable to connect to device.\n") | |
1230 | ||
1231 | time.sleep(0.9) | |
1232 | - | main() |
1232 | + | |
1233 | ||
1234 | - | intro() |
1234 | + | |
1235 | - | os.system('cls' if os.name == 'nt' else 'clear') |
1235 | + | |
1236 | print("\033[37mIF YOUR DEVICE HOLDS IMPORTANT DATA, BACK UP DEVICE BEFORE YOU CONTINUE!\033[0m\n") | |
1237 | print("\033[35mIMPORTANT: if you have already unlocked your device and are re-unlocking, you MUST be running the XNPH25R stock firmware or older.\n") | |
1238 | print("\033[32mRE-UNLOCK ATTEMPTS WILL FAIL on XNPH30O or newer. you must return to the previous menu and flash the XNPH25R images to your device.\033[0m\n") | |
1239 | bunlock = raw_input("enter 1 to continue unlocking bootloader. enter 2 to skip to flashing custom recovery or images. enter 3 to re-lock bootloader. or enter 4 to return to menu. --> ") | |
1240 | while not re.search(r'^[123]$', bunlock): | |
1241 | bunlock = raw_input("invalid selection. enter 1 to unlock bootloader and wipe device. enter 2 to skip to flashing custom recovery or images. enter 3 to re-lock bootloader. or enter 4 to return to menu. --> ") | |
1242 | ||
1243 | if bunlock == '1': | |
1244 | obj.reboot("bootloader") | |
1245 | obj.unlockboot() | |
1246 | print("your device should reboot after successfully unlocking the bootloader.\n") | |
1247 | raw_input("press ENTER to continue...") | |
1248 | recovflash() | |
1249 | ||
1250 | elif bunlock == '2': | |
1251 | recovflash() | |
1252 | ||
1253 | elif bunlock == '3': | |
1254 | print("\033[33mREMINDER: to unlock your device again, you MUST downgrade to firmware release XNPH25R or earlier!\033[0m\n") | |
1255 | btlockconfirm = raw_input("press ENTER to continue, or 1 to exit to the previous menu --> ") | |
1256 | if btlockconfirm == '1': | |
1257 | flashmenu() | |
1258 | else: | |
1259 | obj.reboot("bootloader") | |
1260 | obj.lockboot() | |
1261 | raw_input("press ENTER to reboot your device") | |
1262 | obj.fastreboot("android") | |
1263 | ||
1264 | else: | |
1265 | flashmenu() | |
1266 | ||
1267 | time.sleep(0.9) | |
1268 | main() | |
1269 | ||
1270 | elif option == '9': #run shell command | |
1271 | shellcmd = raw_input("enter shell command --> ") | |
1272 | while shellcmd: | |
1273 | obj.shell(shellcmd) | |
1274 | shellcmd = raw_input("enter another shell command, or press ENTER to continue --> ") | |
1275 | time.sleep(0.9) | |
1276 | main() | |
1277 | ||
1278 | elif option is '10': #get bugreport | |
1279 | raw_input("please allow several minutes for process to complete. press ENTER to start generating bug report.") | |
1280 | obj.bugreport() | |
1281 | raw_input("press ENTER to return to main menu.") | |
1282 | time.sleep(0.9) | |
1283 | main() | |
1284 | ||
1285 | elif option == '11': #get logcat | |
1286 | print("logcat will open in a new window. close logcat window to return to menu.") | |
1287 | if os.name == 'nt': | |
1288 | process = subprocess.Popen('start /wait adb logcat', shell=True, creationflags=subprocess.CREATE_NEW_CONSOLE, stdout=subprocess.PIPE) | |
1289 | else: | |
1290 | process = subprocess.Popen(['xterm', '-e', 'adb', 'logcat', 'sleep 4'], stdout=subprocess.PIPE) | |
1291 | line = process.stdout.readline() | |
1292 | while line: | |
1293 | print line | |
1294 | line = process.stdout.readline() | |
1295 | time.sleep(0.9) | |
1296 | main() | |
1297 | ||
1298 | elif option == '0': #quit | |
1299 | print("thanks for using the HALF-ASSED ONEPLUS ONE TOOLKIT! bye!") | |
1300 | sys.exit() | |
1301 | ||
1302 | else: | |
1303 | print '\n\033[32man unhandled exception occurred. returning to main menu..\033[0m\n' | |
1304 | time.sleep(0.9) | |
1305 | main() | |
1306 | ||
1307 | main() | |
1308 | sys.exit() |