Advertisement
eudemonics

opotoolkit.py v1.3.1 - half-assed 1+1 toolkit - september

Nov 27th, 2014
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/env python
  2. ### HALF-ASSED ONE + ONE TOOLKIT
  3. ##### VERSION: 1.3.1 STABLE
  4. ##### RELEASE DATE: SEPTEMBER 13, 2014
  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. ##### will not be irregularly maintained at the developer's whim.
  10. ##### REQUIREMENTS: Python 2.7, Android SDK tools, USB drivers, pyadb.py library, opointro.py
  11. ##### also required, obviously, is a computer that runs an OS that supports python 2.7.
  12. ##### HOLY SHIT I HAVE A README FILE!
  13. ##### http://notworth.it/opo/README
  14. ##### source code for stable releases should be available on my pastebin:
  15. ##### http://pastebin.com/u/eudemonics
  16. ##################################################
  17. ##################################################
  18. ##### USER LICENSE AGREEMENT & DISCLAIMER
  19. ##### copyright (C) 2014  vvn <vvn@eudemonics.org>
  20. #####
  21. ##### This program is FREE software: you can use it, redistribute it and/or modify
  22. ##### it as you wish. Copying and distribution of this file, with or without modification,
  23. ##### are permitted in any medium without royalty provided the copyright
  24. ##### notice and this notice are preserved. This program is offered AS-IS,
  25. ##### WITHOUT ANY WARRANTY; without even the implied warranty of
  26. ##### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27. ##### GNU General Public License for more details.
  28. #####
  29. ##### For more information, please refer to the "LICENSE AND NOTICE" file that should
  30. ##### accompany all official download releases of this program.
  31. ##################################################
  32. ##################################################
  33. ##### don't ask about the arbitrary versioning. i am totally making this shit up.
  34. ##### getting credited for my work is nice. so are donations.
  35. ##### BTC: 1M511j1CHR8x7RYgakNdw1iF3ike2KehXh
  36. ##### https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=26PWMPCNKN28L
  37. ##### but to really show your appreciation, you should buy my EP instead!
  38. ##### you can stream and purchase it at: dreamcorp.bandcamp.com
  39. ##### (you might even enjoy listening to it)
  40. ##### questions, comments, feedback, bugs, complaints, death threats, marriage proposals?
  41. ##### contact me at:
  42. ##### vvn (at) notworth (dot) it
  43. ##### latest version will always be available HERE:
  44. ##### http://notworth.it/opo/opotoolkit.py
  45. ##### if above link is not able to download, use this one:
  46. ##### http://notworth.it/opo/opotoolkit.py.txt (rename from *.py.txt to *.py)
  47. ##### there be only code after this -->
  48.  
  49. import subprocess, sys, re, os, os.path, time, datetime, urllib
  50. from opointro import *
  51. from pyadb import *
  52. if os.name == 'nt' or sys.platform == 'win32':
  53.    try:
  54.       import colorama
  55.       colorama.init()
  56.       s = opointro()
  57.       s.colorlogo()
  58.       startmenu = s.colormenu
  59.    except:
  60.       try:
  61.          import tendo.ansiterm
  62.          s = opointro()
  63.          s.colorlogo()
  64.          startmenu = s.colormenu
  65.       except:
  66.          s = opointro()
  67.          s.cleanlogo()
  68.          startmenu = s.cleanmenu
  69.          pass
  70. else:
  71.    s = opointro()
  72.    s.colorlogo()
  73.    startmenu = s.colormenu
  74.  
  75. def mainmenu():
  76.    print(startmenu)
  77.  
  78. def main():
  79.    os.system('cls' if os.name == 'nt' else 'clear')
  80.    mainmenu()
  81.  
  82.    global option
  83.    option = raw_input('Select an option 0-11 --> ')
  84.    
  85.    while not re.search(r'^[0-9]$', option) and not re.search(r'^1[0-1]$', option):
  86.       option = raw_input('Invalid selection. Please select an option 0-11 --> ')
  87.  
  88.    if option:
  89.  
  90.       obj = pyADB()
  91.  
  92.       if option == '1': #reboot      
  93.          rboption = raw_input("please enter 1 to reboot into android. enter 2 to reboot to bootloader. enter 3 to reboot to recovery. --> ")
  94.          while not re.search(r'^[123]$', rboption):
  95.             rboption = raw_input("invalid selection. please enter 1 to reboot into android, 2 for bootloader, and 3 for recovery. --> ")
  96.          rbtype = "android"
  97.          if rboption == '1':
  98.             rbtype = "android"
  99.          elif rboption == '2':
  100.             rbtype = "bootloader"
  101.          elif rboption == '3':
  102.             rbtype ="recovery"
  103.          checkdev = obj.get_state()
  104.          listdev = obj.attached_devices()
  105.          fastdev = obj.fastboot_devices()
  106.          if "device" in str(checkdev) and listdev is not None and "fastboot" not in str(fastdev):
  107.             print("rebooting via ADB..\n")
  108.             obj.reboot(rbtype)
  109.             time.sleep(0.9)
  110.             main()
  111.          elif "unknown" in str(checkdev) and "fastboot" in str(fastdev):
  112.             print("rebooting via fastboot..\n")
  113.             if rboption == '3':
  114.                rbtype = "bootloader"
  115.             obj.fastreboot(rbtype)
  116.             time.sleep(0.9)
  117.             main()
  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.                      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.                      os.makedirs(localsyncdir, 0755)
  367.                      print(localsyncdir + " created\n")
  368.                else:
  369.                   localdir = "none"
  370.                obj.sync(localdir, syncdir)
  371.                if "none" not in localdir:
  372.                   print("\033[32mfile(s) in sync directory:\n")
  373.                   for fn in next(os.walk(localdir))[2]:
  374.                      fullpath = os.path.join(localdir, fn)
  375.                      if os.path.getmtime(fullpath) >= os.path.getctime(localdir):
  376.                         print(fullpath)
  377.                   print("\033[0m\n")
  378.                raw_input("press ENTER to continue...")
  379.             elif syncargs == '2':
  380.                # obj.sync()
  381.                localargs = raw_input("enter 1 to set local sync directory, or 2 to use default ANDROID_PRODUCT_OUT --> ")
  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.                      while not re.search(r'^[12]$', crlocaldir):
  390.                         crlocaldir = raw_input("invalid selection. please enter 1 to create directory, or 2 to enter another location. --> ")
  391.                      if crlocaldir == '1':
  392.                         os.makedirs(localdir, 0755)
  393.                      else:
  394.                         localdir = raw_input("please enter relative path for local directory to sync device with --> ")
  395.                else:
  396.                   localdir = "none"
  397.                obj.sync(localdir, "none")
  398.                raw_input("press ENTER to continue...")
  399.             else:
  400.                print("could not connect to device.\n")
  401.          
  402.          else:
  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.                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.          main()
  474.  
  475.       elif option == '7': #root
  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.             recovimg = "twrp.img"
  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("file size: \033[33m")
  577.             print(dlsize)
  578.             print("\n\033[0mbytes downloaded: \033[33m")
  579.             print(fsize)
  580.             print("\033[0m\n")
  581.            
  582.          def susrroot(recovimg): # FLASH SUPERUSER ZIP IN CUSTOM RECOVERY
  583.             while not os.path.isfile(superusr):
  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.             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.                      obj.fastreboot("android")
  667.                      time.sleep(0.9)
  668.                      print("\033[32mmake sure your computer is authorized to access your device over ADB.\033[0m\n")
  669.                      raw_input("press ENTER to continue..")
  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.                      superfail = raw_input("choose REBOOT SYSTEM from device menu. if update successful, press ENTER. else, press 1 to install superSU from TWRP, or 2 to install superSU from Philz --> " )
  674.                      ogj.reboot("android")
  675.                      if superfail == '1': # SUPERSU TWRP
  676.                         suroot("twrp.img")
  677.                      elif superfail == '2': # SUPERSU PHILZ
  678.                         suroot("philz.img")
  679.                      else:
  680.                         obj.get_state()
  681.                   time.sleep(0.9)
  682.                   main()
  683.                else:
  684.                   print("attempting to install " + updatewhich + "...\n\n")
  685.                   while not os.path.isfile(updatewhich):
  686.                      updatewhich = raw_input("invalid file path. please enter correct path of ZIP file to install --> ")
  687.                   obj.update(updatewhich) # CUSTOM FASTBOOT UPDATE
  688.                   failupd = raw_input("if installation failed, press 1 to try sideload method. otherwise, press ENTER to continue...")
  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.                   else:
  699.                      obj.fastreboot("android")
  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.                   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.             flashmenu()
  1233.                
  1234.          print("\n\033[36mFlashing a CUSTOM RECOVERY requires an UNLOCKED BOOTLOADER.\033[0m\n")
  1235.          print("\033[33m***UNLOCKING YOUR BOOTLOADER WILL WIPE YOUR DEVICE!!!***\033[0m\n")
  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()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement