#!/usr/bin/python
# encoding: utf-8
# +------------------------------------------------------------------+
# |             ____ _               _        __  __ _  __           |
# |            / ___| |__   ___  ___| | __   |  \/  | |/ /           |
# |           | |   | '_ \ / _ \/ __| |/ /   | |\/| | ' /            |
# |           | |___| | | |  __/ (__|   <    | |  | | . \            |
# |            \____|_| |_|\___|\___|_|\_\___|_|  |_|_|\_\           |
# |                                                                  |
# | Copyright Mathias Kettner 2014             mk@mathias-kettner.de |
# +------------------------------------------------------------------+
#
# This file is part of Check_MK.
# The official homepage is at http://mathias-kettner.de/check_mk.
#
# check_mk is free software;  you can redistribute it and/or modify it
# under the  terms of the  GNU General Public License  as published by
# the Free Software Foundation in version 2.  check_mk is  distributed
# in the hope that it will be useful, but WITHOUT ANY WARRANTY;  with-
# out even the implied warranty of  MERCHANTABILITY  or  FITNESS FOR A
# PARTICULAR PURPOSE. See the  GNU General Public License for more de-
# ails.  You should have  received  a copy of the  GNU  General Public
# License along with GNU Make; see the file  COPYING.  If  not,  write
# to the Free Software Foundation, Inc., 51 Franklin St,  Fifth Floor,
# Boston, MA 02110-1301 USA.

import socket, sys
BUFFER_SIZE = 1024
try:
    HOST        = sys.argv[1]
    TCP_PORT    = int(sys.argv[2])
    SERVICE     = sys.argv[3]
    JOB         = sys.argv[4]
    if JOB == "ADDRESS":
        STREET      = sys.argv[5]
        STREET_NR   = sys.argv[6]
        CITY        = sys.argv[7]
        REGEX       = sys.argv[8]
except:
    print " Usage: client_uniserv.py HOSTNAME PORT SERVICE (VERSION|ADDRESS STREET NR CITY SEARCH_REGEX) "
    sys.exit(3)

def parse_response(data):
    info = dict([ x.split('=') for x in data.split(";") ][:-1])
    if info['type'] == '1':
        print "Invalid response: " % str(info)
        sys.exit(3)
    return info

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, TCP_PORT))

sendstring = "open:service="+SERVICE+";servicehost="+HOST+"\n"
s.send(sendstring)

data = parse_response(s.recv(BUFFER_SIZE))
if not data.get('session'):
    print "Error getting SID. Response was: " + str(data)
    sys.exit(3)
sid = data.get('session')

if JOB == "VERSION":
    sendstring = "version:session="+sid+"\n"
    s.send(sendstring)
    data = parse_response(s.recv(BUFFER_SIZE))
    state = 0
    infotext = "Version is " + data['version_str']
elif JOB == "ADDRESS":
    import re
    sendstring = "exec:session=%s;request_type=check_address;in_str=%s;in_hno=%s;in_city=%s\n" % \
    ( sid, STREET, STREET_NR, CITY )
    s.send(sendstring)
    data = parse_response(s.recv(BUFFER_SIZE))	
	
    sendstring = "fetch:session="+sid+";out_zip=?;out_city=?\n"
    s.send(sendstring)
    data = parse_response(s.recv(BUFFER_SIZE))
	
    state = 0
    infotext = "Address is %s %s" % ( data['out_zip'], data['out_city'])
    if not re.match( REGEX, data['out_city']):
        infotext += " But excpects %s" % REGEX
        state = 2
else:
    state = 3
    infotext = "JOB not known"

s.send("close:session="+sid+"\n")
s.close()

print infotext
sys.exit(state)
