MySQL filter的實(shí)際配置
以下的文章主要介紹的是qmailadmin+vpopmail+MySQL filter的實(shí)際配置,如果你對(duì)其相關(guān)的實(shí)際操作有興趣的話,你就可以對(duì)以下的文章點(diǎn)擊觀看了。希望會(huì)給你帶來(lái)一些幫助在MySQL filter的實(shí)際配置方面。
作用于qmail-local(即MDA)的方法。
這里有幾個(gè)問(wèn)題,需要解決。
1.如何在建用戶(hù)的時(shí)候自動(dòng)的初始化用戶(hù)的初始MySQL filter文件.
2.webmail定義的filter如何起作用。
3.還有一些是解決這些問(wèn)題的過(guò)程中遇到的問(wèn)題。
針對(duì)第一個(gè)問(wèn)題,研究了一下qmailadmin,看了代碼之后才發(fā)現(xiàn),
qmailadmin支持插件似的配置文件,在操作用戶(hù)后,
運(yùn)行在插件配置文件中定義的腳本。腳本是針對(duì)每個(gè)域的,即放在域的目錄下面。
呵呵,網(wǎng)上都沒(méi)有介紹哦,估計(jì)是inter7 unleased.
域的目錄通過(guò)/var/qmail/users/assign來(lái)定位。例如,assign的內(nèi)容如下:
- +foo.com-:foo.com:515:511:/home/vpopmail/domains/foo.com:-::
則在/home/vpopmail/domains/foo.com下定義一個(gè)配置文件.qmailadmin-hooks。注意屬
主和屬性,這個(gè)配置文件格式如下:
- #....
- op: cmd
其中到qmailadmin-1.06,op支持以下一些操作
- "adduser",
- "deluser",
- "moduser",
- "addmaillist",
- "delmaillist",
- "modmaillist",
- "listadduser",
- "listdeluser"
例如:你想在增加用戶(hù)以后干些事情,就以增加MySQL filter為例,.qmailadmin-hooks
就可以這么配:
adduser: /home/vpopmail/bin/inituser.sh
inituser.sh腳本如下:
- #!/bin/bash
- Domain=$1
- User=$3
- Passwd=$2
- DomainPath=/home/vpopmail/domains/$Domain
- umask 0177
- exec 1> /tmp/adduser.log
- exec 2> /tmp/adduser.log
- echo $DomainPath
- cat>$DomainPath/.qmail-$User <|maildrop $DomainPath/$User/.mailfilter
- EOF
- cat>$DomainPath/$User/.mailfilter <include $User/.userfilter
- EOF
- cat>$DomainPath/$User/.userfilter <#MFMAILDROP=2
- #
- # DO NOT EDIT THIS FILE. This is an automatically generated filter.
- FROM='$User@$Domain'
- import SENDER
- if ($SENDER ne "")
- {
- FROM=$SENDER
- }
- to "$DomainPath/$User/Maildir/."
- EOF
- cat>$DomainPath/$User/Maildir/maildirfilterconfig <MAILDIRFILTERMAILDIRFILTER=../.userfilter
- MAILDIR=$DomainPath/$User/Maildir
- EOF
針對(duì)第二個(gè)問(wèn)題,實(shí)際上上面inituser.sh已經(jīng)提供了解決方法,也就是sqwebmail通過(guò)
maildirfilterconfig來(lái)查找MySQL filter文件,這里定義的是../.userfilter,它有包含在.mailfiter中,
而點(diǎn).mailfilter則是maildrop調(diào)用的規(guī)則文件。
這里有幾個(gè)地方需要解釋?zhuān)?/p>
1..userfilter中的前幾行comment是起作用的,是sqwebmail的標(biāo)記,不能去掉,否則sqwebmail會(huì)報(bào)錯(cuò)
2.MAILDIRFILTER為什么不指向.mailfiter,而是.userfilter,一句話方便擴(kuò)充??梢栽?mailfilter中加入
其它的MySQL filter rule, 而這些rule并不需要用戶(hù)編輯。
3..qmailadmin-hook中的腳本是qmailadmin fork出的子進(jìn)程執(zhí)行的,qmailadmin由于是以http的用戶(hù)運(yùn)行
所以建立這些文件的時(shí)候會(huì)有錯(cuò)誤。因此,我們改了一點(diǎn)源代碼,位置在源碼包的qmailadmin*/user.c的
函數(shù)call_hooks的fork之前, 如下:
.
- + setuid(0);
- + setgid(VPOPMAILGID);
- + setuid(VPOPMAILUID);
- pid = fork();
編譯之后qmailadmin后,并替換cgi目錄下的文件,注意屬主是root和setuid位.
4.為什么不在inituser.sh中用su來(lái)執(zhí)行,這樣就不用改代碼了?首先,apache(Unix平臺(tái)最流行的WEB服務(wù)器平臺(tái))重定向了stdin,而su是檢查
stdin是不是tty,如果不是,就不會(huì)執(zhí)行。其次,fork出來(lái)的子進(jìn)程是exec的方式執(zhí)行MySQL filter的配置中指定的命令,
而exec是不復(fù)制euid和egid的,所以如果不用su,就需要用自己編一個(gè)suid的程序。這又麻煩了.
.qmailadmin-hooks如下:
- adduser: /home/vpopmail/bin/inituser.sh
- deluser: /home/vpopmail/bin/deluser.sh
/var/vpopmail/bin/deluser.sh如下
- #!/bin/bash
- Domain=$1
- User=$3
- Passwd=$2
- DomainPath=/home/vpopmail/domains/$Domain
- rm -f $DomainPath/.qmail-$User
注:原來(lái)qmailadmin有bug.
在源碼包的qmailadmin*/user.c的函數(shù)call_hooks的這行
error = execl(cmd, Newu, Domain, Password1, Gecos, NULL);
這里明顯有問(wèn)題,execl的第二個(gè)參數(shù)是arg0,實(shí)際上不起作用。而Gecos是用戶(hù)的真實(shí)
用戶(hù)名,只有在新建的時(shí)候才有值,不填就是Newu,所以我以為用戶(hù)名是$3.
但是moduser和deluser的時(shí)候,操作的用戶(hù)名都不在Newu里面,而是在ActionUser里面。
所以hook中定義的deluser和moduser腳本取不到用戶(hù)名.
所以需要將這行改為
- if (Newu %26amp;%26amp; *Newu) {
- error = execl(cmd, cmd, Newu, Domain, Password1, Gecos, NULL);
- } else {
- error = execl(cmd, cmd, ActionUser, Domain, Password1, Gecos, NULL);
- }
而且,如果要方便擴(kuò)展的話,可以將op也放在execl的參數(shù)中,這樣,hook中定義的
腳本就可以用一個(gè)。根據(jù)op類(lèi)型來(lái)操作。就不像我這樣分成好多腳本了。
所以u(píng)ser.c最終該過(guò)后,如下,call_hooks函數(shù)的fork附近:
- setuid(0);
- setgid(VPOPMAILGID);
- setuid(VPOPMAILUID);
- pid = fork();
- #ifdef DEBUG
- fprintf(actout,"Where the parameters are: %s, "%s", %s, %s, %s, %s, NULL); ",
- cmd, hooks[hook_type], Newu, Domain, Password1, Gecos);
- #endif
- if (pid == 0) {
- // error = execl(cmd, Newu, Domain, Password1, Gecos, NULL);
- if (Newu %26amp;%26amp; *Newu) {
- error = execl(cmd, cmd, Newu, Domain, Password1, Gecos, NULL);
- } else {
- error = execl(cmd, cmd, ActionUser, Domain, Password1, Gecos, NULL);
- }
而inituser.sh和deluser也需要相應(yīng)的改參數(shù)位置,我只貼上修改的頭幾行如下:
- #!/bin/sh
- User=$1
- Domain=$2
- Passwd=$3
- RealName=$4
以上的相關(guān)內(nèi)容就是對(duì)qmailadmin+vpopmail+MySQL filter的配置的介紹,望你能有所收獲。
【編輯推薦】