2012年2月28日 星期二

利用 uWSGI + nginx 搞定 moinmoin 與 bottle.py

之前用 lighttpd 以 FastCGI 方式架 moinmoin wiki,雖然設定上有點麻煩,但還是可以跑,只是最近在同一個 VM 上玩 bottle,雖然試過用 flup 來啟動,但一直沒有成功,連 flup 作者自己都講他討厭 FastCGI 。

於是就來試試 WSGI 看看,但 lighttpd 對 WSGI 似乎還沒有很完善的支援,乾脆就跳槽到 nginx + uWSGI,試了一下才發現這設定真是簡單到不行,跟當初搞moinmoin 搞到火大的情況完全不同。

不過 Arch Linux 的官方套件庫沒有 uWSGI,必須到 AUR 裡面去找,結果我裝不起來,查資料時意外發現 pypi 裡面有 uWSGI,而且用 virtualenv 裝的起來!只要有裝 gcc 和libxml2,virtualenv 就可以直接編譯 uWSGI 出來用,真是太神奇了!而且 uWSGI 也有支援 virtualenv,只要加上 -H "Venv_dir" 這個選項就能啟用,而 bottle application 也只要在檔案內加上一行


application = bottle.default_app()


就可以跑起來, nginx 設定也很簡單,從官方網站上複製貼上就可以用,moinmoin 的設定更是簡單,只需改一行就OK,只是有些選項搞不太懂意思。

主要由 Running uWSGI behind Nginx 抄來的範例:

# for bottle application
location /bottle {
include uwsgi_params;
uwsgi_param SCRIPT_NAME /bottle;
uwsgi_modifier1 30;
uwsgi_pass localhost:9002;
}


像 SCRIPT_NAME 只有在 wsgiref 和 PEP 333 看到,bottle 開 debug 模式下去看,傳進去的網址跟瀏覽器要求的一樣,只是後端在處理的時候似乎會改變,所以 bottle 會吐錯誤,回報錯誤的網址會改變,不知道能不能設成跟 location 不一樣?

uwsgi_modifier1 就更難找到相關資訊,只知道改另一個數值就跑不起來

目前遇到比較搞不定的是 bottle 原本的 run(reloader=True) 不知道怎麼讓它
重新讀取有修改的檔案,可能要翻一下 bottle 的原始碼看看是怎麼實作的?

Reference:

2011年11月17日 星期四

系統備份 script

紀錄一下半年前的筆記(快沒時間了...Orz)。

之前備份策略是每個禮拜將 /home , /etc , /var 備份到另一顆硬碟上,過兩個禮拜再存到外接硬碟,但有時候會忘記整理,就會碰到備份檔把整顆硬碟空間吃光的情形;現在改成先檢查硬碟空間再備份,如果空間不夠會在 terminal 上顯示訊息,等待十分鐘後再次檢查硬碟空間,如果要在 cron job 啟動 GUI 程式,只要在 cmd 前面加上 export DISPLAY=:0 就行了。

原本想說用 `wall` 或 `talk` 來送訊息,卻發現 rxvt-unicode 收不到廣播訊息,不信邪想翻翻 `walk` 的原始碼看看到底是怎麼寫的,結果發現原始碼內的輸出訊息不大一樣,才發現 Arch Linux 是用 sysinitv 裡面的 `wall` 而不是 util-linux 內的 `wall`,也因此發現有 pkgtools 這個好用的 package,只要下 pkgfile -s CMD 就可以知道是哪個 package 提供的程式。

看了 sysinitv 內的 dowall.c 發現是用 getutent() 來抓目前登入的使用者,但是抓不到 rxvt-unicode 登入的紀錄,還有 xterm +ut 也是抓不到,後來乾脆就直接去掃 /dev/pts/ ,用檔案擁有者來判斷登入者,也很方便, getutent() 測試原始碼如下,編譯完成後只要執行就會列出有抓到登入的使用者。

#include <sys/types.h>
#include <stdio.h>
#include <utmp.h>
#include <unistd.h>

int main(){

int type ,pid;
char *tty,*id, *user, *host;
struct utmp *utmp;
while ((utmp = getutent()) != NULL) {
type = utmp->ut_type;
pid = utmp->ut_pid;
tty = utmp->ut_line;
id = utmp->ut_id;
user = utmp->ut_user;
host = utmp->ut_host;

printf("%d - %d - %s - %s - %s - %s\n",type , pid, tty, id, user, host);
}
}


因為 dcron 有類似 anacron 的功能,所以只要把 script 丟進 /etc/cron.weekly 就會自動執行,這次還用到 logging 這個 module ,非常方便,有了這個 module 就不必自己辛苦刻 log 了 :)


Reference:

2011年10月28日 星期五

關機時一併將 VirtualBox 正常結束

平常開 VirtualBox 都是用

VBoxHeadless --startvm YOUR_VM_NAME --vrde=off


所以有一兩次關機時才想起 VirtualBox 還在背景執行
等於直接拔電源,下次重開就就會看到 Guest OS 開始跑硬碟檢查,現在直接把指令寫到 /etc/rc.local.shutdown 內就不必怕忘記了
因為 vm name 不是系統共用,而是根據使用者設定來找,所以要使用 su USER -c 來執行

#!/bin/bash
#
# /etc/rc.local.shutdown: Local shutdown script.
#

## stop Virtualbox
su YOUR_USER_NAME -c "VBoxManage controlvm YOUR_VM_NAME savestate"

2011年10月4日 星期二

Setup sftp for windows users to download BIG files

