2013年5月27日 星期一

[nodejs] 安裝 node-gitteh 失敗過程

因為有人說,因為大家都是 *nix like,只有 windows 不是,所以有問題會很慢才解決,我當場就把作業系統給換成 ubuntu。

gitteh 是一個讓 nodejs 可以用程式的方式來執行 git 指令,因為我想要自動偵測新檔案出現,就自動 commit,所以腦筋就動到這東西來了。也有人說,只要會用 shell 指令,把 stdout 導出來,再做一些文字解析的工作,也就完成一樣的事,不過,就是怕改版文字會跑掉。所以,有人就寫了 libgit2 的 C 語言函式庫讓人使用,再由各語言呼叫 C 函式庫來滿足大家的需求,例如 nodejs、python。而 nodejs 的 bindings 就叫做 gitteh。

libgit2 的網站 http://libgit2.github.com/

gitteh 的網站 https://github.com/libgit2/node-gitteh

安裝 gitteh (在 ubuntu)

在 github 這裡,就只有說 npm  install gitteh 就好,看了就很高興。

BUT! 人生就怕這個字。

執行 npm install gitteh 遇到

hadoop@ubuntu:~/nodejs/myapp/src$ npm install gitteh
npm http GET https://registry.npmjs.org/gitteh
npm http 304 https://registry.npmjs.org/gitteh

> gitteh@0.1.0 preinstall /home/hadoop/nodejs/myapp/src/node_modules/gitteh
> node-waf configure --use-bundled-libgit2

sh: 1: node-waf: not found
npm ERR! weird error 127
npm ERR! not ok code 0

 

以為是少 node-waf,於是下指令 npm install node-waf

結果

hadoop@ubuntu:~/nodejs/myapp/src$ npm install node-waf
npm http GET https://registry.npmjs.org/node-waf
npm http 404 https://registry.npmjs.org/node-waf
npm ERR! 404 'node-waf' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it
npm ERR! 404
npm ERR! 404 Maybe try 'npm search waf'
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, or http url, or git url.

npm ERR! System Linux 3.5.0-17-generic
npm ERR! command "/home/hadoop/.nvm/v0.10.7/bin/node" "/home/hadoop/.nvm/v0.10.7/bin/npm" "install" "node-waf"
npm ERR! cwd /home/hadoop/nodejs/myapp/src
npm ERR! node -v v0.10.7
npm ERR! npm -v 1.2.21
npm ERR! code E404
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /home/hadoop/nodejs/myapp/src/npm-debug.log
npm ERR! not ok code 0

唉~~

試了 http://stackoverflow.com/questions/13784551/how-to-install-node-gitteh-module-from-npm-nodejs-0-8-x

npm install git://github.com/jmendeth/node-gitteh.git
失敗
再試 https://github.com/libgit2/node-gitteh/issues/21 還是失敗
我想試試先安裝 libgit2,npm install libgit2,結果找不到。
npm search libgit2 有找到一個 nodegit,就來試試,npm install nodegit。
跑了一大串之後得到


> nodegit@0.0.79 install /home/hadoop/nodejs/myapp/src/node_modules/nodegit
> node install.js


[nodegit] Downloading libgit2 dependency.
[nodegit] Building libgit2 dependency.
/usr/bin/env: cmake: No such file or directory
npm ERR! weird error 127
npm ERR! not ok code 0


 


於是 sudo apt-get install cmake 後,再一次,結果換 g++ 找不到。依稀記得有個 build-essential,就裝它吧。 sudo apt-get install build-essential 。再一次安裝 nodegit。好像成功了,雖然有 WARN



