Create new ogClient

This commit init the new ogClient. The new ogClient has support for configuring
and for connecting with the ogAdminServer.
more_events
Alvaro Neira Ayuso 2019-12-12 11:50:46 +01:00 committed by Alvaro Neira Ayuso
parent e3d707cfb3
commit 29fe301ec8
6 changed files with 168 additions and 0 deletions

3
.gitignore vendored
View File

@ -127,3 +127,6 @@ dmypy.json
# Pyre type checker
.pyre/
# ignore swp
*.swp

7
cfg/ogagent.cfg 100644
View File

@ -0,0 +1,7 @@
[opengnsys]
ip=192.168.2.175
port=1234
# Remote OpenGnsys Service
remote=https://192.168.2.10/opengnsys/rest
# Log Level, if ommited, will be set to INFO
log=DEBUG

39
main.py 100644
View File

@ -0,0 +1,39 @@
from src.ogClient import *
from src.ogConfig import *
CONNECTING = 0
RECEIVING = 1
def main():
ogconfig = ogConfig()
if (not ogconfig.parserFile('cfg/ogagent.cfg')):
print 'Error: Parsing configuration file'
return 0
ip = ogconfig.getValueSection('opengnsys', 'ip')
port = ogconfig.getValueSection('opengnsys', 'port')
client = ogClient(ip, int(port))
client.connect()
while 1:
sock = client.get_socket()
state = client.get_state()
if state == CONNECTING:
readset = [ sock ]
writeset = [ sock ]
else:
readset = [ sock ]
writeset = [ ]
readable, writable, exception = select.select(readset, writeset, [ ])
if state == CONNECTING and sock in writable:
client.connect2()
elif state == RECEIVING and sock in readable:
client.receive()
else:
print "bad state" + str(state)
if __name__ == "__main__":
main()

0
src/__init__.py 100644
View File

95
src/ogClient.py 100644
View File

@ -0,0 +1,95 @@
import errno
import select
import socket
import time
import httplib
from mimetools import Message
from StringIO import StringIO
CONNECTING = 0
RECEIVING = 1
class ogClient:
def __init__(self, ip, port):
self.ip = ip
self.port = port
def get_socket(self):
return self.sock
def get_state(self):
return self.state
def connect(self):
print "connecting"
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setblocking(0)
self.state = CONNECTING
self.data = ""
self.trailer = False
self.content_len = 0
try:
self.sock.connect((self.ip, self.port))
except socket.error, err:
if err.errno == errno.EINPROGRESS:
return
elif err.errno == errno.ECONNREFUSED:
return
print "Error connect " + str(err)
def connect2(self):
try:
self.sock.connect((self.ip, self.port))
except socket.error, err:
if err.errno == errno.EISCONN:
print "connected"
self.state = RECEIVING
else:
print "connection refused, retrying..."
self.state = CONNECTING
self.sock.close()
self.connect()
def receive(self):
print "receiving"
try:
data = self.sock.recv(1024)
except socket.err, err:
print "Error3 " + str(err)
if len(data) == 0:
self.state = CONNECTING
self.sock.close()
self.connect()
print "received " + data
self.data = self.data + data
if not self.trailer:
if self.data.find("\r\n") > 0:
# https://stackoverflow.com/questions/4685217/parse-raw-http-headers
request_line, headers_alone = self.data.split('\n', 1)
headers = Message(StringIO(headers_alone))
print "DEBUG: \r\n trailer received"
print "DEBUG: HTTP keys are " + str(headers.keys())
if 'content-length' in headers.keys():
self.content_len = int(headers['content-length'])
self.trailer = True
if self.trailer and len(self.data) >= self.content_len:
#
# TODO: handle request here
#
self.sock.send("HTTP/1.0 200 OK\r\n\r\n")
# Cleanup state information from request
self.data = ""
self.content_len = 0
self.trailer = False
print "DEBUG: request has been processed!"

24
src/ogConfig.py 100644
View File

@ -0,0 +1,24 @@
import configparser
class ogConfig:
def __init__(self):
self.parser = configparser.ConfigParser()
def parserFile(self, path):
self.parser.read(path)
if len(self.parser.sections()) == 0:
return False
return True
def getSections(self):
return self.parser.sections()
def getContainsSection(self, section):
return section in self.parser
def getValueSection(self, section, key):
if (not self.getContainsSection(section)):
return ''
return self.parser[section][key]