python 파일 자동 설정 & 배치 스 크 립 트

8443 단어 Python
배경:
한 항목 은 테스트 기 에 올 리 기도 하고, 정식 기 에 올 리 기도 한다.
한 번 은 환경 설정 이 잘못 되 어 하루 종일 헛수고 를 했 으 니 이 일 은 스 크 립 트 에 맡 기 는 것 이 좋 겠 다.
생각:
1. 환경 변 수 를 정규 표현 식 으로 잡 아 낸 다음 서버 에 업로드 할 환경 변수 로 수정 한 후 파일 을 다시 씁 니 다.
2. 로그, venv 등 하위 디 렉 터 리 를 버 리 고 tar 포장 을 시작 합 니 다.
3. 포 장 된 파일 의 md5 를 계산 합 니 다.
4. SFTP 프로 토 콜 로 서버 에 전송 하고 구체 적 으로 python 의 제3자 lib: paramiko 로 블 로 거들 은 스스로 클래스 패 키 지 를 썼 습 니 다.
5. 전송 후 파일 의 md5 를 계산 하고 이들 md5 보다 같 으 면 데이터 가 완전 하 다 는 것 을 설명 하 며 계속 할 수 있 습 니 다. 그렇지 않 으 면 exit.
6. 파 라 미 코 의 exec 로command () 는 서버 를 조작 하여 cmd 를 실행 할 수 있 습 니 다.
7. 그 후에 마무리 작업 을 한다. 예 를 들 어 virtualenv 를 복사 하고 슈퍼 바 이 저 를 다시 시작 하 는 등 이다.
# coding=utf-8
import os
import shutil
import time
import re
import tarfile
import hashlib

import paramiko

src_root = 'g:\\projects\\myApp\\'
des_root = 'g:\\projects\\myapp_helper\\'
linux_root = '/home/www/myapp_uploads/'

today = time.strftime('%Y-%m-%d-%H-%M', time.localtime(time.time()))
des_target = os.path.join(des_root, 'test_myapp%s\\' % today)
print u'     :', des_target


class MySSH(object):
    def __init__(self, host, username, password):
        self.host = host
        self.username = username
        self.password = password
        self.ssh_fd = None
        self.sftp_fd = None

        self.ssh_connect()
        self.sftp_open()

    def ssh_connect(self):
        try:
            print u'  SSH...'
            self.ssh_fd = paramiko.SSHClient()
            self.ssh_fd.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self.ssh_fd.connect(self.host, 22, username=self.username, password=self.password)

            stdin, stdout, stderr = self.ssh_fd.exec_command("mkdir %s" % linux_root)
            print stdout.readlines()
            print u'  SSH   ...'
        except Exception, ex:
            print 'ssh %s@%s: %s' % (self.username, self.host, ex)
            exit()

    def sftp_open(self):
        print u'  SFTP   ...'
        self.sftp_fd = self.ssh_fd.open_sftp()

    def sftp_put(self, from_path, to_path):
        '''
                      
        '''
        return self.sftp_fd.put(from_path, to_path)

    def sftp_get(self, from_path, to_path):
        '''
                      
        '''
        return self.sftp_fd.get(from_path, to_path)

    def exe(self, cmd):
        '''
                    cmd
        '''
        stdin, stdout, stderr = self.ssh_fd.exec_command(cmd)
        print u'  %s:' % cmd
        print stderr.readlines()
        if cmd.find('md5') == 0:
            return stdout.readline()

    def close(self):
        self.sftp_fd.close()
        self.ssh_fd.close()
        print u'  SSH  ...  '

    def __del__(self):
        self.close()


