我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python重启深信服设备

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python重启深信服设备

一、背景

在生产环境中,有客户架构为阿里云线上环境及线下IDC需要内网互通,互联采用阿里云使用第三方深信服云产品与线下IDC侧Cisco防火墙ipsec打通实现,主要用于定时阿里云文件及数据备份至IDC,在生产应用中无故隧道会不定时中断,联系深信服及思科售后排查均没有结果,但是进行手动的重启阿里云上深信服设备隧道立即恢复,在两边网络工程师排查无果后,想到去编写监控脚本,如果隧道终端去利用python重启深信服设备,从而恢复隧道,数据传输延迟timeout及使用断点续传,当网络层面异常无法解决时,换另一种思路来解决问题。

二、技术要点

2.1 编写隧道监控脚本

由于线上阿里云侧为公有云,且为配置EIP及NAT网关,ecs均采用前端公网SLB负责业务请求接入,其内部无法出公网,隧道监控脚本想告警出来发送至微信及后续的去操作深信服需要公网连通,因此在线下IDC侧放置检查及重启脚本。

2.2 深信服重启

  • 利用Python编写去操作深信服,web页面模拟登录,主要利用到了selenium模块,logging来记录日志。
  • 利用阿里云ECS API来操作重启深信服设备。

三、源码

3.1 隧道检测脚本

3.1.1 检查脚本功能

检测隧道连通性,如果隧道终端告警至微信及钉钉,其次触发深信服重启脚本。

#!/bin/bash
#检测内网地址
IP=10.10.10.2
dir="/sangfor/Shscripts/pdc/"
if [ ! -d ${dir} ];then
    mkdir -p ${dir}
fi
echo 1 > ${dir}pdcping.lock
while true
do
    #日志分割归档
    Time=`date +%F`
    TIME="${Time} 23:59"
    if [ "${data}" == "${TIME}" ];then
        mkdir ${dir}${Time} && mv ${dir}pdcping.log ${dir}${Time}-pingpdc.log
        mv ${dir}${Time}-pingpdc.log ${dir}${Time}
    fi
    find ${dir} -mtime +7 -type d -exec rm -rf {} \;

    find ${dir} -mtime +7 -name "*-pingpdc.log" -exec rm -rf {} \;
    data=`date +%F' '%H:%M`
    data1=`date +%F' '%H:%M:%S`
    echo "------------${data1}---------------">>${dir}pingpdc.log
    ping -c 10 ${IP} >>${dir}pingpdc.log
    if [ $? -eq 1 ];then
        STAT=`cat ${dir}pdcping.lock`
        if [ ${STAT} -eq 1 ];then
                        /usr/local/python34/bin/python3 /sangfor/Pysangfor/sangfor_public.py
            echo 0 > ${dir}pdcping.lock
        else
            continue
        fi
    else
        STAT=`cat ${dir}pdcping.lock`
        if [ ${STAT} -eq 0 ];then
            echo 1 > ${dir}pdcping.lock
        else
            continue
        fi
    fi
done

3.1.2 检查脚本功能

为防止隧道检测脚本异常,另外编写监控监测脚本的脚本配合定时任务来定时监控,如果异常,重新拉起。

#!/bin/bash
num=$(ps -ef |grep pdc.sh|wc -l)
cmd="/usr/bin/nohup /bin/bash /sangfor/Shscripts/pdc/pdc.sh &"
if [ ${num} -lt 2 ];then
${cmd}
fi

配合定时任务

* * * * * /bin/bash /sangfor/Shscripts/pdc/checkpdc.sh

3.2 深信服操作脚本

3.2.1 基础环境部署

  • A 依赖软件及python3.4版本安装
    yum -y install zlib-devel zlib readline-devel  openssl-devel wget gcc-c++ Xvfb lrzsz firefox
    cd /tmp
    wget -c https://www.python.org/ftp/python/3.4.5/Python-3.4.5.tgz
    tar -zxvf Python-3.4.5.tgz
    cd Python-3.4.5
    ./configure --prefix=/usr/local/python34
    make && make install
    echo "export PATH=$PATH:/usr/local/python34/bin" >/etc/profile.d/python34.sh
    source /etc/profile.d/python34.sh
  • B pip安装
    cd /tmp
    wget https://bootstrap.pypa.io/get-pip.py
    python3 get-pip.py
  • C 安装python模块
    pip3 install selenium
    pip3 install pyvirtualdisplay
    pip3 install xvfbwrapper
  • D 下载安装geckodriver
    cd /tmp
    wget -c https://github.com/mozilla/geckodriver/releases/download/v0.16.1/geckodriver-v0.16.1-linux64.tar.gz
    tar zxvf geckodriver-v0.16.1-linux64.tar.gz
    cp geckodriver /usr/bin/

