#!/usr/bin/env python
#
#
#   multiwatch
#
#   Supervisory watch of several SGD sockets.
#
#   Version 2003-10-30(a)
#
#   Copyright (C) 2003, by the Grand River Dam Authority,
#   All rights reserved.
#
#   Author: Matt Roberts
#
#
#

import sys
import socket
import select
import os

socket_prefix = '/var/run/sgd'
socket_names  = [ ]
open_sockets  = [ ]

#
#  port class
#

class port:
	def __init__(self, pn):
		self.name = pn
		self.setup()
	
	def setup(self):
		try: del(self.sock)
		except: pass
		try: del(self.buffer)
		except: pass

		self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
		self.sock.connect(self.name)
		self.buffer = ''

	def process(self):
		# get data from socket
		try:
			a = self.sock.recv(1024)
		except:
			self.setup()
			return

		# DEBUG:
		#sys.stderr.write("Process: \"%s\"\n" % a)

		for i in a:
			if i == '\n': self.buffer += i
			if ord(i) < 32:  continue
			if ord(i) > 126: continue
			self.buffer += i

	def getline(self):
		self.process()
		if '\n' in self.buffer:
			i = self.buffer.split('\n', 1)
			self.buffer = i[1]
			return i[0].strip()

	def fileno(self):
		return self.sock.fileno()


# usage function
def usage():
	sys.stderr.write("Usage: multiwatch <sock1> [ <sock2> [ <sock3> [ ...]]]\n")
	sys.exit(1)




#
#
#
#
#     Main Program
#
#
#
#

# display something
sys.stderr.write("Opening ports: ")
sys.stderr.flush()

# find sockets
for i in sys.argv[1:]:
	full_path = socket_prefix + '/' + i

	if not os.path.exists(full_path):
		sys.stderr.write("\nCannot find socket \"%s\"\n" % full_path)
		sys.exit(1)
	
	socket_names.append(full_path)
	del(full_path)

# open sockets
for sp in socket_names:
	try:
		open_sockets.append(port(sp))
	except Exception, e:
		sys.stderr.write("\nCannot open socket \"%s\": %s\n" % (sp, str(e)))
		sys.exit(1)

# display some more
sys.stderr.write("done.\n\n")
sys.stderr.flush()

# read data from sockets
while 1:
	try:
		rset, wset, eset = open_sockets, [ ], [ ]
		rset, wset, eset = select.select(rset, wset, eset)
		for sock in rset:
			a = sock.getline()
			if a: sys.stdout.write("\a%s\n" % a)
	except KeyboardInterrupt:
		sys.stderr.write("\n")
		sys.stderr.write("USER DISCONNECT.\n")
		sys.stderr.write("\n")
		sys.exit(0)
	except Exception, e:
		sys.stderr.write("Error: %s\n" % str(e))
		sys.exit(1)

