Files
SC200/sc200-push.py
2016-12-20 12:42:08 +08:00

112 lines
2.6 KiB
Python
Executable File

#!/usr/bin/python3
#from netaddr import IPNetwork
#from netaddr import IPAddress
from xmlrpc.client import ServerProxy
#import sqlite3
import socket
import csv
import queue
import threading
import sys
import http.client
WORKERS = 10
inFilePath = sys.argv[1]
def GetStatusCode(host, path="/"):
try:
conn = http.client.HTTPConnection(host)
conn.request("GET", path)
return conn.getresponse().status
except Exception:
return None
class Worker(threading.Thread):
def __init__(self, Settings, Results):
self.__Settings = Settings
self.__Results = Results
self.parent = threading.current_thread()
threading.Thread.__init__(self)
def run(self):
retry = False
socket.setdefaulttimeout(5)
while 1:
DevSettings = self.__Settings.get()
if DevSettings is None:
self.__Results.put(None)
break
IP = DevSettings.pop('IP', None)
for k in list(DevSettings.keys()):
if k.startswith('Alarm-Name'):
DevSettings.pop(k)
if GetStatusCode(str(IP), "/languages") == 200:
#print((self.getName() + ' processing: ' + str(IP)))
while True:
proxy = ServerProxy('http://%s/xmlrpc' % IP)
try:
#print(((DevSettings)))
Result = proxy.db.set(DevSettings)
except socket.timeout:
retry = True
continue
if retry:
retry = False
else:
break
if len(Result) > 0:
Result['IP'] = str(IP)
self.__Results.put(Result)
else:
print((self.getName() + ' skipping: ' + str(IP)))
def Input():
with open(inFilePath, 'r', newline='') as inFile:
csvReader = csv.DictReader(inFile)
for row in csvReader:
Settings.put(row)
inFile.close()
for i in range(WORKERS):
Settings.put(None)
def Output():
Count = WORKERS
while 1:
Row = Results.get()
if Row is None:
if Count > 1:
Count -= 1
else:
break
else:
print(((Row['IP'] + ':' + Row['resultString'])))
Settings = queue.Queue(0)
Results = queue.Queue(0)
Input()
for i in range(WORKERS):
Worker(Settings, Results).start()
if threading.current_thread() is not threading.main_thread():
sys.exit(0)
Output()
sys.exit(0)