煙流模式地形前處理-AERMAP之遠端執行

Table of contents

背景

遠端執行

  • 遠端執行顧名思義就是不是在使用者(客戶端)的電腦執行,而是透過網路、在遠端工作站執行作業,給予簡單的設定及要求,啟動遠端程式,執行完畢再將結果檔案下載至使用者電腦。
  • 遠端執行的好處及必要性
    • 同時具有SaaS(Software as a Service)的好處,避免程式的散佈版權
    • 避免使用者更動設定造成程式執行的錯誤、或不一致
    • 減省使用者電腦資源的耗費
    • 適合公眾領域程式之推廣應用
  • 此處遠端執行有別於一般小規模計算
    • 使用客戶端瀏覽器執行的java程式、顯示軟體
    • 轉檔服務、翻譯、
  • 更多討論詳見網頁計算服務軟體系統的建置,此處專注AERMAP之部分。

地形前處理自動執行遭遇的問題

主要的問題

  1. 發生在網頁使用者的身份,與平常一般用ssh登入的使用者,二者在環境的設定上有著很大的差異,
    • 造成可以登入執行流程,卻不能由cgi_python操縱流程。
    • 理論上cgi_python是由root之分身www(Mac是_www),其權限能力是很高的,但是實際執行時環境變數仍然不能自動設定,執行外部其他程式時會發生錯誤。
  2. cgi_python的standard output or error (stdout, stderr)
    • cgi_python所有產生的standard output,都會是html的內容,因此,
    • 如果呼叫os中的其他程式如果有輸出,也將會干擾正常的html功能,發生AH02429誤錯(contains invalid characters)
    • 解決方案就是將所有stdout/err都導向檔案、或者是/dev/null,讓html保持乾淨。
  • 由於本系統的外部批次檔內容較為複雜,此一經驗將可以作為未來發展的重要參考。

成果

terr_html.png
煙流模式地形前處理之網頁計算服務系統畫面
  • iscParser雷同,但多出結果表格之說明

客戶身份的問題與解決

定義

  • 客戶:經由網頁來讀取網頁、(由www或_www代為)執行工作站程式者
  • 一般使用者:可以登入工作站的作業人員
  • 管理者:root

方案一:以絕對路徑執行程式

  • 適用在較單純的程式,相依性較低的批次檔
  • 除了在shell之指令以外,所有的程式(包括在/usr/bin、/usr/local/bin等等),客戶都是沒有辦法透過網頁來使用的。
    • 可以用which 指令來確認程式位置
    • terrain.py中之範例
...
    32  geninp='/opt/local/bin/gen_inp.py' 
    33  aermap='/opt/local/bin/aermap'
...
    36  cmd+='/usr/bin/zip '+fname+' *out *OUT aermap.inp>&/dev/null;'

方案二:每次宣告路徑之環境變數($PATH)

  • 每次跳到os都宣告環境變數真的很不方便,因此不是常態,只在程式是個批次檔,會呼叫同系列的其他程式,其絕對路徑無從指定。
  • 或程式的相依性很高,除了其他程式外,還包括了其他必要數據檔之路徑
  • 在gen_inp.py中的範例:
    • eio是個python檔,不是包裝好的執行檔
    • eio還會呼叫gdal_translate
    • 系列程式都需要搜尋地理座標系統定義檔,路徑由環境變數GDAL_DATA指定
    • gd_data同時定義PATH及GDAL_DATA等2個環境變數
$ cat -n /opt/local/bin/gen_inp.py|grep '/'
...
   183  pth1='/opt/anaconda3/bin/' 
   184  pth2='/opt/anaconda3/envs/ncl_stable/bin/' 
   186  gd_data=';export PATH='+pth1+':'+pth2+':$PATH;GDAL_DATA=/opt/anaconda3/envs/py37/share/gdal '
...
  • 組合結果
    • 每次都要執行gd_data內容
    • 因為有PATH,因此執行程式不必再另加絕對路徑了。
  185  eio='eio'
