当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : autotoy
帖子发表于 : 2010-03-09 14:11 
头像

注册: 2006-07-31 0:09
帖子: 192
地址: 四季都好,若是你在
送出感谢: 0 次
接收感谢: 0 次
无聊给外包公司写了个邮件接口,外包人员可通过邮件对本公司内网服务器进行一些检查及操作,保留了两个较普遍的需求.
各位不要见笑

代码:
#!/usr/bin/python
 
import sys
import email
import string
import poplib
import smtplib
import threading
import subprocess
 
 
SERVER = 'demo'
USER = 'demo'
PASSWD = 'demo'
 
MAX_THREAD = 100
sem=threading.BoundedSemaphore(MAX_THREAD)
 
class GetMail(object):
 
        def __init__(self, popServer, user, passwd):
 
                self.popServer = popServer
                self.user = user
                self.passwd = passwd
 
        def doit(self):
                result = { 'Msgs':0 }
 
                popServer = poplib.POP3_SSL(self.popServer)
                popServer.user(self.user)
                popServer.pass_(self.passwd)
 
                result['Msgs'] = popServer.stat()[0]
 
                if result['Msgs'] == 0:
                        return result
                        sys.exit()
 
                message = popServer.retr(result['Msgs'])[1]
                mail = email.message_from_string(string.join(message,'\n'))
                result['Subject'] = email.Header.decode_header(mail['subject'])[0][0]
                result['From'] = email.Header.decode_header(mail['from'])[0][0]
                result['To'] = email.Header.decode_header(mail['To'])[0][0]
                result['Body'] = mail.get_payload(decode=True)
 
                popServer.dele(result['Msgs'])
                popServer.quit()
 
                return result
 
class SendMail:
 
        def __init__(self, smtpServer, user, passwd):
                self.smtpServer = smtpServer
                self.user = user
                self.passwd = passwd
 
        def doit(self, fromAddr, toAddr, subject, msg):
                smtpServer = smtplib.SMTP(self.smtpServer)
                smtpServer.ehlo()
                smtpServer.starttls()
                smtpServer.ehlo()
                smtpServer.login(self.user,self.passwd)
                body=string.join((
                        "FROM: %s" %fromAddr,
                        "TO: %s" %toAddr,
                        "Subject: %s" %subject,
                        "",
                        msg),"\n")
                smtpServer.sendmail(fromAddr,toAddr,body)
                smtpServer.quit()
 
 
def iLOCheck(ip,l):
        '''Check ilo connectivity'''
 
        ILOPING = '/home/wangruoyan/ping.sh '
 
        ret = subprocess.call("%s %s" % (ILOPING, ip),shell=True,stdout=open('/dev/null', 'w'),stderr=subprocess.STDOUT)
        if ret == 0:
                truth[ip] = 'Alive'
        elif ret == 1:
                truth[ip] = 'Dead'
        else:
                truth[ip] = 'Error'
 
        sem.release()
 
 
def NodeCheck(ip,l):
        '''Check node connectivity'''
 
        ret = subprocess.call("ping -c 4 %s" % (ip),shell=True,stdout=open('/dev/null', 'w'),stderr=subprocess.STDOUT)
 
        if ret == 0:
                truth[ip] = 'Alive'
        elif ret == 1:
                truth[ip] = 'Dead'
        else:
                truth[ip] = 'Error'
 
        sem.release()
 
 
if __name__ == "__main__":
 
 
        ErrString = '''Error request types,only provide:
        ILOCHECK,NODECHECK,ILOCONFIG,DLINKCHECK'''
 
        while (True):
 
                result = ''
                todo = list()
                truth = dict()
 
                Get = GetMail(SERVER, USER, PASSWD)
                Info = Get.doit()
 
                if Info['Msgs'] == 0:
                        sys.exit()
 
                if Info['Subject'] == 'ILOCHECK':
                        for ip in Info['Body'].split('\n'):
                                sem.acquire()
                                th = threading.Thread(target=iLOCheck, args=(ip,'J'))
                                todo.append(th)
                                th.start()
 
                        for t in todo:
                                t.join()
 
                        for key in truth.keys():
                                result = result + "%s\t\t%s\n" % (key, truth[key])
 
                elif Info['Subject'] == 'NODECHECK':
                        for ip in Info['Body'].split('\n'):
                                sem.acquire()
                                th = threading.Thread(target=NodeCheck, args=(ip,'J'))
                                todo.append(th)
                                th.start()
 
                        for t in todo:
                                t.join()
                        for key in truth.keys():
                                result = result + "%s\t\t%s\n" % (key, truth[key])
                else:
                        result = ErrString
 
                truth.clear()
 
                Info['From'], Info['To'] = Info['To'], Info['From']
 
                Send = SendMail(SERVER, USER, PASSWD)
                Send.doit(Info['From'], Info['To'], Info['Subject'], result)
 
                if Info['Msgs'] == 1:
                        break


_________________
Nothing is Sound..


最后由 夕阳 编辑于 2010-03-09 14:17,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: autotoy
帖子发表于 : 2010-03-09 14:12 
头像

注册: 2008-12-13 19:39
帖子: 13284
地址: 物华天宝人杰地灵
送出感谢: 1
接收感谢: 6
不懂源码的占位帮顶。 :em11


_________________
行到水穷处,坐看云起时。
海内生明月,天涯共此夕。
--------------------吾本独!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译