npm WARN package.json cli-table@0.2.0 No repository field.
nodegit@0.0.79 node_modules/nodegit
├── async@0.2.8
├── request@2.9.203
├── tar@0.1.17 (inherits@1.0.0, block-stream@0.0.6, fstream@0.1.22)
├── fs-extra@0.6.0 (jsonfile@0.0.1, ncp@0.4.2, mkdirp@0.3.5, rimraf@2.1.4)
└── node-gyp@0.8.5 (which@1.0.5, osenv@0.0.3, graceful-fs@1.2.1, rimraf@2.1.4, semver@1.1.4, mkdirp@0.3.5, glob@3.2.1, fstream@0.1.22, npmlog@0.0.2, nopt@2.1.1, minimatch@0.2.12)


 


又回到執行 npm install gitteh,登登!



> gitteh@0.1.0 preinstall /home/hadoop/nodejs/myapp/src/node_modules/gitteh
> node-waf configure --use-bundled-libgit2


sh: 1: node-waf: not found
npm ERR! weird error 127
npm ERR! not ok code 0


 


此路不通啊。


下載 git clone https://github.com/libgit2/node-gitteh.git 來安裝試試



hadoop@ubuntu:~/nodejs/myapp/src/node-gitteh$ node install.js


module.js:340
    throw err;
          ^
Error: Cannot find module 'async'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/home/hadoop/nodejs/myapp/src/node-gitteh/install.js:1:75)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)


 


看來是 async 找不到,就裝一下,




hadoop@ubuntu:~/nodejs/myapp/src/node-gitteh$ npm install async -g
npm http GET https://registry.npmjs.org/async
npm http 304 https://registry.npmjs.org/async
npm WARN package.json github-url-from-git@1.1.1 No repository field.
npm WARN package.json assert-plus@0.1.2 No repository field.
npm WARN package.json ctype@0.5.2 No repository field.
async@0.2.8 /home/hadoop/.nvm/v0.10.7/lib/node_modules/async


 


再試發現裝到 global 好像沒反應,就改裝在工作目錄。



hadoop@ubuntu:~/nodejs/myapp/src/node-gitteh$ node install.js


module.js:340
    throw err;
          ^
Error: Cannot find module 'async'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/home/hadoop/nodejs/myapp/src/node-gitteh/install.js:1:75)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
hadoop@ubuntu:~/nodejs/myapp/src/node-gitteh$ npm install async
npm http GET https://registry.npmjs.org/async
npm http 304 https://registry.npmjs.org/async
async@0.2.8 node_modules/async


hadoop@ubuntu:~/nodejs/myapp/src/node-gitteh$


