文档章节

sw_tools_check.py

xxjbs001
 xxjbs001
发布于 2014/06/09 15:35
字数 1227
阅读 14
收藏 0
#!/usr/bin/env python
#coding=utf-8
import csv
import csvtodic
from csvtodic import csvtodictlist,dictlisttocsv
from optparse import OptionParser
from optparse import OptionGroup
import logging
from pprint import pprint
from pprint import pformat
import syslog
import subprocess
import signal
import time
import select
import commands
import os
import sys


def subproc(cmd, timeout=3600,mute=True) :
        """
        subprogress to run command
        """
        rc = None
        output = ''
        #
        #print('subproc : ' + cmd)
        if not mute : print('timout : ' + str(timeout))
        try :
            #
            p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True, shell=True)
            pi, po, pe = p.stdin, p.stdout, p.stderr
            while_begin = time.time()
            while True :
                to = 600
                fs = select.select([p.stdout, p.stderr], [], [], to)
                #if p.poll() : break
                #print '.....',
                if p.stdout in fs[0]:
                    #print '---xxxifs0:',fs[0]
                    tmp = p.stdout.readline()
                    if tmp :
                        output += tmp
                        #print(tmp)
                        #if not mute : print(tmp)
                    else :
                        #print '---end'
                        #print time.time()
                        while None == p.poll() : pass
                        break
                elif p.stderr in fs[0]:
                    #print "!!!!!!!!!!!!!!!"
                    tmp = p.stderr.readline()
                    if tmp :
                        output += tmp
                        #plogger.error(tmp)
                    else :
                        #print 'end'
                        #print time.time()
                        while None == p.poll() : pass
                        break
                else:
                    #print 'Timeout'
                    #os.system('ps -f')
                    s = os.popen('ps -f| grep -v grep |grep sleep').read()

                    if len(s.strip()) :
                        print('No output in sleep : ' + s)
                        continue

                    print('Timeout ' + str(to) + ' seconds without any output!')
                    print(os.popen('ps -p ' + str(p.pid)).read())
                    p.kill()

                    #os.kill(p.pid, signal.SIGKILL)
                    break
                #timeout = timeout - (time.time() - while_begin)
                # Check the total timeout
                dur = time.time() - while_begin
                if dur > timeout :
                    print('The subprocess is timeout more than ' + str(timeout))
                    break
            # return
            rc = p.poll()
            # close all fds
            p.stdin.close()
            p.stdout.close()
            p.stderr.close()
            #print('return value : ' + str(rc))

        except Exception, e :
            print('Exception : ' + str(e))
            #rc = False
        return rc, output


 
def sw_online(dic, online_flag ) : 
    if online_flag == 'online':
       if dic["cmd_install_online"] == '':
          print( '%s have no online install command' % (str(dic["description"])))
       else:   
          cmd_install = dic["cmd_install_online"].splitlines()
          #print ('%s installing latest version online !!' % (str(dic["description"])))
          i = 0 
          for h in cmd_install:
              install_code,install_output =  subproc(h)
              if install_code != 0: 
                     print ('%s install failed:%s' % (str(dic["description"]),str (install_output)))
                     i+=1
          if i == 0 :               
             print( '%s online install success!!' % (str(dic["description"])))

def sw_offline(dic, online_flag, pk_path, cmdlist ) : 
    if online_flag == 'offline':
       if dic["cmd_install_offline"] == '':
          print( '%s have no offline install command' % (str(dic["description"])))
          cmdlist.append(dic["description"]) 
       elif pk_path == '':
          print( '%s have no offline packet dir! ' % (str(dic["description"])))
       else:   
            #pk_path = 'cd ' + pk_path
           # print'pk_path is: ', pk_path
            if 'all' not in pk_path :
                pk_path = pk_path+'/'+'all'
            os.chdir(pk_path)
            dir = os.getcwd()
            #print 'dir1 is :',dir
            if dir != pk_path :
               print( '%s cd  packet dir error : %s! ' % ((str(dic["description"]), str(pk_path))))
            cmd_install = dic["cmd_install_offline"].splitlines()
           # print ('%s installing offline !!' % (str(dic["description"])))
            j = 0 
            #s = 'already installed'
            str_cd = 'cd'
            for h in cmd_install:
                  new_str = str(h)
                  if str_cd in new_str:
                   # print 'dir is :',dir  
                    new_path = dir + '/'+new_str[3:] 
                    #print "new_path is:", new_path     
                    os.chdir(new_path)  
                    new_dir = os.getcwd()
                    #print 'new_dir is :',new_dir  
                  else:
                    install_code,install_output =  subproc(h)
                    #print 'install code is :' ,install_code
                    #stri = str (install_output)
                    if install_code != 0: 
                       #if s not in stri :
                          print ('%s install failed:%s' % (str(dic["description"]),str (install_output)))
                          j +=1
            if j == 0 :
               print( '%s offline install success!!' % (str(dic["description"])))
               os.chdir(pk_path)
               dir = os.getcwd()
               #print 'dir2 is :',dir

