Ticket #28159

更新の自動チェックとアップデートを有効にする

Open Date: 2012-04-22 23:43 Last Update: 2013-12-15 12:59

Reporter:
Owner:
(None)
Status:
Closed
Component:
(None)
MileStone:
Priority:
6
Severity:
6
Resolution:
Fixed
File:
None

Details

本家 2012.2 では updateCheck 機能が追加されます。

クライアントの処理が updateCheck.py に実装されています。

ユーザー側の実行環境とバージョン情報を受け取って、最新版へのアップデートが可能かどうかを返答するサーバーの機能が www.nvda-project.org/updateCheck に実装されています。(動作しているかどうかは未確認です)

nvdajp を本家と独立に公開・配布するならば updateCheck を無効化するか、サーバーを日本独自に構築・運用することが望ましいです。

NVDAユーザ会広島 nvda.jp が運用してはという提案があります。

Ticket History (3/13 Histories)

2012-04-22 23:43 Updated by: nishimoto
  • New Ticket "updateCheck対応" created
2012-06-09 23:34 Updated by: nishimoto
  • Type Update from Bugs to Feature Requests
Comment

2012.2 の日本語版では自動更新チェックを無効化し、独自にサーバーを立てることは今後の検討課題とします。

2012-06-18 22:16 Updated by: nishimoto
  • Severity Update from 5 - Medium to 4
  • Priority Update from 5 - Medium to 4
2013-04-05 17:45 Updated by: nishimoto
  • Severity Update from 4 to 5 - Medium
  • Priority Update from 4 to 5 - Medium
Comment

自動アップデートサーバーを独自に立てることについて調査をしたので記録しておきます。

versionInfo.py の updateVersionType を下記のように書き換えるとNVDAメニュー「ヘルプ」に「更新を確認」が出てきます。

NVDAのパッチ:

=== modified file 'source/config/__init__.py'
--- source/config/__init__.py	2013-04-04 03:16:46 +0000
+++ source/config/__init__.py	2013-04-04 09:06:53 +0000
@@ -193,7 +193,7 @@
 	enabled = boolean(default=true)
 
 [update]
-	autoCheck = boolean(default=false) # nvdajp
+	autoCheck = boolean(default=true) # nvdajp
 
 [inputComposition]
 	autoReportAllCandidates = boolean(default=False) # nvdajp

=== modified file 'source/updateCheck.py'
--- source/updateCheck.py	2012-12-10 00:21:55 +0000
+++ source/updateCheck.py	2013-04-04 09:03:23 +0000
@@ -30,7 +30,8 @@
 import shellapi
 
 #: The URL to use for update checks.
-CHECK_URL = "http://www.nvda-project.org/updateCheck"
+#CHECK_URL = "http://www.nvda-project.org/updateCheck"
+CHECK_URL = "http://localhost:8080/nvdajp/updateCheck.php"
 #: The time to wait between checks.
 CHECK_INTERVAL = 86400 # 1 day
 #: The time to wait before retrying a failed check.

=== modified file 'source/versionInfo.py'
--- source/versionInfo.py	2013-03-05 07:56:06 +0000
+++ source/versionInfo.py	2013-04-04 09:34:31 +0000
@@ -32,7 +32,7 @@
 longName=_("NonVisual Desktop Access")
 version="2013.1dev"
 publisher="unknown"
-updateVersionType=None
+updateVersionType="jpdev"
 try:
 	from _buildVersion import version, publisher, updateVersionType
 except ImportError:

HTTP のクエリー例:

GET /nvdajp/updateCheck.php?language=ja_JP&autoCheck=False&x64=True&installed=False&version=bzr-jp2013.1-5992&versionType=jpdev&osVersion=6.2.9200+ HTTP/1.0" 200 126 "-" "Python-urllib/1.17"

ためしにPHPで書いたサーバーの例。レスポンスの最後に空行が入るとエラーになるので、あえて php ブロックの終了マークを省略しています。

<?php 
header('Content-type: text/plain');
echo "version: jpdev130404" . PHP_EOL;
echo "launcherUrl: http://localhost:8080/nvdajp/download1.php http://localhost:8080/nvdajp/download2.php" . PHP_EOL;

header だけで body が空のときは「更新はありません」になります。

上記の2行(レコードは改行で区切る、属性名と値は ": " で区切る)が存在すると「NVDAバージョン jpdev130404 が利用可能です」というメッセージと「更新をダウンロード(D)」ボタンが表示されます。片方しかないとエラーになるようです。

launcherUrl はスペース区切りで exe ファイルを取得できるURLを並べます。

なお、ポータブル環境で実行すると、launcherUrl の先頭要素を os.startfile() で実行しているようです。

