__init__.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. # -*- coding: utf-8 -*-
  2. import pygame
  3. import os
  4. import requests
  5. import validators
  6. import gobject
  7. ## local UI import
  8. from UI.page import Page
  9. from UI.constants import ICON_TYPES,Width,Height,RUNEVT,RUNSH
  10. from UI.icon_item import IconItem
  11. from UI.icon_pool import MyIconPool
  12. from UI.label import Label
  13. from UI.util_funcs import midRect,CmdClean,get_git_revision_short_hash
  14. from UI.keys_def import CurKeys, IsKeyStartOrA, IsKeyMenuOrB
  15. from UI.confirm_page import ConfirmPage
  16. from UI.download import Download
  17. from UI.download_process_page import DownloadProcessPage
  18. from UI.skin_manager import MySkinManager
  19. from UI.lang_manager import MyLangManager
  20. from UI.info_page_list_item import InfoPageListItem
  21. from libs.roundrects import aa_round_rect
  22. from libs.DBUS import is_wifi_connected_now
  23. import config
  24. LauncherLoc = "/home/cpi/launcher"
  25. class UpdateDownloadPage(DownloadProcessPage):
  26. _MD5 = ""
  27. def GObjectUpdateProcessInterval(self):
  28. if self._Screen.CurPage() == self:
  29. if self._Downloader.isFinished():
  30. if self._Downloader.isSuccessful():
  31. print("Success!")
  32. # Do something with obj.get_dest()
  33. filename = self._Downloader.get_dest()
  34. if filename.endswith(".tar.gz"):
  35. #/home/cpi/apps/[launcher]
  36. cmdpath = "tar zxf " + CmdClean(filename) + " -C /home/cpi/ ;rm -rf "+ filename
  37. pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath))
  38. self.ReturnToUpLevelPage()
  39. self._Screen.Draw()
  40. self._Screen.SwapAndShow()
  41. else:
  42. print("Download failed with the following exceptions:")
  43. for e in self._Downloader.get_errors():
  44. print(unicode(e))
  45. try:
  46. self._Downloader.stop()
  47. except:
  48. pass
  49. filename = self._Downloader.get_dest()
  50. print(filename)
  51. os.system("rm -rf %s" % CmdClean(filename))
  52. self._Screen._MsgBox.SetText("DownloadFailed")
  53. self._Screen._MsgBox.Draw()
  54. self._Screen.SwapAndShow()
  55. return False
  56. else:
  57. self._Value = self._Downloader.get_progress()
  58. print("Progress: %d%%" % (self._Value))
  59. self._Screen.Draw()
  60. self._Screen.SwapAndShow()
  61. return True
  62. else:
  63. return False
  64. def StartDownload(self,url,dst_dir):
  65. if validators.url(url) and os.path.isdir(dst_dir):
  66. self._URL = url
  67. self._DST_DIR = dst_dir
  68. else:
  69. self._Screen._MsgBox.SetText("Invaid")
  70. self._Screen._MsgBox.Draw()
  71. self._Screen.SwapAndShow()
  72. return
  73. self._Downloader = Download(url,dst_dir,None)
  74. if self._MD5 != None:
  75. if len(self._MD5) == 32:
  76. self._Downloader.add_hash_verification('md5' ,self._MD5) ## hashlib provide algorithms
  77. self._Downloader.start()
  78. self._DownloaderTimer = gobject.timeout_add(100, self.GObjectUpdateProcessInterval)
  79. class UpdateConfirmPage(ConfirmPage):
  80. _ConfirmText = "Confirm Update ?"
  81. _DownloadPage = None
  82. _URL = ""
  83. _MD5 = ""
  84. _Version = ""
  85. _GIT = False
  86. def KeyDown(self,event):
  87. global LauncherLoc
  88. if IsKeyMenuOrB(event.key):
  89. self.ReturnToUpLevelPage()
  90. self._Screen.Draw()
  91. self._Screen.SwapAndShow()
  92. if IsKeyStartOrA(event.key):
  93. if self._GIT == True:
  94. cmdpath = "%s/update.sh %s" % (LauncherLoc,self._Version)
  95. pygame.event.post( pygame.event.Event(RUNSH, message=cmdpath))
  96. return
  97. if self._DownloadPage == None:
  98. self._DownloadPage = UpdateDownloadPage()
  99. self._DownloadPage._Screen = self._Screen
  100. self._DownloadPage._Name = "Downloading"
  101. self._DownloadPage.Init()
  102. self._DownloadPage._MD5 = self._MD5
  103. self._Screen.PushPage(self._DownloadPage)
  104. self._Screen.Draw()
  105. self._Screen.SwapAndShow()
  106. if self._URL != None and validators.url(self._URL):
  107. self._DownloadPage.StartDownload(self._URL, "/tmp")
  108. else:
  109. print "error url %s " % self._URL
  110. def OnReturnBackCb(self):
  111. self.ReturnToUpLevelPage()
  112. self._Screen.Draw()
  113. self._Screen.SwapAndShow()
  114. def Draw(self):
  115. self.ClearCanvas()
  116. self.DrawBG()
  117. for i in self._MyList:
  118. i.Draw()
  119. self.Reset()
  120. class UpdatePage(Page):
  121. _Icons = {}
  122. _FootMsg = ["Nav","","Check Update","Back",""]
  123. _ListFontObj = MyLangManager.TrFont("varela15")
  124. _ConfirmPage = None
  125. _AList = {}
  126. _MyList = []
  127. def __init__(self):
  128. Page.__init__(self)
  129. self._Icons = {}
  130. def GenList(self):
  131. start_x = 0
  132. start_y = 0
  133. for i,v in enumerate( self._AList):
  134. li = InfoPageListItem()
  135. li._Parent = self
  136. li._PosX = start_x
  137. li._PosY = start_y + i*InfoPageListItem._Height
  138. li._Width = Width
  139. li._Fonts["normal"] = self._ListFontObj
  140. li._Fonts["small"] = MySkinManager.GiveFont("varela12")
  141. if self._AList[v]["label"] != "":
  142. li.Init( self._AList[v]["label"] )
  143. else:
  144. li.Init( self._AList[v]["key"] )
  145. li._Flag = self._AList[v]["key"]
  146. li.SetSmallText( self._AList[v]["value"] )
  147. self._MyList.append(li)
  148. def Init(self):
  149. self._CanvasHWND = self._Screen._CanvasHWND
  150. self._Width = self._Screen._Width
  151. self._Height = self._Screen._Height
  152. self._ConfirmPage = UpdateConfirmPage()
  153. self._ConfirmPage._Screen = self._Screen
  154. self._ConfirmPage._Name = "Update Confirm"
  155. self._ConfirmPage._Parent = self
  156. self._ConfirmPage.Init()
  157. it = {}
  158. it["key"] = "version"
  159. it["label"] = "Version"
  160. it["value"] = config.VERSION
  161. self._AList["version"] = it
  162. self.GenList()
  163. def CheckUpdate(self):
  164. global LauncherLoc
  165. self._Screen._MsgBox.SetText("CheckingUpdate")
  166. self._Screen._MsgBox.Draw()
  167. self._Screen.SwapAndShow()
  168. try:
  169. r = requests.get(config.UPDATE_URL, verify=False, timeout=8)
  170. except:
  171. print("requests get error")
  172. return
  173. else:
  174. if r.status_code == requests.codes.ok:
  175. try:
  176. json_ = r.json()
  177. if "version" in json_ and "updatepath" in json_ and "md5sum" in json_:
  178. if config.VERSION != json_["version"]:
  179. self._ConfirmPage._URL = json_["updatepath"]
  180. self._ConfirmPage._MD5 = json_["md5sum"]
  181. self._ConfirmPage._GIT = False
  182. self._Screen.PushPage(self._ConfirmPage)
  183. self._Screen.Draw()
  184. self._ConfirmPage.SnapMsg(MyLangManager.Tr("ConfirmUpdateToFQ") % json_["version"] )
  185. self._Screen.SwapAndShow()
  186. elif "gitversion" in json_: ### just use git to run update
  187. cur_dir = os.getcwd()
  188. os.chdir(LauncherLoc)
  189. current_git_version = get_git_revision_short_hash()
  190. current_git_version = current_git_version.strip("\n")
  191. current_git_version = current_git_version.strip("\t")
  192. os.chdir(cur_dir)
  193. if current_git_version != json_["gitversion"]:
  194. self._ConfirmPage._URL = None
  195. self._ConfirmPage._MD5 = None
  196. self._ConfirmPage._GIT = True
  197. self._ConfirmPage._Version = json_["gitversion"]
  198. self._Screen.PushPage(self._ConfirmPage)
  199. self._Screen.Draw()
  200. self._ConfirmPage.SnapMsg(MyLangManager.Tr("UpdateToFQ") % json_["gitversion"] )
  201. self._Screen.SwapAndShow()
  202. else:
  203. self._Screen.Draw()
  204. self._Screen._MsgBox.SetText("LauncherIsUpToDate")
  205. self._Screen._MsgBox.Draw()
  206. self._Screen.SwapAndShow()
  207. pygame.time.delay(765)
  208. return True
  209. except Exception, e:
  210. print("r.json() error %s" % str(e))
  211. else:
  212. print(" requests get error %d ", r.status_code)
  213. return False
  214. def OnLoadCb(self):
  215. pass
  216. def KeyDown(self,event):
  217. if IsKeyMenuOrB(event.key):
  218. self.ReturnToUpLevelPage()
  219. self._Screen.Draw()
  220. self._Screen.SwapAndShow()
  221. if event.key == CurKeys["X"]:
  222. if is_wifi_connected_now():
  223. if self.CheckUpdate() == True:
  224. self._Screen.Draw()
  225. self._Screen.SwapAndShow()
  226. else:
  227. self._Screen.Draw()
  228. self._Screen._MsgBox.SetText("CheckingUpdateFailed")
  229. self._Screen._MsgBox.Draw()
  230. self._Screen.SwapAndShow()
  231. else:
  232. self._Screen.Draw()
  233. self._Screen._MsgBox.SetText("CheckWifiConnection")
  234. self._Screen._MsgBox.Draw()
  235. self._Screen.SwapAndShow()
  236. def Draw(self):
  237. self.ClearCanvas()
  238. # self._Ps.Draw()
  239. for i in self._MyList:
  240. i.Draw()
  241. class APIOBJ(object):
  242. _UpdatePage = None
  243. def __init__(self):
  244. pass
  245. def Init(self,main_screen):
  246. self._UpdatePage = UpdatePage()
  247. self._UpdatePage._Screen = main_screen
  248. self._UpdatePage._Name = "Update Launcher"
  249. self._UpdatePage.Init()
  250. def API(self,main_screen):
  251. if main_screen !=None:
  252. main_screen.PushPage(self._UpdatePage)
  253. main_screen.Draw()
  254. main_screen.SwapAndShow()
  255. OBJ = APIOBJ()
  256. def Init(main_screen):
  257. OBJ.Init(main_screen)
  258. def API(main_screen):
  259. OBJ.API(main_screen)