Chinaunix首页 | 论坛 | 博客
  • 博客访问: 812914
  • 博文数量: 167
  • 博客积分: 7173
  • 博客等级: 少将
  • 技术积分: 1671
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-04 23:07
文章分类

全部博文(167)

文章存档

2018年(1)

2017年(11)

2012年(2)

2011年(27)

2010年(88)

2009年(38)

分类: Python/Ruby

2010-01-22 10:38:40

    环境需求: 本人工作环境中存在上千多台服务器,自己负责几十台每台上又分一些应用,所存在很多管理脚本、监控脚本、控制脚本等,如果自己需要升级就比较麻烦了,要发一个公告谁用了我这个脚本,要在哪里哪里拿然后怎么怎么更新(相对于项目应用、打文件是有一套更新系统的),所以为了方便自己的管理,做了一个小的版本控制程序,有:文件分发功能、文件升级功能。
   可能会问,现在有很多同步的工具啊简单的例如rsync等。就拿这个rsync来说,又要做服务端配置,又要做客户端配置。这有麻烦了,我现在做的是只在服务端进行信息的录入,服务端不用进行任何配置。
  
   简单流程是:
   
     将要更新的文件拷到服务端相应的目录->更改好文件的相应权限(因为到客户端也要保证同样的权限)->录入相关信息(要分发和同步的客户端ip,要把文件放置客户端的那个目录,定义的文件名字)
      
     核心代码:
     
#!/usr/bin/python
#Edited by Sky bin /Ashely 2010.01.22
import pexpect
import string
import os
import time
import sys
T=time.time()
timeout=30
username="sky"
passwd=""
ip=""
filename=""
filepath=""
def handle(username,passwd,ip):
   shell_cmd='ssh
   child = pexpect.spawn(shell_cmd,timeout=timeout)
   idx=child.expect(['password:','continue connecting(yes/no)?'])
   if idx==0:
     child.sendline('&10acypt')
     child.expect('$')
     child.sendline('su -')
     child.expect("Password:")
     child.sendline(passwd)
     child.expect('#')
     child.sendline('cd '+filepath)
     child.expect('#')
     child.sendline('mv -f /home/support/'+filename+' '+filepath)
     child.expect('#')
   elif idx==1:
     child.sendline('yes')
     child.close()
     handle(username,passwd,ip)
   child.close()
def handle_scp(ip,filename,usernaem):
   scp_cmd="scp src_file/"+filename+" +":."
   child = pexpect.spawn(scp_cmd)
   child.expect('.ssword:*')
   child.sendline('sky')#发送密码
   #child.interact()
   child.expect(pexpect.EOF)
   child.close()
def get_passwd(passwd,tap):
   这个是本人的root的密码转换规则这里就不贴出来了
try:
  if len(sys.argv)<5:
    print 'please input parameter:ip filename filepath passwd IP_tap'
    exit
  else:
    ip=sys.argv[1]
    filename=sys.argv[2]
    filepath=sys.argv[3]
    passwd=get_passwd(sys.argv[4],sys.argv[5])
    handle_scp(ip,filename,username)
    handle(username,passwd,ip)
except pexpect.EOF:
  print 'error'
  print '%d seconds'% int(time.time()-T)
  
 
shell调用该python的脚本代码:
 
    #!/bin/bash
#Edited by Sky bin /Ashely 2010.01.22
LIST="list"
time_inter=5
 des=""
i=0
  find src_file/ -ctime -$time_inter | awk 'BEGIN { FS="/"} {if ($2!="") print $2}' | \
  while read filename
  do
    i=$(($i+1))
    if [ $i -lt 2 ] ; then
       des="$filename"
       echo $des > /tmp/.filename
    else
       des="$des|$filename"
       echo $des > /tmp/.filename
    fi
  done
if [[ -e /tmp/.filename ]] ; then
   des=`cat /tmp/.filename`
   rm -f /tmp/.filename
   grep -E $des list | awk '{print  $1,$2,$3}'| \
   while read filepath filename ip
     do
        passwd=`echo $ip | awk 'BEGIN { FS="."} {print $4}'`
        IP_tap=`echo $ip | awk 'BEGIN { FS="."} {print $3}'`
        /usr/bin/python ssh.py $ip $filename $filepath $passwd $IP_tap
     done
fi
 
 
信息录入代码:
   
   #!/bin/bash
#Edited by Sky bin /Ashely 2010.01.22
. add_file.sh
. scan.sh
. del_file.sh
export LANG=zh_CN.gb18030
ROOT="`update.sh"
MENU="`menu_dir/menu"
MENU2="menu_dir/menu2"
#echo $ROOT
        export PS3="[Update Tool Server Mode]:"
        select item in `awk -F: '{print $1}' $MENU`
        do
               if [ $item == "EXIT" ] ; then
                  break
               elif [ $item == "FILE_INFORMATION" ] ; then
                     select itemt in `awk -F: '{print $1}' $MENU2`
                     do
                       if [ $itemt == "EXIT" ] ; then
                          exit
                       elif [ $itemt == "BACK" ] ; then
                          break
                       elif [ $itemt == "ADD_FILE_INFO" ] ; then
                          add_file
                       elif [ $itemt == "SCAN" ] ; then
                          scan
                       elif [ $itemt == "DEL_FILE_INFO" ] ; then
                          del_file
                       fi
                      done
               fi
        done
                     
function add_file(){
  echo "Please input your Client File_Path_Server filename and IP"
  read  serverfilename filename ip
  servertap=`expr length "$serverfilename"`
  filetap=`expr length "$filename"`
  iptap=`expr length "$ip"`
  if [[ $servertap -gt 1 && $filetap -gt 1 && $iptap -gt 1 ]] ; then
    tap="$(echo $ip | grep -c '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}')"
     if [ "$tap" = "0" ] ; then
        echo "你的输入是非法的IP格式"
     else
        tap=`grep "$serverfilename $filename $ip" list`
        tapnum=`expr length "$tap"`
         if [[ $tapnum -lt 1 ]] ; then
          if echo "$serverfilename $filename $ip">> list 2> /dev/null ;then
             echo "Your file infomation has been added!"
          else
             echo "Input wrong!"
          fi
         else
          echo "The information already exist"
         fi
      fi
   else
      echo "You miss something infomation!"
  fi
}
      
 
function del_file()
{
  select itemth in `cat $LIST | sed "s/ /---/g"`
   do
      del_str=`echo $itemth | sed "s/---/ /g"`
      sed -i "/$del_str/d" $LIST
      echo "Deleted the information in list!"
      break
   done
}
阅读(1101) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~