Pages

Friday, December 25, 2009

vsftpd 日誌(log)不支援中文檔名的解決方式

vsftpd (2.0.4-1.2) 的日誌(vsftpd.log)不支援中文日文等字元(如檔名),會顯示為一串的問號。

網路上找了一下,解決的方式有二:
方法一. 將 log 寫入系統 log
方法二.修改原始碼


方法一比較好處理,缺點是會寫入 message 裡,跟其他 log 混在一起,只要在 vsftpd.conf 裡加入
syslog_enable=YES 即可


方法二要先看一下原始檔,以下節錄網路資料:

日誌記錄檔, file logging.c, line 152 - 171:
static void
vsf_log_do_log_to_file(int fd, struct mystr* p_str)
{
if (!tunable_no_log_lock)
{
int retval = vsf_sysutil_lock_file_write(fd);
if (vsf_sysutil_retval_is_error(retval))
{
return;
}
}
str_replace_unprintable(p_str, '?');
str_append_char(p_str, '\n');
/* Ignore write failure; maybe the disk filled etc. */
(void) str_write_loop(p_str, fd);
if (!tunable_no_log_lock)
{
vsf_sysutil_unlock_file(fd);
}
}



函數用 str_replace_unprintable(p_str, '?') 把所有「無法輸出的字元」替換為問號.

str_replace_unprintable 函數, file str.c, line 656 - 668:
void
str_replace_unprintable(struct mystr* p_str, char new_char)
{
unsigned int i;
for (i=0; i <>len; i++)
{
if (!vsf_sysutil_isprint(p_str->p_buf[i]))
{
p_str->p_buf[i] = new_char;
}
}
}



函數 vsf_sysutil_isprint, file sysutil.c, line 883 - 903:
int
vsf_sysutil_isprint(int the_char)
{
/* From Solar - we know better than some libc's! Don't let any potential
* control chars through
*/
unsigned char uc = (unsigned char) the_char;
if (uc <= 31)
{
return 0;
}
if (uc == 177)
{
return 0;
}
if (uc >= 128 && uc <= 159)
{
return 0;
}
return isprint(the_char);
}



作者注釋 "Don't let any potential control chars through" 表明對「無法輸出的字元」所做的定義

解決的方法就是注釋掉 logging.c 檔中的 static void vsf_log_do_log_to_file(int fd, struct mystr* p_str) 函數中的 str_replace_unprintable(p_str, '?');這一行
個人覺得比較麻煩,且有降低系統的安全的可能性(potential),所以我選「方法一」~

Monday, February 23, 2009

Study Oracle : 使用 PFILE/SPFILE

Oracle 使用兩種型式的檔案來儲存參數: PFILE 或 SPFILE。

PFILE 是使用notepad等編輯器即可修改的純文字檔。PFILE 內儲存的 Oracle的各項啟動參數、記憶體配置、檔案位置等。大部份情況下,PFILE可以在 ORACLE_HOME\database 或 ORACLE_HOME\dbs 裡找到。如果你的 ORACLE_SID 名是 test1,PFILE的檔名應該就是 inittest1.ora。

SPFILE使用二進位格式檔案,因此我們不能直接用vi等文字編輯器來修改它。使用SPFILE的最大好處是,一但我們修改它,它將會被永久保存。這代表即使重啟資料庫,它的內容也不會跑掉。這對於一些自動調整的功能來說相當適合,反之,若不用SPFILE是無法使用自動調整的功能的。同樣的,如果你的 ORACLE_SID 名是 test1,SPFILE的檔名會是 spfiletest1.ora。

備份你的PFILE和SPFILE,其中SPFILE還可以用RMAN備份。要將 SPFILE 轉成 PFILE,可用以下指令:
SQL> create pfile from spfile;

檔案將會用預設的檔名和位置產生,然後你就可以用一般檔案備份方式備份PFILE了。當然你也可以用PFILE來產生SPFILE:
SQL> create pfile=/path/initSID.ora from spfile;

如果你使用 SPFILE來設定你的資料庫,那你得先關閉資料庫才能使用這個指令,否則SPFILE將無法被覆寫。

Oracle 會優先使用 SPFILE再來才是 PFILE,當你啟動資料庫,Oracle是以以下順序來使用設定檔的:
- spfileSID.ora
- spfile.ora
- initSID.ora
- init.ora

其中預設的目錄是 ORACLE_HOME\database 或 ORACLE_HOME\dbs,SID代表 ORACLE_SID,你也可以指定使用這個方式指定PFILE:
SQL> startup
pfile=/path/initSID.ora

如果找不到適合的 PFILE/SPFILE ,資料庫將不會啟動。

Thursday, February 19, 2009

FW:問題Warning: Invalid argument supplied for foreach() in 完善解決方案

FW:問題Warning: Invalid argument supplied for foreach() in
完善解決方案將報錯的語句做如下修改(例):

foreach($extcredits as $id => $credit)
{
if($credit['ratio'])
{
$exchcredits[$id] = $credit;
}
}

改為
if(is_array($extcredits)) //add
{
foreach($extcredits as $id => $credit)
{
if($credit['ratio'])
{
$exchcredits[$id] = $credit; }
}
} //add


foreach((array)$extcredits as $id => $credit)
{
if($credit['ratio'])
{
$exchcredits[$id] = $credit;
}
}


在升級 wpmu 時,執行 upgrade 功能遭遇到的問題,如不處理無法升級資料庫等,會導致後續升級等的問題。但該錯誤不但在前端不會顯現,結束時還會出現升級完成的訊息,實際查看 error_log 則可找出發生錯誤的程式行數。

Wednesday, February 18, 2009

fedora core 5 yum 國內站台

這個網址可以找到國內的站台

http://mirrors.fedoraproject.org/publiclist

CountrySiteHostContentBandwidth (Mbits/sec)I2Comments
TWFedora Mirrorftp.mirror.tw
Fedora Corehttpftp
100No
TWI-Shou Universityftp.isu.edu.tw
Fedora Extrashttpftp
Fedora Corehttpftp
1000Yes
TWFedora Mirroropensource.nchc.org.tw
Fedora Corehttpftp
Fedora Extrashttpftp
100Yes
不過部份連結結進去後,只有一個 Readme 檔,記載資料 archive 後的位址,所以要直接用...還得自已連看看了...