2008-06-18

Alteon 2424 將 Syslog 送到 FreeBSD Syslogd Server HowTo

Alteon 本身有支援 syslog 輸出到外部 syslogd server 的方式(UDP:514),其 syslog 一些設定(訊息等級之類都雷同 Unix-like OS)

整個設定裡最麻煩的在於要讓 syslogd server 把 Alteon 跟 loacl 的訊息區分出來不要混淆,所以會造成一些麻煩事

設定我們就分 Alteon & syslogd server 兩部份來說

  1. Alteon: (參考 Alteon_OS_22.0.2_Command_Reference Page.233)
    • /cfg/sys/syslog
      host 10.0.1.62 #我們走 LAN 送 DATA 就好
      sever 6
      facil 6
      log all ena
      apply
  2. Syslogd Server: (我們以 一台 Lan Server 來當收 log 的 server)
    1. /etc/hosts #這個部份是為了讓我們的 syslog.conf 可以區分用
      10.0.1.1 alteon1.mydomain.com.tw alteon1
      10.0.1.2 alteon2.mydomain.com.tw alteon2
    2. /etc/rc.conf[.local] #rc.conf 設定 syslogd 的啟動參數,若需多個就以空白隔開,語法: ip[/netmask]:port
      syslogd_flags="-a 10.0.1.0/24:514" (註一)
    3. /etc/pf.conf[.local] #pf.conf 加一個 UDP: 514 的 port allow
      udp_private = "{ snmp 514 }" (註二)
    4. syslog.conf #在所有設定的最上面加上以下幾行
      +alteon1 (註三)
      *.* /var/log/alteon1.log
      +alteon2
      *.* /var/log/alteon2.log
      +@
  3. 以上都設定好要重跑 syslogd & pf
    1. /etc/rc.d/syslogd restart
    2. /etc/rc.d/pf restart
解說:
  • 註一:FreeBSD 上 syslogd 預設開機就會啟動,然而預設開機是有加 -s (會讓這台 Server 不能當做 Syslogd server),所以我們要加個 syslogd_flags 讓 syslogd 啟動時換掉啟動參數;若是要 allow 多網段或 IP,在網段或 IP 之間用空白隔開即可,至於 "IP/netmask" 的表示法就不多說;成功啟動後用 ps 去看會看到 syslogd 長的像這個樣子 "/usr/sbin/syslogd -a 10.0.1.0/24:514"
  • 註二:我們在 pf 部份只 allow 了 snmp,而 syslog 是走 UDP 514,所以要開放,有些人沒用 pf 是用 ipfw,也是相對應做一下設定開放 UDP 514
  • syslog.conf 的精華在這,
    • 我們在 /etc/hosts 指定好 server alias 就是為了這部份要用,最一開始有說到 Alteon 丟出來的訊息等級都跟 unix-like OS 雷同,所以不分類的話一定會混雜在一起,要分類的話就得有個明顯的"標的"可以被 syslog.conf 使用
    • 在 man page 裡有提到,
      • +[hostname] 指的是由這個 host 過來的訊息利用以下 block 的方式記錄
      • +@ 指的是 localhost 的訊息利用以下 block 的方式記錄
      • -[hostname] 跟 +[hostname] 反向,也就是除了 [hostname] 以外的都用以下 block 的方式記錄
    • 剩下的可以參考 man syslog.conf
syslog.conf 設定參考:
  • 以下列出收 Log 的 Server 的 syslog.conf 給大家參考
  • # $FreeBSD: src/etc/syslog.conf,v 1.28 2005/03/12 12:31:16 glebius Exp $
    #
    # Spaces ARE valid field separators in this file. However,
    # other *nix-like systems still insist on using tabs as field
    # separators. If you are sharing this file between systems, you
    # may want to use only tabs as field separators here.
    # Consult the syslog.conf(5) manpage.
    +alteon1
    *.* /var/log/alteon1.log
    +alteon2
    *.* /var/log/alteon2.log
    +@ #這裡要讓以下原本的設定都是跟之前一樣,所以指定為以下 block 都是記 localhost

    *.err;kern.warning;auth.notice;mail.crit /dev/console
    *.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
    security.* /var/log/security
    auth.info;authpriv.info /var/log/auth.log
    mail.info /var/log/maillog
    lpr.info /var/log/lpd-errs
    ftp.info /var/log/xferlog
    cron.* /var/log/cron
    *.=debug /var/log/debug.log
    *.emerg *
    # uncomment this to log all writes to /dev/console to /var/log/console.log
    console.info /var/log/console.log
    # uncomment this to enable logging of all log messages to /var/log/all.log
    # touch /var/log/all.log and chmod it to mode 600 before it will work
    #*.* /var/log/all.log
    # uncomment this to enable logging to a remote loghost named loghost
    #*.* @loghost
    # uncomment these if you're running inn
    # news.crit /var/log/news/news.crit
    # news.err /var/log/news/news.err
    # news.notice /var/log/news/news.notice
    !startslip
    *.* /var/log/slip.log
    !ppp
    *.* /var/log/ppp.log
