示例#1
0
    def unzip(self):
        """
        解压
        :return:
        """
        responder = Responder(
            pattern=r".*",
            response="A\n",
        )
        cli.info("unzip {} -d {}".format(path.join(self.zip_process_path,
                                                   self.zipfile_newname),
                                         self.zip_process_path))
        result = self.local_connection.local("unzip {} -d {}".format(path.join(self.zip_process_path,
                                                                               self.zipfile_newname),
                                                                     self.zip_process_path),
                                             pty=True)  # type:Result
        # if result.ok:
        #     cli.info("解压完成")
        # elif result.failed:
        #     cli.error("解压出错了")
        #     cli.error(result.stderr + "\n")
        #     exit(result.return_code)

        # 压缩包解压后的名字按命名规范重命名
        cli.info("mv {} {}".format(path.join(self.zip_process_path, self.zipfile_root_foldername),
                                   path.join(self.zip_process_path, self.zipfile_newname[:-4])
                                   ))
        self.local_connection.local("mv {} {}".format(path.join(self.zip_process_path, self.zipfile_root_foldername),
                                                      path.join(self.zip_process_path, self.zipfile_newname)[:-4]
                                                      ))
示例#2
0
def mv_unzip_analysis(file_path: str):
    """
        针对ftp上传的zip文件进行,移动、解压、包分析
    """

    if not path.isfile(file_path) or not file_path.endswith(".zip"):
        cli.error(
            "{} 不是文件 or 不是 zip 压缩文件,请传入需要处理的 zip 压缩包的路径".format(file_path))
        exit()

    file_path = path.abspath(file_path)

    helper = FtpServerHelperStep1(file_path)

    # 开始任务
    cli.warning("Task Start...")
    helper.ls_lah(helper.zipfile_path)

    # 0. 分析路径获取相关信息
    helper.show_zipfile_info()

    # 1. 挪动文件到 Configs['ftp_data_tmp'] 下,为了避免文件名不规范导致数据丢失,给文件重新起名
    helper.mv()
    helper.show_tree()

    # 2. 解压
    helper.unzip()

    # 3. 进行包分析,修复,生成excel
    cli.info("正在针对解压后的目录进行数据解密,数据清洗工作")
    helper.package_analysis()

    # 完成
    cli.warning("Task Finished!")
示例#3
0
    def compress_folder(self):
        # 检测压缩存放目录是否存在,不存在则创建
        if not path.exists(self.tar_path):
            os.makedirs(self.tar_path, exist_ok=True)  # 不存在则新建,存在则不管

        command = "tar -zcf {}.tar.gz {} ".format(self.tar_name, self.packages_folder_path)
        cli.info(command)
        self.local_connection.local(command)
    def send_mail(self, is_result_write_file=False, is_package_info_write_excel_file=False):
        """
        运行完程序以后运行结果和附件以邮件方式发送发出通知
        :param bool is_result_write_file: cli 运行是否选择运行结果写入文件
        :param bool is_package_info_write_excel_file: cli 是否选择生成excel
        :return:
        """
        # 因处理结束时全局正常不正常列表还没更新 所以临时先放这块代码,后期优化
        all_packages = (self.normal_packages + self.abnormal_packages)
        print_normal_list = []
        print_abnormal_list = []

        for package in all_packages:
            if package.is_normal_package:
                print_normal_list.append(package.get_formatted_package_info())
            elif not package.is_normal_package:
                print_abnormal_list.append(package.get_formatted_abnormal_reason())

        # 1. 邮件正文
        cli.info("正在生成邮件内容")
        content = "主人主人,我处理了 {packages_path} 目录下的所有包,结果放邮件正文,你快看快看,嘻嘻嘻.\n\n\n " \
                  "总结果为: 正常: {normal_count} , 不正常: {unnormal_count}  \n \n \n {result} \n \n \n".format(
            packages_path=self.packages_path,
            normal_count=str(len(print_normal_list)),
            unnormal_count=str(len(print_abnormal_list)),
            result=self.run_result_str()
        )
        # 2.附件
        attechments = []
        if is_result_write_file:
            spl_path = path.split(self.packages_path.rstrip("/"))
            result_file_full_path = path.join(
                spl_path[0],
                spl_path[1] + "_" + self.result_txt_filename
            )

            attechments.append(result_file_full_path)

        if is_package_info_write_excel_file:
            spl_path = path.split(self.packages_path.rstrip("/"))
            excel_file_full_path = path.join(
                spl_path[0],
                spl_path[1] + "_" + self.package_info_excel_filename
            )

            attechments.append(excel_file_full_path)

        # 3. 发送邮件
        mail_controller = SendMailController(receivers=["*****@*****.**"])
        mail_controller.send_mail_with_attachment(
            sub="【自动化】【包处理助手】包分析脚本运行结果",
            content=content,
            attachment=attechments
        )
