#!/usr/bin/python

import sys,os
from optparse import OptionParser
import socket
import struct

verbose = False

def prefix_ipa_ctrl_header(data):
	return struct.pack(">HBB", len(data)+1, 0xee, 0) + data

def remove_ipa_ctrl_header(data):
	if (len(data) < 4):
		raise BaseException("Answer too short!")
	(plen, ipa_proto, osmo_proto) = struct.unpack(">HBB", data[:4])
	if (plen + 3 > len(data)):
		print "Warning: Wrong payload length (expected %i, got %i)" % (plen, len(data) - 3)
	if (ipa_proto != 0xee or osmo_proto != 0):
		raise BaseException("Wrong protocol in answer!")

	return data[4:plen+3], data[plen+3:]

def connect(host, port):
	if verbose:
		print "Connecting to host %s:%i" % (host, port)

	sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	sck.setblocking(1)
	sck.connect((host, port))
	return sck

def send(sck, data):
	if verbose:
		print "Sending \"%s\"" %(data)
	data = prefix_ipa_ctrl_header(data)
	sck.send(data)

def do_set(var, value, id, sck):
	setmsg = "SET %s %s %s" %(options.id, var, value)
	send(sck, setmsg)

def do_get(var, id, sck):
	getmsg = "GET %s %s" %(options.id, var)
	send(sck, getmsg)

if __name__ == '__main__':
        parser = OptionParser("Usage: %prog [options] var [value]")
        parser.add_option("-d", "--host", dest="host",
                          help="connect to HOST", metavar="HOST")
        parser.add_option("-p", "--port", dest="port", type="int",
                          help="use PORT", metavar="PORT", default=4249)
        parser.add_option("-g", "--get", action="store_true",
                          dest="cmd_get", help="perform GET operation")
        parser.add_option("-s", "--set", action="store_true",
                          dest="cmd_set", help="perform SET operation")
        parser.add_option("-i", "--id", dest="id", default="1",
                          help="set id manually", metavar="ID")
        parser.add_option("-v", "--verbose", action="store_true",
                          dest="verbose", help="be verbose", default=False)
        parser.add_option("-m", "--monitor", action="store_true",
                          dest="monitor", help="monitor the connection for traps", default=False)

        (options, args) = parser.parse_args()

        verbose = options.verbose

        if options.cmd_set and options.cmd_get:
	        parser.error("Get and set options are mutually exclusive!")

        if not (options.cmd_get or options.cmd_set or options.monitor):
	        parser.error("One of -m, -g, or -s must be set")

        if not (options.host):
	        parser.error("Destination host and port required!")

        sock = connect(options.host, options.port)

        if options.cmd_set:
	        if len(args) < 2:
		        parser.error("Set requires var and value arguments")
	        do_set(args[0], ' '.join(args[1:]), options.id, sock)

        if options.cmd_get:
	        if len(args) != 1:
		        parser.error("Get requires the var argument")
	        do_get(args[0], options.id, sock)

        data = sock.recv(1024)
        while (len(data)>0):
	        (answer, data) = remove_ipa_ctrl_header(data)
	        print "Got message:", answer

        if options.monitor:
	        while (True):
		        data = sock.recv(1024)
		        if len(data) == 0:
			        print "Connection is gone."
			        break

		        while (len(data)>0):
			        (answer, data) = remove_ipa_ctrl_header(data)
			        print "Got message:", answer

        sock.close()