npm install async
npm http GET https://registry.npmjs.org/async
npm http 304 https://registry.npmjs.org/async
async@0.2.8 node_modules/asynchadoop@ubuntu:~/nodejs/myapp/src/node-gitteh$
hadoop@ubuntu:~/nodejs/myapp/src/node-gitteh$
hadoop@ubuntu:~/nodejs/myapp/src/node-gitteh$
hadoop@ubuntu:~/nodejs/myapp/src/node-gitteh$
hadoop@ubuntu:~/nodejs/myapp/src/node-gitteh$ node install.js
[gitteh] Downloading libgit2 dependency.
Submodule 'deps/libgit2' (git://github.com/libgit2/libgit2.git) registered for path 'deps/libgit2'
Cloning into 'deps/libgit2'...


中間省略


[gitteh] Building native module.
/bin/sh: 1: ./node_modules/.bin/node-gyp: not found


又少 node-gyp。再來 npm install node-gyp



hadoop@ubuntu:~/nodejs/myapp/src/node-gitteh$ npm install node-gyp
npm http GET https://registry.npmjs.org/node-gyp
npm http 304 https://registry.npmjs.org/node-gyp
npm http GET https://registry.npmjs.org/tar
npm http GET https://registry.npmjs.org/fstream
npm http GET https://registry.npmjs.org/graceful-fs
npm http GET https://registry.npmjs.org/minimatch
npm http GET https://registry.npmjs.org/mkdirp
npm http GET https://registry.npmjs.org/nopt
npm http GET https://registry.npmjs.org/npmlog
npm http GET https://registry.npmjs.org/osenv
npm http GET https://registry.npmjs.org/request
npm http GET https://registry.npmjs.org/rimraf
npm http GET https://registry.npmjs.org/semver
npm http GET https://registry.npmjs.org/which
npm http GET https://registry.npmjs.org/glob
npm http 304 https://registry.npmjs.org/graceful-fs
npm http 304 https://registry.npmjs.org/minimatch
npm http 304 https://registry.npmjs.org/fstream
npm http 304 https://registry.npmjs.org/nopt
npm http 304 https://registry.npmjs.org/npmlog
npm http 304 https://registry.npmjs.org/osenv
npm http 304 https://registry.npmjs.org/request
npm http 200 https://registry.npmjs.org/tar
npm http 304 https://registry.npmjs.org/rimraf
npm http 304 https://registry.npmjs.org/semver
npm http 304 https://registry.npmjs.org/which
npm http 304 https://registry.npmjs.org/glob
npm http 304 https://registry.npmjs.org/mkdirp
npm http GET https://registry.npmjs.org/ansi
npm http GET https://registry.npmjs.org/abbrev
npm http GET https://registry.npmjs.org/lru-cache
npm http GET https://registry.npmjs.org/sigmund
npm http GET https://registry.npmjs.org/inherits
npm http GET https://registry.npmjs.org/inherits
npm http GET https://registry.npmjs.org/inherits
npm http GET https://registry.npmjs.org/block-stream
npm http 304 https://registry.npmjs.org/abbrev
npm http 304 https://registry.npmjs.org/sigmund
npm http 304 https://registry.npmjs.org/lru-cache
npm http 304 https://registry.npmjs.org/ansi
npm http 304 https://registry.npmjs.org/inherits
npm http 304 https://registry.npmjs.org/inherits
npm http 304 https://registry.npmjs.org/block-stream
npm http 304 https://registry.npmjs.org/inherits
node-gyp@0.8.5 node_modules/node-gyp
├── which@1.0.5
├── osenv@0.0.3
├── graceful-fs@1.2.1
├── rimraf@2.1.4
├── semver@1.1.4
├── mkdirp@0.3.5
├── request@2.9.203
├── nopt@2.1.1 (abbrev@1.0.4)
├── fstream@0.1.22 (inherits@1.0.0)
├── minimatch@0.2.12 (sigmund@1.0.0, lru-cache@2.3.0)
├── npmlog@0.0.2 (ansi@0.1.2)
├── tar@0.1.17 (inherits@1.0.0, block-stream@0.0.6)
└── glob@3.2.1 (inherits@1.0.0)


再試 node install.js



/home/hadoop/.node-gyp/0.10.7/deps/uv/include/uv.h:1411:15: error:   initializing argument 4 of ‘int uv_queue_work(uv_loop_t*, uv_work_t*, uv_work_cb, uv_after_work_cb)’ [-fpermissive]
make: *** [Debug/obj.target/gitteh/src/repository.o] Error 1
make: Leaving directory `/home/hadoop/nodejs/myapp/src/node-gitteh/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/home/hadoop/nodejs/myapp/src/node-gitteh/node_modules/node-gyp/lib/build.js:256:23)
gyp ERR! stack     at ChildProcess.EventEmitter.emit (events.js:98:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:789:12)
gyp ERR! System Linux 3.5.0-17-generic
gyp ERR! command "node" "/home/hadoop/nodejs/myapp/src/node-gitteh/node_modules/.bin/node-gyp" "build"
gyp ERR! cwd /home/hadoop/nodejs/myapp/src/node-gitteh
gyp ERR! node -v v0.10.7
gyp ERR! node-gyp -v v0.8.5
gyp ERR! not ok


 


還是失敗。等等,會不會忘了 preinstall?結果沒用…。


於是我就放棄了,試試看 http://www.pygit2.org/

[python]安裝 libgit2, pygit2 on Ubuntu

作業環境:ubuntu 12.10

由於,node-gitteh 實在太難裝了。於是,我換到 pygit2 這裡。

按照 http://www.pygit2.org/install.html 一樣我也遭遇到問題。

例如,要安裝 python-dev 之類的 ( sudo apt-get install python-dev)

最後,我還是安裝成功了。

過程如下:

先下載 libgit2 的 git source,要記得,使用下列指令拿到的才行,不然之後有可能會出現錯誤(註一),據說是 libgit2 v0.18 之後的才不會有問題。

git clone git://github.com/libgit2/libgit2.git -b master

然後,使用 cmake 安裝至系統中

mkdir libgit2/build
cd libgit2/build
cmake ..
cmake --build .
sudo cmake --build . --target install

之後,下載 pygit2,並使用 setup.py 安裝

$ git clone git://github.com/libgit2/pygit2.git
$ cd pygit2
$ python setup.py install
$ python setup.py test

 


註一:錯誤訊息為:error: too many arguments to function ‘git_reference_list’


 


參考連結在此 https://github.com/libgit2/pygit2/issues/233

2013年5月22日 星期三

[gae]很久沒寫 GAE 程式了,很多東西變了

很久沒寫 GAE 程式來,看來這世界有改變。

  1. 現在採用 webapp2 來當 web framework。
  2. 以前的 master / slave 的 data storage 已經要廢除。要改用 High Replication Datastore (HRD)。不過,使用者應該沒什麼感覺。程式幾乎還是一樣。https://developers.google.com/appengine/docs/python/datastore/usingmasterslave
  3. python runtime 支援到 2.7 !
  4. 在旁邊的連結有看到 GAE for PHP !

真的,久沒寫,真的會忘光光…。

突然想到,會不會哪天發現 GAE for Node.js ?

2013年5月21日 星期二

[nodejs]安裝在 ubuntu

使用 nvm 來安裝 node.js 據說是現在推薦的方法。

nvm 是一個善心人士提供的管理工具,用 shell 指令寫的,可以幫忙安裝 node.js。

打開 terminal!

首先,先安裝 git,才能把 nvm 下載回來。一般 ubuntu 可能沒有安裝 git。

sudo apt-get install git

然後,下載 nvm 到使用者目錄去

git clone git://github.com/creationix/nvm.git ~/.nvm

接下來,把 shell 指令,附到 shell 的設定裡

echo ". ~/.nvm/nvm.sh" >> ~/.bashrc

然後重開 terminal 讓指令生效。

先測試一下,現在有什麼版本可以安裝

nvm ls-remote

因為,nvm 使用 curl 抓取資料與檔案,所以,如果沒有安裝 curl,使用下列指令安裝 curl

sudo apt-get install curl

從 nvm ls-remote 指令,可以看到很多版本,現在最新的是 v0.11.2 但是官網頁面上寫 v0.10.7,就安裝 v0.10.7 以策安全。

nvm install v0.10.7

最後,設定 node 預設版本為 v0.10.7

nvm alias default v0.10.7

這樣就安裝完畢了!

之後就可以在 terminal 底下,使用 node 指令。例如,看一下 node 的版本

node -v

如果發生找不到 node 的話,就再用 nvm use v0.10.7 這個指令。

2013年5月16日 星期四

[windows]程式更新機制自動化的考量(3)-各角色工作描述

在 google 的 Omaha 中,主要分成三個部份,也就是三個角色,這三個角色在整個流程的工作大致已經描述過(前文一前文二)。接下來,則是再詳細說明,各個角色的工作項目的內容。

Client

Omaha client 是 windows 應用程式,經由客製化的 windows 安裝程式 安裝至 windows 環境中。Omaha client 有以下的功能:

  • 在所在的主機上,安裝及更新 google 應用程式。
  • 定期與 update server 交談,決定是否有需要做更新。
  • 提供簡單的進度條畫面,可通知使用者,「 omaha client 的初始安裝」已經發生。
  • omaha client 具有提升權限的功能。就算應用程式執行在低權限的等級時,依然可以讓應用程式更新自己。
  • 提供一個程式當機回報機制,讓應用程式使用。

client 可以平行處理多個下載,多個循序的安裝,也可以續傳或重新下載檔案。

client 不是一個獨立的應用程式,所以它不能單獨被移除。它應視為是應用程式的一部份,當最後一個 google 應用程式被移除時,它會自行移除。

為了要回報安裝及更新的報告,omaha 包含了一個通用的程式當機報告的機制給 google 應用程式使用。其中使用了 Breakpad 專案的 network library,而 client,會處理 local minidump 的儲存,報告的佇列動作。

Omaha client 由兩大部份組成:

  • Runtime,處理所有的更新及安裝 service。
  • Web browser control (Active X for IE,NPAPI for others),這允許 google 網頁及 google 應用程式可以要求 runtime 做一些事情。

Client Runtime

Client runtime 擁有下列的功能:

  • 自動啟動,如此才能為所有的應用程式服務。
  • 依需求,提升權限,以執行安裝及自動更新。
  • 自動更新的輪詢(polling)。
  • 從 google download server 下載安裝檔。
  • 執行 google 安裝檔。
  • 一個持久的工作佇列,以達成平行處理可重開始的下載工作及安裝工作。
  • 進度條及狀態畫面的掛勾(hook),UI 程式可以從這知道狀況。
  • 自我解安裝,當最後一個註冊的應用程式被解安裝的時候。
  • 報告安裝成功或失敗。
  • 使用狀況收集
  • google 應用程式的當機報告的回報機制。
  • 認證及驗證安裝檔。

 

執行模型

Runtime 的功能,被分成數個行程 (process)。最明顯的是核心行程及許多的工作者行程 (worker process)。設計成如此有一些理由:強固性、以最小權限執行、儘量以登入者的身份執行 google 安裝檔、避免長生命行程的資源消耗或佔用。

Runtime 核心的執行模型有兩種,端看 Omaha 是如何被安裝的。

  1. Omaha 安裝給整台電腦。這需要使用者有管理者權限。在這個情況下,有一個 Windows service 是使用 SYSTEM 身份執行。它會分配許多工作給工作者行程。在更新整機安裝的應用程式(per-machine applications)時,工作者行程也是用 SYSTEM 身份執行。當工作都結束時,工作者行程會自己關閉。
  2. Omaha 只安裝給現在使用者。這個情況就不會有 service 安裝其中,也沒有更新整機安裝應用程式的時機。所以執行模型只有 goopdate 工作者行程,會在登入使用者的 interactive session 中。

在不同的作業系統(Windows 2000, XP, and Vista)執行的行為要一樣,這一點的要求是非常重要的。同時,核心行程在「整機安裝」、「使用者安裝」的執行模型也幾乎一樣。在大部份情況中,整機安裝與使用者安裝的安裝資訊是隔離的。

有一種情況,Omaha 為了整機安裝,使用 local system 身份執行了一個核心行程,為了使用者安裝,也使用目前登入使用者的身份執行一個核心行程。這種狀況就會執行兩個核心行程。這裡可以有個增加效律的作法,就是以local system 身份執行一個核心行程,然後以需求啟動使用者身份的核心行程。

整機安裝的 Omaha 核心行程,在開機時,以系統服務(system service)呼叫的方式啟動。不把 Omaha 本身作成 service 的理由是:在 Windows XP 有個 bug,如果這 service crash,會讓這個 service 無法更新。在使用者安裝模式,核心行程是用登入使用者的 shell 執行的。這避免了單點失敗,在核心行程沒有執行的情況下(不管任何理由),我們另外使用 Windows system scheduler 來啟動核心行程。我們期望 Omaha 的 available 的時間就跟 Windows OS 的 uptime 一樣長。

Omaha 核心要非常可靠及輕量:

  • 做越少事越好,而且保證做到:安裝工作者行程,完成無聲更新、權限提升,支援 breakpad crashes。
  • 移除對某些 Windows 模組的依頼:不要 msxml,不要 shell,不要 network,不要 UI,不要 crypto,不要 wintrust 等等。
  • 降低資源的消耗
  • 較少的程式碼,且儘量使用 OS 層底層的程式,只求穩固、穩固、穩固。

Omaha 工作者行程則是做大部份的工作:

  • 統一的 IPC 溝通機制是必要的。
  • 工作者行程之間的溝通與同步,保持在最低限度。因為 isolation 與 share-nothing 是設計的概念。
  • 工作者行程,使用新的網路堆疊及新的 CUP ( client update protocol, which uses HMACs over plain HTTP instead of HTTPS)
  • To facilitate firewall traversals, a constant shell is used

 

應用程式註冊

為了讓應用程式收到更新,應用程式必須要在 Omaha 註冊。應用程式註冊機制建立在 windows registry。Omaha 有兩個主要的更新規範,這會影響 Omaha 如何得知應用程式的註冊。

  1. 整機更新 (per-machine updates)
  2. 使用者更新 (per-user udpates)

在整機更新的情況,每一個整機安裝的應用程式會建立一個 key HKLM/Software/Google/Update/Clients/{GUID}。在這個 key 底下,應用程式建立下列的值:

  • pv (現在產品版本,例 1.0.20.0)
  • name (這個值忽略,但 debug 時很好用)

在使用者更新的情況,key 所在的位置是 HKCU/Software/Google/Update/Clients/{GUID}。其他與整機更新相同。

當更新動作開始,Omaha 使用 SYSTEM 身份執行整機更新,使用登入的使用者執行使用者更新。這是假設使用者有一個 active session。也就是說,當使用者沒登入時,使用者更新是不執行的。只要,那些 key 底下有任何東西,Omaha 會不停偵測是否有更新,並執行應用程式的更新。有可能發生一個狀況,應用程式當掉且應用程式的 Omaha 註冊是啟用的,例如,使用者剛殺掉應用程式檔案。 不幸的是,Omaha 不會知道這種情況的發生,它仍會下載程式,執行更新,直到應用程式的註冊被清除。

把註冊的 key 及底層實作細節讓應用程式知道是有缺點的。這會破壞 Omaha 的封裝。有討論認為,目前這種實作細節從應用程式連結的 code library 抽離出來會比較好。然而,現在的註冊機制有個很大的好處,註冊 key 可以容易地從應用程式的安裝腳本(任何現有的 installer 的技術)產生,於是與 Omaha 整合變得容易。

自動啟動

整機安裝時的 Omaha service,是設定成自動執行的。如果 service 當機,會使用 SCM failover 機制重啟 service。當 Omaha 是使用者安裝的方式安裝,goopdate 工作者行程會由 windows shell 從HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 啟動。

排程器

client runtime 要定時執行一些工作,像是發出更新檢查要求給伺服器,確認是否有更新。這工作是分配給排程器。排程器的程式是在 Omaha 核心行程中。排程器的需求是一段時間執行一個工作者行程。

很多建議我們使用 windows 內建的排程器而不要用自己寫的。windows vista 的排程器有很大的改良。但在 XP 及 windows 2003 有一些限制:

  1. 在排程器有個認證上的問題。因為排程器的使用者認證是使用 cache 的認證。如果使用者後來改密碼,排程器之後會認為認證失敗。這在 vista 有修正。
  2. 在 2003 的任務排程器只能允許 administrators 使用。
  3. 如果機器在 sleep state,有些硬體上的任務就不會排入。有些排入的任務會在某些情況下失敗,因為 suspected ACPI interactions。其中一個極端的情況是網路線被拔掉時,機器不會做排程。

資源與時機的條件

runtime 在考量資源消耗及更新時機,有一些條件。

在資源限制上:

  • 確保不會用光使用者的硬碟空間
  • 使用少量的記憶體,延遲載入不需要的模組。(This is very important for resident core)
  • 如果沒有網路連線,就不要執行自動更新(避免撥接用戶自動撥號)
  • 限制背景下載的頻寬
  • 嘗試當使用者機器在 idle 時,更新應用程式

在更新時機上:

  • 至少一天一次的更新檢查
  • 循序的下載及安裝

 

Web Browser Control

Web Browser Control 提供介面給 google web page 及 client application,給予 one-click 網頁安裝及 rich update client as Pack 的特色。這需要限制存取,所以只有認證的 google 網頁及應用程式能存取 client runtime 提供的 service。The interface is defined by very coarse-granularity functions。不使用 "download file X from server Y" 這種方式,而是使用 "download application id X from Google" 這種方式。當 client 有安全漏洞時,這種 interface 的限制可降低傷害。

Crash Reporting

有兩個主要的部份是 crash reporting 在 windows 上要做的,產生 minidump 及回報給伺服器。每個應用程式仍然需要負責捕捉例外及通知 Omaha,以產生及傳送 minidump 給 google 伺服器。minidump 是放在一個安全的目錄,是 Omaha 可以寫入的地方。Omaha 有程式試著降低意外的「自我-阻斷攻擊」(self-DDoS),防範在回報重要資料時過於頻繁的當機,或許是發現重覆的 minidump 產生或一定次數的當機的報告產生時就不回報。

Meta-Installer

The Omaha meta-installer 是一個簡單的 wrapper,包含了 client 及安裝一個或數個 google 應用程式的資訊。它擁有以下的功能:

  • 安裝 client,如果本來沒有安裝
  • 更新 client,如果有更新的 client。
  • 啟動 client,如果本來有安裝,但沒有啟動。
  • 佇列應用程式的安裝要求到 client。

我們的目標是最小化安裝程式,小於 172KB (在現今最慢的 modem  的速度 28.8kbps 的 10 wire bits per data bits,在一分鐘內可下載完畢)。目前的 meta-installer 超過這個大小。我們仍在尋找降低檔案大小的方法。

Server

The google update server 不是 omaha open source project 的一部份。應用程式的更新需要一個實作 Omaha Server Protocol 的伺服器。

Omaha 有兩個伺服器組成,autoupdate 及 download。將伺服器責任的分離,是故意的,因為兩個事情的要求不同。下載檔案需要大頻寬,且可容忍高延遲。更新時的要求則是頻率高且低延遲但頻寬要求低。這兩個的不同,使得 google 採取兩個伺服器來滿足需求。

autoupdate 伺服器提供以下功能:

  • 回應來自不同的 Omaha client 的 update ping,告訴它們,是否有更新及如何更新機器上的一批 client 產品。
  • 提供足夠的 configuration schema,讓不同的產品團隊不用實作自己的伺服器。Client 產品應該可提供任意的旗標,讓伺服器在 update ping 傳送時使用,同時讓伺服器根據旗標的出現或不出現做不同的行為反應。
  • 讓 google 在某群穩定的使用者執行實驗測試。例如,某個團隊希望佈署新版產品到 0.01% 的使用者電腦,為期一星期,在全面佈署前可以確認有無不預期的問題。

download 伺服器主要工作是提供位元檔下載。為了提供非公開 beta 及其他有限制軟體的更新,download 伺服器可以限制某些下載的存取。

Rollout Process

為了最大的可擴展性,團隊可以重新設定 update server 的範圍而不會影響到其他團隊。

 

參考:http://omaha.googlecode.com/svn/wiki/OmahaOverview.html