示例#5
0
def src_exist_on_dst_packages(src, dst):
    """
    获取目标中已经存在的源包列表 \n
    """
    pass
    src = src if path.isabs(src) else path.abspath(src)
    dst = dst if path.isabs(dst) else path.abspath(dst)

    if not path.exists(src) or not path.exists(dst):
        info = "源和目标目录必须得存在 %s %s %s" % (src, "__" * 5, dst)
        cli.error(info)
        return

    diff_packages = [sp for sp in os.listdir(src) if path.exists(path.join(dst, sp))]

    cli.info(str(diff_packages))
示例#6
0
    def upload_2_weiruan(self):
        """
        上传到微软服务器的逻辑
        :return:
        """
        #[email protected] 因这种登录方式不便于使用服务器改动,也不想读配置文件
        #此处的ssh 信息将应该是~/.ssh/config中配置好然后直接使用它的host
        command = "rsync -avz --progress {} SurfingtechProductionServer:{}".format(
            path.join(data_sync_backup_path(),
                      self.packages_folder_info.project_code,
                      self.tar_name + ".tar.gz"),
            "/SurfingDataDisk/ftpserver_synchronize_folder"
        )
        cli.info(command)

        self.local_connection.local(command)
    def result_echo_no_via_pager(self):
        """
        不使用click的echo_via_pager 输出运行结果
        :return:
        """
        all_packages = (self.normal_packages + self.abnormal_packages)
        print_normal_list = []
        print_abnormal_list = []
        for package in all_packages:
            if package.is_normal_package:
                print_normal_list.append(package.get_formatted_package_info())
            elif not package.is_normal_package:
                print_abnormal_list.append(package.get_formatted_abnormal_reason())

        cli.info("\n".join(print_normal_list))

        cli.error("\n".join(print_abnormal_list))
示例#8
0
def get_package_metadata_info(packages_path, keys):
    """
     读取每个包中任意一个metadata 获取给定key列表,count(keys) >=1
    """
    if not path.isabs(packages_path):
        packages_path = (path.abspath(packages_path)).rstrip("//")

    if not len(keys) > 0:
        cli.error("Warning:keys 必须得有一个")
        return

    cli.warning("Task Starting...")

    for package in os.listdir(packages_path):
        package_path = path.join(packages_path, package)
        key_values = get_package_metadata_file_con_by_key(package_path, keys)
        cli.info("%s 包 %s" % (package, str(key_values)))
    cli.warning("Task Finish!")
def fix_wrong_packagename_files(packages_path):
    """
    包中错误包名文件修改成当前包名,文件格式实例: 2017001P00012a1234.wav|txt
    """
    """
    :param packages_path:
    :return:
    """
    cli.info("Task starting...")
    assistant_controller = PackageAssistantController(packages_path)
    assistant_controller.do_analysis()

    package_models = assistant_controller.abnormal_packages

    script_info = []
    for package_model in package_models:
        for wrong_file in package_model.wrong_package_files:
            file_full_path = path.join(package_model.package_path, wrong_file)
            package_name_start_point = wrong_file.find("P")
            package_name_end_point = wrong_file.find(
                "i") if "i" in wrong_file else wrong_file.find("a")
            file_package_name = wrong_file[
                package_name_start_point:package_name_end_point]
            # if len(file_package_name) == 0 or len(file_package_name) > 6:  # P00474 包名一般6位
            #     cli.error("推算文件包名有误,暂无处理,请核对。file:%s" % file_full_path)
            #     continue
            script_info.append("%s 文件被修改包名,原:%s,新:%s" %
                               (file_full_path, file_package_name,
                                package_model.package_name))

            # 替换包名
            file_new_full_path = path.join(
                package_model.package_path,
                wrong_file.replace(file_package_name,
                                   package_model.package_name))
            os.rename(file_full_path, file_new_full_path)
    if len(script_info) > 0:
        cli.warning("\n".join(script_info))

    cli.info("Task finished!")
