歡迎您光臨本站 註冊首頁

發布一個自己編寫的postfix policy service

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

發布一個自己編寫的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 這一層可以做很多事


謝謝捧場!

[火星人 ] 發布一個自己編寫的postfix policy service已經有243次圍觀

http://coctec.com/docs/service/show-post-24389.html