mono 與 SELinux

重灌 server 並啟用 SELinux 以後,發現 asp.net 應用程式無法啟動.
原本不想碰 SELinux 的,不得已,出來混的早晚都要還,只好硬著頭皮去K.
經過研讀文件之後,大致上對 SELinux 有一定的瞭解.
SELinux 本身純粹是作安全性的加強,所以不管是 user, file, directory, socket, process…等等的,都另外有了 security context,作為安全性的第二道防線.
當系統要存取這些資源的時候,首先會使用原有的 unix permission 去作檢查,接著 SELinux 會再依照 security context 作第二道檢查,當檢查沒問題之後,才會允許存取.
SELinux 裡面有所謂的 identity, domain, type, security context, target context 等等物件…
大致上來說, identity 決定身份, domain 決定 process 能幹麼, type 決定 process 以外的物件可以幹麼, security context, target context 則是 identity + domain + type 的組合. policy 則用來定義 security context, target context 可以存取哪些物件. (這些組合,真的很讓人頭暈.)
存取的指令也蠻多的:

  • 要看檔案目錄的 security context, 可以加上 -Z (ls -Z)
  • 要看process的 security context, 也可以用 -Z (ps axZ)
  • 要看自己的security context,可以用 id
  • 要改security context, 可以用 chcon
  • 要 reset security context, 可以用 restorecon

整個研讀完之後,發現應該是 policy 問題.
今天下午用Google去找到 v14, i08: Tuning Your SELinux Policy with Audit2allow” href=”http://www.samag.com/documents/s=9820/sam0508a/0508a.htm”>這篇文章,發現有這麼個工具 – audit2allow,他是在 policycoreutils 套件裡面的指令,可以根據 warning message 產生 policy,省掉不少編寫的麻煩.
為了要能重新編譯 policy, 你需要安裝 selinux-policy-targeted-sources 這個套件

yum install selinux-policy-targeted-sources

再使用 audit2allow 這個指令,從 dmesg 裡面分析 warning, 並將產生以後的 policy 寫入到 mono.policy 檔案中.

audit2allow -d -o mono.policy

接著把 mono.policy 更名為 local.te, 放到 /etc/selinux/targeted/src/policy/domains/misc/ .
放完之後,切換到 /etc/selinux/targeted/src/policy
強制 selinux 重新編譯 policy

make load

最後重新啟動我的 Apache server,就大功告成了.
參考資料:

ThreadAbortException

原來呼叫 Response.End() 就會丟出 ThreadAbortException.
害我以為是我程序出現錯誤了呢…
Google 幫忙一下,原來也有人碰到同樣情況:
Impersonation Failure : ASP.NET – ThreadAbortException
其實還不只是 Response.End(), Server.Transfer() 與 Response.Redirect() 也有機會發生此狀況,因為他們內部也呼叫了 Response.End().
比較正確的作法應該還是先呼叫

Response.Flush();
Response.Close();

會比較好些.
這是那篇文章所提供的參考資料:

log4net

在 .Net/mono 程序裡面使用 log4net,是極為簡單的事情.
首先到 log4net官方網站下載.
解開以後,到 bin 資料夾下,找適合你用的 assembly file. (p.s. 其實也不用特別找, .Net 與 mono 是通用的, .Net compact framework 與 sccli 我就沒試過了)
接著,視你自己專案的類型,該引用的就引用 (Visual Studio.Net/MonoDevelop/SharpDevelop),該改 Nant build file / Makefile 的就改.
步驟一:
使用 log4net 的第一步,是在你程序一開始的地方,去解析 log4net 的 configuration.

log4net.Config.XmlConfigurator.Configure();

一般性的 Windows form 程序通常是放在 Main 的一開始,而 asp.net 程序通常則是在 global.asax (codebehind 的話就是 global.asax.cs) 的 Application_Start 事件.
步驟二:
接著在你想要進行 log 的類別宣告這一個屬性.

protected static readonly ILog log = LogManager.GetLogger(typeof( your_class_name ));

要當成一般變數來用也行

ILog log = LogManager.GetLogger(typeof( your_class_name ));

步驟三:
最後是在你想要 log 的地方,放置這麼一行

log.Info( “your message here.” );

大功告成!!
就這麼簡單.
而 ILog 不只 Info() method 可以操作,還可以有 Debug(), Error(), Fatal(), Warn() 這幾個 method 可用,他們各代表了不同的層級.
層級的區分大致是這樣: Debug < Info < Warn < Error < Fatal
換句話說,當你 Configuration 裡的層級設定為 Debug 的時候,只要你有調用 ILog 的任何一個 method 來 log, 這些訊息都會出現在 log 裡面.
當你 Configuration 裡的層級設為 Warn 的時候,你有調用 Warn(), Error(), Fatal() 這三個 method 來 log 的地方,這些訊息都會出現在 log 裡面.
再來就是 Configuration.
Windows form 的 configuration 檔案通常名稱是 xxx.exe.config, asp.net 的 configuration 檔案則是 web.config
這裡主要放置兩個部份:

  • configSection:

    <configSections>
    <section name=”log4net” type=”log4net.Config.Log4NetConfigurationSectionHandler,log4net” />
    </configSections>

    p.s.這裡我有一個慘痛的教訓,查了好久,結果發現是打錯字, “log4net.Config” 我打成 “log4net.config”,一度我還懷疑是 configuration file 問題,還跑去 trace log4net 的程式 =_=”, 如果你確定你都設對了,該設的也都設定了,不妨利用 LogManager.GetRepository 取得 ILoggerRepository,去看 Configured 屬性,如果是 false,表示沒設定到,可以試著檢查大小寫看看.

  • log4net, 這邊請參考 log4net Config Examples 會比較快一點.

參考資料:

2005年回顧

  • PMP順利出貨
  • 應M客戶要求,加上像 iPod 一樣的 ID3 tag 導引功能.還有 audio resume 功能(基本上是抄原有的 video resume)
  • 去了大陸崑山一趟,沒玩甚麼,因為沒有帶旅遊導覽.
  • 把 UML 看過一遍
  • 把結構化系統分析看過一遍
  • 開始去中和的國立中央圖書館台灣分館借書
  • 開始玩仙境傳說 (http://blog.xuite.net/x991275c/ThinkingRo/)
  • 開始離職信收集的 blog (http://farewellcollection.blogspot.com/)
  • 第一次趕流行喝薄酒來
  • 重感冒兩次,中度感冒一次
  • 開始認真寫 asp.net, 把 rss 時刻表重寫了兩次,正在重寫第三次中…
  • 去韓國
  • 喝掛一次,沒當場醉倒,隔天宿醉,痛苦了一天.
  • 恢復閱讀的習慣

讀”魔鬼都在細節裡”一文小感

今天讀完 Neo’s blog魔鬼都在細節裡 之後,覺得很慚愧…

我不知道我的同學是不是很用心在籌備自己的婚禮,但是感覺上沒有一個細節處理的好,而且最重要的是,婚禮的整個過程我的同學都沒有過來跟我打過一聲招呼,就算結婚當天太忙,事隔一天連通電話也沒有,感覺實在相當糟糕。

是的,就是這句話.
讓我想到三年前我對自己婚宴的心態,是的,我真的只想快快結束.
很多事情都沒考慮到,該聯絡的朋友啊~什麼的,都沒有好好去處理.
以我現在來看,這個婚宴辦的不好!
有看到我這篇文章,而且有收到我帖子的朋友,在此說聲對不起.
不過….不會有下次了~~

聊 Editor

昨天好友問到我用啥編輯器在寫 .Net 程式,有沒有用 UltraEdit??
我答道:”沒有,現在都用免費的編輯器在寫.”
so, 這就是這篇文章的由來…
PSPad Unicode
話才說完,還真巧,沒多久我就在 Nelson’s Blog 上看到這篇文章.
裝起來大致看了一下,還不錯,該有的功能都有了.
notepad++
這個是無意之中找到的,速度很快,也很好用.
用他的頻率,不知道為甚麼就是比下面的 Programmer’s Notepad 少.
Programmer’s Notepad
這是我目前最常用的編輯器之一,功能也很多.
常常用的原因很簡單,因為在檔案上面按下滑鼠右鍵,就會出現 Edit with PN2 ….
=_=”
Crimson
這個則是在某 blog 上看到的,不過沒記下網址.
也很好用,某同事大力推薦.
VIM
這個就不用說了,在 linux 環境下我都是用這個.
他也有 Windows 版本,也可以很方面的在檔案上面按下滑鼠右鍵,選”使用Vim編輯此檔案”…
可以說是上上之選,一直都沒有花很多時間去認真學他,都是停留在堪用的程度.
依照我逛網路的經驗告訴我,網路上很多 Linux 玩家都很厲害.
Linux 還有一個很有名的 Emacs, 但我沒用過,也懶得學,這套聽說也是神的不得了.
jEdit
是在 SourceForge 找到的,還是在 JavaLobby 電子報上逛到的??
已經不可考,不過這也是一套不錯用的編輯器,可以裝很多官方提供的亂七八糟 plugin. (我還蠻喜歡亂裝 plugin 來玩的)
Eclipse
這套最有名啦~目前紅的要命~~
也有提供很多 plugin, EclipsePlugins : hi! Find your plugin for Eclipse here.
還記得第一次裝的時候,如墜五里霧中.
後來找到不少 tutorial, 才知道怎麼裝.
其實用法不如想像中困難,就只是解開壓縮檔而已.
plugin 的話,eclipse 有內建 plugin manager,很方便.
eclipse 的 plugin 一狗票,但要注意的是,蠻多都是要收錢錢的.
AEdiX Suite
這一套是我同事介紹的.
他是這麼說的:”這套也是不用錢的..還不少人用.還支援 foxpro ..!”
不過,我沒辦法下載,所以也無從驗證起.
最後,”需要評比嗎??”
我這樣問我自己.我想應該是不用吧,每套編輯器都有自己的長處.
Developer 自己用熟就好啦~~

關於 ASP.NET 的 Cache(後續追蹤報導)

昨天在 Trace ASP.NET Caching 之後,還是念念不忘…
這麼好用的 OutputCacheModule 為甚麼會需要特別設定才會掛載??
於是今天再次 Trace, 這次從 Page 的產生開始.
於是我下手查了 Mono 的 PageCompiler 與 PageParser
他們之間的 Class diagram 大致是這樣
PageParser-20051216
在收到 Page Request 的時候,如果以前沒編譯過,Page Compiler 會先 Parse 這個 Page, 接著組出 code, 動態編譯成組件 (Assembly),然後再載入這個組件.
這樣一查下來,發現 PageParser 遇到 @ OutputCache 這個 Directive 的時候,也沒有動態去載入 OutputCacheModule 這個 Module.
這更怪了,再搜索 HttpModuleCollection.AddModule (.Net 是 HttpModuleCollection.LoadModule ),發現這真的只有在 HttpApplication 一開始的時候才有用到.
難道我昨天的結論真的沒有錯??
在萬念俱灰之下,利用 Google 搜索 OutputCacheModule
找到這篇文章:Extending the ASP.NET Runtime with Custom HTTP Modules
才發現,除了應用程式自訂的 web.config 之外,其實還有預設的 .config !!
以 .Net 1.1 來說,他是在 %WINDIR%\Microsoft.NET\Framework\v1.1.4322\CONFIG\machine.config
Mono 來說,他是在 /etc/mono/1.0/machine.config
打開來看之後,赫然發現在這裡, OutputCacheModule 已經被載入了!
所以並不需要特別在你自己的 web.config 去加載 OutputCacheModule!!
p.s. 這篇是意外的收穫,對於整個流程解析的不錯,僅供參考:ASP.NET 中 Session 實現原理淺析 (1) 會話的建立流程