def getVersion():
	ret = "Testerman Agent Controller Server %s" % Versions.getAgentControllerVersion()
	return ret
	def __init__(self, controller, iaAddress):
		Nodes.ListeningNode.__init__(self, "TACS/Ia", "IaServer/%s" % Versions.getAgentControllerVersion())
		self._controller = controller
		self.initialize(iaAddress)
	# If an explicit pid file was provided, use it. Otherwise, fallback to the var_root/ts.pid if possible.
	pidfile = cm.get("tacs.pid_filename")
	if not pidfile and cm.get("testerman.var_root"):
		# Set an actual value
		pidfile = cm.get("testerman.var_root") + "/ts.pid"
		cm.set_actual("tacs.pid_filename", pidfile)


#	print Tools.formatTable([ ('key', 'Name'), ('format', 'Type'), ('dynamic', 'Dynamic'), ('default', 'Default value'), ('user', 'User value'), ('actual', 'Actual value')], cm.getVariables(), order = "key")

	# Logger initialization
	level = cm.get("tacs.debug") and logging.DEBUG or logging.INFO
	logging.basicConfig(level = level, format = '%(asctime)s.%(msecs)03d %(thread)d %(levelname)-8s %(name)-20s %(message)s', datefmt = '%Y%m%d %H:%M:%S', filename = cm.get("tacs.log_filename"))
	
	# Display startup info
	getLogger().info("Starting Testerman Agent Controller Server %s" % (Versions.getAgentControllerVersion()))
	getLogger().info("Agent interface    (Xa) listening on tcp://%s:%s" % (cm.get("interface.xa.ip"), cm.get("interface.xa.port")))
	getLogger().info("Internal interface (Ia) listening on tcp://%s:%s" % (cm.get("interface.ia.ip"), cm.get("interface.ia.port")))

	# Now we can daemonize if needed
	if cm.get("tacs.daemonize"):
		if pidfile:
			getLogger().info("Daemonizing, using pid file %s..." % pidfile)
		else:
			getLogger().info("Daemonizing...")
		Tools.daemonize(pidFilename = pidfile, displayPid = True)


	# Main start
	cm.set_transient("tacs.pid", os.getpid())
	controller = None