自动运维.用PYTHON生成设备端固件升级指定目录结构?

具体要求:

  1. 过滤出当前目录下所有.zip和.bin固件程序

  2. 分析固件名获取固件日期/固件DevID/固件名,获取成功失败列表

  3. 创建并将固件放入指定目录结构,格式化打印固件信息

代码实现:

# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://my.oschina.net/pydevops/
# Purpose:
#
"""
import os
import re
import glob
import json
import pprint
import shutil
import zipfile
import datetime
import blessings


def file_filter(dir_path, filters=['*.zip', '*.bin']):
    """Filter zip or bin file.

    Args:
        dir_path: dirname, default current dir
        filters : default filter zip or bin file
    Returns:
        list
    """
    file_list = []
    for cur_filter in filters:
        for cur_file in glob.iglob(cur_filter):
            file_path = os.path.join(dir_path, cur_file)
            file_list.append(file_path)
    return file_list

def file_analysis(file_list):
    """Analysis file (file_devid, file_date, file_name)

    Args:
        file_list: zip or bin file list
    Returns:
        list
    """
    suc_list = []
    err_list = []
    # 获取DevID
    file_devid = None
    for cur_file in file_list:
        file_unzip = zipfile.ZipFile(cur_file, 'r')
        for cur_name in file_unzip.namelist():
            if cur_name == 'InstallDesc':
                cur_data = file_unzip.read(cur_name)
                if 'DevID' in cur_data:
                    file_devid = json.loads(cur_data)['DevID']
                break

        # 获取date
        file_date = re.search(r'''(?<=\.)
                                  (?P<date>[0-9]+)
                                  (?=_ALL\.bin|_ALL\.zip)''', cur_file, re.X)
        if file_date:
            file_date = file_date.groupdict()['date']
            file_date = '-'.join([file_date[:4], file_date[4:6], file_date[6:]])

        if all([file_devid, file_date, cur_file]) and len(file_devid) == 24:
            file_devid = convert_devid(file_devid)
            suc_list.append([file_devid, file_date, cur_file])
        else:
            err_list.append([file_devid, file_date, cur_file])

    return  suc_list, err_list

def convert_devid(file_devid):
    """Convert devid in InstallDesc file.

    Args:
        file_devid: DevID in InstallDesc file.
    Returns:
        str
    """
    convert_res = None
    if file_devid[5] < '5':
        convert_res = file_devid[:8] + \
                      'X'*11 + file_devid[19:]
    else:
        convert_res = file_devid[:8] + \
                      file_devid[8:13].replace('2', '0').replace('3', '1') + \
                      '0'*4 + file_devid[17:]
    return convert_res

def format_show(rets_list):
    """Formated result

    Args:
        rets_list:
    Returns:
        str
    """
    screen_width = int(TERMINAL.width)
    date_width = 15
    devid_width = 25
    file_width = screen_width - date_width - devid_width
    comm_format = '%-*s%-*s%*s'

    print comm_format % (date_width, 'Date', file_width,
                         'Name', devid_width, 'DevID')
    print '='*screen_width
    for cur_item in rets_list:
        if not cur_item[0]:
            comm_format = '\033[31;40m%-*s%-*s%*s\033[0m'
        file_name = os.path.basename(cur_item[-1])
        file_name = '_'.join(file_name.split('_')[3:])
        print comm_format % (date_width, cur_item[1],
                             file_width, file_name,
                             devid_width, cur_item[0])

def create_files(bin_file, dev_id, file_date):
    """Create files for bin or zip files.

    Args:
        bin_file : bin or zip file
        dev_id   : 24 bits devid in file
        file_date: file datetime
    Returns:
        None
    """
    create_files = ['Level_0.dat',
                    'ChangeLog_Chinese.dat',
                    'ChangeLog_English.dat']
    cur_dir = os.path.dirname(bin_file)
    dev_dir = os.path.join(cur_dir, dev_id)
    dat_dir = os.path.join(dev_dir, file_date)
    if os.path.exists(dev_dir):
        shutil.rmtree(dev_dir)
    os.makedirs(dat_dir)
    shutil.move(bin_file, dat_dir)
    for cur_file in create_files:
        cur_file = os.path.join(dat_dir, cur_file)
        with open(cur_file, 'w+b') as whandler:
            whandler.write('\x00')

def main():
    """Main function."""
    dir_path = os.getcwd()
    file_list = file_filter(dir_path)
    rets_list = file_analysis(file_list)

    success_list = rets_list[0]
    faileds_list = rets_list[1]

    if success_list:
        print 'Success:'
        for cur_item in success_list:
            create_files(cur_item[-1],
                         cur_item[0],
                         cur_item[1])
        format_show(success_list)
    if faileds_list:
        print 'Faileds:'
        format_show(faileds_list)

if __name__ == '__main__':
    TERMINAL = blessings.Terminal()
    main()

有图有像:

自动运维.用PYTHON生成设备端固件升级指定目录结构?_第1张图片

你可能感兴趣的:(自动运维.用PYTHON生成设备端固件升级指定目录结构?)