def main() :
    """
    """
    lie = []
    sys_argv = len(sys.argv)
    #print 'sys_argv:',sys_argv
    if sys_argv==1:
       path = 'software_checking.csv'
       online = None
       pk_path = None
       check_flag = 'check'     
       print 'checking software ,wait a moment!'
       
    elif sys.argv[1] =='--with-version':
       path = 'software_checking.csv'
       online = None
       pk_path = None
       check_flag ='version'
    elif sys.argv[1] =='--force-install-online':
       path = 'software_checking.csv'
       online = 'online'
       pk_path = None
       check_flag ='version'
    elif sys.argv[1] =='--force-install-offline':
       path = 'software_checking.csv'
       online = 'offline'
       pk_path = os.getcwd()
       check_flag ='version'
    elif sys.argv[1] =='--install-online':
       path = 'software_checking.csv'
       online = None
       pk_path = None
       check_flag ='not_version'
    elif sys.argv[1] =='--install-offline':
       path = 'software_checking.csv'
       online = None
       pk_path = None
       #pk_path = os.getcwd()
       check_flag ='not_version'
    elif sys.argv[1] !='':
         
       print 'need add parameter!\none of them: \n--with-version:check tools verison \n--force-install-online: not check tools force install online\n--force-install-offline:not check tools force install offline\n--install-online: check tools ,if not exist, install online\n--install-offline:check tools ,if not exist, install offline\n if have no parameter , check tools not exits'
       return 0
    csvtodictlist(lie,path)
    #READ_ONLY = (select.POLLIN | select.POLLPRI | select.POLLHUP | select.POLLERR)
    #p=select.poll()
    #p.register(li,READ_ONLY)
    #result = p.poll()
    #if result == 0:
     #  print'...',
        
    #copy file to need dir cp -r i386/* /var/cache/yum/i386/
    copy_cmd ='cp -r all/i386/* /var/cache/yum/i386/'
    copy_code, copy_output =  subproc(copy_cmd)
    if copy_code !=0 :
       print 'copy dir error!!!:',copy_output
       return 0
    m = 0
    error =0
    warnning = 0
    disable  = 0
    errorlist = []
    warnninglist = []
    offcmdlist = []
    disablelist = []
    rtype = []
    otype = []
    dtype = []
    while m<len(lie):
          if lie[m]["status"] == 'required':
             sw_online(lie[m], online )
             sw_offline(lie[m], online, pk_path,offcmdlist) 
             #print lie[m]["status"]
             #print ".....",
             check_code, check_output =  subproc(lie[m]["cmd_check"])
 	     if lie[m]["cmd_version"] != '' and lie[m]["description"] != '' and check_code == 0 :	  
                 version_code,version_output =  subproc(lie[m]["cmd_version"])
                 if version_code != 0:
                    print lie[m]["description"],
                    print 'Version get error!'
                    print 'version_code is :',version_code
                    print 'version_output is :', version_output
                 elif version_code == 0:
                        # if version_output == lie[m]["expect_version"]:
                          if check_flag != 'check' and check_flag != 'not_version':
                            print lie[m]["description"],
                            print ('type:%s ,version:%s' % (str(lie[m]["type"]),str(version_output)))
             if lie[m]["cmd_version"] == '':
                if check_flag != 'check' and check_flag != 'not_version':
                   print lie[m]["description"],
                   print ('type:%s, Not find version command!\n' %(str(lie[m]["type"])))     
             if check_code != 0:
                               
               if  sys_argv != 1 and sys.argv[1] =='--install-online':
                  print('%s not exist , install online'% (str(lie[m]["description"])))
                  str_online = 'online'
                  sw_online(lie[m], str_online )
               elif sys_argv != 1 and sys.argv[1] =='--install-offline':
                  print('%s not exist , install offline'% (str(lie[m]["description"])))
                  str_online = 'offline'
                  pk_path = os.getcwd()
                  sw_offline(lie[m], str_online, pk_path,offcmdlist)
               else :    
                  error+=1
                  errorlist.append(lie[m]["description"])
                  rtype.append(lie[m]["type"])

          if lie[m]["status"] == 'optional':
             sw_online(lie[m], online )
             sw_offline(lie[m], online, pk_path, offcmdlist ) 
             #print ".....",
             check_code, check_output =  subproc(lie[m]["cmd_check"])
 	     if lie[m]["cmd_version"] != '' and lie[m]["description"] != '' and check_code == 0 :	  
                 version_code,version_output =  subproc(lie[m]["cmd_version"])
                 if version_code != 0:
                    print lie[m]["description"],
                    print 'Version get error!'
                 elif version_code == 0:
                           if check_flag != 'check' and check_flag != 'not_version':
                               print lie[m]["description"],
                               print ('type:%s , version:%s' % (str(lie[m]["type"]),str(version_output)))
                               #print 'current version is:', version_output
                            #print 'version_code is :',version_code
             if lie[m]["cmd_version"] == '':
                if check_flag != 'check' and check_flag != 'not_version' :
                   print lie[m]["description"],
                   print ('type:%s , Not find  version command!\n' %(str(lie[m]["type"])))     
                   #print 'not find get Version command'      
             if check_code != 0:
               if sys_argv != 1 and  sys.argv[1] =='--install-online':
                  print('%s not exist , install online'% (str( lie[m]["cmd_version"])))
                  str_online = 'online'
                  sw_online(lie[m], str_online )
               elif sys_argv !=1 and  sys.argv[1] =='--install-offline':
                  print('%s not exist , install offline'% (str(lie[m]["cmd_version"])))
                  str_online = 'offline'
                  pk_path = os.getcwd()
                  sw_offline(lie[m], str_online, pk_path,offcmdlist)
               else :    
                  warnning+=1
                  warnninglist.append(lie[m]["description"])
                  otype.append(lie[m]["type"])

          if lie[m]["status"] == 'disabled':
              sw_online(lie[m], online )
              disable+=1
              disablelist.append(lie[m]["description"])
              dtype.append(lie[m]["type"])
          m+=1
    if check_flag == 'check':
      l = 0     
      print '\nRequired software not find:' ,error
      if len(errorlist)==0 :
          print ('All required software are installed')
      while l<len(errorlist): 
           print ('Type:%s  Name:%s'% (str(rtype[l]),str( errorlist[l])))
           l+=1
      k = 0
      print 'Optional software not find  :' ,warnning
      if len(warnninglist)==0 :
	  print ('All optional software are installed')
      while k<len(warnninglist): 
           print ('Type:%s Name: %s'% (str(otype[k]),str( warnninglist[k])))
           k+=1
      n = 0
      print 'Disabled software :' ,disable
      if len(disablelist)==0 :
          print ('There is no disabled tools')
      while n<len(disablelist):
           print ('Type:%s  Name:%s'% (str(dtype[n]),str( disablelist[n])))
           #print disablelist[n],                           
           n+=1
    else :
       return 0    

							