示例#10
0
    def package_analysis(self):
        # 最后一个 ''字符拼接必须得有,后期调整逻辑
        packages_folder = path.join(self.zip_process_path, self.zipfile_newname[:-4])
        cli.info("分析目录:{}".format(packages_folder))

        assistant_controller = PackageAssistantController(packages_folder)
        assistant_controller.do_analysis()

        # wav 目录下的文件移到wav同级目录下
        assistant_controller.replace_folder_wav_files()

        # 删除 包中出现的 m4a mp3 temp 目录
        assistant_controller.delete_unknown_folders()

        # 删除后缀 skip、sk、pk等文件
        assistant_controller.delete_unknown_suffix_file()

        # .u后缀文件rename
        assistant_controller.rename_endswith_u_file()

        # 删除重复录制产生的 xxx_1.wav xxx_2.wav 这种文件
        assistant_controller.delete_duplicated_underline_number_file()

        # 解密被加密的文件
        assistant_controller.decrypt_endswith_enc_file()

        # 删除没有对应音频的txt
        assistant_controller.delete_single_txt()

        # 输出结果,生成excel 和 运行结果文件
        assistant_controller.result_echo_no_via_pager()
        assistant_controller.result_write_2_file()
        assistant_controller.package_info_write_to_excel()

        # 发送邮件通知
        assistant_controller.send_mail(True, True)
示例#11
0
def package_assistant(packages_path, result_send_mail, result_write_file,
                      result_echo_via_pager, package_info_write_excel_file,
                      delete_unknown_folder, replace_folder_wav_files,
                      rename_endswith_u_file,
                      delete_duplicated_underline_number_file,
                      delete_unknown_suffix_file, decrypt_endswith_enc_file,
                      delete_single_txt, quiet, auto_clean):
    """
        命令:包助理。
        用于:包分析,包清理等等
    """

    if not path.isabs(packages_path):  # 路径转绝对路径
        cli.warning("程序按照给定的相对路径: %s 进行处理" % packages_path)
        packages_path = path.abspath(packages_path)

    # 清除目录最后一个斜杠
    packages_path = packages_path.rstrip("//")

    cli.info("Task Starting...")

    assistant_controller = PackageAssistantController(packages_path)
    assistant_controller.do_analysis()

    if auto_clean:
        # 1. wav 目录下的文件移到wav同级目录下
        replace_folder_wav_files = True
        # 2. 删除 包中出现的 m4a mp3 temp 目录
        delete_unknown_folder = True
        # 3. 删除后缀 skip、sk、pk等文件
        delete_unknown_suffix_file = True
        # 4. .u后缀文件rename
        rename_endswith_u_file = True
        # 5. 删除重复录制产生的 xxx_1.wav xxx_2.wav 这种文件
        delete_duplicated_underline_number_file = True
        # 6. 解密被加密的文件
        decrypt_endswith_enc_file = True
        # 7. 删除没有对应音频的txt
        delete_single_txt = True

    # wav 目录下的文件移到wav同级目录下
    if replace_folder_wav_files:
        assistant_controller.replace_folder_wav_files()

    # 删除 包中出现的 m4a mp3 temp 目录
    if delete_unknown_folder:
        assistant_controller.delete_unknown_folders()

    # 删除后缀 skip、sk、pk等文件
    if delete_unknown_suffix_file:
        assistant_controller.delete_unknown_suffix_file()

    # .u后缀文件rename
    if rename_endswith_u_file:
        assistant_controller.rename_endswith_u_file()

    # 删除重复录制产生的 xxx_1.wav xxx_2.wav 这种文件
    if delete_duplicated_underline_number_file:
        assistant_controller.delete_duplicated_underline_number_file()

    # 解密被加密的文件
    if decrypt_endswith_enc_file:
        assistant_controller.decrypt_endswith_enc_file()

    # 删除没有对应音频的txt
    if delete_single_txt:
        assistant_controller.delete_single_txt()

    # 是否静默运行
    if not quiet:
        # 运行结果是否分页显示
        if result_echo_via_pager:
            assistant_controller.result_echo_via_pager()
        else:
            assistant_controller.result_echo_no_via_pager()

    # 运行结果是否写入文件
    if result_write_file:
        assistant_controller.result_write_2_file()

    # 生成package_info的excel文件
    if package_info_write_excel_file:
        assistant_controller.package_info_write_to_excel()

    # 运行结果以及附件发送邮件
    if result_send_mail:
        # 1. 判断是否写入了文件,没写入不用带附件
        # 2. 判断是否生成了excel,没生成过的话不用带附件
        assistant_controller.send_mail(result_write_file,
                                       package_info_write_excel_file)

    cli.info("Task Finish!")
