updater.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. '''
  2. Auto-updater
  3. '''
  4. from distutils.version import StrictVersion
  5. import os
  6. from subprocess import Popen
  7. import sys
  8. import tempfile
  9. import requests
  10. VERSIONFILE_URL = "http://codebox/lab/ModelePython/raw/VERSION"
  11. SETUPFILE_URL = "http://codebox/lab/ModelePython/raw/setup-hello_world.exe"
  12. CURDIR = os.path.dirname(__file__)
  13. class UpdateNeeded(Exception):
  14. pass
  15. class Unavailable(requests.exceptions.RequestException):
  16. pass
  17. def autoupdate():
  18. try:
  19. if update_needed():
  20. update()
  21. except Unavailable:
  22. pass
  23. def update_needed():
  24. # Available version
  25. try:
  26. raw = requests.get(VERSIONFILE_URL).text
  27. available_version = StrictVersion(raw)
  28. except (ValueError, requests.exceptions.RequestException):
  29. raise Unavailable()
  30. # Installed version
  31. with open(os.path.join(CURDIR, "VERSION")) as f:
  32. installed_version = f.read()
  33. return available_version > installed_version
  34. def update():
  35. with tempfile.TemporaryDirectory() as tmpdir:
  36. # Download the setup.exe
  37. response = requests.get(SETUPFILE_URL, stream=True)
  38. with open("setup.exe", "wb") as handle:
  39. for data in response.iter_content():
  40. handle.write(data)
  41. # Run the installer and restart the start command
  42. args = "/SILENT && {}".format(tmpdir / "setup.exe", " ".join(sys.argv[:]))
  43. Popen([os.path.join(tmpdir, "setup.exe"), args], shell=True)
  44. # An UpdateNeeded exception is raised so the script exit before being restarted by subprocess
  45. raise UpdateNeeded()