...
   187  cmd='cd '+dir+gd_data+eio+' --cache_dir '+tmp+' clip -o '+TIF+' --bounds '+smin+NUL 
   188  os.system('echo "'+cmd+'"'+NUL) 
   189  os.system(cmd) 
   190  os.system('echo "before gdal"'+NUL) 
   191  gd='gdal_translate' 
   192  cmd='cd '+dir+gd_data+gd+' -of USGSDEM -ot Float32 -projwin '+llNE+' '+TIF+' '+DEM+NUL 
   193  os.system('echo "'+cmd+'"'+NUL) 
   194  os.system(cmd)

gdal暫存檔儲存與取用的議題

  • 這個問題是增進gdal效率過程中所引起的,嚴格講不是問題,但也是因應客戶身份所必須的特殊處理方式。
  • 一般使用者eio數據暫存位置內設是在/Users/NAME/Library/Caches/elevation,是在個人家目錄(/Users/NAME/)下的次目錄,
    • 因此如果好幾個人下載同一區數據時,系統將會儲存好幾份相同的數據,
    • 因個人目錄別人是無法分享的,形成資源的浪費。
  • 管理者(www,_www亦同)eio暫存位置內設是在/var/root/Library/Caches/elevation,更是深不見底,一般使用者是絕對用不到。
  • 折衷方案用eio的option cache_dir,將暫存目錄放在/tmp/gdal下,如此客戶、管理者、一般使用者就都可以用得到了。
$ cat -n /opt/local/bin/gen_inp.py
...
13  tmp='/tmp/gdal
...
   187  cmd='cd '+dir+gd_data+eio+' --cache_dir '+tmp+' clip -o '+TIF+' --bounds '+smin+NUL 
   188  os.system('echo "'+cmd+'"'+NUL) 
   189  os.system(cmd)

標準輸出(stdout, stderr)干擾之解決

  • cgi_python的輸出將轉成(暫存的)html來讓客戶瀏覽,因此執行過去若有stdout/stderr,將會造成html的錯誤。
  • 最典型的錯誤訊息(AH02429):
[Fri Jan 29 08:48:08.954271 2021] [http:error] [pid 83793] [client 114.45.83.32:46685] AH02429: Response header name '  adding' contains invalid characters, aborting request
  • 網路上討論不多,只有提供cgitb記錄錯誤訊息的方式,間接解決這個問題。
cgitb.enable(display=1, logdir='/tmp/isc', context=5, format="html")
  • 事實上,解決方式很單純,就是將所有呼叫到的程式、執行檔、批次檔等,所有的輸出都必須導向檔案或/dev/null,保持cgi_python std out/err只有html部分訊息,此一問題就可迎刃而解。
  • 容易被忽略的是zip,zip也會有stdout,也必須有所導引,範例中導引到/dev/null(line 45)
$ cat -n terrain.py|grep \>
    20    os.system('echo "'+reg+' not in STR!">> '+out) 
    35  cmd+='sed s/test/'+snamo+'/g aermap.inp_template>aermap.inp;' 
    38  cmd+= geninp+' '+web+'trj_results/'+snamo+' '+inp+'>>geninp.out;' 
    42  cmd+= aermap+'>> '+out+';' 
    45  cmd+='/usr/bin/zip '+fname+' '+snamo+'.* *out *OUT aermap.inp>&/dev/null;'
  • 呼叫gen_inp.py時,程式用NUL來簡化。eio、gdal_translate等程式都會有stdout輸出,也必須有所導引,範例為導引到geninp.out檔案。
$ cat -n $(which gen_inp.py)|grep NUL
   181  TIF,DEM,NUL=fname+'.tiff',last+'.dem',' >>'+dir+'geninp.out' 
   182  os.system('echo "before eio"'+NUL) 
   187  cmd='cd '+dir+gd_data+eio+' --cache_dir '+tmp+' clip -o '+TIF+' --bounds '+smin+NUL 
   188  os.system('echo "'+cmd+'"'+NUL) 
   190  os.system('echo "before gdal"'+NUL) 
   192  cmd='cd '+dir+gd_data+gd+' -of USGSDEM -ot Float32 -projwin '+llNE+' '+TIF+' '+DEM+NUL 
   193  os.system('echo "'+cmd+'"'+NUL)

程式下載

terrain.py

terrainTXT.py

  • 類似獨立執行之控制程式。

,程式說明詳執行控制程式

terrainXYINC.py

terrainLOCAT.py

Reference

  1. 煙流模式的地形處理,提供ISCST3/AERMOD等煙流模式所需地型數據之前處理。