ecs-file-master.py
要修改脚本,host为服务端ip,git的url为项目地址,要手动建好
#!/usr/bin/python3#当同一个文件更新2次时,则提交一次到线上#nohup /usr/bin/python3 -u /root/bin/ecs-file-master.py >> /var/log/ecs-file-master.log 2>&1 &from socket import *import sys, time, os, json, struct#[服务端ip-端口、临时文件位置、git位置、git项目url、push的脚本位置]host_info = (('172.16.5.4', 7777))tmp_dir = "/tmp-file"git_dir = "/ecs-file"git_url = "http://192.168.1.1/jenkins/ecs-file.git"push_script = "/root/bin/push.sh"buffsize = 1024def create_dir(file_ip, file_name):#创建目录,然后返回文件名 name_list = file_name.split('/')if len(name_list) == 2: dir_post = tmp_dir + "/" + file_ip file_post = dir_post + "/" + name_list[1]else: dir_post = tmp_dir + "/" + file_ip name_number = len(name_list) name_number = name_number - 1 i = 1while i < name_number: dir_post = dir_post + "/" + name_list[i] i = i + 1 file_post = dir_post + "/" + name_list[-1] create_bin = "mkdir -p " + dir_post os.system(create_bin)return file_postdef push_gitlab():#将代码push到gitlab上进行更新 push_bin = push_script + " " + tmp_dir + " " + git_dir + " " + git_url os.system(push_bin)def post_sock(): tcp_server = socket(AF_INET, SOCK_STREAM) tcp_server.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1) tcp_server.bind(host_info) tcp_server.listen(200) tmp_list = []while True:print('服务器启动,监听客户端链接') conn, addr = tcp_server.accept() file_ip = addr[0] head_struct = conn.recv(4) # 接收报头的长度,if head_struct:print('已连客户端,等待接收数据') head_len = struct.unpack('i', head_struct)[0] # 解析出报头的字符串大小 data = conn.recv(head_len) # 接收长度为head_len的报头内容的信息 (包含文件大小,文件名的内容) head_dir = json.loads(data.decode('utf-8')) filesize_b = head_dir['filesize_bytes'] file_name = head_dir['filename']#遇到同个文件更新第二次了2就要先发到gitlab一下 tmp_post = file_ip + file_nameif tmp_post in tmp_list: push_gitlab() tmp_list = [] file_post = create_dir(file_ip, file_name) tmp_list.append(tmp_post)print(file_post + "进行更新了")#接受真的文件内容 recv_len = 0 recv_mesg = b'' old = time.time() f = open(file_post, 'wb')while recv_len < filesize_b: percent = recv_len / filesize_bif filesize_b - recv_len > buffsize: recv_mesg = conn.recv(buffsize) f.write(recv_mesg) recv_len += len(recv_mesg)else: recv_mesg = conn.recv(filesize_b - recv_len) recv_len += len(recv_mesg) f.write(recv_mesg)print(recv_len, filesize_b) now = time.time() stamp = int(now - old)print('总共用时%ds' % stamp) f.close() conn.close() tcp_server.closel()post_sock()/root/bin/push.sh
#!/bin/bashtmp_dir=${1}git_dir=${2}git_url=${3}if [[ -d ${git_dir} ]];then rm -rf ${git_dir}ficd /git clone ${git_url}\cp -rf ${tmp_dir}/* ${git_dir}/#更新代码cd ${git_dir}git add .git commit -m "pyscript update"git push origin master#清理cd /rootrm -rf ${tmp_dir}rm -rf ${git_dir}file-slave
要修改host为服务端地址
#!/usr/bin/python#coding=utf-8from socket import *import json, commands, string, osimport sys, struct#[masterip-端口、配置文件位置]host_info = (('172.16.5.4', 7777))cfg_wei = "/tmp/ecs-file.cfg"def md5_file(file_name):#根据传入的文件名,显示md5值import hashlibwith open(file_name, 'r') as fp: data = fp.read() md5_number = hashlib.md5(data).hexdigest()return md5_numberdef write_cfg(file_dict):#将字典写入到配置文件里with open(cfg_wei, 'w') as fp: fp.write(str(file_dict))def read_cfg():#读取配置文件内容with open(cfg_wei, 'r') as fp: data = fp.read() file_dict = eval(data)return file_dictdef add_file(file_name):#添加新文件使用import osif os.path.exists(file_name) != True:print("文件路径不存在") sys.exit(1)if os.path.exists(cfg_wei) == True: file_dict = read_cfg()if file_name in file_dict.keys():print("已经加入到管理")else: md5_number = md5_file(file_name) file_dict[file_name] = md5_number write_cfg(file_dict)print(file_name + "加入到管理成功") post_data(file_name)else: md5_number = md5_file(file_name) file_dict = {file_name : md5_number} write_cfg(file_dict)print(file_name + "加入到管理成功") post_data(file_name)def check_file():#根据配置文件,重新筛查一遍md5值是否一样import os fk = 0if os.path.exists(cfg_wei) == True: file_dict = read_cfg()for file_name in file_dict.keys():if os.path.exists(file_name) != True:del file_dict[file_name] fk = 1print( file_name + "文件不存在了,将清理本地记录,后续使用请重新加入管理")break md5_number = md5_file(file_name)if md5_number != file_dict[file_name]: #不对等就传文件到服务端 file_dict[file_name] = md5_number post_data(file_name) fk = 1print(file_name + "有变动,进行更新")if fk == 1: write_cfg(file_dict)else:print("配置文件不存在,退出检测")def post_data(file_name): tcp_client = socket(AF_INET, SOCK_STREAM) buffsize = 1024 tcp_client.connect_ex(host_info) filesize_bytes = os.path.getsize(file_name) # 得到文件的大小,字节 dirc = {'filename': file_name,'filesize_bytes': filesize_bytes,} head_info = json.dumps(dirc) # 将字典转换成字符串 head_info_len = struct.pack('i', len(head_info)) # 将字符串的长度打包 tcp_client.send(head_info_len) # 发送head_info的长度 tcp_client.send(head_info.encode('utf-8'))# 发送真是信息with open(file_name, 'rb') as f: data = f.read() tcp_client.sendall(data)print('发送成功')if len(sys.argv) != 2:print("使用: --check | /etc/passwd") sys.exit(1)if sys.argv[1] == "--check": check_file()else: file_name = sys.argv[1] tmp_list = file_name.split('/') pwd_dir = os.getcwd()if len(tmp_list) == 1:if pwd_dir == "/": file_name = pwd_dir + file_nameelse: file_name = pwd_dir + "/" + file_name add_file(file_name)原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。