示例#12
0
    def send_mail(self,
                  sub,
                  content,
                  sender=None,
                  receivers=None,
                  cc=None,
                  attachment=[]):
        """
        :param str sub:  标题
        :param str content: 邮件正文
        :param str sender: 发邮件人邮箱
        :param list receivers: 接受邮件人列表
        :param list cc: 抄送人列表
        :return None:
        """
        if sender is not None:
            self.sender = sender
        if receivers is not None:
            self.receivers.extend(receivers)
        if cc is not None:
            self.cc.extend(cc)

        assert len(self.receivers) != 0, "收件人不能 None"
        cli.info("开始发送邮件了")

        msg = MIMEMultipart()
        msg['Subject'] = sub
        msg['From'] = self.sender
        msg['To'] = ";".join(self.receivers)
        msg["cc"] = ";".join(self.cc)
        msg.attach(MIMEText(content))

        # 循环附件列表,添加每一个附件
        if len(attachment) > 0:
            for path in attachment:
                assert os.path.exists(path) and os.path.isfile(
                    path), "附件文件不存在或者不是文件"

                file_name = path.split("/")[-1]
                part = MIMEApplication(open(path, 'rb').read())
                part.add_header('Content-Disposition',
                                'attachment',
                                filename=file_name)
                msg.attach(part)

        s = smtplib.SMTP()
        try:
            s.connect(self.smtpserver)  # 连接smtp服务器
            s.login(self.user, self.password)  # 登陆服务器
            s.sendmail(self.sender, self.receivers + self.cc,
                       msg.as_string())  # 发送邮件

            cli.info("邮件发送成功")
            return True

        except Exception as e:
            cli.warning("邮件发送失败")
            print(e)
            print(self)
            return False
        finally:
            s.close()
示例#13
0
def main():
    """
    Initialise un jeu de scrabble et joue toute la partie.
    
    Arguments : /
    Valeur de retour : /
    """
    # initialisation des variables
    Dico = chargerDico("assets/french.dic")
    multiplicateurs = chargerMultiplicateurs("assets/multiplicateurs")
    Plateau = plateau.init(multiplicateurs)
    lettres = chargerLettres("assets/french.let")
    valeurs = chargerValeurs(lettres)
    Sac = sac.init(lettres)
    joueurs = []

    nbreJoueurs = cli.demanderJoueur()
    for i in range(nbreJoueurs):
        joueurs.append(joueur.init(Sac))
    manche = 0
    # boucle = manche (tour de plateau)
    while len(Sac) > 0:
        manche += 1
        cli.info("Manche numéro " + str(manche))
        # Boucle pour chaque joueur
        for i in range(int(nbreJoueurs)):
            if len(Sac) == 0:
                break
            cli.afficher(Plateau)
            cli.info("C'est au tour du joueur " + str(i + 1))
            chevalet = joueurs[i][0]
            cli.afficherChevalet(chevalet)
            points = 0
            tourFini = False
            while not tourFini:
                mot = cli.demanderMot()
                if mot == False:  # Si le joueur veut jeter une lettre
                    # Valeur non alphabétique et non vide
                    # pour rentrer dans la boucle min. 1 fois
                    delete = "%"
                    # Tant que le joueur veut jeter des lettres
                    while delete != "":
                        delete = cli.demanderJeter()
                        if delete in chevalet:
                            cli.info("Vous jetez la lettre " + delete)
                            chevalet.remove(delete)
                            joueur.remplirChevalet(chevalet, Sac)
                        else:
                            cli.info(
                                "Vous n'avez pas cette lettre,\
veuillez recommencer."
                            )
                    tourFini = True  # Quand le joueur ne veut plus jeter
                    # de lettres, on finit le tour
                else:  # Si je joueur a rentré un mot
                    posx = int(cli.demanderCoord("ligne"))
                    posy = int(cli.demanderCoord("colonne"))
                    dir = int(cli.demanderDirection())
                    points = plateau.placer(Plateau, mot, (posx, posy), dir, Dico, joueurs[i][0], valeurs)
                    if not points == False:  # Si le mot a été placé
                        joueur.ajouterPoints(points, joueurs[i])
                        joueur.remplirChevalet(chevalet, Sac)
                        tourFini = True
                    else:
                        cli.info("Vous vous êtes trompé, veuillez recommencer.")
            # Fin du tour
            cli.info("Nombre de points gagnés : " + str(points))
            cli.info("Joueur " + str(i + 1) + " : " + str(joueurs[i][1]) + " points.")
    # Fin du jeu
    cli.afficher(Plateau)
    cli.info("Il n'y a plus de lettre dans le sac ! Le jeu est fini.")
    gagnant = joueur.gagnant(joueurs)
    cli.info("Le gagnant est le joueur " + str(gagnant + 1) + " avec " + str(joueurs[gagnant][1]) + " points.")
示例#14
0
 def show_zipfile_info(self):
     """
     分析给定的ftp上传目录,获取相关的项目代号,外包代号,ftp id 等信息
     :return:
     """
     cli.info(str(self.ftp_info))
示例#15
0
 def ls_lah(self, file_path):
     cli.info("ls -lah {}".format(file_path))
     self.local_connection.local("ls -lah {}".format(file_path))