3.2.2 python代码

github地址
模拟web登录操作深信服

cat > /sangfor/Pysangfor/sangfor_public.py<<EOF
#!/bin/env python3
# -*- coding:UTF-8 -*-
# _author:kaliarch
#导入模块
from pyvirtualdisplay import Display
from selenium import webdriver
import time
import os
import logging

#定义深信服重启类
class Glp_SangFor:
    def __init__(self,logger):
        self.logger = logger
        self.logger.info("--------------start log----------------")
        self.display = Display(visible=0, size=(800, 600))
        self.display.start()
        self.browser = webdriver.Firefox()
        self.logger.info("start browser successfuly")

        self.sangfor_url = "深信服公网url"
        self.username = '深信服登录用户名'
        self.password = '深信服登录密码'

    def login(self):
        self.browser.get(self.sangfor_url)
        self.browser.implicitly_wait(5)
        self.browser.find_element_by_name('user').send_keys(self.username)
        self.browser.find_element_by_name('password').send_keys(self.password)
        self.browser.find_element_by_class_name('buttons').click()
        self.browser.implicitly_wait(5)
        self.logger.info("loggin sangfor successfuly")

    def client_reboot(self):
        self.browser.find_element_by_id("ext-gen111").click()
        print(self.browser.find_element_by_id("ext-gen111").text)
        self.browser.implicitly_wait(15)
        time.sleep(60)
        self.logger.info("switch mainiframe start")
        try:
            print(self.browser.find_element_by_link_text("重启/重启服务/关机").text)
            self.browser.find_element_by_link_text("重启/重启服务/关机").click()
            self.browser.implicitly_wait(3)
            self.browser.switch_to_frame("mainiframe")
            self.browser.implicitly_wait(8)
            time.sleep(10)
            self.browser.find_element_by_xpath("//button[@id='ext-gen19']").click()
            print(self.browser.find_element_by_xpath("//button[@id='ext-gen19']").text)
            self.browser.implicitly_wait(10)
            #self.browser.find_element_by_xpath("//button[@id='ext-gen42']").click()
            print(self.browser.find_element_by_xpath("//button[@id='ext-gen42']").text)
        except Exception as e:
            self.logger.exception("reboot successful")
            return 1
        self.browser.close()
        self.logger.info("browser close successful")
        self.logger.info("--------------end log----------------")
        return 0

#定义日志记录
class Glp_Log:
    def __init__(self,filename):
        self.filename = filename
    def createDir(self):
        _LOGDIR = os.path.join(os.path.dirname(__file__), 'publiclog')
        print(_LOGDIR)
        _TIME = time.strftime('%Y-%m-%d', time.gmtime()) + '-'
        _LOGNAME = _TIME + self.filename
        print(_LOGNAME)
        LOGFILENAME = os.path.join(_LOGDIR, _LOGNAME)
        print(LOGFILENAME)
        if not os.path.exists(_LOGDIR):
            os.mkdir(_LOGDIR)
        return LOGFILENAME
        print(LOGFILENAME)

    def createlogger(self,logfilename):
        logger= logging.getLogger()
        logger.setLevel(logging.INFO)
        handler = logging.FileHandler(logfilename)
        handler.setLevel(logging.INFO)
        formater = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formater)
        logger.addHandler(handler)
        return logger

#主函数调用
if __name__ == '__main__':
    os.system("pkill firefox")
    os.system("pkill Xvfb")
    glploger = Glp_Log('public-***.log')
    logfilename = glploger.createDir()
    logger = glploger.createlogger(logfilename)

    sangfor_oper = Glp_SangFor(logger)
    sangfor_oper.login()
    sangfor_oper.client_reboot()
EOF

通过阿里云ECS API操作深信服设备