インストール環境の場合は launcherUrl の要素を先頭から順番に fetch して、失敗したら次の要素を fetch します。 ダウンロードに成功したら、取得したファイルを ShellExecute() API を使って "--install -m" オプションで実行します。

2013-04-27 00:57 Updated by: nishimoto
Comment

アップデートサーバーの仕様案:

  • 各リリースは、バージョン名、ダウンロードURL、新しさを表す serial 、安定版かどうかを表す stable フラグを付与して、データベースに格納する。
  • 以下 stable=false のリリースは unstable と呼ぶ。

ロジック:

  • if クエリーがデータベース未登録のバージョンの場合は、「更新なし」を返す。
  • elif クエリーのバージョンよりも serial の大きい stable が存在すればそのバージョン名を返す。
  • elif クエリーのバージョンが unstable で、さらに serial の大きい unstable があれば、そのバージョン名を返す。
  • else 「更新なし」を返す。
2013-09-19 10:42 Updated by: nishimoto
  • Resolution Update from None to Accepted
Comment

2013年7月に www.nvda.jp を Amazon EC2 に移したので、アップデートサーバーの運用について再検討をしたいと思います。

2013.3jp から運用を開始して、2014.1jp をリリースしたときに自動通知されるようになる、というのがスケジュール案です。

日本語チーム内でテストのために配布するリリース候補、ベータ版、テスト版は自動通知の対象としない、または自動通知機能のテストのために使うことにして、運用を単純化したいと思います。

2013-09-21 22:22 Updated by: nishimoto
Comment

自動更新のテストをするだけのためのスナップショットを作りました。

特にテストを呼びかけるわけではありませんが、いちおう公開します。

https://dl.dropboxusercontent.com/u/62564469/nvda_jpupd130921a.exe

電子署名をしないでインストールしても不具合が少ない環境ということで、現在は Windows XP でしかテストしていません。

このバイナリをインストールして、ALT+Ctrl+N などで実行すると http://www.nvda.jp/updateCheck/ にアクセスします。

サーバー側はまだバージョン比較のロジックを実装していないので、常に jpnext130920 のバージョン番号とダウンロードURLを返します。

なお、過去に NVDA 日本語版がインストールされていた環境では、一般設定「更新の自動チェックとNVDAのアップデート」がオフになっているので、オンにする必要があります。

現時点では、アップデートが完了すると jpnext130920 になり、これは自動更新機能を無効にしてあるので、それ以上は自動更新されません。

本チケットで4月5日に書いたことに加えて、わかったことを書いておきます。

  • updateVersionType=None のままだとクライアント側の自動更新機能が有効にならない
  • サーバー側の launcherUrl は i.nvda.jp など HTTP のリダイレクトを前提にしたアドレスだと「ダウンロードエラー」になる。

以上のことから、アップデートサーバーが稼働したら、sourceforge.jp にリダイレクトしてダウンロード数を数えてもらうことが(現状の実装では)できないので、アップデートサーバー自身でダウンロード数をカウントするのがよさそうです。

ソースファイルのブランチは下記です:

To ssh://git@bitbucket.org/nvdajp/nvdajp.git
   ca4e0b4..a76b9a7  ti28159 -> ti28159
2013-09-22 12:59 Updated by: nishimoto
Comment

簡単ですがバージョン比較ロジックを書いてみました。

現状は jpnext130920 以外のバージョンがきたら jpnext130920 のダウンロードを案内する処理になっています。

To ssh://git@bitbucket.org/nvdajp/nvdajp.git
   a76b9a7..31bdada  ti28159 -> ti28159

以下 curl で実験したログ:

> curl -i "http://www.nvda.jp/updateCheck/?language=ja_JP&autoCheck=False&x64=True&installed=False&version=jpnext130919&versionType=jpdev&osVersion=6.2.9200"
HTTP/1.1 200 OK
Date: Sun, 22 Sep 2013 03:54:24 GMT
Server: Apache
Content-Length: 102
Connection: close
Content-Type: text/plain; charset=UTF-8

version: jpnext130920
launcherUrl: https://dl.dropboxusercontent.com/u/62564469/nvda_jpnext130920.exe

ユーザーが最新バージョンの場合:

> curl -i "http://www.nvda.jp/updateCheck/?language=ja_JP&autoCheck=False&x64=True&installed=False&version=jpnext130920&versionType=jpdev&osVersion=6.2.9200"
HTTP/1.1 200 OK
Date: Sun, 22 Sep 2013 03:54:38 GMT
Server: Apache
Content-Length: 0
Connection: close
Content-Type: text/plain; charset=UTF-8
2013-09-25 18:20 Updated by: nishimoto
Comment

日本語テスト版 jpnext を自動更新の対象にしました。

現時点では以下の2つのバージョン

