LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 944|回复: 0

autotoy

[复制链接]
发表于 2010-3-10 19:31:26 | 显示全部楼层 |阅读模式
无聊给外包公司写了个邮件接口,外包人员可通过邮件对本公司内网服务器进行一些检查及操作,保留了三个较普遍的需求.
各位不要见笑

  1. #!/usr/bin/python

  2. import sys
  3. import email
  4. import pxssh
  5. import string
  6. import poplib
  7. import smtplib
  8. import threading
  9. import subprocess

  10. SERVER = 'demo'
  11. USER = 'demo'
  12. PASSWD = 'demo'

  13. MAX_THREAD = 100
  14. sem=threading.BoundedSemaphore(MAX_THREAD)

  15. class GetMail(object):

  16.         def __init__(self, popServer, user, passwd):

  17.                 self.popServer = popServer
  18.                 self.user = user
  19.                 self.passwd = passwd

  20.         def doit(self):
  21.                 result = { 'Msgs':0 }

  22.                 popServer = poplib.POP3_SSL(self.popServer)
  23.                 popServer.user(self.user)
  24.                 popServer.pass_(self.passwd)

  25.                 result['Msgs'] = popServer.stat()[0]

  26.                 if result['Msgs'] == 0:
  27.                         return result
  28.                         sys.exit()

  29.                 message = popServer.retr(result['Msgs'])[1]
  30.                 mail = email.message_from_string(string.join(message,'\n'))
  31.                 result['Subject'] = email.Header.decode_header(mail['subject'])[0][0]
  32.                 result['From'] = email.Header.decode_header(mail['from'])[0][0]
  33.                 result['To'] = email.Header.decode_header(mail['To'])[0][0]
  34.                 result['Body'] = mail.get_payload(decode=True)

  35.                 popServer.dele(result['Msgs'])

  36.                 popServer.quit()
  37.                 return result

  38. class SendMail:

  39.         def __init__(self, smtpServer, user, passwd):
  40.                 self.smtpServer = smtpServer
  41.                 self.user = user
  42.                 self.passwd = passwd

  43.         def doit(self, fromAddr, toAddr, subject, msg):
  44.                 smtpServer = smtplib.SMTP(self.smtpServer)
  45.                 smtpServer.ehlo()
  46.                 smtpServer.starttls()
  47.                 smtpServer.ehlo()
  48.                 smtpServer.login(self.user,self.passwd)
  49.                 body=string.join((
  50.                         "FROM: %s" %fromAddr,
  51.                         "TO: %s" %toAddr,
  52.                         "Subject: %s" %subject,
  53.                         "",
  54.                         msg),"\n")
  55.                 smtpServer.sendmail(fromAddr,toAddr,body)
  56.                 smtpServer.quit()


  57. def iLOCheck(ip,l):
  58.         '''Check ilo connectivity'''

  59.         ILOPING = '/home/wangruoyan/ping.sh '

  60.         ret = subprocess.call("%s %s" % (ILOPING, ip),shell=True,stdout=open('/dev/null', 'w'),stderr=subprocess.STDOUT)
  61.         if ret == 0:
  62.                 truth[ip] = 'Alive'
  63.         elif ret == 1:
  64.                 truth[ip] = 'Dead'
  65.         else:
  66.                 truth[ip] = 'Error'

  67.         sem.release()


  68. def iLOConfig(ip ,l):
  69.         '''Config server ilo'''

  70.         result = 'Configuration done.'

  71.         REMOTEUSER = 'user'
  72.         REMOTPASSWD = 'password'


  73.         GETSCRIPT = 'wget -O /tmp/ilodrac-all.sh ftp://10.23.247.252/home/bakup/auto-scripts/ilodrac-all.sh > /dev/null'
  74.         RUNSCRIPT = 'sh /tmp/ilodrac-all.sh'

  75.         try:
  76.                 ssh = pxssh.pxssh()
  77.                 ssh.login(ip, REMOTEUSER, REMOTPASSWD)
  78.                 ssh.prompt()
  79.                 ssh.sendline(GETSCRIPT)
  80.                 ssh.prompt()
  81.                 ssh.sendline(RUNSCRIPT)
  82.                 ssh.prompt(timeout=200)
  83.                 ssh.logout()
  84.         except pxssh.ExceptionPxssh, err:
  85.                 result= str(err)

  86.         truth[ip] = result
  87.         sem.release()


  88. def NodeCheck(ip,l):
  89.         '''Check node connectivity'''

  90.         ret = subprocess.call("ping -c 4 %s" % (ip),shell=True,stdout=open('/dev/null', 'w'),stderr=subprocess.STDOUT)

  91.         if ret == 0:
  92.                 truth[ip] = 'Alive'
  93.         elif ret == 1:
  94.                 truth[ip] = 'Dead'
  95.         else:
  96.                 truth[ip] = 'Error'

  97.         sem.release()


  98. if __name__ == "__main__":

  99.         while (True):

  100.                 ErrString = '''Error request types,only provide:
  101.                                 \tILOCHECK,NODECHECK,ILOCONFIG'''

  102.                 result = ''
  103.                 todo = list()
  104.                 truth = dict()

  105.                 Get = GetMail(SERVER, USER, PASSWD)
  106.                 Info = Get.doit()
  107.                 if Info['Msgs'] == 0:
  108.                         sys.exit()

  109.                 if Info['Subject'] == 'ILOCHECK':
  110.                         for ip in Info['Body'].split('\n'):
  111.                                 sem.acquire()
  112.                                 th = threading.Thread(target=iLOCheck, args=(ip,'J'))
  113.                                 todo.append(th)
  114.                                 th.start()

  115.                         for t in todo:
  116.                                 t.join()

  117.                         for key in truth.keys():
  118.                                 result = result + "%s\t\t%s\n" % (key, truth[key])

  119.                 elif Info['Subject'] == 'NODECHECK':
  120.                         for ip in Info['Body'].split('\n'):
  121.                                 sem.acquire()
  122.                                 th = threading.Thread(target=NodeCheck, args=(ip,'J'))
  123.                                 todo.append(th)
  124.                                 th.start()

  125.                         for t in todo:
  126.                                 t.join()

  127.                         for key in truth.keys():
  128.                                 result = result + "%s\t\t%s\n" % (key, truth[key])

  129.                 elif Info['Subject'] == 'ILOCONFIG':

  130.                         for ip in Info['Body'].split('\n'):
  131.                                 sem.acquire()
  132.                                 th = threading.Thread(target=iLOConfig, args=(ip,'J'))
  133.                                 todo.append(th)
  134.                                 th.start()

  135.                         for t in todo:
  136.                                 t.join()

  137.                         for key in truth.keys():
  138.                                 result = result + "%s\t\t%s\n" % (key, truth[key])
  139.                 else:
  140.                         result = ErrString

  141.                 truth.clear()

  142.                 Info['From'], Info['To'] = Info['To'], Info['From']

  143.                 Send = SendMail(SERVER, USER, PASSWD)
  144.                 Send.doit(Info['From'], Info['To'], 'Autoreply: '+Info['Subject'], result)

  145.                 if Info['Msgs'] == 1:
  146.                         break
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表