參考資料:
  1. 【FreeBSD】用 FreeBSD 建置集中式 Syslog Server
  2. Unix 系統管理手冊-第十一章 Syslog 和記錄檔
  3. Alteon_OS_22.0.2_Command_Reference P.233

2008-06-14

Google Developer Day 2008

早上剛去 Google Developer Day,趁著記憶尤新大概註記一下

我參加的部份是 App Engine & Android 兩個部份,底下大概描述一下今天的重點

  • App Enginel:
    1. 簡單來說,就是 Google 發展了一個 App Engine 的開放平台,
    2. 使用者可以透過它們提供的 SDK 將本機開發好的 Phyton (未來也會支援別的程式語言)Upload 到 App Engine,
    3. 可以透過 Google 註冊自己的 domain(或用自己現有的 Domain,也就是讓 Google Host 使用者的 Web Application;
    4. 使用者當然可以透過 Google 提供的管理介面檢視自己的程式吃了多少 resource (Like cpu/ram/data store...) & PV(PageView),
    5. 管理介面提供類似 Apache style 的 log 供使用者檢視,
    6. 提供版本管理可線上做版本更換或 rollback 等
    7. 提供 Database Model,但是其實後端是以 Object-Oriented 方式實作(其實也就是 Hash,Google 稱之為 Big Table)
    8. Database Model 支援 SQL command,但是由於是 Hash 方式操作,所以建議改以各種技巧實作 Hash Key,直接存取以求最高效能
    9. 在以下條件之下可以免費使用;資料儲存量 500M / 2G Band width per day / 500M PV per month,要使用更大量就要付錢了
    10. 願意的話,其實個人用戶甚至一般公司行號直接在上面建置自己的網站都不是問題,只是說目前只支援 Phyton
  • Android:
    1. 主要講解這個平台的架構(architecture)
    2. 現場有 Demo 一些參加 Android 程式設計比賽的實作結果( On Emulator)
    3. 整個架構中以 Linux 為其 Core,Libraries & Application 皆以 Java 實作(包括要自己開發的功能皆是)
    4. 目前已釋出 SDK for Programmer 開發
    5. 其核心角色是 Google 為其編寫的 Dalvik VM,透過它將 Java 轉成專用 byte code(.jre to .dex)增加其效能,預定於產品上市後其 VM 也將 Open source
    6. 今天現場沒有實機展示,根據瞭解預計今年年底會推出產品
以上大概是我今天的印象,有三場都是英文演講,現場也有提供同步口譯機可以借用,不過我大部份都是聽原文,偶爾遇到比較轉不過來時才開口譯機;畢竟程式語言是工程師共通語言阿,大概抓住關鍵字加上又是自己常摸的領域,就可以瞭解主講人要表示什麼了,至於其他場次除了實作部份沒有錄影外,從開場到最後都有錄影,相關投影片也都可以從這裡取得

今天的報名人數據了解大概是 2000 多人,不過應該有蠻多人沒到的,現場提供了無限制的餅干點心跟可樂、咖啡、紅茶、果汁等,隨時餓了渴了饞了都可以去嗑,中午還一人發了一個不錯的便當哩,另外不免俗的會後有提供 T-shirt,不過我本來以為是工作人員那件白底Google字樣的,結果是這次 Developer Day 主題灰底跟四個主角的 icon (App Engine / Gears / Android / Maps )

總之...還蠻 High的,下次有機會可以再報名呀 XDDDD

2008-06-11

寫程式掃HDD檔案的一點小技巧

最近要處理一個程式,簡單來說就是要去新的 RAID 裡把檔案一個個翻出來跟舊的 RAID 比對看檔案大小跟日期修改等資訊(轉檔出問題要重轉)

原本還想說用 PHP opendir 去開一個 resource 來一層層掃,後來經高人(我們家老大)指點突然想通了

unix find 指令是個好幫手

因為我要掃整個 RAID,而且這是個好幾十G的資料量,一層層掃是跟自己過不去,於是我先做了下列的事;

  • 切換到要掃的資料夾那層
  • 下指令 #find . > ~/file_list.idx
簡單來說就是用 find 把從要掃的那層資料夾開始,整個檔案樹狀結構都先 output 出來成為一個 file list,這樣 PHP 只要直接去 fopen 那個 file list,然後透過變數串接加上像是 filesize() / filemtime() 等 PHP function 就可以輕鬆得到所需的效果,省時又方便(程式又簡單)

所以要靈活運用 UNIX 指令來幹噁心的事呀 XDDDD

MySQL 權限問題的雷

MySQL 的權限判斷我想大家應該都有概念, 稍微提一下:

  1. 判斷 mysql.user(也是控制 ID/PW, 另外一些系統操作權限也在這理, 還有相關權限設定後就可以控制整個 mysql 的所有DB...)
  2. 判斷 mysql.db, 這裡可以控制哪個 host -> db -> user(判斷順序) 可以有哪些權限
  3. 判斷 mysql.host, 大多搭配 2. 使(我目前沒用到)
  4. 判斷 mysql.table_priv, 再細一步劃分哪個 host -> user -> table 可以做什麼操作
  5. mysql.column_priv, (我目前沒用到)
其實這次的雷簡單來說就是兩個點
  1. MySQL 權限判斷的順序
  2. 排序比對應先判斷最特定值,最後判斷不特定值(但是我測試出來結果似乎不是這樣)
可以確定的就是"在判斷權限時,前面如果有比對的到的資料就會直接忽略後面的權限設定"

但是我很不解的地方在於,Document 說會先根據最"實體", 再根據最不實體, 所以理論上像是 192.168.1.1 應該比 192.168.1.0/255.255.255.0 實體, 但事實上似乎不是

我先節錄一些參考資料(MySQL doc)給大家看看:

db和host表在伺服器啟動時被讀取和排序(同時它讀user表)。db表在Host、Db和User範圍字段上排序,並且host表在Host和Db 範圍字段上排序。對於user表,排序首先放置最特定的值然後最後最不特定的值,並且當伺服器尋找匹配入條目時,它使用它找到的第一個匹配。

user 、db 及 host 資料表在伺服器啟動時就會被讀入及排序
User資料表依Host、User 排序
db 資料表依 Host、Db及 User 排序
host 資料表會依 Host 及 Db 排序

dbhost表授予數據庫特定的權限。在這 些表中的範圍列的值可以採用以下方式:

  • 通配符字符%_可 用於兩個表的HostDb列。它們與用LIKE操作符執行的模式匹配 操作具有相同的含義。如果授權時你想使用某個字符,必須使用反斜現引用。例如,要想在數據庫名中包括下劃線(_), 在GRANT語句中用\_來指定
  • db表的'%'Host值意味著「任 何主機」,在db表中空Host值意味著「對進一步的信息諮詢host表」 (本節後面將描述的一個過程)。
  • host表的'%'或空Host值 意味著「任何主機」。
  • 在兩個表中的'%'或空Db值意味著 「任何數據庫」。
  • 在兩個表中的空User值 匹配匿名用戶。

dbhost表在服務器啟動時被讀取並排序(同 時它讀user)db表在HostDbUser範 圍列上排序,並且host表在HostDb範圍列上排序。對於user表, 首先根據最具體的值最後根據最不具體的值排序,並且當服務器尋找匹配條目時,它使用它找到的第一匹配。

參考網站如下:
(中文)
http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#request-access
http://www.sy3es.tnc.edu.tw/teaching/php_mysql/mysql.htm

底下可能有點混亂,是我測試的例子:

假設原本的 mysql.db 內容如下(cvs type):

"192.168.1.100";"my_db";"my_account";"Y";"Y";"Y";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"192.168.2.100";"my_db";"my_account";"Y";"Y";"Y";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"192.168.1.0/255.255.255.0";"my_db";"my_account";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"192.168.2.0/255.255.255.0";"my_db";"my_account";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"192.168.3.0/255.255.255.0";"my_db";"my_account";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"192.168.4.0/255.255.255.0";"my_db";"my_account";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"

前面兩個 IP 是 指定 Server 的 IP, 後面是我們針對我們各個 ISP 的網段(也就是自家機器都至少開給 SELECT table 的權限)

當我新增兩筆資料在 mysql.db 後, 它的資料排序會像底下的樣子

"168.95.1.100";"my_db";"my_account";"Y";"Y";"Y";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"168.95.2.100";"my_db";"my_account";"Y";"Y";"Y";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"168.95.3.100";"my_db";"my_account";"Y";"Y";"Y";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"168.95.1.0/255.255.255.0";"my_db";"my_account";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"168.95.2.0/255.255.255.0";"my_db";"my_account";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"168.95.3.0/255.255.255.0";"my_db";"my_account";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"168.95.4.0/255.255.255.0";"my_db";"my_account";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"168.95.4.100";"my_db";"myaccount";"Y";"Y";"Y";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"

一切看起來都正確, 然後下指令更新 DB: Flush PRIVILEGES

問題來了, 在 168.95.4.100 上就會出現
mysql> UPDATE your_table SET seq='10' WHERE id=6;
ERROR 1142 (42000): UPDATE command denied to user 'my_account'@'168.95.4.100' for table 'your_table'

這個問題我嘗試了一整天,懷疑該不會是真的有順序問題, 然後請小白幫我看,小白研究一下將168.95.1.100直接 update 成 168.95.4.100那筆, 然後再新增一筆168.95.1.100的權限資料,
結果 168.95.4.100就可以 update, 但是後來再加的168.95.1.100變成 不能 update table 了!!

後來用同樣的手法再把 168.95.1.100 改回去, 讓它恢復正常, 於是確定了的確會有順序判比對上的問題, 接著就以手動加一筆改一筆的方式讓 mysql.db 變成底下的排序

"168.95.1.100";"my_db";"my_account";"Y";"Y";"Y";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"168.95.2.100";"my_db";"my_account";"Y";"Y";"Y";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"168.95.3.100";"my_db";"my_account";"Y";"Y";"Y";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"168.95.4.100";"my_db";"myaccount";"Y";"Y";"Y";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"168.95.1.0/255.255.255.0";"my_db";"my_account";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"168.95.2.0/255.255.255.0";"my_db";"my_account";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"168.95.3.0/255.255.255.0";"my_db";"my_account";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"
"168.95.4.0/255.255.255.0";"my_db";"my_account";"Y";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N";"N"

目前兩邊都可以正常 update,

這個排序目前沒摸透的就是它的邏輯,似乎是 insert 時就決定好的(通常會在最後面,但是也有發現不會到最後面的, 像168.95.3.100那筆就會跑到前面,168.95.4.100就一直在最後,不管砍掉重現幾次都一樣)

感動36紀元最新回報

其實也沒什麼大事

活動持續進行中,當然已經有人亂了規則;一天兩張或兩三天才一張的,真是有夠...

"活動官網"持續都會更新每一天的拍照"記錄",等之後照片洗出來後再補圖囉~

在 FreeBSD 掛載 WINDOWS 網路磁碟機

最近剛好工作上有這個需求,所以稍微的研究一下

在 FreeBSD 上掛載 Windows 的網路磁碟機跟一般 NFS 最大的差異在於需加上"網芳名稱(NetBIOS Name)",也就是所謂的"電腦名稱",指令用法參考如下:

  1. 不需帳號、密碼:
    • #mount_smbfs -I [ip_address] -N '//[sharehost]/[source_dir]' /[mount_point] #-I 為指定 Host IP,-N 為指定不需密碼驗證
  2. 需帳號、密碼:
    • #mount_smbfs -I [ip_address] '//username][@[sharehost]/[source_dir]' /[mount_point] #執行後會請您輸入密碼
  3. 修改掛載後目錄的權限:
    • #mount_smbfs -f 664 -d 755 '//[username]@[sharehost]/[source_dir]' /[mount_point] #-f 為指定檔案權限,-d 為指定目錄權限
執行成功後用 df 觀察會看到如下的掛載資訊:
  • //ROOT@REG/my_raid 6347602544 5476972928 870629616 86% /raid3/share
其中ROOT應該是預設的username,REG則是那台XP的電腦名稱

目前根據查到的參考資料對中文命名的資料夾會有問題,另外我遇到的另一個問是"電腦名稱"太長(像是剛灌好 WindowsXP 後預設給的那串落落長的)也會有問題,所以相對的用中文做電腦名稱應該也是會出問題的。

以上參考資料來源請點這裡