From d9f5edf54a85c247590d8ea454b60f558d9fcbfb Mon Sep 17 00:00:00 2001 From: chrox Date: Fri, 1 Aug 2014 12:36:32 +0800 Subject: [PATCH] add 'Check update' menu and OTA update functionality --- Makefile | 25 ++++- frontend/apps/filemanager/filemanagermenu.lua | 24 ++++- frontend/apps/reader/modules/readermenu.lua | 22 +++++ frontend/ui/otamanager.lua | 88 +++++++++++++++++ kindle/koreader.sh | 41 +++++--- kobo/koreader.sh | 13 ++- koreader-base | 2 +- l10n/templates/koreader.pot | 96 ++++++++++++------- 8 files changed, 256 insertions(+), 55 deletions(-) create mode 100644 frontend/ui/otamanager.lua diff --git a/Makefile b/Makefile index 38bf6475f..176917bfb 100644 --- a/Makefile +++ b/Makefile @@ -59,6 +59,7 @@ endif mkdir -p $(INSTALL_DIR)/koreader/data/dict mkdir -p $(INSTALL_DIR)/koreader/data/tessdata mkdir -p $(INSTALL_DIR)/koreader/fonts/host + mkdir -p $(INSTALL_DIR)/koreader/ota ifndef EMULATE_READER # clean up, remove unused files for releases rm -rf $(INSTALL_DIR)/koreader/data/{cr3.ini,cr3skin-format.txt,desktop,devices,manual} @@ -109,8 +110,19 @@ endif zip -9 -r \ ../koreader-kindle-$(MACHINE)-$(VERSION).zip \ extensions koreader $(KINDLE_LEGACY_LAUNCHER) \ - -x "koreader/resources/fonts/*" \ + -x "koreader/resources/fonts/*" "koreader/ota/*" \ "koreader/resources/icons/src/*" "koreader/spec/*" + # generate kindleupdate package index file + zipinfo -1 koreader-kindle-$(MACHINE)-$(VERSION).zip > \ + $(INSTALL_DIR)/koreader/ota/package.index + echo "koreader/ota/package.index" >> $(INSTALL_DIR)/koreader/ota/package.index + # update index file in zip package + cd $(INSTALL_DIR) && zip -u ../koreader-kindle-$(MACHINE)-$(VERSION).zip \ + koreader/ota/package.index + # make gzip kindleupdate for zsync OTA update + cd $(INSTALL_DIR) && \ + tar czafh ../koreader-kindle-$(MACHINE)-$(VERSION).tar.gz \ + -T koreader/ota/package.index --no-recursion koboupdate: all # ensure that the binaries were built for ARM @@ -134,6 +146,17 @@ koboupdate: all KoboRoot.tgz koreader koreader.png README_kobo.txt \ -x "koreader/resources/fonts/*" \ "koreader/resources/icons/src/*" "koreader/spec/*" + # generate koboupdate package index file + zipinfo -1 koreader-kobo-$(MACHINE)-$(VERSION).zip > \ + $(INSTALL_DIR)/koreader/ota/package.index + echo "koreader/ota/package.index" >> $(INSTALL_DIR)/koreader/ota/package.index + # update index file in zip package + cd $(INSTALL_DIR) && zip -u ../koreader-kobo-$(MACHINE)-$(VERSION).zip \ + koreader/ota/package.index + # make gzip koboupdate for zsync OTA update + cd $(INSTALL_DIR) && \ + tar czafh ../koreader-kobo-$(MACHINE)-$(VERSION).tar.gz \ + -T koreader/ota/package.index --no-recursion androidupdate: all mkdir -p $(ANDROID_LAUNCHER_DIR)/assets/module diff --git a/frontend/apps/filemanager/filemanagermenu.lua b/frontend/apps/filemanager/filemanagermenu.lua index aab575645..f6e881541 100644 --- a/frontend/apps/filemanager/filemanagermenu.lua +++ b/frontend/apps/filemanager/filemanagermenu.lua @@ -1,7 +1,9 @@ local CenterContainer = require("ui/widget/container/centercontainer") -local TouchMenu = require("ui/widget/touchmenu") local InputContainer = require("ui/widget/container/inputcontainer") +local ConfirmBox = require("ui/widget/confirmbox") +local TouchMenu = require("ui/widget/touchmenu") local InfoMessage = require("ui/widget/infomessage") +local OTAManager = require("ui/otamanager") local UIManager = require("ui/uimanager") local Device = require("ui/device") local GestureRange = require("ui/gesturerange") @@ -136,6 +138,26 @@ function FileManagerMenu:setUpdateItemTable() table.insert(self.tab_item_table.setting, Language:getLangMenuTable()) -- info tab + table.insert(self.tab_item_table.info, { + text = _("Check update"), + callback = function() + local ota_version = OTAManager:checkUpdate() + if ota_version == 0 then + UIManager:show(InfoMessage:new{ + text = _("Your koreader is updated."), + }) + elseif ota_version == nil then + UIManager:show(InfoMessage:new{ + text = _("OTA server is not available."), + }) + elseif ota_version then + UIManager:show(ConfirmBox:new{ + text = _("Do you want to update to version ")..ota_version.."?", + ok_callback = function() OTAManager:zsync() end + }) + end + end + }) table.insert(self.tab_item_table.info, { text = _("Version"), callback = function() diff --git a/frontend/apps/reader/modules/readermenu.lua b/frontend/apps/reader/modules/readermenu.lua index ef4233b66..f0e3a1dcd 100644 --- a/frontend/apps/reader/modules/readermenu.lua +++ b/frontend/apps/reader/modules/readermenu.lua @@ -2,8 +2,10 @@ local InputContainer = require("ui/widget/container/inputcontainer") local CenterContainer = require("ui/widget/container/centercontainer") local InfoMessage = require("ui/widget/infomessage") local InputDialog = require("ui/widget/inputdialog") +local ConfirmBox = require("ui/widget/confirmbox") local TouchMenu = require("ui/widget/touchmenu") local GestureRange = require("ui/gesturerange") +local OTAManager = require("ui/otamanager") local UIManager = require("ui/uimanager") local Device = require("ui/device") local Geom = require("ui/geometry") @@ -136,6 +138,26 @@ function ReaderMenu:setUpdateItemTable() table.insert(self.tab_item_table.setting, Language:getLangMenuTable()) -- info tab + table.insert(self.tab_item_table.info, { + text = _("Check update"), + callback = function() + local ota_version = OTAManager:checkUpdate() + if ota_version == 0 then + UIManager:show(InfoMessage:new{ + text = _("Your koreader is updated."), + }) + elseif ota_version == nil then + UIManager:show(InfoMessage:new{ + text = _("OTA server is not available."), + }) + elseif ota_version then + UIManager:show(ConfirmBox:new{ + text = _("Do you want to update to version ")..ota_version.."?", + ok_callback = function() OTAManager:zsync() end + }) + end + end + }) table.insert(self.tab_item_table.info, { text = _("Version"), callback = function() diff --git a/frontend/ui/otamanager.lua b/frontend/ui/otamanager.lua new file mode 100644 index 000000000..c49edce50 --- /dev/null +++ b/frontend/ui/otamanager.lua @@ -0,0 +1,88 @@ +local Device = require("ui/device") +local DEBUG = require("dbg") + +local OTAManager = { + ota_server = "http://vislab.bjmu.edu.cn/apps/koreader/ota/", + ota_channel = "nightly", -- or "stable" + zsync_template = "koreader-%s-latest-%s.zsync", + installed_package = "ota/koreader.installed.tar", + package_indexfile = "ota/package.index", + updated_package = "ota/koreader.updated.tar", +} + +function OTAManager:getOTAModel() + if Device:isKindle() then + return "kindle" + elseif Device:isKobo() then + return "kobo" + else + return "" + end +end + +function OTAManager:getOTAChannel() + return self.ota_channel +end + +function OTAManager:setOTAChannel(channel) + -- channel should be "nightly" or "stable" + self.ota_channel = channel +end + +function OTAManager:getZsyncFilename() + return self.zsync_template:format(self:getOTAModel(), self:getOTAChannel()) +end + +function OTAManager:checkUpdate() + local http = require("socket.http") + local ltn12 = require("ltn12") + + local zsync_file = self:getZsyncFilename() + local ota_zsync_file = self.ota_server .. zsync_file + local local_zsync_file = "ota/" .. zsync_file + -- download zsync file from OTA server + local r, c, h = http.request{ + url = ota_zsync_file, + sink = ltn12.sink.file(io.open(local_zsync_file, "w"))} + -- parse OTA package version + if c ~= 200 then return end + local ota_package = nil + local zsync = io.open(local_zsync_file, "r") + if zsync then + for line in zsync:lines() do + ota_package = line:match("^Filename:%s*(.-)%s*$") + if ota_package then break end + end + zsync:close() + end + local local_version = io.open("git-rev", "r"):read() + local ota_version = nil + if ota_package then + ota_version = ota_package:match(".-(v%d.-)%.tar") + end + -- return ota package version if package on OTA server has version + -- larger than the local package version + if ota_version and ota_version > local_version then + return ota_version + elseif ota_version and ota_version == local_version then + return 0 + end +end + +function OTAManager:_buildLocalPackage() + return os.execute(string.format( + "./tar cvf %s -C .. -T %s --no-recursion", + self.installed_package, self.package_indexfile)) +end + +function OTAManager:zsync() + if self:_buildLocalPackage() == 0 then + return os.execute(string.format( + "./zsync -i %s -o %s -u %s %s &", + self.installed_package, self.updated_package, + self.ota_server, "ota/" .. self:getZsyncFilename() + )) + end +end + +return OTAManager diff --git a/kindle/koreader.sh b/kindle/koreader.sh index 8526c439f..1675afae7 100755 --- a/kindle/koreader.sh +++ b/kindle/koreader.sh @@ -76,8 +76,19 @@ if [ "$(nice)" == "5" ] ; then renice -n -5 $$ fi +# working directory of koreader +KOREADER_DIR=/mnt/us/koreader + +# update to new version from OTA directory +NEWUPDATE=${KOREADER_DIR}/ota/koreader.updated.tar +if [ -f $NEWUPDATE ]; then + # TODO: any graphic indication for the updating progress? + logmsg "Updating koreader . . ." + cd /mnt/us && tar xf $NEWUPDATE && rm $NEWUPDATE +fi + # we're always starting from our working directory -cd /mnt/us/koreader +cd $KOREADER_DIR # export trained OCR data directory export TESSDATA_PREFIX="data" @@ -91,26 +102,26 @@ iptables -A INPUT -i wlan0 -p udp --dport 5670 -j ACCEPT iptables -A INPUT -i wlan0 -p tcp --dport 49152:49162 -j ACCEPT # bind-mount system fonts -if ! grep /mnt/us/koreader/fonts/host /proc/mounts > /dev/null 2>&1 ; then +if ! grep ${KOREADER_DIR}/fonts/host /proc/mounts > /dev/null 2>&1 ; then logmsg "Mounting system fonts . . ." - mount -o bind /usr/java/lib/fonts /mnt/us/koreader/fonts/host + mount -o bind /usr/java/lib/fonts ${KOREADER_DIR}/fonts/host fi # bind-mount altfonts if [ -d /mnt/us/fonts ] ; then - mkdir -p /mnt/us/koreader/fonts/altfonts - if ! grep /mnt/us/koreader/fonts/altfonts /proc/mounts > /dev/null 2>&1 ; then + mkdir -p ${KOREADER_DIR}/fonts/altfonts + if ! grep ${KOREADER_DIR}/fonts/altfonts /proc/mounts > /dev/null 2>&1 ; then logmsg "Mounting altfonts . . ." - mount -o bind /mnt/us/fonts /mnt/us/koreader/fonts/altfonts + mount -o bind /mnt/us/fonts ${KOREADER_DIR}/fonts/altfonts fi fi # bind-mount linkfonts if [ -d /mnt/us/linkfonts/fonts ] ; then - mkdir -p /mnt/us/koreader/fonts/linkfonts - if ! grep /mnt/us/koreader/fonts/linkfonts /proc/mounts > /dev/null 2>&1 ; then + mkdir -p ${KOREADER_DIR}/fonts/linkfonts + if ! grep ${KOREADER_DIR}/fonts/linkfonts /proc/mounts > /dev/null 2>&1 ; then logmsg "Mounting linkfonts . . ." - mount -o bind /mnt/us/linkfonts/fonts /mnt/us/koreader/fonts/linkfonts + mount -o bind /mnt/us/linkfonts/fonts ${KOREADER_DIR}/fonts/linkfonts fi fi @@ -172,21 +183,21 @@ if pidof reader.lua > /dev/null 2>&1 ; then fi # unmount system fonts -if grep /mnt/us/koreader/fonts/host /proc/mounts > /dev/null 2>&1 ; then +if grep ${KOREADER_DIR}/fonts/host /proc/mounts > /dev/null 2>&1 ; then logmsg "Unmounting system fonts . . ." - umount /mnt/us/koreader/fonts/host + umount ${KOREADER_DIR}/fonts/host fi # unmount altfonts -if grep /mnt/us/koreader/fonts/altfonts /proc/mounts > /dev/null 2>&1 ; then +if grep ${KOREADER_DIR}/fonts/altfonts /proc/mounts > /dev/null 2>&1 ; then logmsg "Unmounting altfonts . . ." - umount /mnt/us/koreader/fonts/altfonts + umount ${KOREADER_DIR}/fonts/altfonts fi # unmount linkfonts -if grep /mnt/us/koreader/fonts/linkfonts /proc/mounts > /dev/null 2>&1 ; then +if grep ${KOREADER_DIR}/fonts/linkfonts /proc/mounts > /dev/null 2>&1 ; then logmsg "Unmounting linkfonts . . ." - umount /mnt/us/koreader/fonts/linkfonts + umount ${KOREADER_DIR}/fonts/linkfonts fi # Resume cvm (only if we stopped it) diff --git a/kobo/koreader.sh b/kobo/koreader.sh index 5160b4363..68f28b7ce 100755 --- a/kobo/koreader.sh +++ b/kobo/koreader.sh @@ -1,8 +1,19 @@ #!/bin/sh export LC_ALL="en_US.UTF-8" +# working directory of koreader +KOREADER_DIR=/mnt/onboard/.kobo/koreader + +# update to new version from OTA directory +NEWUPDATE=${KOREADER_DIR}/ota/koreader.updated.tar +if [ -f $NEWUPDATE ]; then + # TODO: any graphic indication for the updating progress? + logmsg "Updating koreader . . ." + cd /mnt/onboard/.kobo && tar xf $NEWUPDATE && rm $NEWUPDATE +fi + # we're always starting from our working directory -cd /mnt/onboard/.kobo/koreader/ +cd $KOREADER_DIR # export trained OCR data directory export TESSDATA_PREFIX="data" diff --git a/koreader-base b/koreader-base index 87d869223..d68bae786 160000 --- a/koreader-base +++ b/koreader-base @@ -1 +1 @@ -Subproject commit 87d869223a1948a1e3431d57cf3bf1bc7aaad8de +Subproject commit d68bae7862977310c6cdfe5e83f876346a218dec diff --git a/l10n/templates/koreader.pot b/l10n/templates/koreader.pot index ee89c9fb6..faee2cf6d 100644 --- a/l10n/templates/koreader.pot +++ b/l10n/templates/koreader.pot @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: https://github.com/koreader/koreader-base/issues\n" -"POT-Creation-Date: 2014-07-27 13:41+0000\n" +"POT-Creation-Date: 2014-08-01 04:35+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,9 +17,9 @@ msgid "" " others." msgstr "" -#: frontend/apps/reader/modules/readermenu.lua:175 -#: frontend/apps/reader/modules/readermenu.lua:181 -#: frontend/apps/reader/modules/readermenu.lua:187 +#: frontend/apps/reader/modules/readermenu.lua:197 +#: frontend/apps/reader/modules/readermenu.lua:203 +#: frontend/apps/reader/modules/readermenu.lua:209 msgid "" " pages" msgstr "" @@ -65,8 +65,8 @@ msgid "" "Apply" msgstr "" -#: frontend/apps/filemanager/filemanagermenu.lua:103 -#: frontend/apps/reader/modules/readermenu.lua:94 +#: frontend/apps/filemanager/filemanagermenu.lua:105 +#: frontend/apps/reader/modules/readermenu.lua:96 #: frontend/apps/reader/modules/readertypeset.lua:66 msgid "" "Auto" @@ -83,7 +83,7 @@ msgid "" msgstr "" #: frontend/apps/reader/modules/readergoto.lua:36 -#: frontend/apps/reader/modules/readermenu.lua:208 +#: frontend/apps/reader/modules/readermenu.lua:230 #: frontend/ui/widget/confirmbox.lua:29 #: plugins/evernote.koplugin/main.lua:124 #: plugins/zsync.koplugin/main.lua:279 @@ -101,6 +101,12 @@ msgid "" "Change font" msgstr "" +#: frontend/apps/filemanager/filemanagermenu.lua:142 +#: frontend/apps/reader/modules/readermenu.lua:142 +msgid "" +"Check update" +msgstr "" + #: plugins/zsync.koplugin/main.lua:226 #: plugins/zsync.koplugin/main.lua:236 msgid "" @@ -127,9 +133,9 @@ msgid "" "Copy" msgstr "" -#: frontend/apps/reader/modules/readermenu.lua:175 -#: frontend/apps/reader/modules/readermenu.lua:181 -#: frontend/apps/reader/modules/readermenu.lua:187 +#: frontend/apps/reader/modules/readermenu.lua:197 +#: frontend/apps/reader/modules/readermenu.lua:203 +#: frontend/apps/reader/modules/readermenu.lua:209 msgid "" "Custom " msgstr "" @@ -176,17 +182,23 @@ msgid "" "Do you want to Turn on Wifi?" msgstr "" +#: frontend/apps/filemanager/filemanagermenu.lua:155 +#: frontend/apps/reader/modules/readermenu.lua:155 +msgid "" +"Do you want to update to version " +msgstr "" + #: frontend/ui/data/strings.lua:17 msgid "" "Document Language" msgstr "" -#: frontend/apps/reader/modules/readermenu.lua:265 +#: frontend/apps/reader/modules/readermenu.lua:287 msgid "" "Document menu" msgstr "" -#: frontend/apps/reader/modules/readermenu.lua:162 +#: frontend/apps/reader/modules/readermenu.lua:184 msgid "" "E-ink full refresh rate" msgstr "" @@ -223,12 +235,12 @@ msgid "" "Evernote" msgstr "" -#: frontend/apps/reader/modules/readermenu.lua:170 +#: frontend/apps/reader/modules/readermenu.lua:192 msgid "" "Every 6 pages" msgstr "" -#: frontend/apps/reader/modules/readermenu.lua:165 +#: frontend/apps/reader/modules/readermenu.lua:187 msgid "" "Every page" msgstr "" @@ -254,7 +266,7 @@ msgid "" "File does not exist" msgstr "" -#: frontend/apps/filemanager/filemanagermenu.lua:180 +#: frontend/apps/filemanager/filemanagermenu.lua:202 msgid "" "File manager menu" msgstr "" @@ -279,8 +291,8 @@ msgid "" "Font Weight" msgstr "" -#: frontend/apps/filemanager/filemanagermenu.lua:100 -#: frontend/apps/reader/modules/readermenu.lua:91 +#: frontend/apps/filemanager/filemanagermenu.lua:102 +#: frontend/apps/reader/modules/readermenu.lua:93 msgid "" "Font size" msgstr "" @@ -325,8 +337,8 @@ msgid "" "Go to Page or Location" msgstr "" -#: frontend/apps/filemanager/filemanagermenu.lua:148 -#: frontend/apps/reader/modules/readermenu.lua:148 +#: frontend/apps/filemanager/filemanagermenu.lua:170 +#: frontend/apps/reader/modules/readermenu.lua:170 msgid "" "Help" msgstr "" @@ -362,7 +374,7 @@ msgid "" "Indentation" msgstr "" -#: frontend/apps/reader/modules/readermenu.lua:203 +#: frontend/apps/reader/modules/readermenu.lua:225 msgid "" "Input page number for a full refresh" msgstr "" @@ -387,8 +399,8 @@ msgid "" "Language" msgstr "" -#: frontend/apps/filemanager/filemanagermenu.lua:127 -#: frontend/apps/reader/modules/readermenu.lua:118 +#: frontend/apps/filemanager/filemanagermenu.lua:129 +#: frontend/apps/reader/modules/readermenu.lua:120 msgid "" "Large" msgstr "" @@ -434,8 +446,8 @@ msgid "" "Logout" msgstr "" -#: frontend/apps/filemanager/filemanagermenu.lua:119 -#: frontend/apps/reader/modules/readermenu.lua:110 +#: frontend/apps/filemanager/filemanagermenu.lua:121 +#: frontend/apps/reader/modules/readermenu.lua:112 msgid "" "Medium" msgstr "" @@ -445,8 +457,8 @@ msgid "" "More" msgstr "" -#: frontend/apps/filemanager/filemanagermenu.lua:89 -#: frontend/apps/reader/modules/readermenu.lua:82 +#: frontend/apps/filemanager/filemanagermenu.lua:91 +#: frontend/apps/reader/modules/readermenu.lua:84 msgid "" "Night mode" msgstr "" @@ -467,12 +479,18 @@ msgid "" msgstr "" #: frontend/apps/reader/modules/readerfrontlight.lua:115 -#: frontend/apps/reader/modules/readermenu.lua:214 +#: frontend/apps/reader/modules/readermenu.lua:236 #: frontend/ui/widget/confirmbox.lua:28 msgid "" "OK" msgstr "" +#: frontend/apps/filemanager/filemanagermenu.lua:151 +#: frontend/apps/reader/modules/readermenu.lua:151 +msgid "" +"OTA server is not available." +msgstr "" + #: frontend/apps/reader/modules/readertypeset.lua:150 msgid "" "Off" @@ -513,8 +531,8 @@ msgid "" "Paste" msgstr "" -#: frontend/apps/filemanager/filemanagermenu.lua:151 -#: frontend/apps/reader/modules/readermenu.lua:151 +#: frontend/apps/filemanager/filemanagermenu.lua:173 +#: frontend/apps/reader/modules/readermenu.lua:173 msgid "" "Please report bugs to \n" "https://github.com/koreader/koreader/issues" @@ -615,12 +633,12 @@ msgid "" "Share" msgstr "" -#: frontend/apps/reader/modules/readermenu.lua:129 +#: frontend/apps/reader/modules/readermenu.lua:131 msgid "" "Show advanced options" msgstr "" -#: frontend/apps/filemanager/filemanagermenu.lua:67 +#: frontend/apps/filemanager/filemanagermenu.lua:69 msgid "" "Show hidden files" msgstr "" @@ -630,13 +648,13 @@ msgid "" "Show page overlap" msgstr "" -#: frontend/apps/filemanager/filemanagermenu.lua:111 -#: frontend/apps/reader/modules/readermenu.lua:102 +#: frontend/apps/filemanager/filemanagermenu.lua:113 +#: frontend/apps/reader/modules/readermenu.lua:104 msgid "" "Small" msgstr "" -#: frontend/apps/filemanager/filemanagermenu.lua:75 +#: frontend/apps/filemanager/filemanagermenu.lua:77 msgid "" "Start with last opened file" msgstr "" @@ -716,8 +734,8 @@ msgid "" "Underscore" msgstr "" -#: frontend/apps/filemanager/filemanagermenu.lua:140 -#: frontend/apps/reader/modules/readermenu.lua:140 +#: frontend/apps/filemanager/filemanagermenu.lua:162 +#: frontend/apps/reader/modules/readermenu.lua:162 msgid "" "Version" msgstr "" @@ -752,6 +770,12 @@ msgid "" "Yinxiang" msgstr "" +#: frontend/apps/filemanager/filemanagermenu.lua:147 +#: frontend/apps/reader/modules/readermenu.lua:147 +msgid "" +"Your koreader is updated." +msgstr "" + #: plugins/zsync.koplugin/main.lua:42 msgid "" "ZSync"