#раз в сутки проверяет нет ли аккаунтов с неоплаченными проксями #если такие нашлись - отвязывает от них проксю и оповещает об этом пользователя смской #также оповещает за неделю до истечения даты проксей __author__ = "esemi" import logging import config import db_operations from sender import Sender if __name__ == "__main__": config.initLog('proxy_billing') db = db_operations.DB() #освобождение проксей accounts = db.getAccountsWithExpiredProxy() logging.info("found %d account with expired proxy" % len(accounts)) sender = Sender(db) for account in accounts: logging.info("process account %s" % account) acc = db.getAccount(account['id']) if acc is None: logging.error('аккаунт не найден') continue
import sys import logging import time import config from collections import Counter #каждую ночь обновляет прокси с сайта поставщика #пишет ошибки, если удалили проксю, которую ктото использует (подсеть забиндена на аккаунт) def parseNetwork(proxy): return u'.'.join(proxy.split('.')[0:3]) if __name__ == "__main__": config.initLog("proxy_update") logging.info("Started %s" % time.strftime("%H:%M:%S %d.%m.%Y")) try: newProxy = set([unicode(i.strip()) for i in urllib2.urlopen("http://www.billingproxy.net/usergui/tmp/%s8080.txt" % config.PROXY_USER, timeout=20)]) except urllib2.HTTPError: logging.error('http error') sys.exit() logging.info("found %d proxy" % len(newProxy)) if len(newProxy) < 70 : logging.warning('short list?') sys.exit() db = db_operations.DB()
'urllib', 'FunWebProducts', 'SeznamBot', ) for bot in bots: if x.find(bot) != -1: return False if len(x) < 20 or len(x) > 250: return False return True if __name__ == "__main__": config.initLog("agents_update", True) logging.info("Started %s" % time.strftime("%H:%M:%S %d.%m.%Y")) try: f = open(os.path.join(os.path.dirname(__file__), '..', 'docs', 'agents'), 'r') except IOError: logging.error('file not found') sys.exit() agents = set([i.strip() for i in f if filter_bot(i.strip())]) logging.info("found %d unique agents" % len(agents)) db = db_operations.DB() for agent in agents: try: db.addAgent(agent)
#Каждую минуту проверяет наличие заданий на проверку игроков и запускает их при наличии #TODO переписать на демона (?) __author__ = "esemi" import logging import os import subprocess import config import db_operations if __name__ == "__main__": config.initLog('run_check') #получаем таски на эту минуту db = db_operations.DB() tasks = db.getCurrentTasks() logging.info('найдено %d тасков' % len(tasks)) for task in tasks: if task['status'] != 'wait': logging.error("задача уже обработана?! Как, кем, билиать!? (%s)" % task) continue logging.info("запускаем проверку игрока %d (task id %d)" % (task['player_id'], task['id'])) subprocess.Popen([
return '{"result":"-5"}' try: url = config.SMS_parameter %(phone,message) f = urllib2.urlopen(url) xmlstr = str(f.read()) xmlstr = xmlstr.replace('\r', '') xmlstr = xmlstr.replace('\n', '') xmlstr = xmlstr.replace('\t', '') doc = minidom.parseString(xmlstr) root = doc.documentElement nodes = root.getElementsByTagName('error') value = nodes[0].childNodes[0].nodeValue result = value.encode('utf-8','ignore') return '{"result":"%s"}' %result except: logger.info("send_sms proc exception: %s " % traceback.format_exc()) return '{"result":"-10"}' conf = os.path.join(os.path.dirname(__file__), 'http.conf') if __name__ == '__main__': config.initLog() cherrypy.tree.mount(mobile_server(), '/') cherrypy.quickstart(config=conf) if hasattr(cherrypy.engine, 'block'): cherrypy.engine.start() cherrypy.engine.block() else: cherrypy.server.quickstart() cherrypy.engine.start()
#сменили тип нотификейшенов res = db.setAccountNotify(acc['id'], 'email') logging.debug("change type result %s" % res) message = "%s: balance < 0, notify type change to email" % acc['login'] res1 = sender.sendNotify(acc, message, 'Notify type change by balance', 'sms') res2 = sender.sendNotify(acc, message, 'Notify type change by balance', 'email') logging.debug('result sms - %s; email - %s' % (res1, res2)) if res1 is not True or res2 is not True: logging.error(res1) logging.error(res2) continue logging.info('success notification of change notify type') return len(accounts) if __name__ == "__main__": config.initLog('notify_billing') db = db_operations.DB() res = changeNotifyTypeByBalance(db) logging.info("обработано %d аккаунтов" % res) db.close()
if x < 0: x = 0 if x > len: x = len return x def exit(try_count=0, task_result='fail'): global DB, TASK_ID logging.info("End %s" % time.strftime('%H:%M:%S %d.%m.%Y')) if DB is not None: DB.setTaskCompleted(TASK_ID,task_result,try_count) DB.close() QApplication.exit() sys.exit() if __name__ == "__main__": config.initLog("checker") logging.info("Started %s" % time.strftime("%H:%M:%S %d.%m.%Y")) parser = OptionParser() parser.add_option("-t", '--task', type='int', dest='task_id', help='task id for check red button') (options, args) = parser.parse_args() if options.task_id is None: logging.error("task id not set") exit() DB = db_operations.DB() TASK_ID = options.task_id logging.info("task_id is %d" % TASK_ID)
else: end = last_check['date'] + maxdelta logging.debug("исходное окно %s - %s" % (begin, end)) segment = end - begin factor = random.betavariate(3, 1.2) result_data = begin + timedelta(seconds=factor * segment.seconds) logging.debug("окно от %s до %s; множитель %s; итоговый отступ %s" % (begin, end, factor, result_data)) return result_data if __name__ == "__main__": config.initLog('sheduler') db = db_operations.DB() monitoring_players = db.getMonitoringPlayers() for player in monitoring_players: logging.info("взяли игрока %s" % player) if db.isRequireTaskByPlayer(player['player_id']): last_task = db.getLastTaskByPlayer(player['player_id']) logging.info("last checked %s, interval %d hours" % (last_task, player['check_interval'])) check_date = compute_next_check_date(player['check_interval'], last_task) logging.info("next check date %s" % check_date)
'ids': [a['attack_id'] for a in v], 'message': createMessage(v) }) return result def exit(): global db logging.info("End %s" % time.strftime('%H:%M:%S %d.%m.%Y')) db.close() sys.exit() if __name__ == "__main__": config.initLog('sender') db = db_operations.DB() #сменили тип оповещений на аккаунтах с отрицательным балансом res = changeNotifyTypeByBalance(db) logging.info("обработано %d аккаунтов" % res) #взяли атаки для оповещения attack = db.getAttackForNotification() logging.info('Найдено %d атак для уведомления' % len(attack)) if len(attack) == 0: exit() #сжали до одного толстого сообщения по каждому игроку
password_mgr.add_password(None, url, user, password) proxy_handler = urllib2.ProxyHandler({'http': url}) proxy_auth_handler = urllib2.ProxyBasicAuthHandler(password_mgr) return urllib2.build_opener(proxy_handler, proxy_auth_handler) def test_network(urls): try: for url in urls: urllib2.urlopen(url, timeout=10) except Exception, err: logging.error('network error %s' % str(err)) return False return True if __name__ == "__main__": config.initLog("proxy_check") logging.info("Started %s" % time.strftime("%H:%M:%S %d.%m.%Y")) db = db_operations.DB() proxyList = list(db.getProxy()) logging.info("found %d proxy" % len(proxyList)) shuffle(proxyList) for num, proxy in enumerate(proxyList): urls = ['http://ya.ru/','http://google.de/'] if not test_network(urls): continue logging.info("%d - %s" % (num,proxy['proxy'])) opener = get_proxy_opener(proxy['proxy'], proxy['user'], proxy['pass'])
return x def exit(try_count=0, task_result='fail'): global DB, TASK_ID logging.info("End %s" % time.strftime('%H:%M:%S %d.%m.%Y')) if DB is not None: DB.setTaskCompleted(TASK_ID, task_result, try_count) DB.close() QApplication.exit() sys.exit() if __name__ == "__main__": config.initLog("checker") logging.info("Started %s" % time.strftime("%H:%M:%S %d.%m.%Y")) parser = OptionParser() parser.add_option("-t", '--task', type='int', dest='task_id', help='task id for check red button') (options, args) = parser.parse_args() if options.task_id is None: logging.error("task id not set") exit()
if last_check is None or (datetime.now()-last_check['date']) > maxdelta : end = datetime.now() + timedelta(hours=config.SHEDULER_MIN_HOURS_CHECK) else: end = last_check['date'] + maxdelta logging.debug("исходное окно %s - %s" % (begin, end)) segment = end - begin factor = random.betavariate(3, 1.2) result_data = begin + timedelta( seconds = factor * segment.seconds ) logging.debug("окно от %s до %s; множитель %s; итоговый отступ %s" % (begin, end, factor, result_data) ) return result_data if __name__ == "__main__": config.initLog('sheduler') db = db_operations.DB() monitoring_players = db.getMonitoringPlayers() for player in monitoring_players: logging.info("взяли игрока %s" % player) if db.isRequireTaskByPlayer(player['player_id']): last_task = db.getLastTaskByPlayer(player['player_id']) logging.info("last checked %s, interval %d hours" % (last_task, player['check_interval'])) check_date = compute_next_check_date(player['check_interval'], last_task) logging.info("next check date %s" % check_date) db.addNewTask(player['player_id'], check_date)
'FunWebProducts', 'SeznamBot', ) for bot in bots: if x.find(bot) != -1: return False if len(x) < 20 or len(x) > 250: return False return True if __name__ == "__main__": config.initLog("agents_update", True) logging.info("Started %s" % time.strftime("%H:%M:%S %d.%m.%Y")) try: f = open( os.path.join(os.path.dirname(__file__), '..', 'docs', 'agents'), 'r') except IOError: logging.error('file not found') sys.exit() agents = set([i.strip() for i in f if filter_bot(i.strip())]) logging.info("found %d unique agents" % len(agents)) db = db_operations.DB() for agent in agents:
if acc is None: logging.error('аккаунт не найден') continue #сменили тип нотификейшенов res = db.setAccountNotify(acc['id'], 'email') logging.debug("change type result %s" % res) message = "%s: balance < 0, notify type change to email" % acc['login'] res1 = sender.sendNotify(acc, message, 'Notify type change by balance', 'sms') res2 = sender.sendNotify(acc, message, 'Notify type change by balance', 'email') logging.debug('result sms - %s; email - %s' % (res1, res2)) if res1 is not True or res2 is not True: logging.error(res1) logging.error(res2) continue logging.info('success notification of change notify type') return len(accounts) if __name__ == "__main__": config.initLog('notify_billing') db = db_operations.DB() res = changeNotifyTypeByBalance(db) logging.info("обработано %d аккаунтов" % res) db.close()
result = [] for k, v in groupby(attack, lambda x: x['player_id']): v = list(v) result.append({ 'acc':v[0]['acc_id'], 'ids':[a['attack_id'] for a in v], 'message':createMessage(v)}) return result def exit(): global db logging.info("End %s" % time.strftime('%H:%M:%S %d.%m.%Y')) db.close() sys.exit() if __name__ == "__main__": config.initLog('sender') db = db_operations.DB() #сменили тип оповещений на аккаунтах с отрицательным балансом res = changeNotifyTypeByBalance(db) logging.info("обработано %d аккаунтов" % res) #взяли атаки для оповещения attack = db.getAttackForNotification() logging.info('Найдено %d атак для уведомления' % len(attack)) if len(attack) == 0: exit() #сжали до одного толстого сообщения по каждому игроку
#Каждую минуту проверяет наличие заданий на проверку игроков и запускает их при наличии #TODO переписать на демона (?) __author__ = "esemi" import logging import os import subprocess import config import db_operations if __name__ == "__main__": config.initLog('run_check') #получаем таски на эту минуту db = db_operations.DB() tasks = db.getCurrentTasks() logging.info('найдено %d тасков' % len(tasks)) for task in tasks: if task['status'] != 'wait': logging.error("задача уже обработана?! Как, кем, билиать!? (%s)" % task) continue logging.info("запускаем проверку игрока %d (task id %d)" % (task['player_id'], task['id']) ) subprocess.Popen(['python', os.path.join(os.path.dirname(__file__), 'checker.py'), '--task', str(task['id'])]) db.close()