Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1859632
  • 博文数量: 117
  • 博客积分: 2559
  • 博客等级: 少校
  • 技术积分: 4385
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-13 20:08
个人简介

作为初学者,要想取得进步,成为高手,首先应该了解自己的不足之处.

文章分类

全部博文(117)

文章存档

2014年(1)

2013年(25)

2012年(13)

2011年(77)

2010年(1)

分类: 系统运维

2011-01-20 14:39:41

  1. #!/usr/bin/python

  2. import os,sys,time,re,MySQLdb

  3. now=time.strftime('%Y%m%d')
  4. passwd='/tmp/.passwd'
  5. log22='/tmp/stats_%s.csv' % (now)

  6. dict_mon={
  7. 'mytest1':('ning@127.0.0.1::','/tmp/test2010'),
  8. #'mytest1':('ning@127.0.0.1','/tmp/test2010'),
  9. 'mytest4':('ning@127.0.0.1::','/tmp/test2010'),
  10. 'mytest2':('ning@127.0.0.1::','/tmp/test2010')
  11. }
  12. def write_title(log_stat):
  13.     file_log=open(log_stat,'a')
  14.     file_log.write('start_time,end_time,module,Number of files,Number of files transferred,Total file size(bytes),Total transferred file size(bytes)\n')
  15.     file_log.close()
  16. def write_notes(d_ary,log_stat,port=873):
  17.     db_conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='',db='test')
  18.     db_curs=db_conn.cursor()
  19.     fle=open(log_stat,'a')
  20.     for i in d_ary:
  21.         line_mon=d_ary[i]
  22.         cmd='rsync -tzrp --stats --port=%s --password-file=%s %s%s %s' % (port,passwd,line_mon[0],i,line_mon[1])
  23.         try:
  24.             s_time=time.strftime('%H:%M:%S')
  25.             cmd_put=os.popen(cmd)
  26.             list_tmp=[]
  27.             re_p=re.compile('(Number of files:|Number of files transferred:|Total file size:|Total transferred file size:) (\d+)?')
  28.             for each_line1 in cmd_put:
  29.                 for each_line2 in re_p.finditer(each_line1):
  30. # print each_line2.group()
  31.                     if each_line2 is not None:
  32.                         list_tmp.append(each_line2.group(2))
  33.                     else:
  34.                         pass
  35.             e_time=time.strftime('%H:%M:%S')
  36.      cmd_stat='%s,%s,%s,%s,%s,%s,%s,%s' % (s_time,e_time,i,list_tmp[0],list_tmp[1],list_tmp[2],list_tmp[3],os.linesep)
  37.             cmd_put.close()
  38.             fle.write(cmd_stat)

  39.             db_curs.execute("INSERT INTO bak_stat \
  40.             (date_ymd,s_time,e_time,mod_name,files,files_traned,filesize,filesize_traned,a_error) VALUES('%s','%s','%s','%s','%s','%s','%s','%s','')" \
  41.             % (now,s_time,e_time,i,list_tmp[0],list_tmp[1],list_tmp[2],list_tmp[3]) )
  42.         except:
  43.             cmd_stat='%s,%s,%s,%s,%s,%s,%s' % (s_time,e_time,i,'error','error','error','error'+os.linesep)
  44.             fle.write(cmd_stat)
  45.             db_curs.execute("INSERT INTO bak_stat (date_ymd,s_time,e_time,mod_name,a_error) VALUES('%s','%s','%s','%s','error')" % (now,s_time,e_time,i) )
  46.     db_curs.close()
  47.     db_conn.close()
  48.     fle.close()

  49. if __name__ == '__main__':
  50.     write_title(log22)
  51.     write_notes(dict_mon,log22)
  52. # write_notes(dict_mon,log22,8770)

 

部分代码解析
#!/usr/bin/python

import os,sys,time,re,MySQLdb
#在导入MySQLdb模块前,要安装MySQL-python
#yum install MySQL-python

