Python重啟深信服設(shè)備

一免猾、背景

在生產(chǎn)環(huán)境中是辕,有客戶架構(gòu)為阿里云線上環(huán)境及線下IDC需要內(nèi)網(wǎng)互通,互聯(lián)采用阿里云使用第三方深信服云產(chǎn)品與線下IDC側(cè)Cisco防火墻ipsec打通實(shí)現(xiàn)猎提,主要用于定時(shí)阿里云文件及數(shù)據(jù)備份至IDC获三,在生產(chǎn)應(yīng)用中無故隧道會(huì)不定時(shí)中斷,聯(lián)系深信服及思科售后排查均沒有結(jié)果锨苏,但是進(jìn)行手動(dòng)的重啟阿里云上深信服設(shè)備隧道立即恢復(fù)疙教,在兩邊網(wǎng)絡(luò)工程師排查無果后,想到去編寫監(jiān)控腳本伞租,如果隧道終端去利用python重啟深信服設(shè)備贞谓,從而恢復(fù)隧道,數(shù)據(jù)傳輸延遲timeout及使用斷點(diǎn)續(xù)傳葵诈,當(dāng)網(wǎng)絡(luò)層面異常無法解決時(shí)裸弦,換另一種思路來解決問題。

二作喘、技術(shù)要點(diǎn)

2.1 編寫隧道監(jiān)控腳本

由于線上阿里云側(cè)為公有云理疙,且為配置EIP及NAT網(wǎng)關(guān),ecs均采用前端公網(wǎng)SLB負(fù)責(zé)業(yè)務(wù)請(qǐng)求接入泞坦,其內(nèi)部無法出公網(wǎng)窖贤,隧道監(jiān)控腳本想告警出來發(fā)送至微信及后續(xù)的去操作深信服需要公網(wǎng)連通,因此在線下IDC側(cè)放置檢查及重啟腳本贰锁。

2.2 深信服重啟

  • 利用Python編寫去操作深信服赃梧,web頁面模擬登錄,主要利用到了selenium模塊豌熄,logging來記錄日志授嘀。
  • 利用阿里云ECS API來操作重啟深信服設(shè)備。

三房轿、源碼

3.1 隧道檢測(cè)腳本

3.1.1 檢查腳本功能

檢測(cè)隧道連通性粤攒,如果隧道終端告警至微信及釘釘,其次觸發(fā)深信服重啟腳本囱持。

#!/bin/bash
#檢測(cè)內(nèi)網(wǎng)地址
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 檢查腳本功能

為防止隧道檢測(cè)腳本異常夯接,另外編寫監(jiān)控監(jiān)測(cè)腳本的腳本配合定時(shí)任務(wù)來定時(shí)監(jiān)控,如果異常纷妆,重新拉起盔几。

#!/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

配合定時(shí)任務(wù)

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

3.2 深信服操作腳本

3.2.1 基礎(chǔ)環(huán)境部署

  • 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
#導(dǎo)入模塊
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 = "深信服公網(wǎng)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("重啟/重啟服務(wù)/關(guān)機(jī)").text)
            self.browser.find_element_by_link_text("重啟/重啟服務(wù)/關(guān)機(jī)").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("http://button[@id='ext-gen19']").click()
            print(self.browser.find_element_by_xpath("http://button[@id='ext-gen19']").text)
            self.browser.implicitly_wait(10)
            #self.browser.find_element_by_xpath("http://button[@id='ext-gen42']").click()
            print(self.browser.find_element_by_xpath("http://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
                
#主函數(shù)調(diào)用
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操作深信服設(shè)備

#!/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):
        # 設(shè)置參數(shù)
        request = RebootInstanceRequest.RebootInstanceRequest()
        request.set_accept_format('json')
        request.add_query_param('InstanceId', 'i-bpxxzx1rlsgvclq79au')
        # 發(fā)起請(qǐng)求
        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')
        # 發(fā)起請(qǐng)求
        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')
        # 發(fā)起請(qǐng)求
        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()

四、效果展示

查看檢查腳本日志已經(jīng)進(jìn)行了切割掩幢,且保留7天的日志逊拍,防止日志過大占用過多磁盤空間


image

微信告警信息


image

釘釘告警信息
image

查看python腳本深信服重啟日志


image

五上鞠、總結(jié)

其簡(jiǎn)單的實(shí)現(xiàn)了故障自愈,利用其思路客戶配合很多業(yè)務(wù)芯丧,例如簡(jiǎn)單的應(yīng)用重啟等芍阎。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缨恒,隨后出現(xiàn)的幾起案子谴咸,更是在濱河造成了極大的恐慌,老刑警劉巖骗露,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岭佳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡萧锉,警方通過查閱死者的電腦和手機(jī)珊随,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柿隙,“玉大人叶洞,你說我怎么就攤上這事∮欧” “怎么了京办?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵掀序,是天一觀的道長(zhǎng)帆焕。 經(jīng)常有香客問我,道長(zhǎng)不恭,這世上最難降的妖魔是什么叶雹? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮换吧,結(jié)果婚禮上折晦,老公的妹妹穿的比我還像新娘。我一直安慰自己沾瓦,他們只是感情好满着,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贯莺,像睡著了一般风喇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缕探,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天魂莫,我揣著相機(jī)與錄音,去河邊找鬼爹耗。 笑死耙考,一個(gè)胖子當(dāng)著我的面吹牛谜喊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播倦始,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斗遏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了鞋邑?” 一聲冷哼從身側(cè)響起最易,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炫狱,沒想到半個(gè)月后藻懒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡视译,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嬉荆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酷含。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鄙早,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出椅亚,到底是詐尸還是另有隱情限番,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布呀舔,位于F島的核電站弥虐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏媚赖。R本人自食惡果不足惜霜瘪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惧磺。 院中可真熱鬧颖对,春花似錦、人聲如沸磨隘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽番捂。三九已至个唧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間白嘁,已是汗流浹背坑鱼。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲁沥。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓呼股,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親画恰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子彭谁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,931評(píng)論 2 89
  • 摘要: 一、新產(chǎn)品發(fā)布1允扇、云防火墻 商業(yè)化 發(fā)布云防火墻是一款云環(huán)境下的防火墻產(chǎn)品缠局,首創(chuàng)了基于業(yè)務(wù)可視的結(jié)果,實(shí)現(xiàn)...
    貓耳呀閱讀 704評(píng)論 0 1
  • 有些圖片,能讓你感覺心靈杯凈化一般,慢慢欣賞
    黑白律動(dòng)閱讀 3,174評(píng)論 0 0
  • 寒風(fēng)肆意蝌麸,漣漪濫泛伙判, 一個(gè)人班套, 一本書, 靜靜地,好似世界與她無關(guān)。 昨夜的思緒绎谦, 還在回蕩, 夢(mèng)醒時(shí)分粥脚,記憶猶傷...
    琴彧閱讀 160評(píng)論 0 1
  • DNS劫持和Http劫持 1窃肠、什么是DNS DNS( Domain Name System)是“域名系統(tǒng)”的英文縮...
    奮斗的螻蟻閱讀 1,669評(píng)論 2 0