| | ''' |
| | * Project : Screenipy |
| | * Author : Pranjal Joshi |
| | * Created : 21/04/2021 |
| | * Description : Class for handling OTA updates |
| | ''' |
| |
|
| | from classes.ColorText import colorText |
| | from classes.Utility import isDocker, isGui |
| | import requests |
| | import os |
| | import platform |
| | import sys |
| | import subprocess |
| | import requests |
| |
|
| | class OTAUpdater: |
| |
|
| | developmentVersion = 'd' |
| |
|
| | |
| | def updateForWindows(url): |
| | batFile = """@echo off |
| | color a |
| | echo [+] Screenipy Software Updater! |
| | echo [+] Downloading Software Update... |
| | echo [+] This may take some time as per your Internet Speed, Please Wait... |
| | curl -o screenipy.exe -L """ + url + """ |
| | echo [+] Newly downloaded file saved in %cd% |
| | echo [+] Software Update Completed! Run'screenipy.exe' again as usual to continue.. |
| | pause |
| | del updater.bat & exit |
| | """ |
| | f = open("updater.bat",'w') |
| | f.write(batFile) |
| | f.close() |
| | subprocess.Popen('start updater.bat', shell=True) |
| | sys.exit(0) |
| |
|
| | |
| | def updateForLinux(url): |
| | bashFile = """#!/bin/bash |
| | echo "" |
| | echo "[+] Starting Screeni-py updater, Please Wait..." |
| | sleep 3 |
| | echo "[+] Screenipy Software Updater!" |
| | echo "[+] Downloading Software Update..." |
| | echo "[+] This may take some time as per your Internet Speed, Please Wait..." |
| | wget -q """ + url + """ -O screenipy.bin |
| | echo "[+] Newly downloaded file saved in $(pwd)" |
| | chmod +x screenipy.bin |
| | echo "[+] Update Completed! Run 'screenipy.bin' again as usual to continue.." |
| | rm updater.sh |
| | """ |
| | f = open("updater.sh",'w') |
| | f.write(bashFile) |
| | f.close() |
| | subprocess.Popen('bash updater.sh', shell=True) |
| | sys.exit(0) |
| |
|
| | |
| | def updateForMac(url): |
| | bashFile = """#!/bin/bash |
| | echo "" |
| | echo "[+] Starting Screeni-py updater, Please Wait..." |
| | sleep 3 |
| | echo "[+] Screenipy Software Updater!" |
| | echo "[+] Downloading Software Update..." |
| | echo "[+] This may take some time as per your Internet Speed, Please Wait..." |
| | curl -o screenipy.run -L """ + url + """ |
| | echo "[+] Newly downloaded file saved in $(pwd)" |
| | chmod +x screenipy.run |
| | echo "[+] Update Completed! Run 'screenipy.run' again as usual to continue.." |
| | rm updater.sh |
| | """ |
| | f = open("updater.sh",'w') |
| | f.write(bashFile) |
| | f.close() |
| | subprocess.Popen('bash updater.sh', shell=True) |
| | sys.exit(0) |
| |
|
| | |
| | def showWhatsNew(): |
| | url = "https://raw.githubusercontent.com/pranjal-joshi/Screeni-py/main/src/release.md" |
| | md = requests.get(url) |
| | txt = md.text |
| | txt = txt.split("New?")[1] |
| | |
| | txt = txt.split("## Installation Guide")[0] |
| | txt = txt.replace('**','').replace('`','').strip() |
| | return (txt+"\n") |
| |
|
| | |
| | def checkForUpdate(proxyServer, VERSION="1.0"): |
| | OTAUpdater.checkForUpdate.url = None |
| | guiUpdateMessage = "" |
| | try: |
| | resp = None |
| | now = float(VERSION) |
| | if proxyServer: |
| | resp = requests.get("https://api.github.com/repos/pranjal-joshi/Screeni-py/releases/latest",proxies={'https':proxyServer}) |
| | else: |
| | resp = requests.get("https://api.github.com/repos/pranjal-joshi/Screeni-py/releases/latest") |
| | |
| | ''' |
| | if 'Windows' in platform.system(): |
| | OTAUpdater.checkForUpdate.url = resp.json()['assets'][1]['browser_download_url'] |
| | size = int(resp.json()['assets'][1]['size']/(1024*1024)) |
| | elif 'Darwin' in platform.system(): |
| | OTAUpdater.checkForUpdate.url = resp.json()['assets'][2]['browser_download_url'] |
| | size = int(resp.json()['assets'][2]['size']/(1024*1024)) |
| | else: |
| | OTAUpdater.checkForUpdate.url = resp.json()['assets'][0]['browser_download_url'] |
| | size = int(resp.json()['assets'][0]['size']/(1024*1024)) |
| | # if(float(resp.json()['tag_name']) > now): |
| | if(float(resp.json()['tag_name']) > now and not isDocker()): # OTA not applicable if we're running in docker! |
| | print(colorText.BOLD + colorText.WARN + "[+] What's New in this Update?\n" + OTAUpdater.showWhatsNew() + colorText.END) |
| | action = str(input(colorText.BOLD + colorText.WARN + ('\n[+] New Software update (v%s) available. Download Now (Size: %dMB)? [Y/N]: ' % (str(resp.json()['tag_name']),size)))).lower() |
| | if(action == 'y'): |
| | try: |
| | if 'Windows' in platform.system(): |
| | OTAUpdater.updateForWindows(OTAUpdater.checkForUpdate.url) |
| | elif 'Darwin' in platform.system(): |
| | OTAUpdater.updateForMac(OTAUpdater.checkForUpdate.url) |
| | else: |
| | OTAUpdater.updateForLinux(OTAUpdater.checkForUpdate.url) |
| | except Exception as e: |
| | print(colorText.BOLD + colorText.WARN + '[+] Error occured while updating!' + colorText.END) |
| | raise(e) |
| | ''' |
| | if(float(resp.json()['tag_name']) > now and not isDocker()): |
| | print(colorText.BOLD + colorText.FAIL + "[+] Executables are now DEPRECATED!\nFollow instructions given at https://github.com/pranjal-joshi/Screeni-py to switch to Docker.\n" + colorText.END) |
| | elif(float(resp.json()['tag_name']) > now and isDocker()): |
| | print(colorText.BOLD + colorText.FAIL + ('\n[+] New Software update (v%s) available.\n[+] Run `docker pull joshipranjal/screeni-py:latest` to update your docker to the latest version!\n' % (str(resp.json()['tag_name']))) + colorText.END) |
| | print(colorText.BOLD + colorText.WARN + "[+] What's New in this Update?\n" + OTAUpdater.showWhatsNew() + colorText.END) |
| | if isGui(): |
| | guiUpdateMessage = f"New Software update (v{resp.json()['tag_name']}) available - Watch this [**YouTube Video**](https://youtu.be/T41m13iMyJc) for additional help or Update by running following command:\n\n**`docker pull joshipranjal/screeni-py:latest`**" |
| | elif(float(resp.json()['tag_name']) < now): |
| | print(colorText.BOLD + colorText.FAIL + ('[+] This version (v%s) is in Development mode and unreleased!' % VERSION) + colorText.END) |
| | if isGui(): |
| | guiUpdateMessage = f"This version (v{VERSION}) is in Development mode and unreleased!" |
| | return OTAUpdater.developmentVersion, guiUpdateMessage |
| | except Exception as e: |
| | print(colorText.BOLD + colorText.FAIL + "[+] Failure while checking update!" + colorText.END) |
| | print(e) |
| | if OTAUpdater.checkForUpdate.url != None: |
| | print(colorText.BOLD + colorText.BLUE + ("[+] Download update manually from %s\n" % OTAUpdater.checkForUpdate.url) + colorText.END) |
| | return None, guiUpdateMessage |