#!/bin/env python3
# -*- coding:UTF-8 -*-
# _author:kaliarch
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526 import RebootInstanceRequest,StartInstanceRequest,StopInstanceRequest
import time
import os
import logging
class ecsOper():
    def __init__(self,logger):
        self.clentoper = client.AcsClient('<accessKeyId>', '<accessSecret>', 'cn-hangzhou')
        self.logger = logger
        self.logger.info("------------------------start reboot *** ecs of API log-------------")
    def reboot_instance(self):
        # 设置参数
        request = RebootInstanceRequest.RebootInstanceRequest()
        request.set_accept_format('json')
        request.add_query_param('InstanceId', 'i-bpxxzx1rlsgvclq79au')
        # 发起请求
        response = self.clentoper.do_action_with_exception(request)
        self.logger.info("public ecs *** reboot successful!")
        self.logger.info(response)
        print(response)

    def start_instance(self):
        request = StartInstanceRequest.StartInstanceRequest()
        request.set_accept_format('json')
        request.add_query_param('InstanceId', 'i-bpxxzx1rlsgvclq79au')
        # 发起请求
        response = self.clentoper.do_action_with_exception(request)
        self.logger.info("public ecs *** start successful!")
        self.logger.info(response)
        print(response)

    def stop_instance(self):
        request = StopInstanceRequest.StopInstanceRequest()
        request.set_accept_format('json')
        request.add_query_param('InstanceId', 'i-bp1djzd1rlsgvclq79au')
        request.add_query_param('ForceStop', 'false')
        # 发起请求
        response = self.clentoper.do_action_with_exception(request)
        request.add_query_param('InstanceId', 'i-bpxxzxd1rlsgvclq79au')
        self.logger.info(response)
        print(response)

    def testlog(self):
        self.logger.info("public test log")

class Glp_Log:
    def __init__(self,filename):
        self.filename = filename
    def createDir(self):
        _LOGDIR = os.path.join(os.path.dirname(__file__), 'publiclog')
        print(_LOGDIR)
        _TIME = time.strftime('%Y-%m-%d', time.gmtime()) + '-'
        _LOGNAME = _TIME + self.filename
        print(_LOGNAME)
        LOGFILENAME = os.path.join(_LOGDIR, _LOGNAME)
        print(LOGFILENAME)
        if not os.path.exists(_LOGDIR):
            os.mkdir(_LOGDIR)
        return LOGFILENAME
        print(LOGFILENAME)

    def createlogger(self,logfilename):
        logger= logging.getLogger()
        logger.setLevel(logging.INFO)
        handler = logging.FileHandler(logfilename)
        handler.setLevel(logging.INFO)
        formater = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formater)
        logger.addHandler(handler)
        return logger

if __name__ == "__main__":
    glploger = Glp_Log('public-***.log')
    logfilename = glploger.createDir()
    logger = glploger.createlogger(logfilename)

    app = ecsOper(logger)
    app.reboot_instance()

四、效果展示

查看检查脚本日志已经进行了切割,且保留7天的日志,防止日志过大占用过多磁盘空间
Python重启深信服设备
微信告警信息
Python重启深信服设备
钉钉告警信息
Python重启深信服设备
查看python脚本深信服重启日志
Python重启深信服设备

五、总结

其简单的实现了故障自愈,利用其思路客户配合很多业务,例如简单的应用重启等。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python重启深信服设备

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python重启深信服设备

一、背景在生产环境中,有客户架构为阿里云线上环境及线下IDC需要内网互通,互联采用阿里云使用第三方深信服云产品与线下IDC侧Cisco防火墙ipsec打通实现,主要用于定时阿里云文件及数据备份至IDC,在生产应用中无故隧道会不定时中断,联系
2023-01-31

云服务器如何重启设备

云服务器通常可以通过关闭服务、更改设置或者使用其他方法来重启服务器。以下是重启的步骤:检查云服务器的日志或者其他系统日志,以找出导致问题的原因。可以查看日志或者使用ApacheSphinx或者Redis等数据库来检查相关日志。检查配置是否正确,例如云服务器是否支持负载均衡、是否有备份数据等。检查服务是否正在运行,是否有任何警告或者错误消息,或者是否存在任何其他异常。更改云服务器的设置,
2023-10-26

云服务器如何重启设备设置

云服务器通常可以通过手动设置来重启其设备设置,以下是一些常见的方法:检查控制台:检查控制台是否显示“重启设备”选项以及其它选项,确保它们与云服务器所使用的应用程序兼容。在应用程序设置中:查看应用程序设置中的“重启时间”和“重新启动”选项。这将帮助您确定在应用程序停止后重新启动云服务器的最佳时间。检查安全设置:检查云服务器中的安全设置是否正确,包括数据锁定、日志和审计记录等。检查设备驱动
2023-10-26

