__init__.py 11 KB

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