定时push+告警

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author : 71standby@gmail.com
# Description : Keep static-file cached in local, which provide to partner upstream. import re
import json
import time
import socket
import logging
import urllib
import urllib2
import subprocess class Utils(object):
def __init__(self, logger):
self.logger = logger @classmethod
def from_logger(cls):
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
handler = logging.FileHandler("/path/keeping.log", mode='a')
handler.setLevel(logging.INFO)
handler.setFormatter(formatter)
logger.addHandler(handler)
return cls(logger) def subprocess_caller(self, cmd):
try:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
output, error = p.communicate()
code = p.returncode
except Exception, e:
self.logging.error('Execute %s failed: %s' % (cmd, e))
return dict(output=output, error=error, code=1)
return dict(output=output, error=error, code=code) def get_local_ip(self):
inner_ips = []
outer_ips = []
ipaddr = "/sbin/ip addr | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk -F[' '/]+ '{print $3}'"
ip_regex = re.compile(r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")
p = self.subprocess_caller(ipaddr)
if 0 == p['code']:
for ip in [ips.strip() for ips in p['output'].split('\n') if ips]:
if ip_regex.match(ip) and ip.startswith(r'10.'):
inner_ips.append(ip)
elif ip_regex.match(ip):
outer_ips.append(ip)
else:
continue
if inner_ips and outer_ips:
return inner_ips[0],outer_ips[0]
elif not inner_ips and outer_ips:
return None,outer_ips[0]
else:
return None,'NoPublicIP'
else:
self.logging.error('Get ips failed: %s' % p['error'])
return None,None class PartnerDetection(object):
def __init__(self, utils):
self.logger = utils.logger
self.private_ip,self.public_ip = utils.get_local_ip()
self.subprocess_caller = utils.subprocess_caller
self.url = "http://%s:80/path/test.file" % self.public_ip
self.cmd = "dd if=/dev/zero of=/data/test.file bs=1K count=100"
self.alarm_url = 'http://alert.standby.pub/event/interface/'
self.topic_id = 666666
self.secret_key = "1234567890xxxooo" @classmethod
def from_subprocess(cls, utils):
return cls(utils) def send_alarm(self, bodyDict):
data = {
"topic_id": self.topic_id,
"secret_key": self.secret_key,
"data": json.dumps(bodyDict)
}
try:
data = urllib.urlencode(data)
req = urllib2.Request(self.alarm_url, data)
response = urllib2.urlopen(req, timeout=6)
result = response.read()
code = response.getcode()
response.close()
except Exception, e:
self.logger.error("Alarm exception: %s" % e)
return False
else:
if 200 != code:
self.logger.error("Alarm faild: %s" % code)
return False
return True def active_cache(self):
p = self.subprocess_caller(self.cmd)
if 0 != p['code']:
self.logger.error('Test file create failed: %s' % p['error'])
ret = self.send_alarm({'ip':self.private_ip, 'error':'test.file create failed'})
if not ret:
self.logger.error('Test file create alarm faile!!!')
else:
with open("/data/test.file", mode='r') as fr:
data = fr.read()
self.tspush(data) def tspush(self, data):
response = "HTTP/1.1 200 OK\r\nContent-type:application/octet-stream\r\n\r\n"
len_push = len(response) + len(data)
push = "PUSH %s HTTP/1.0\r\nContent-Length:%d\r\n\r\n%s" % (self.url, len_push, response)
push_bytes = push.encode('utf-8')
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect(('127.0.0.1', 55336))
sock.send(push_bytes + data)
msg = sock.recv(1024)
if "200 OK" in msg or "201 Created" in msg:
self.logger.info('Tspush successfully: %s' % msg.split('\r\n')[0])
else:
self.logger.error('Tspush failed: %s' % msg)
ret = self.send_alarm({'ip':self.private_ip, 'error':'Tspush failed: %s' % msg})
if not ret:
self.logger.error('Tspush alarm faile!!!')
except Exception, e:
self.logger.error('Tspush exception: %s' % e)
ret = self.send_alarm({'ip':self.private_ip, 'error':'Tspush exception: %s' % e})
if not ret:
self.logger.error('Tspush exception alarm faile!!!')
finally:
sock.close() def url_test(self):
try:
response = urllib2.urlopen(url=self.url, timeout=6)
code = response.getcode()
data = response.read()
response.close()
except Exception, e:
self.logger.error('Detect failed: %s' % e)
code = 199
finally:
return code def running(self):
while True:
code = self.url_test()
if 200 != code:
self.logger.info("MISS, start to active cache...")
ret = self.send_alarm({'ip':self.private_ip, 'error':'MISS at %s' % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())})
if not ret:
self.logger.error('MISS alarm faile!!!')
self.active_cache()
else:
self.logger.info("HIT")
time.sleep(60) if __name__ == '__main__':
utils = Utils.from_logger()
obj = PartnerDetection.from_subprocess(utils)
obj.running()

  