云服务器怎么重启设备

云服务器是一种虚拟化软件,通常是通过软件方式运行的,因此无法直接通过重启来重启设备。如果你的云服务器运行正常,那么它可以随时从后台进行重启操作。重启操作通常是由系统管理员(如系统管理员)或自动化脚本(如SymantecVMware中的symantec_recovery.json)完成的,以下是一个例子:在命令行中输入“sudorestartmyserver”,以启用云服务器。在终端中输入“
2023-10-26

云服务器怎么重启设备设置

如果您想要重启服务器,通常您可以通过以下步骤进行操作:检查网络连接,确保您正在使用的设备与云服务器之间连接通畅。打开云服务器管理控制台,查看重启选项以及是否有重启按钮。选择重启云服务器,然后点击重启按钮或手动重启云服务器。重启过程可能需要花费一段时间,请耐心等待,直到云服务器重新启动。请注意,如果您在执行重启操作时遇到问题,请查明原因并尝试进行修复。
2023-10-26

云服务器怎么重启设备设置的

如果您想要重启服务器设置,请按照以下步骤操作:在控制面板中单击“管理工具”。在弹出的“管理工具”中,单击“服务”。在“服务”列表中,找到“AmazonWebServices”服务,并确保它已经被关闭。单击“停止”按钮停止AmazonWebServices服务。重新启动您的服务器。以上是重启服务器的基本步骤。需要注意的是,AmazonWebServices服务可能已
2023-10-26

云服务器怎么重启设备设置密码

如果您想要重启服务器设置密码,以下是一些步骤:首先,您需要检查您正在使用的云服务器是否已成功连接到您的互联网。这意味着您需要查看服务器是否已连接到互联网,并登录到您的账户。然后,您可以打开控制台,查看云服务器提供商是否提供了所需的重启设置选项。这可能包括从登录界面中选择“重启”或“手动”重启云服务器。如果您没有看到任何选项,您可以使用计算资源管理器中的磁盘管理器来查找您的设备,并根据您的
2023-10-26

云服务器怎么重启设备设置界面

如果您想要重启服务器,需要在云服务器控制台中打开“重启”选项,然后按照以下步骤操作:确认您想要重启的操作是否成功。如果是,您应该能够看到“重启成功”字样。确认云服务器是否已连接到远程服务器。您可以尝试在云服务器控制台中查找连接到您的设备的端口地址,或者尝试使用命令行工具来连接远程服务器。在云服务器控制台中选择“重启我的云服务器”选项,并按下Enter。等待几秒钟。当云服务器控制台显示“
2023-10-26

云服务器怎么重启网络设备

如果您想重新启动网络设备以便进行故障排除,可以按照以下步骤操作:确认您的计算机能够访问互联网:打开浏览器,输入“www.ia.com”,查找与您网络设备相关的网站。找到与您网络设备相关的网站,并下载所需软件和更新:在下载网站中,有一些提供网络服务的网站(如AmazonWebServices、GoogleCloudPlatform等)和一些提供软件更新的网站(如Net
2023-10-26

云服务器怎么重启设备教程

首先,在重启之前,需要将云服务器与计算机断开连接,以免数据丢失。方法如下:在云服务器界面中选择“设置自动重启”选项,这将在云服务器重启之前自动启动服务器,以确保数据不会丢失。将鼠标悬停在云服务器上,右键点击云服务器,选择“重置”选项,这将将云服务器重新启动,以便数据不会丢失。在重启云服务器之前,需要断开与云服务器的网络连接,以确保数据不会丢失。方法如下:打开云服务器控制台,选择“网
2023-10-26

亚马逊服务器如何重启设备

1.登录到亚马逊控制台首先,你需要登录到亚马逊Web服务(AWS)的控制台。在浏览器中打开AWS管理控制台,并使用你的凭证登录。2.导航到EC2服务在控制台的顶部导航栏中,找到并点击"服务"。在服务列表中,选择"EC2",这是亚马逊提供的弹性云计算服务。3.选择要重启的实例在EC2控制台中,你将看到你的实例列表。找到你想要重启的实例,并选中它。4.重启实例在实例列表中选中实例后,你将看到实例的详细信息。在顶部菜单栏...
2023-10-27

腾讯云服务器如何重启设备设置

1.登录腾讯云控制台首先,你需要登录腾讯云控制台。在控制台首页,找到左侧导航栏中的“云服务器”选项,点击进入。2.进入服务器管理页面在云服务器页面中,找到需要重启的服务器实例,点击进入该实例的管理页面。3.选择重启方式在服务器管理页面中,找到“操作”选项卡,点击进入。在操作选项卡中,你可以看到多种操作选项,包括重启、关机、启动等。选择“重启”选项。4.确认重启在选择重启方式后,系统
2023-10-26

云服务器如何重启设备设置密码

如果您使用云服务器,需要重新设置账户和密码,可以按照以下步骤进行:打开云服务器控制台,查看是否有“用户帐户”、“密码管理”等类似选项。点击左侧的“用户帐户”选项卡,然后点击“安全”选项卡。在弹出的对话框中,请输入您的登录密码、密码安全问题以及您的安全偏好设置。完成上述步骤后,您将会看到云服务器控制台出现一个“重置登录密码”按钮,点击它即可进行重置登录密码的操作。重置密码时请注意,您需要输
2023-10-27

云服务器如何重启设备设置界面

如果您想重新设置您的Web服务器设置界面,可以按照以下步骤进行:确认您的Web服务提供商是否提供重置选项,比如远程重启、备份和还原等选项。检查您的Web服务器软件设置是否正确,特别是在使用Linux操作系统时,需要检查其配置文件和权限。如果Web服务器配置文件位于本地计算机上,请备份该配置文件,并尝试通过网络重新启动您的Web服务器。如果您已经安装并配置了您的Web服务器,但是出现意外,比如无法登录或无法显示登录信息,请重...
2023-10-27

阿里云服务器怎么重启设备

如果您想重启阿里云服务器设备,您可以按照以下步骤进行操作:检查连接:首先,检查您的阿里云服务器的连接是否正常,确保阿里云服务器的通信端口、网络连接和数据包大小等方面与您预期的一致。重启设备:一旦连接正常,请先尝试重新启动阿里云服务器设备。您可以尝试以下命令:ping127.0.0.1:80ping127.0.0.1:127.0.0.1ping127.0.0.2:80ping12
2023-10-26

云服务器怎么重启设备设置的密码

如果您想要重启服务器设置的密码,您可以按照以下步骤进行操作:首先您需要登录您的云服务器供应商的网站,例如https://cloud.cloudserve.com/或者https://www.cloudsite.com/。输入您的用户名和密码,以便在重新启动服务器之后登录您的帐户。点击“登录”或“重新启动”按钮来重新启动您的云服务器。等待一段时间,直到您的服务器关闭,再登录您的帐户。如果您选择的是默认密码,则需要将密码更改为您自己的密码,否则将无法登录您的云服
2023-10-27

云服务器怎么重启设备设置的界面

如果您想要重启服务器的设备设置,您可以按照以下步骤进行操作:打开浏览器并登录您的云服务器。在界面左侧选择“管理登录凭据”选项。找到您的用户名和密码,并选择“启用登录凭据”选项。确认您的用户名和密码正确。点击界面下方的“重新启动”按钮,以重新连接到您的云服务器。重新启动后,您的设备设置将会被自动启用。您可以在不同的云服务器上尝试上述操作,以找到最适合您需求的重启方式。
2023-10-27

云服务器怎么重启设备设置密码呢

如果您想重启您的云服务器设备,您可以按照以下步骤进行操作:检查服务是否正常运行。您可以检查网络连接是否正常,例如网络是否被正确连接、是否已启用网络防火墙等。登录到云服务器管理界面。如果您使用的是公有云服务,请在公有云管理平台(如Google、Amazon)登录云服务器管理界面进行登录。在登录界面中,按照提示输入您的用户名和密码,并输入验证码。按"OK"确认服务已重启。点击界面中的"重启"按钮开始重启云服务器。您的云服务...
2023-10-27

云服务器怎么重启设备设置的命令

重启服务器设置的命令通常为"startuprestart"或"restart"。以下是一些关于重启服务器设置的命令:首先,检查您的硬件和软件设置,确保所有硬件和软件均处于正常的工作状态。在ApacheWeb服务器上执行"startup"命令。此命令将启动服务器,并在服务器启动期间打印日志。在ApacheWeb服务器上执行"restart"命令。此命令将启动服务器,并等待服务器重新启动,直到重启时间结束。如果您使用的是MySQL
2023-10-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录