2012年5月6日 星期日

這兩天 system upgrade 碰到有關 xfce 的問題

最近 pacman -Syu 後重開機碰到兩個問題

  1.  xfce 的 panel 位置跑掉,所有的 items 擠在左邊
  2. 點 panel 上的 Action Buttons 只能 logout 不能關機
幸好搜尋一下就找到解法,但是出這種問題實在很讓人灰心,不知道是 Arch Linux 這邊的打包者還是 xfce 自己的問題?
  1. 在 Panel 上新增一個 Separator, 勾選 expand,就可以達到向右靠齊的效果


  2. 在 Action Buttons 上點右鍵,進入 Properties,把預設勾選的「Log out」改成勾選「Log out...」,注意是 "...",這樣才可以選擇要 Shtudown 或是 Logout


Reference:

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: