發布一個自己編寫的postfix policy service
發布一個自己編寫的postfix policy service
名稱(暫時):ABCpolicy
版本:0.1
功能:目前只有一個,就是監控系統的負載,根據負載的大小,決定放行此郵件(執行DUNNO),還是拒收(執行defer_if_permit,顯示 450 4.7.1 <ms01>: Helo command rejected: System too busy.)。
運行環境:由於沒有生產環境進行測試,目前我只在VMware + CentOS 5.2 + Python 2.5 下運行過。
安裝使用方法:
1.安裝Python 2.5
2.修改/etc/postfix/main.cf,增加一行:
smtpd_helo_restrictions = check_policy_service inet:127.0.0.1:12321
3.運行本腳本
# ./policy.py &
4.腳本中的UpdateInvterval 變數代表每隔多少秒檢查系統最新負載,所謂負載是指cat /proc/loadavg | awk '{print $1} 的運行結果。
5.腳本中的 LoadingLimit 變數代表一旦負載超過其值,就執行defer_if_permit。
聲明:本人不對運行此腳本所帶來的影響負任何負責。
我知道代碼還是挺差勁的,請各位多提意見,小弟郵箱:tonyfeng#yahoo.com
#!/usr/local/bin/python
import SocketServer
import sys
import threading
from threading import Lock
from subprocess import Popen, PIPE
import time
#Update the system loading info every XX seconds
UpdateInvterval = 120
#Once system loading higher than LoadingLimit, perform defer_if_permit.
LoadingLimit = 5
class MyClassCheck():
def __init__(self, LoadingLimit, UpdateInterval):
self.LoadingLimit = LoadingLimit
self.UpdateInterval = UpdateInterval
self.LastUpdateTime = 0
self.LoadingNow = 0
self.Lock = threading.RLock()
def LoadingCheck(self):
# self.Lock.acquire()
if time.time() - self.LastUpdateTime > self.UpdateInterval:
cmd = "cat /proc/loadavg | awk '{print $1}'"
self.Lock.acquire()
p = Popen(cmd,
shell=True,
close_fds=True,
stdout=PIPE,
stderr=PIPE)
stdoutdata, stderrdata = p.communicate()
# self.Lock.acquire()
self.LastUpdateTime = time.time()
self.LoadingNow = float(stdoutdata)
# print str(time.ctime()), 'Need Update'
self.Lock.release()
return self.LoadingLimit > self.LoadingNow
else:
# self.Lock.release()
# print 'No Need Update'
return self.LoadingLimit > self.LoadingNow
class EchoRequestHandler(SocketServer.StreamRequestHandler):
def handle(self):
global MyChecker
while 1:
self.data = self.rfile.readline().strip()
if self.data == '' :
break
if MyChecker.LoadingCheck():
self.wfile.write("action=DUNNO" + '\n\n')
else:
self.wfile.write("action=defer_if_permit System too busy." + '\n\n')
# print 'Done with connection'
def main():
global MyChecker
MyChecker = MyClassCheck(LoadingLimit, UpdateInvterval)
server=SocketServer.ThreadingTCPServer(('127.0.0.1',12321),EchoRequestHandler)
server.serve_forever()
#server.handle_request()
if __name__ == '__main__':
main()
《解決方案》
很不錯了
就當是寫程序練練手了
《解決方案》
嘿嘿,pythoner。
不妨看看這個 policy server:
http://bimbo.fjfi.cvut.cz/ppolicy/
《解決方案》
呵呵,很簡單的一個policy
用shell或perl寫個,相信會有更多人感興趣。
《解決方案》
是啊,簡簡單單玩一下,練下手。
《解決方案》
我個人更喜歡用 python 寫的 :mrgreen:
支持樓主,基於一個小功能,慢慢擴展,還是很有希望的。在 policy 這一層可以做很多事
《解決方案》
原帖由 MichaelBibby 於 2009-2-19 20:03 發表 http://bbs2.chinaunix.net/images/common/back.gif
我個人更喜歡用 python 寫的 :mrgreen:
支持樓主,基於一個小功能,慢慢擴展,還是很有希望的。在 policy 這一層可以做很多事
謝謝捧場!