天天看點

Linux系統小型日程表挑戰大型群件

群件很強大也很重要。如果需要,可以購買一個群件系統。或者可能是一個叢集 —— 有一個使用了 RAID 的專用的資料庫伺服器,以及錄音帶備份的保證,還有單獨的機器來運作界面。為什麼?當然是因為它更可靠,而且可以根據負載擴充!

不過,您可能不會處理非常多的排程任務,以至于需要使用消耗大量記憶體的應用程式。可能隻是需要某種基于 Web 的日程表界面,以及核查需要做的項目的能力。

可能并不需要 30 兆位元組大小的類庫、由一組本體專家(ontologists)來設計對象模型,或者依賴 15 個其他軟體包。這裡是我的目标:盡可能隻使用系統附帶的功能來運作那些應用程式。

業務的第一個步驟

首先,需要確定老機器可以運作某個 Web 伺服器和某些 CGI 腳本。友善的是,我們的機器已經擁有了一個 Web 伺服器,其根位于 /var/www/htdocs.檢查配置檔案(/etc/apache/httpd.conf),可以發現預設把 ExecCGI 和 Includes 都關閉了 —— 不過我想把它們打開,讓我的 Web 頁面華麗而生動。

之後的 Options 那一行是相關的設定。我添加了 ExecCGI 和 Includes 選項。如果沒有伺服器端解析的檔案的支援,Includes 不會做什麼事情;在 httpd.conf 中有一些注釋掉的行将完成此任務。我去掉了這三行的注釋(但仍讓那些真正的注釋保持被注釋):

完成後,執行 apachectl restart,讓 Apache 重新加載其配置檔案。為節約以 root 身份登入的時間,可以将 /var/www/htdocs 的所有者設定為您的個人帳号。我這樣做了,而且還删除了線上手冊和預設的索引頁。

在計算機科學中有一句諺語,“百分之十的工作可以解決百分之九十的問題”。就此想法,我為這個應用程式制作了一個首頁草稿,囊括了這個程式預期的主要工作:

現在隻需要測試 CGI 處理。我的測試叫做 env.cgi,并不大,但是很實用:

您會注意到,我實際上并沒有使用 CGI 子產品;之是以引用它,是為了確定它已經安裝。将它放在适當的位置,我可以确認 CGI 腳本正在運作。我将機器在網絡上命名為“crate”,是以,對 http://crate/env.cgi 的通路結果如我所想:

那非常有利于調試 —— 它發現我那部分有一個錯誤。我忘記去修改 httpd.conf 中的 ServerAdmin 行了。很容易修改。您的使用者名不存在。請走開。

安全性是早期出現的問題之一。您不會希望讓所有人都可以留下關于午餐所有者的危險記錄。進入通路控制。

這需要對 httpd.conf 進行更多修改,允許 .htaccess 檔案限制對站點的通路。那表示要向允許通路清單中添加“Limit AuthConfig”,覆寫頂層配置檔案。

接下來需要一個 .htaccess 檔案。從這裡開始:

htpasswd 檔案并不是以普通形式存在于文檔樹中。那樣做是有目的的;不能為攻擊者創造有利條件。可以使用 htpasswd 指令初始化 htpasswd 檔案:

-c 選項讓 htpasswd 建立一個新檔案。當建立另外的使用者時不要使用它;否則,隻有最新的使用者才能夠登入。完成後,嘗試通路頁面将會要求輸入密碼。給出使用者名和密碼,然後就能進入了。 $REMOTE_USER 将被設定為使用者名,以使得腳本可以知道誰在使用它們。

我不喜歡漫長的告别

于是,您可以登入進入。不能登入出去 —— 出于未知的原因,多數浏覽器通常不允許重新整理所請求的使用者名/密碼組合的記憶體。可以重新整理 cookies,可以重新整理緩存 —— 但是浏覽器可能仍然認為它知道您要做什麼。

是以,如果登入到公用的計算機,那麼在離開之前一定要關閉整個浏覽器。否則,人們可能碰巧會看到您的家務雜事清單,而不是他們自己的,這樣就會出笑話了。如果這确實是個問題,那麼可使用 cookies.

盡管如此,這使得系統允許使用者使用他們自己的使用者名登入,對于讓使用者添加記錄來說就足夠了。隻要有添加記錄的途徑!

室友記錄

實作此目标的基本概念很簡單:公開地張貼有時間标記的消息,使用者可以讀取。 Berkeley msgs 工具剛好是所需的複雜程度(也就是說,幾乎根本就不難)。每個檔案将包含一個名稱、一個時間标記以及一些文本。系統将向使用者顯示特定時間段的消息,或者将使用者最後一次通路之後張貼的消息顯示給他們。

要讀取的消息的數目應該暫時不重要,是以我将使用最簡單的所有檔案格式:目錄中的全部檔案,每個檔案中,第一行是一個時間标記和一個使用者名,然後是一些文本。這甚至不需要為檔案準備資料庫;檔案系統的靈活性就足夠了。(您可能會問我為什麼不直接使用檔案系統中的時間标記;答案是我并不相信它,因為粗心的使用者會破壞它。我的很多目錄中所有的檔案都擁有相同的時間标記。)我确實需要某種類型的資料庫,用于使用者以及他們的最近的時間标記,是以每個使用者都将擁有一個資料檔案,現在其中包含有一個時間标記。

整個項目很小,隻使用一個 CGI 腳本就可以借助 Perl 的标準 CGI 子產品來實作。目标是折衷所需附加代碼(盡可能少)以及所需開發時間(盡可能短)。在本例中,系統所附帶的功能是足夠的。

/var/www/msgs 是一個新目錄,用于儲存消息(以數字命名的檔案)和使用者記錄(使用 .htaccess 檔案中給出的使用者名作為檔案名)。CGI 腳本會識别自身,執行被請求的動作,并展現出相當簡單的界面;它所需要的隻是一些按鈕和一個文本區域。 為了表示尊敬,這個腳本命名為 msgs.cgi.

開發過程中涉及了一些設計方面的考慮。

甚至不需要去解析日期,因為在大部分情況下可以簡單地讓使用者使用按鈕(最近 24 小時、上一周、自上一次通路,以及所有消息)。

以數字為名稱的檔案可以簡單地由内置的 glob 來識别,它能夠友善地整理檔案。不過,如果數字的位數發生了變化,整理就會發生錯誤,是以要給出前導的零。腳本并沒有精心地去分辨主題,而隻是為每條消息的第一行使用了 H3 标簽。程式假定輸入消息的全部 HTML 都是沒有惡意的。如果室友沒有足夠的幽默感,那麼使用者在寫入時應該仔細檢查。

這個腳本非常短小,隻有 2K 多一點。不過,它也有潛在的開銷,因為 CGI 庫實際上很大。但是相對于更大的系統,它還是非常小的,而且它提供了一個适當的途徑讓使用者張貼消息并讓其他人友善地進行檢視。

誰知道 Sam 去哪兒了?

偶爾室友的問題會是他們到底去哪裡了。我并不是要讨論,當要付房租或者分擔公共費用時,某些人卻不得不離開房間 —— 而隻是說某個人,比如一個朋友,打電話過來問“您知道他在哪兒嗎?”或者“您知道他什麼時候回來嗎?”

要說有什麼不同之處,那麼就是這個腳本更短小,寫起來更簡單。遵循相同的基本方法:隻需要建立名字為使用者名的檔案,其中包含有時間标記、可能要離開多少小時以及簡短描述。然後,每找到這樣一個檔案,列印一個簡要描述。

“I'm back!”按鈕會删除那個檔案,因為可能人們并不需要知道您曾經 在哪兒(如果有意外,這有助于證明您不是幫兇)。與之相對照,能知道某人曾經要去哪裡是 有用的,是以檔案不會因為變成老檔案而被删掉。

我覺得一個好的、簡單的群組日程安排軟體非常類似于 Harry Potter 叢書中 Weasley 的起房間裡的那個時鐘。它有九個黃金指針,每個上面刻有一個家庭成員的名字。邊緣上沒有數字,而是标記為位置和狀态 —— 家、工作、學校、旅行、走失、緻命危險,等等。(還有一個廚房時鐘,它有一個指針以及“time for this”和“you're late”标記。)

日程計劃任務

所需要的最後一件事情是日程計劃。我們如何處理家務事的正常提示?輪到誰來洗衣服?輪到誰來涮碗?不需費力就可以定期地安排這些任務。

處理垃圾可能對每個人來說都是瑣碎的工作,但是我們所需要的隻是張貼公開提示的某種方法。現在您應該對此有了一些想法。當然是使用另外一個腳本以及它自己的自定義資料庫檔案。

隻是目前還不需要它。這個項目的難點在于排程任務。要編寫能夠表達類似于“every Thursday is trash night”或“someone needs to do the dishes every night”等想法的代碼一點都不簡單。

不過這些代碼已經編寫好了,叫做 cron.我們所需要的隻是公布消息的某種途徑。可以知道,為本月項目的第一部分已經編寫的消息程式,可以正确地滿足我們的要求。為消息目錄賦與寫權限(例如,root 有令人羨慕的特權),嘗試這個指令:

現在,去檢視那些消息。很酷,不是嗎? 已經能夠通過運作指令添加新消息,也就是說 cron(可以根據日程安排運作指令)滿足了我們全部的需求。

有一個小型的 Web 界面來建立這些任務可能會更好,但是由于這些東西很少修改,是以可能并不需要。這将處理所有需要正常提示的任務。不需要正常提示的任務可以手工輸入,或者使用 at(1) 設定為在适當的時候輸入。

總結與說明

本月支出為 ,這非常好。沒有進行任何下載下傳,隻是要在本地進行一些輸入。應用程式有一些簡單,但是它們能完成應該做的事情,而且代價低廉。

進一步講,它們足夠簡單,能友善地更新。最大的弱點是安全性;沒有投入任何精力來保護這些程式不受最常見入侵的危害。其中一方面原因是,在大部分情況下那不是個大問題。

不過,如果您計劃與懂技術的室友一起使用這些,那麼有很多種方法可以讓程式更加安全。例如,如果不允許通過指令行運作 msgs.cgi 腳本,那麼需要考慮使用另外的方法來排程任務。(實際上有一個非常簡單的方法,就是使用指令行浏覽器以及精心構造的 URL,這些留給讀者去練習)。

古老的機器 的下一篇文章:使用 Web 頁開燈。可用的 x10 硬體和 Linux 驅動程式使得我們能夠完成所有那些有用的事情,比如在起床前半小時打開咖啡壺(coffee maker)。