python自动检测更新业务脚本

  • 基于业务,定时检测版本更新。写了个python3脚本去放到定时任务

此实现是建立在容器里面运行业务的情况下实现的

脚本内容如下:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
# Time:2020-10
# Author:Shensg

import sys
import os
import time
# import readline
import requests


# Gets the current script directory as the working directory // 获取当前脚本目录作为工作目录
dir = sys.path[0]
os.chdir(dir)

# help // 运行脚本的帮助
def used_Usge():
    help = "Example:\npython3 + %s + servername" % (sys.argv[0])
    return help

# obtain current version //获取当前版本
def current_version(sname):
    os.system("docker ps -a | grep -i %s | awk '{print $2}' | awk -F[:] '{print $2}' > ./version.txt" % (sname))
    f = open("./version.txt")
    vold = f.readline()
    return vold

# obtain docker image new version //获取docker最新镜像版本
def obtain_new_version(sname):
    try:
        if sname == 0:
            print("\033[1;31mInsert server name error\033[0m\033[5;32m!!!...\033[0m")
        else:
            r = requests.get("http://stry.snwit.com:5000/v2/%s/tags/list" % (sname))
            i = r.json()
            v = i['tags']
            v.sort(reverse=True)
            # print(v)
            l = v[0]
            # print(l)
            return l
    except EOFError:
        print("\033[1;31mAll version obtain fail, exit\033[0m\033[5;32m!!!...\033[0m")
        sys.exit(3551)

# check versioin update // 检查版本更新
def checkup(sname):
    newv = obtain_new_version(sname)
    # print(newv)
    oldv = current_version(sname)
    # print("this: %s" % (oldv))
    time.sleep(5)
    if newv in oldv:
        print("\033[1;32mThis's the latest version\033[0m\033[5;32m...\033[0m")
        s = "off"
        return s
    else:
        print("\033[1;32mCheck the new version, updating, please wait\033[0m\033[5;32m!!!...\033[0m")
        s = "on"
        print(s)
        return s


# check start running status // 检查启动运行状态
def running_stated(sname):
    os.system("docker ps -a | grep %s | awk '{print $NF}' > ./status.txt" % (sname))
    f1 = open("./status.txt")
    status1 = f1.readline()
    # print("这是状态:%s" % (status1))
    if 'snwit' in status1:
        os.system("docker logs %s | grep -i 'error' > ./out.txt || echo 'on' > ./out.txt" % (sname))
        f2 = open("./out.txt")
        logout = f2.readline()
        # print(logout)
        if 'on' in logout:
            print("\033[1;33m %s server is running success\033[0m\033[5;32m!!!...\033[0m" % (sname))
            s = "on"
            return s
        else:
            print("\033[1;31m %s server is running fail\033[0m\033[5;32m!!!...\033[0m" % (sname))
            s = "off"
            return s
    else:
        print("\033[1;31m%s server is stop\033[0m\033[5;32m!!!...\033[0m")
        s = "no"
        return s

# start server // 启动服务
def start_server(sname):
    while True:
        os.system("docker ps -a |grep %s | awk '{print $NF}' > ./status.txt" % (sname))
        f = open("./status.txt")
        status = f.readline()
        if sname in status:
            print("\033[1;32m%s server is running...\nstopping, please wait!\033[0m\033[5;32m...\033[0m" % (sname))
            stop_server(sname)
            os.system("/data/scripts/runserver %s %s" % (sname, obtain_new_version(sname)))
            time.sleep(3)
            s = running_stated(sname)
            if 'on' in s:
                return s
            elif 'no' in s:
                return s

        else:
            os.system("/data/scripts/runserver %s %s" % (sname, obtain_new_version(sname)))
            time.sleep(3)
            s = running_stated(sname)
            if 'on' in s:
                return s
            elif 'no' in s:
                return s

# stop server // 停止服务
def stop_server(sname):
    print("\033[1;32m%s server is stopping\033[0m\033[5;32m...\033[0m" % (sname))
    while True:
        os.system("docker stop %s" % (sname))
        time.sleep(3)
        os.system("docker rm %s" % (sname))
        time.sleep(3)
        os.system("docker ps -a | grep %s | awk '{print $NF}' > ./stop.txt" % (sname))
        f = open("./stop.txt")
        stop_out = f.readline()
        if sname in stop_out:
            print("\033[1;31m %s server is running !!! please wait\033[0m\033[5;32m...\033[0m" % (sname))
            time.sleep(2)
            # sys.exit(2)
        else:
            print("\033[1;32m%s server is stop\033[0m\033[5;32m...\033[0m" % (sname))
            time.sleep(2)
            s = "stop"
            return s
            # sys.exit()

# update failed version rollback // 更新失败时版本回滚
def rollback_server(sname):
    print("\033[1;33m%s update fail, %s server is rollback !!!\033[0m\033[5;32m...\033[0m" % (sname, sname))
    f = open("./version.txt")
    vold = f.readline()
    while True:
        stop_server(sname)
        os.system("/data/scripts/runserver %s %s" % (sname, vold))
        time.sleep(3)
        s = running_stated(sname)
        if 'on' in s:
            sys.exit()


if __name__ == "__main__":
    if len(sys.argv) < 2:
        h = used_Usge()
        print(h)
    else:
        sname = sys.argv[1]
        obtain_new_version(sname)
        l = checkup(sname)
        if 'on' in l:
            l1 = start_server(sname)
            if 'no' in l1:
                while True:
                    rollback_server(sname)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值