if __name__=="__main__":
    main()




© 著作权归作者所有

共有 人打赏支持
xxjbs001
粉丝 55
博文 749
码字总数 215621
作品 0
浦东
QA/测试工程师
私信 提问
服务端测试环境hosts配置检查脚本

[本文出自天外归云的博客园] 问题 由于A测试环境和B测试环境相互耦合,B测试环境切换导致我方测试环境需要更改后台服务器的响应配置。若多台服务器中有一台服务器没有更改配置,则在测试过程...

天外归云
2017/09/14
0
0
招高级PHY Layer软件工程师

帮公司(瞬联)内部推荐的职位,地点在北京,3月31号前有效。薪水9K起吧,关键在能力、工作经验并与HR谈,没听说过低的。我在公司的体会是,各方面比较正规,HR帮办理各种证明、福利啥的很有...

yuhonglei4025
2011/02/04
454
2
外企公司招聘Senior Symbian Engineer based in Beijing

Title: Senior Symbian Engineer Lcoation: Beijing, China Position description: Work within a Symbian/S60 product/platform program in the areas of analysis, design, implementation......

Angela WANG
2009/11/16
299
0
何朝威/zscat_sw

springboot dubbo redis solr mq kafka 商城 blog cms 单机版商城 http://git.oschina.net/JiaGou-XiaoGe/payshop jeeplus单机版商城 https://gitee.com/JiaGou-XiaoGe/jeeplusBanDuoShangJi......

何朝威
2017/10/23
0
0
【北京】Lloyd Morgan猎头代芬兰无线通信公司招聘手机软件底层和中间层开发职位

芬兰公司,业务无线通信领域。北京研发中心现在扩展业务,招聘若干做手机底层和中间层软件开发的技术人才。 两个职位不限于某种开发平台,涉及到的有Symbian, Android, Windows Phone,任何一...

Angela WANG
2011/08/24
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

PHP生成CSV之内部换行

当我们使用PHP将采集到的文件内容保存到csv文件时,往往需要将采集内容进行二次过滤处理才能得到需要的内容。比如网页中的换行符,空格符等等。 对于空格等处理起来都比较简单,这里我们单独...

豆花饭烧土豆
今天
2
0
使用 mjml 生成 thymeleaf 邮件框架模板

发邮件算是系统开发的一个基本需求了,不过搞邮件模板实在是件恶心事,估计搞过的同仁都有体会。 得支持多种客户端 支持响应式 疼彻心扉的 outlook 多数客户端只支持 inline 形式的 css 布局...

郁也风
今天
5
0
让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字

让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字: 作者:孙冬梅;以前读韩国前总统朴槿惠的著作《绝望锻炼了我》时,里面有一句话令我印象深刻,她说“在我最困难的时期,...

原创小博客
今天
4
0
JAVA-四元数类

public class Quaternion { private final double x0, x1, x2, x3; // 四元数构造函数 public Quaternion(double x0, double x1, double x2, double x3) { this.x0 = ......

Pulsar-V
今天
17
0
Xshell利用Xftp传输文件,使用pure-ftpd搭建ftp服务

Xftp传输文件 如果已经通过Xshell登录到服务器,此时可以使用快捷键ctrl+alt+f 打开Xftp并展示Xshell当前的目录,之后直接拖拽传输文件即可。 pure-ftpd搭建ftp服务 pure-ftpd要比vsftp简单,...

野雪球
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部