keeping.py的更多相关文章

  1. web.py 学习(-)Rocket web框架

    Rocket是一个轻量级,多线程,符合WSGI规范的web框架. Rocket使用一个线程监听连接,接收到连接之后放到Queue中,有worker线程进行处理. Rocket含有以下属性: metho ...

  2. Python 打包中 setpy.py settuptools pbr 的了解

    背景 nova服务构建失败,报错: 'tests_require' must be a string or list of strings containing valid project/versi ...

  3. Flask源码阅读-第四篇(flask\app.py)

    flask.app该模块2000多行代码,主要完成应用的配置.初始化.蓝图注册.请求装饰器定义.应用的启动和监听,其中以下方法可以重点品读和关注 def setupmethod(f): @setupm ...

  4. tensorflow 的rnn的示例 ptb_word_lm.py 的完整代码

    其训练数据源在我的空间里,名字为:tensorflow的ptb-word-lm示例的训练数据源.tgz 讲解参见另一篇文章:  http://www.cnblogs.com/welhzh/p/6739 ...

  5. python的setup.py文件及其常用命令

    编写setup.py文件,获取帮助:python setup.py --help-commands [python]  Standard commands:    build             ...

  6. python调用py中rar的路径问题。

    1.python调用py,在py中的os.getcwd()获取的不是py的路径,可以通过os.path.split(os.path.realpath(__file__))[0]来获取py的路径. 2. ...

  7. Python导入其他文件中的.py文件 即模块

    import sys sys.path.append("路径") import .py文件

  8. import renumber.py in pymol

    cp renumber.py /usr/local/lib/python2.7/dist-packages/pymol import renumber or run /path/to/renumber ...

  9. python gettitle.py

    #!/usr/bin/env python # coding=utf-8 import threading import requests import Queue import sys import ...

随机推荐

  1. 「洛谷5290」「LOJ3052」「十二省联考 2019」春节十二响【启发式合并】

    题目链接 [洛谷传送门] [LOJ传送门] 题目大意 给定一棵树,每次选取树上的一个点集,要求点集中的每个点不能是另一个点的祖先,选出点集的代价为点集中权值最大点的权值,问将所有点都选一遍的最小代价为 ...

  2. vue自定义插件-弹框

    <template> <transition name="msgbox"> <div v-if="show" class=&quo ...

  3. Nmap扫描常用参数

    TCP: nmap -sC -sS -sV -p 1-65535 -A -v -v -oX filename.xml -Pn ip 类似: nmap -sS -A -sV -vv -sC -PN -p ...

  4. luogu1608 路径统计 (spfa)

    题意:给一个有向图(无零边),要求找出最短路的数量(重边只计算一次) 做spfa的时候,记一个cnt对于u-w->v如果dis[u]+w=dis[v],cnt[v]+=cnt[u] 如果dis[ ...

  5. CF285E Positions in Permutations(dp+容斥)

    题意,给定n,k,求有多少排列是的 | p[i]-i |=1 的数量为k. Solution 直接dp会有很大的后效性. 所以我们考虑固定k个数字使得它们是合法的,所以我们设dp[i][j][0/1] ...

  6. 通俗讲解MOSFET

    一位工程师曾经对我讲,他从来不看MOSFET数据表的第一页,因为“实用”的信息只在第二页以后才出现.事实上,MOSFET数据表上的每一页都包含有对设计者非常有价值的信息.但人们不是总能搞得清楚该如何解 ...

  7. zabbix3.2监控mysql

    应用环境:ZABBIX一款强大的企业级可分布式的开源监控工具,从2.2版本开始支持MySQL监控(自带监控模板), 不过,默认添加MySQL模板后是无法使用的,这里小记一下部署监控MySQL的简单全过 ...

  8. Docker的脚本安装

    官方镜像支持 curl -sSL https://get.docker.com/ | sh 国内镜像站 curl -sSL https://get.daocloud.io/docker | sh cu ...

  9. luoguP4707 重返现世

    收集邮票加强版,每个邮票不是等概率获得的了. 而且是获得K个,如果把一个全集S集合找出其获得时间集合(显然获得时间两两不同)的话,那么就是第n-k+1大的期望! %%%Sooke min-max容斥扩 ...

  10. bzoj1271 秦腾与教学评估

    SB题!!! 我TM困惑了一下午,三份代码答案全都不一样,后来才发现要用long long来二分... 拿记事本一改就A了. 我TM...... 这SB题目...... 这惨痛的事实充分说明了long ...