keeping.py
定时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的更多相关文章
- web.py 学习(-)Rocket web框架
Rocket是一个轻量级,多线程,符合WSGI规范的web框架. Rocket使用一个线程监听连接,接收到连接之后放到Queue中,有worker线程进行处理. Rocket含有以下属性: metho ...
- Python 打包中 setpy.py settuptools pbr 的了解
背景 nova服务构建失败,报错: 'tests_require' must be a string or list of strings containing valid project/versi ...
- Flask源码阅读-第四篇(flask\app.py)
flask.app该模块2000多行代码,主要完成应用的配置.初始化.蓝图注册.请求装饰器定义.应用的启动和监听,其中以下方法可以重点品读和关注 def setupmethod(f): @setupm ...
- tensorflow 的rnn的示例 ptb_word_lm.py 的完整代码
其训练数据源在我的空间里,名字为:tensorflow的ptb-word-lm示例的训练数据源.tgz 讲解参见另一篇文章: http://www.cnblogs.com/welhzh/p/6739 ...
- python的setup.py文件及其常用命令
编写setup.py文件,获取帮助:python setup.py --help-commands [python] Standard commands: build ...
- python调用py中rar的路径问题。
1.python调用py,在py中的os.getcwd()获取的不是py的路径,可以通过os.path.split(os.path.realpath(__file__))[0]来获取py的路径. 2. ...
- Python导入其他文件中的.py文件 即模块
import sys sys.path.append("路径") import .py文件
- import renumber.py in pymol
cp renumber.py /usr/local/lib/python2.7/dist-packages/pymol import renumber or run /path/to/renumber ...
- python gettitle.py
#!/usr/bin/env python # coding=utf-8 import threading import requests import Queue import sys import ...
随机推荐
- Qt Creator 搭配Git 版本控制
再次介绍一下Git的使用,这次是在Coding.net上部署项目的.这个是写给大作业合作的小伙伴们(我和我的A奶朋友们和某A的男朋友)看的. 安装Git 首先安装Git(msysGit) 下载地址 h ...
- 【bfs】献给阿尔吉侬的花束
[题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ...
- htmlunit 校验验证码
htmlUnit 校验验证码 直接上代码 String url = "http://www.zycg.gov.cn/"; WebclientUtil webClientUtils ...
- String:字符串常量池
String:字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池: 字 ...
- goroutine与调度器
29 November 2013 by skoo 我们都知道Go语言是原生支持语言级并发的,这个并发的最小逻辑单元就是goroutine.goroutine就是Go语言提供的一种用户态线程,当然这种用 ...
- Learn to securely share files on the blockchain with IPFS!
https://medium.com/@mycoralhealth/learn-to-securely-share-files-on-the-blockchain-with-ipfs-219ee47d ...
- 笔记:用标准c写 com dll
在 [XXX.idl] 中 1. 如果想在脚本语言中传递一个值,并且在dll(c代码)中修改这个值并返回的话, 这个参数必须写为:[in, out] VARIANT* 如果写成 [in, out] i ...
- 构建flutter环境并实现属于我们的hello world
我们知道flutter和react-native一样,都是既可以运行在andorid也可以运行在iOS环境下的. 我之前是react-native开发者,我的电脑环境中已经安装好了jdk,sdk,以及 ...
- 第十六节、特征描述符BRIEF(附源码)
我们已经知道SIFT算法采用128维的特征描述子,由于描述子用的是浮点数,所以它将会占用512字节的空间.类似的SUFR算法,一般采用64维的描述子,它将占用256字节的空间.如果一幅图像中有1000 ...
- JavaScript的函数声明与函数表达式的区别
1)函数声明(Function Declaration); // 函数声明 function funDeclaration(type){ return type==="Declaration ...