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] ))
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!")
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 )
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))
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))
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!")
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)
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!")
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()
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.")
def show_zipfile_info(self): """ 分析给定的ftp上传目录,获取相关的项目代号,外包代号,ftp id 等信息 :return: """ cli.info(str(self.ftp_info))
def ls_lah(self, file_path): cli.info("ls -lah {}".format(file_path)) self.local_connection.local("ls -lah {}".format(file_path))