過去都是用 samba 在區網中分享檔案,方便,快速,又不必新增使用者(單純讀取不寫入),傳過 4GB 左右的檔案都沒問題。

但是上個月有個大檔 (13GB) 要傳到 Win 7,但是透過 samba 下載不到十分鐘就會跳網路錯誤,接著就從頭開始傳檔,搜尋了一下,似乎是 Windows 的問題,只好在 Linux 上架 sftp , Win 7 使用 WinSCP 來傳,速度至少有 5 MB/s ,偶爾可以衝到 6 MB/s (中間還有經過無線網路),就算斷線還可以續傳,對於傳大型檔案來說是不可或缺的功能,也有 log 可以看,但是有個缺點 — 檔案名稱除了正體中文外,還包含日文或簡體字時,在 WinSCP 上會顯示問號,沒辦法正常顯示。

原本要設 chroot sftp ,結果搞了半天,發現 openssh 對 chroot directory 的限制還挺嚴格的,後來還是決定有需要才開啟帳號,平常把 ssh 關掉比較沒有安全上的顧慮,順便紀錄一下設定過程。

Package:
  • openssh 5.9p1-3
  • WinSCP 4.3.4

sftp user name: sftptest
sftp server ip: 192.168.1.2

------

# Create user account
sudo useradd -m sftptest
sudo passwd sftptest

# Generate ssh key
# WinSCP only accept "rsa" and "dsa" ,not support for "ecdsa" yet (PuTTYgen)
su sftptest
cd /home/sftptest
ssh-keygen -C "$(id -un)@$(uname -n)-$(date --rfc-3339=date)"
cp .ssh/id_rsa.pub .ssh/authorized_keys

# copy .ssh/id_rsa to client machine

# Disable sftp user from login into shell
usermod -s /bin/false sftptest

# Test if able to establish sftp connection from other machine
# also verify user is unable to login from ssh
sftp -i id_rsa_from_sftp_server sftptest@192.168.1.2
ssh sftptest@192.168.1.2 -i id_rsa_from_sftp_server

# Setup Windows client
# WinSCP only accept the ssh-key generated by PuTTYgen
# In PuTTYgen menu, select Conversions -> Import to load id_rsa
# Save private key will create a *.ppk file, use it in WinSCP
# Also set UTF-8 Encoding for Filenames -> On in WinSCP
# for non-ANSCII file names


測試的時候被 sftp 的 chroot directory 搞了很久,錯誤訊息根本不對,最後是跑去看 /var/log/auth.log 才想到問題可能是出在那邊

Error message for chroot directory ownship problem :
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer

這錯誤丟 Google ,大部分的解都是說要設定 TimeOut,進 /var/log/auth.log 一看,才發現問題是出在權限設定上
sshd[12399]: fatal: bad ownership or modes for chroot directory component "/path/of/chroot/directory/"
如果要設定 chroot sftp 路徑上所有目錄的擁有者都必須是 root ,而且其他使用者不能寫入,如果用家目錄 (%h) 當 chroot directory,還必須要注意使用者能夠讀取該目錄,不然 ssh 就會因為讀不到 key 跳 " Permission denied (publickey). " 錯誤,權限至少要 750

ls -l /home
drwxr-x--- 3 root sftptest 4.0K Sep 10 19:08 sftptest


Reference:

2011年9月9日 星期五

設定 chromium 將 ed2k 連結傳給 aMule 下載

DE: Xfce 4.8
chromium:13.0.782.220
aMule:10598-1

Firefox 很簡單就可以設定好 ed2k 連結的處理程式,但是 chromium 沒有類似的設定選項,找了好久都沒發現有簡單的解決方案,倒是看到 chromium issue 裡這個問題一直沒修……

chromium 預設會把 ed2k 連結傳給 xdg-open,而 xdg-open 針對每個桌面環境都有特殊設定,在 Xfce 裡面是直接傳給 exo-open 去處理,但是用不同參數測了快一個小時,exo-open 還是不能將 ed2k 連結傳給 aMule,正當要放棄的時候,看到 VLC wiki 上介紹可以用mimeinfo.cache 來設定預設程式,測試結果還真的可行,覺得前幾個小時真像個傻瓜 XD

設定範例放在 /home/dot.local/share/applications 裡面,如果只是個人設定的話,只要動到 ~/.local/share/applications/ 下的檔案:
  1. 先在 defaults.list 內加上一行 x-scheme-handler/ed2k=chromium-ed2k.desktop
  2. 再新增 chromium-ed2k.desktop,因為 chromium 傳的連結有經過 urlencode,所以要另外用程式來解碼後傳給 aMule,比較重要的是 exec 要用絕對路徑,否則會找不到程式
  3. 在 url_unquote.py 內解碼後再傳給 aMule 就搞定了,目前在 python 2.7 下測試過 OK,幾行程式碼就解決

試了兩三個網站都可以正常運作,但是 VeryCD 會有問題,點連結還是會跳開啟錯誤,最奇怪的是將整個網頁下載到電腦內再點連結就可以正常下載,不知道問題是出在那邊?目前暫時還是先用複製連結貼到 aMule 來解決。



# Update 2011-09-09
一直很好奇 exo-open 是從那個檔案抓設定檔來判斷使用者自訂開啟的程式,翻了 exo-open 的程式碼才發現是利用 exo-helper 傳參數給 exo-open,所以在 ~/.config/xfce4/helpers.rc 跟 ~/.local/share/xfce4/helpers/ 裡面就可以找到相關設定檔,之前看到以為只是說明檔,根本不會想到是藏在這裡面 XD

Reference: