Archive for the '軟體系統' category

Debian Etch to Lenny

ilmare| March 30, 2009 3:22 pm

關於系統升級這件事情,弄得不好,通常就是災難的開始,但是趁著lenny剛release,升級的話相信會比較輕鬆一點。

看著網路上如何升級的的文章,大抵上非常的簡單,就是編寫/etc/apt/sources.list,把出現etch的地方改成lenny。

deb http://ftp.tw.debian.org/debian/ lenny main
deb-src http://ftp.tw.debian.org/debian/ lenny main

deb http://security.debian.org/ lenny/updates main contrib
deb-src http://security.debian.org/ lenny/updates main contrib

接下來就是執行:
apt-get update
apt-get dist-upgrade

但是基本上過程不會這麼順利。
我遇到的第一個問題就是PGP的key不認得。
所以必須先安裝debian-archive-keyring。

接著呢,過程中出現一個錯誤,那就是slapd沒辦法自動升級,還好我的ldap的內容很簡單,因此我就先移除它,然後再安裝。

另一個比較嚴重的問題就是升級完後,用新的kernel開機在遇到lvm具有加密的部份會沒辦法執行,
cryptsetup: failed to setup lvm device
還好重開機後用舊的kernel是可以動作的,在網路上找了一下資料,似乎就是lvm2這個套件沒有安裝確實。
aptitude install lvm2
update-initramfs -u -k VERSION

最後還遇到了saslauthd的設定檔與舊的不相容,套用新的格式即可。

雖然說遇到的大問題不多,但是上面的那個failed to setup lvm device簡直就是快讓我嚇死了,雖然什麼東西都有備份,但要是加密磁區都毀了,搞起來還是很麻煩的。

Subversion through Https with LDAP authentication

ilmare| May 28, 2007 4:04 pm

先前講到了Subversion的建置過程,建置之後便是要正式上線使用,考量到安全性與管理上的問題,加密的連線就顯的必須,而認證系統的一致化也是減少管理的工作之一,綜合考量以上兩者,Subversion搭配https的協定與LDAP的認證顯然可以達成這樣的目的。

我們使用的軟體環境為:

  • Fedora Core 4
  • Apache 2.0.54
  • Subversion 1.2.3
  • OpenLDAP 2.2.29

為了讓Subversion可以透過httpd來存取,必須使用WebDAV這個東西,其rpm套件名稱為mod_dav_svn-1.2.3-2.1,這是用來搭配apache的。若已經安裝過mod_dav_svn,便可以在/etc/httpd/conf.d/目錄下找到subversion.conf這個檔案。若檔案不存在,那麼去檢查是否有安裝mod_dav_svn便可以發現問題所在。

我們必須在subversion.conf加入必須的東西,讓apache知道如何去存取subversion。


   DAV svn
   SVNParentPath /var/repos
   SSLRequireSSL

   AuthType Basic
   AuthName "Authorization for Subversion"
   AuthLDAPURL ldap://localhost:389/ou=People,dc=mytest,dc=com?uid
   Require user user1 user3 user5

  • Location ->存取的網頁位置,以上面的例子,我們可以用 https://localhost/repos/ 作為存取/var/repos的網址
  • SVNParentPath ->設定svn的repository目錄,以之前的例子,我們使用/var/repos
  • SSLRequireSSL ->強制使用https連線
  • 接下來的部分為LDAP authentication的部分:

  • AuthName -> 出現在認證網頁上的文字
  • AuthLDAPURL ->定義使用LDAP搜尋的參數,詳細請看apache的手冊,簡單的來說,上面的例子為使用本機的LDAP伺服器,搜尋BaseDN為ou=People,dc=mytest,dc=com,符合uid有值的所有紀錄。
  • Require user -> 符合AuthLDAPURL所搜尋的紀錄者都成為user,這邊將繼續限制user需為user1或user3或user5才允許進行登入

若以之前的文章為例子,加上本次的設定,我們將需使用https://localhost/repos/Project/calc/trunk 作為check out calc這個project trunk的URL of repository。

若透過網路存取,請把localhost換成適當的hostname即可。

CVSNT轉到Subversion

ilmare| May 25, 2007 4:33 pm

CVSNT算是CVS的另一種增強版,至於啥是CVS,從字面上的意思Concurrent Versions System,應該是可以翻譯成”協同版本系統”。這是共同開發軟體的好用工具,或者是說不可或缺。

Subversion的功能與CVS差不多,但是Subversion算是重新開發的東西,改進了原本CVS一些根本性的問題,主要的改進在branches/tags的處理上,加上很多大的軟體開發計畫都逐漸的改用Subversion,趁著我們還沒有很深入的使用CVSNT之前,就趕緊給他導入Subversion吧。

CVS2SVN就是相當合適的一個工具,他是由發展Subversion的同一個地方出來的,不過事實上他並不支援cvsnt,但是不乏成功的例子,如這邊。所以我還是決定嘗試一下,初步的結果是轉的過去,不過有出現許多的問題,就之後再討論。

綜觀我們的程式,是在win32下使用的視窗環境程式,其實大部分的問題是檔案特性的部分,大家都知道win32的環境,檔案會分成二進位檔與文字檔兩種,在cvsnt中對於二進位檔的處理,我們都有加上kb這個旗標,只是不知道未啥有些檔案轉的過去有些卻轉不過去,在嘗試了好幾天之後終於知道其中的奧妙所在。

首先把我用到的cvs2svn的選項先列出來:(使用的環境為Fedora Core 4 with Python 2.4.3)

  • –dumpfile=PATH 輸出轉好的SVN到指定目錄下的檔案名稱中
  • –use-cvs 若用CVSNT一定要用這個選項
  • –encoding=ENC 指定檔案的編碼,因為檔案中免不了有中文的部分,所以還是指定一下
  • –force-branch=REGEXP 第一次轉的時候出現branch不清楚的狀況,轉不過去,就使用這個選項,記得REGEXP是指出問題的那個branch的名稱,要是出問題的東西太多了,就得使用正規表示法囉
  • –mime-types=FILE 太部分的失敗都出現在二進位檔的格式不對,最後終於使用mime-types來處理所有二進位的檔案,他是使用apache的mime type相容格式,在FC4的/etc/mime.types有一個還頗完整的,但還是需要自行加入一些只有win32才有的二進位檔副檔名
  • –eol-from-mime-type

    For files that don’t have the kb expansion mode but have a known mime type, set the eol-style based on the mime type.

    請記住在轉換cvsnt時,-kb的旗標一點用也沒有,完全從mime type的檔案來,因此這個旗標要用,更重要的是 mime type的檔案種類更是要齊全。

最終所使用的指令如下:

cvs2svn --use-cvs --encoding=UTF-8 --encoding=Big5 \
--mime-types=/etc/mime.types --eol-from-mime-type \
--force-branch=arelease --dumpfile=fooall /var/cvs

接著就需要建立subversion的repository,然後把轉出的dump file匯入subversion的repository中。我選用的repository的layout是類似這樣:

/
calc/
trunk/
tags/
branches/
calendar/
trunk/
tags/
branches/
spreadsheet/
trunk/
tags/
branches/

因此我必須把之前在cvsnt的每個project都轉成獨立的檔案,然後一個一個匯進去。
假設/var/repos是我們放置repository的地方,首先我們先建立初始的repository。
svnadmin create Project
切換到其他的目錄,下載剛建立的repository。

svn co -N https://localhost/repos/Project
cd Project
mkdir fooall
svn add fooall
svn ci -m 'preparing for fooall migration' fooall

然後就可以把剛剛轉好的dump file匯入subversion中。

svnadmin load --parent-dir fooall/ /var/repos/Project < /tmp/fooall

這是因為dump出來的東西會自動區分成trunk,tags,branches這樣的layout,因此我們必須在匯入的時候從fooall這個目錄之後進行,就得使用上述的指令。詳細的可參考Apache的網頁他們也有轉換的經驗。

最後在Client端把剛剛匯入的程式碼check out,作嚴格的測試,若沒有問題那麼其他的project就可以一樣畫葫蘆。

使用rsync進行備分

ilmare| May 4, 2007 11:15 am

備份資料是很重要的事情,因為永遠不知道硬碟什麼時候會壞掉,就算有了SMART(Self-Monitoring Analysis and Reporting Technology)技術,還是不能保證硬碟什麼時候一定壞,至於為何選用rsync?因為需求為可以透過網路,快速且安全。以下是在Fedora的系統運作的。

  • 安裝方法
  • 先透過rpm指令檢查是否已經安裝
    rpm -qa | grep rsync
    若無安裝,直接用yum進行安裝即可
    yum install rsync

  • 規劃rsync server
  • 以下是需要規劃的部分:
    1. 使用那個目錄做為備份的區域
    2. 編輯設定檔

    rsync server的設定檔預設是/etc/rsyncd.conf

    [mypc]
    path = /my_backup
    auth users = mypc_backup
    uid = root
    gid = root
    secrets file = /etc/rsyncd.secrets
    read only = no

    [mypc] -> 預備份的主機名稱,自己看的懂就好
    path -> 在備份主機的那個目錄下放置備份的檔案
    auth users -> 用來認證用的帳號名稱
    secrets file -> 存放認證用的帳號名稱與密碼檔的位置

    密碼檔/etc/rsyncd.secrets的格式如下:

    mypc_backup:my_passwd

    my_passwd需自行更換成自己要的

    權限部分,請讓/etc/rsyncd.conf與/etc/rsyncd.secrets的owner與group都是root。
    檔案權限需為600

    chown root.root /etc/rsyncd.conf /etc/rsyncd.secrets
    chmod 600 /etc/rsyncd.conf /etc/rsyncd.secrets

  • 啟動rsync
  • 在Fedora的套件裡,rsync是由xinetd來管理啟動的,因此啟動設定檔為/etc/xinetd.d/rsync
    service rsync
    {
    disable = no
    socket_type = stream
    wait = no
    user = root
    server = /usr/bin/rsync
    server_args = --daemon
    log_on_failure += USERID
    }

    要注意的地方有兩處,disable = no,這樣才會啟動rsync,
    另外server_args= –daemon,我們要rsync執行於daemon模式下。
    之後請下指令重新啟動xinetd。
    service xinetd restart

  • Client端的設定
  • 在Client端,大致有三個東西要作,設定密碼檔,執行rsync,寫入自動排程。

    首先自訂一個密碼檔,例如叫做/root/rsyncd.secrets
    內容只需放入server那邊設定的密碼即可,如
    my_passwd
    同樣的/root/rsyncd.secrets的權限也需要是600。

    接著就可以使用rsync指令來測試拉,
    rsync -rvlHpogDtS --password-file=/root/rsyncd.secrets
    /backup_dir mypc_backup@server::mypc

    –password-file -> 密碼檔的位置
    /backup_dir -> Client端要備份的目錄
    mypc_backup -> 登入rsync Server的帳號,請與Server設定一致。
    server -> 因為是透過網路,因此這邊要寫可以連上Server的hostname或是簡名(/etc/hosts中有設定的)
    mypc -> 使用Server端的哪一個備份的設定區塊,這邊需與Server端一致
    -rvlHpogDtS -> 設定的flag,解說如下
    r -> 遞迴的進入每個子目錄,表示你所設定備份目錄之下的所有子目錄都會被備份到
    v -> 顯示執行過程的訊息
    l -> 如果檔案是link模式,也一併拷貝link
    H -> 若檔案為hard link,就保持原本的模式
    p -> 保持原本檔案的權限
    o -> 保持原本檔案的擁有者權限
    g -> 保持原本檔案的group群組
    D -> 保持device的屬性 (root only)
    t -> 保持檔案時間的設定
    S -> 有效的處理稀疏的檔案結構

    參考文獻:
    1. OLS3 的備份的方法 3 : 使用 rsync
    2. rsyncd.conf 手冊
    3. rsync指令手冊

    OpenLDAP建置心得

    ilmare| April 26, 2007 4:46 pm

    OpenLDAP是目前我一直在接觸的東西,
    server目前已經有一套可以運作的,但是在少許的軟體的搭配上
    一直有些小問題,例如與Samba的搭配,
    因此透過撰寫這篇文章的過程,徹底的解決一些之前匆促上線,
    而發生的不明原因的狀況。

    本次的Linux選定為Fedora Core 6,
    OepnLDAP的版本為2.3.27-4
    若系統上並沒有安裝OpenLDAP server的檔案,請下
    yum install openldap-servers

  • 編輯/etc/openldap/slapd.conf
  • 此檔案是啟動ldap server最根本的檔案,
    請根基於套件安裝後的初始檔案進行更改。

    schema(綱要)定義了LDAP中objectClass與必要的attribute,
    因此啟動server時,必須引入這些schema。預設引入的有以下這四種。

    include /etc/openldap/schema/core.schema
    include /etc/openldap/schema/cosine.schema
    include /etc/openldap/schema/inetorgperson.schema
    include /etc/openldap/schema/nis.schema

    接下來我們進入資料庫設定的部分,通常我們使用bdb。
    至於suffix代表這個資料庫所負責的root suffix,
    root dn類似unix系統中的root帳號,可以做任何的事而不受限制。

    database bdb
    suffix "dc=mytest,dc=com"
    rootdn "cn=Manager,dc=mytest,dc=com"

    定義root dn的密碼也是很重要的,
    首先用slappasswd指令來產生密碼
    slappasswd -h {SSHA} -s secret
    編碼的方式我們採用SSHA,這是目前建議的編碼方式,
    secret請換成你所要設定的密碼。
    指令執行完之後會出現 {SSHA}jFEq2uiz1S6z3843uMO2p7/Kl/0HW0k4
    所以我們必須在設定檔中加入
    rootpw {SSHA}jFEq2uiz1S6z3843uMO2p7/Kl/0HW0k4
    到此我們便可以完成slapd.conf的編輯,並且儲存它。

  • 啟動LDAP server
  • 在Fedora的系統,只要使用下列的指令即可啟動LDAP server
    service ldap start

  • 加入初始的目錄項目
  • 使用熟悉的編輯軟體來開啟一個檔案,例如init.ldif

    dn: dc=mytest,dc=com
    objectclass: dcObject
    objectclass: organization
    o: mytest
    dc: mytest

    dn: cn=Manager,dc=mytest,dc=com
    objectclass: organizationalRole
    cn: Manager

    使用ldapadd來加入init.ldif到server中

    ldapadd -x -D "cn=Manager,dc=mytest,dc=com" -W -f ./init.ldif

    若加入成功將會出現下列的訊息

    Enter LDAP Password:
    adding new entry "dc=mytest,dc=com"

    adding new entry "cn=Manager,dc=mytest,dc=com"

  • 檢查是否運作正常
  • 使用ldapsearch 來看server的內容

    ldapsearch -x -b 'dc=mytest,dc=com' '(objectclass=*)'

    若運作成功,就會在執行結果中出現之前加入的內容:

    # extended LDIF
    #
    # LDAPv3
    # base with scope subtree
    # filter: (objectclass=*)
    # requesting: ALL
    #

    # mytest.com
    dn: dc=mytest,dc=com
    objectClass: dcObject
    objectClass: organization
    o: mytest
    dc: mytest

    # Manager, mytest.com
    dn: cn=Manager,dc=mytest,dc=com
    objectClass: organizationalRole
    cn: Manager

    # search result
    search: 2
    result: 0 Success

    # numResponses: 3
    # numEntries: 2

    這樣就完成LDAP server的建置初步拉。

    怒了-該死的Hinet

    ilmare| April 12, 2007 4:52 pm

    由於我在家裡用Hinet ADSL配發的固定IP架站,

    一個站,最重要的就是不可以中斷服務阿,

    但是死Hinet,看心情好壞斷我的線,斷線就算了,還不送斷線的訊號讓FreeBSD的ppp知道後自動重新撥號。

    這幾天都是早上斷線,然後晚上我回到家重新連線後,到了早上我出門就又斷線。

    因此我就到網路上找了一些相關的討論,解法就是寫一個script吧,固定時間去check是否斷線,

    #!/bin/sh
    set — `ping -c 5 -t 4 168.95.1.1 | grep loss`
    LOSS=$7
    if [ "$LOSS" = "100%" ]; then
       killall ppp
       sleep 3
       ppp -ddial -quiet -nat hinet
    fi

    這個script主要是說,去ping 168.95.1.1這個ip,這ip是Hinet主DNS的機器位址,因此很難當機吧。如果ping的結果loss是100%的話,那就把ppp這個process砍掉,killall是一個強大的指令呢,接著去重新執行撥號的動作。

    接著就把他寫到crontab 中,每5分鐘去check一次。

    這個script當然不能解決所有的問題,尤其是硬體上的問題,像小烏龜當了之類的。

    Django-我的第一步

    ilmare| 4:21 pm

    Django是啥?其實一開始我也真的不太清楚,我只是猜測他也許可以完成我想要的功能而以。

    在真正下定決心要用Django之前,我是比較早決定使用Python這個語言,早在好幾年前,我已經在使用Python,只不過那時候是跑一些科學計算的軟體,跟現在的使用上有一些差距。比較可惜的是那時候也沒有很專心的去學習這個語言比較基礎的部分,憑藉著自己對C/C++有一些了解,就依樣畫葫蘆。

    決定了使用的語言之後,便著手尋找相關的Web開發的資源,在Vault 13看到了一篇關於Rapid Web App Development,不過致命的是,在此之前,我先選擇了Plone,用了幾天之後,發現若要自行引入自己寫的code,他的限制頗多,因此就草草放棄。接著就選了這個似乎大家比較推薦的Django,引入外部的Python-LDAP似乎也可以work,因此就變成我學習Django與Python的開始。

    軟體資訊系統建置

    ilmare| March 29, 2007 12:12 am

    以我目前的想法,軟體資訊系統不外兩個主要的基本功能,那就是管理(Administration)與驗證(Authentication)。以管理者的角度來看這兩件事情,目標就是”Simple is Best”,做一次不要做兩次。使用同一個使用者資料庫來控管所有的事,就變成了最美好的事情。

    若以一個軟體公司來說,怎們去區別使用者的種類,其實就蠻令人頭痛的,初步我只好先以可以接觸程式碼(code)與否先行分類,接著用是否為公司內部人員或客戶來分類,各種分類的方式不外乎為了達成控管的目的,針對所限制的東西進行控管。

    網頁是一個公司的門面,內部人員也需要一個共同的工作平台,軟體開發需要程式碼控管機制,郵件伺服器,檔案傳輸伺服器,個人電腦登入控管,似乎有太多的東西需要被使用,很難一次寫完。

    回到最根本的一件事,那就是要選用怎樣的方案來存放使用資訊,目前有一個非常不錯的選擇,那就是LDAP (Lightweight Directory Access Protocol ),從字面上看來,就是輕量級目錄存取協定的意思,目前有許多的版本可供選擇,在此我們選擇了開放原始碼的OpenLDAP,我們將從LDAP出發,開始架構我們心目中的理想軟體系統 ^^