https://dl.dropboxusercontent.com/u/62564469/nvda_jpupd130921a.exe

https://dl.dropboxusercontent.com/u/62564469/nvda_jpnext130925.exe

から、バージョン jpnext130925a

https://dl.dropboxusercontent.com/u/62564469/nvda_jpnext130925a.exe

にアップデートされます。

現時点で Windows 8 で「ポータブル版」を c:\nvdajp に作り、アップデートすると以下が起きます:

  • アップデートのときに寄付の確認ダイアログが表示され、いまは寄付をしないことを選択すると、ダウンロードのURLが Internet Explorer で開く。
  • IEの「ダウンロードの表示と追跡」で許可の操作が必要。さらにこのファイルはダウンロードした人が少ないので安全ではない、という警告を解除して実行ボタンを押す。この実行ボタンを探すときにオブジェクトナビゲーションが必要。
  • 実行すると(電子署名がないので) SmartScreen フィルター「WindowsによってPCが保護されました」が出る。詳細情報のリンクを押して、プログラムを実行する。
  • NVDA のインストーラーが起動するので、いまポータブル版を置いているフォルダを再度指定する。これでポータブル版がアップデートされる。起動しなおすと新しいバージョンが動く。

本家のアップデートクライアントの実装で、一度アップデートをチェックすると、しばらく(おそらく24時間)次のチェックを行いません。

jpnext130925a には、ブランチ ti28159 に加えて、以下がマージされています:

  • メッセージ翻訳の追加や更新(ブランチ jpbranch)
  • JTalk への JTalk2 相当機能の統合、JTalk2 ドライバの廃止、実験的な eSpeak での日本語読み上げ、バグ修正(JTalk が 1.01 のような数字で小数点を読まない #32087 )(ブランチ jtalk)
  • Excel セル範囲の読み上げの再修正(ブランチ ti31413)
2013-09-25 19:54 Updated by: nishimoto
  • Summary Updated
2013-10-08 15:32 Updated by: nishimoto
  • Milestone Update from (None) to 2013.3jp (closed)
  • Severity Update from 5 - Medium to 6
  • Priority Update from 5 - Medium to 6
2013-10-10 22:31 Updated by: nishimoto
Comment

updateCheck.py の独自拡張で使うかも知れない実験コードを書きました。

たぶん本家はこういう処理をサーバーサイドでやっていると思います。

import urllib2
import re
from urlparse import urlparse

def nvdajp_urlopen(url):
	while True:
		remote = urllib2.urlopen(url)
		ct = remote.headers["content-type"].lower()
		#print remote.code
		#print remote.geturl()
		#print ct
		if remote.code == 200 and ct in (
			'application/octet-stream', 
			'application/x-msdos-program', 
			'application/x-msdownload'):
			return remote
		elif ct == "text/html; charset=utf-8":
			o = urlparse(remote.geturl())
			newUrl = None
			for line in remote:
				line = line.rstrip()
				mo = re.match(r'.*<meta http-equiv="refresh" content="1; url=([^"]+)">.*', line)
				if mo:
					newUrl = o[0] + '://' + o[1] + mo.group(1).replace('&amp;', '&')
					break
			if not newUrl:
				raise RuntimeError("Download failed")
			url = newUrl
		else:
			raise RuntimeError("Download failed")

url = "http://i.nvda.jp"
remote = nvdajp_urlopen(url)
print remote.geturl()
2013-12-15 12:59 Updated by: nishimoto
  • Ticket Close date is changed to 2013-12-15 12:59
  • Status Update from Open to Closed
  • Resolution Update from Accepted to Fixed
Comment

2013.3jp のファイル公開およびサーバー設定を終えたので、下記のテストを行いました。

Windows 7 32ビットをネットワークのない状態にして nvda_jpbeta131127.exe をクリーンインストール(ログオン画面での使用はなし)する。

ネットワークを有効にして NVDA を起動すると、「NVDAバージョン2013.3jpが利用可能です」が出る。

「更新をダウンロードしてアップデートする」を選ぶ。

ここで「寄付」を押すと日本語チームの寄付ページが開く。

続行すると 2013.3jp がダウンロードされる。サーバーのせいか環境のせいかわからないが、ダウンロードに約5分かかった。

ダウンロードが終わると「NVDAを更新中」(インストーラーの実行)になる。

ユーザーアカウント制御で「はい」を選んで先に進む。

1分くらいで更新が完了し、2013.3jp が起動して「ようこそ画面」が開く。

ログを見た限りでは特に異常はない。

上記、確認できたので、本チケットはクローズして、2013.3jp リリースに関する作業は完了とします。

今後の課題は、アップデートチェックのトラフィックの統計を取ることです。

Attachment File List

No attachments

Edit

Please login to add comment to this ticket » Login