now=time.strftime('%Y%m%d')
passwd='/tmp/.passwd'
log22='/tmp/stats_%s.csv' % (now)

dict_mon={
'mytest1':(),
#'mytest1':(),
'mytest4':(),
'mytest2':()
}
#定义一个字典
#举例说明,'mytest1'(键)为模块名,()为值,rsync命令的组成部分,如下
#rsync -tzrp --stats --port=873 --password-file='/tmp/.passwd' /tmp/test2010


def write_title(log_stat):
    file_log=open(log_stat,'a')
    file_log.write('start_time,end_time,module,Number of files,Number of files transferred,Total file size(bytes),Total transferred file size(bytes)\n')
    file_log.close()
函数功能:
#创建一个日志文件,并写入标题
#open()方法创建一个文件,参数a,以追加的方式


def write_notes(d_ary,log_stat,port=873):
#定义三个参数,设置port的默认值为873
    db_conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='',db='test')
    db_curs=db_conn.cursor()
#定义一个数据库连接,并创建一个游标
    fle=open(log_stat,'a')
    for i in d_ary:
        line_mon=d_ary[i]
        cmd='rsync -tzrp --stats --port=%s --password-file=%s %s%s %s' % (port,passwd,line_mon[0],i,line_mon[1])
        try:         
            s_time=time.strftime('%H:%M:%S')
            cmd_put=os.popen(cmd)
     list_tmp=[]
            re_p=re.compile('(Number of files:|Number of files transferred:|Total file size:|Total transferred file size:) (\d+)?')

#(\d+)?表示,\d+表示任意数字,至少有一个,
#特殊符号*,+,?它们可以用于匹配字符串模式出现一次、多次、或未出现的情况。
#星号或称星号操作符匹配它左边那个正则表达式出现零次或零次以上的情况
#加号(+)操作符匹配它左边那个正则表达式模式至少出现一次的情况(它也被称为正闭包操作符)
#问号操作符( ? )匹配它左边那个正则表达式模式出现零次或一次的情况

     for each_line1 in cmd_put:
                for each_line2 in re_p.finditer(each_line1):
#                    print each_line2.group()
                    if each_line2 is not None:
                        list_tmp.append(each_line2.group(2))
                    else:
                        pass
#用了两次循环,第一次把命令结果迭代赋给each_line1变量,第二次,调用正则表达式,把匹配值赋给each_line2变量
#finditer(pattern,string[, flags])在字符串中,查找匹配项,返回迭代器;对于每个匹配,该迭代器返回一个匹配对象。
#避免程序抛出错误,增加一个判断。
            e_time=time.strftime('%H:%M:%S')
#设置两个时间,分别记录命令的开始和结束
     cmd_stat='%s,%s,%s,%s,%s,%s,%s,%s' % (s_time,e_time,i,list_tmp[0],list_tmp[1],list_tmp[2],list_tmp[3],os.linesep)
            cmd_put.close()
            fle.write(cmd_stat)

            db_curs.execute("INSERT INTO bak_stat \
            (date_ymd,s_time,e_time,mod_name,files,files_traned,filesize,filesize_traned,a_error) VALUES('%s','%s','%s','%s','%s','%s','%s','%s','')" \
            % (now,s_time,e_time,i,list_tmp[0],list_tmp[1],list_tmp[2],list_tmp[3]) )
        except:
            cmd_stat='%s,%s,%s,%s,%s,%s,%s' % (s_time,e_time,i,'error','error','error','error'+os.linesep)
            fle.write(cmd_stat)
            db_curs.execute("INSERT INTO bak_stat (date_ymd,s_time,e_time,mod_name,a_error) VALUES('%s','%s','%s','%s','error')" % (now,s_time,e_time,i) )
#try...except,异常处理
    db_curs.close()
    db_conn.close()
    fle.close()
#关闭数据库连接,关闭文件连接

if __name__ == '__main__':
    write_title(log22)
    write_notes(dict_mon,log22)
#    write_notes(dict_mon,log22,8770)

 

阅读(1532) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~