def copy_project():
    '''
        1、  src     des 
        2、       :discard_dirs = ['myproto', 'log', 'myapp_env', 'test', 'tmp', 'upload', '.idea', '.git']
        3、          : .gitignore, README.md
        4、      ,           ...api_status = 2
    '''
    if not os.path.exists(des_target):
        print u'     :', des_target
        os.makedirs(des_target)

    discard_dirs = ['myproto', 'log', 'myapp_env', 'test', 'tmp', 'upload', '.idea', '.git', 'uploads']

    for root, dirs, files in os.walk(src_root, topdown=False):
        t_root = root.replace(src_root, des_target)

        for dir in dirs:
            t_dir = os.path.join(t_root, dir)
            # print t_dir
            if len(list(set(t_dir.split('\\')).intersection(set(discard_dirs)))) > 0:
                continue

            if not os.path.exists(t_dir):
                print u'    ,  ...',t_dir
                os.makedirs(t_dir)
            if not os.listdir(t_dir):
                print u'    ,  ...',t_dir
                os.removedirs(t_dir)

        for file in files:
            if file.endswith('.pyc'):
                continue
            if file in ['.gitignore', 'README.md']:
                continue

            src_file = os.path.join(root, file)
            des_file = os.path.join(t_root, file)
            if len(list(set(src_file.split('\\')).intersection(set(discard_dirs)))) > 0:
                continue

            des_folder = des_file[0: -len(des_file.split('\\')[-1])]
            if not os.path.exists(des_folder):
                print u'    ,  ...',des_folder
                os.makedirs(des_folder)

            # print src_file, ' > ', des_file
            if file != 'settings.py':
                shutil.copy(src_file, des_file)
            else:
                out = open(des_file, 'w')
                datas = open(src_file, 'r')

                pattern = re.compile(r'api_status\s*=\s*\d')
                for line in datas.readlines():
                    if pattern.match(line):
                        line = 'api_status = 2
' out.write(line) datas.close() out.close() # print des_target+'log' os.mkdir(des_target+'log') os.mkdir(des_target+'uploads') def tar_project(dir_path): ''' 1、 tarfile , 。 2、 tar 。 dir_path = g:\projects\chanzai_helper\test_chanzai2016-11-22-11-09 return filename, filepath ''' # tar_name = "%s.tar.gz" % dir_path.split('\\')[-2] tar_fullpath = des_root+tar_name print u' :', tar_fullpath tar = tarfile.open(tar_fullpath, "w:gz") # for root, dirs, files in os.walk(dir_path): for file in files: fullpath = os.path.join(root, file) # print u' :', fullpath filename = fullpath.replace(des_target, '') tar.add(fullpath, arcname=filename) tar.add(des_target+'log', arcname="log/") tar.add(des_target+'uploads', arcname="uploads/") tar.close() return tar_name, tar_fullpath def CalcMD5(filepath): ''' md5, ''' with open(filepath, 'rb') as f: md5obj = hashlib.md5() md5obj.update(f.read()) hash = md5obj.hexdigest() return hash copy_project() filename, filepath = tar_project(des_target) from_md5 = CalcMD5(filepath) print u' md5 = %s' % from_md5 # shutil.rmtree(des_target) ssh = MySSH('xxx.xx.xx.xxx', 'your_name', 'your_pass') print u' :', filename ssh.sftp_put(filepath, linux_root + filename) # linux md5 cmd = "md5sum %s%s|cut -d ' ' -f1" % (linux_root, filename) to_md5 = ssh.exe(cmd) print u' md5 = %s' % to_md5 to_md5 = to_md5.strip('
') if from_md5 != to_md5: print len(from_md5), len(to_md5) print u'ERROR: ...' exit() else: print u'OK: !' # tar folder = filename.split('.')[0] cmd = 'mkdir %s%s;cd %s%s;tar -zxvf %s%s' % (linux_root, folder, linux_root, folder, linux_root, filename) ssh.exe(cmd) # linux - tar cmd = 'cd %s; rm -rf %s%s' % (linux_root, linux_root, filename) err = ssh.exe(cmd) if err: print err exit() # /home/www/myAppbak cmd = 'cd /home/www; rm -rf /home/www/myAppbak' err = ssh.exe(cmd) if err: print err exit() # cmd = 'mv /home/www/myApp /home/www/myAppbak' err = ssh.exe(cmd) if err: print err exit() cmd = 'mv %s%s /home/www/myApp' % (linux_root, folder) err = ssh.exe(cmd) if err: print err exit() # cmd = 'cp -r /home/www/myAppbak/myapp_env /home/www/myApp/myapp_env' err = ssh.exe(cmd) if err: print err exit() # supervisor cmd = 'supervisorctl restart myapp' err = ssh.exe(cmd) if err: print err exit()

좋은 웹페이지 즐겨찾기