# class for interfacing with FAH server in Python.

from os import system, chdir
from os.path import abspath
from FAHBaseType import FAHBaseType
from ProjectConfigurationFile import *
class FAHServer( FAHBaseType ):
	"""
	This class creates an object representing a Folding@home server which
	may be manipulated in a python script.

	To generate a server object with the default settings:

		>>> server = FAHServer()
		>>> print server.server2dir
		/home/server/server2
		>>> print server.configurationfile
		project.conf
		>>> print server.serverBinary
		serverV3M
		>>> print server.SVr 
		SVr.sh

	If your server is configured a little differently:

		>>> server = FAHServer( server2dir = "/home/server_c/server2",
					serverBinary = "serverV3M_c",
					SVr = "SVr_c.sh" )
	"""

	def __init__ ( self, server2dir 	= "/home/server/server2", 
			serverBinary		= "serverV3M",
			configurationFile	= "project.conf",
			SVr 			= "SVr.sh",
			saveAs 			= None,
			verbose 		= False ):

		self.server2dir = abspath( server2dir )
		self.serverBinary = abspath( serverBinary )
		self.configurationFile = abspath( "%s/%s" % ( self.server2dir, configurationFile ) )
		self.SVr = SVr

		# loudness
		self.verbose = verbose

		# generate the configuration
		self.configuration = {} # not set 
		self.projects = {}
		self.weights= {}
		self.parseConfig()

	def parseConfig_old( self ):
		self._vmesg( "Parsing %s" % self.configurationFile )
		CONF=open( self.configurationFile )
		conf=CONF.readlines()
		CONF.close()
		for line in conf :
			stripline=line[: line.find("#") ]
			if "SERVER_CONF" in stripline :
				proj = stripline.split()[1]
				projnum=proj.split("/")[-1].split(".")[0].replace("project","")
				self.projects[ projnum ] = proj
			
	def parseConfig( self ):
		self._vmesg( "Parsing %s" % self.configurationFile )
		CONF=open( self.configurationFile )
                conf=CONF.readlines()
                CONF.close()
                for line in conf :
			stripline=line[ : line.find("#") ]
			if "SERVER_CONF" in stripline :
				projfile = stripline.split()[1] 
				if "ASSIGN_AND_ACCEPT" in stripline :
					try : weight=int( stripline.split()[3] )
					except: weight=0
				else: weight = 0

				pfilepath = "%s/%s" % ( self.server2dir, projfile )
				try:
					project = ProjectConfigurationFile( pfilepath,self.server2dir,self.verbose )
				except ProjectConfigurationFile.CannotFindConfiguration:
					print "while looking for %s" % projfile
					raise
				self.projects[ str( project.projectnumber ) ] = projfile
				self.weights[ str( project.projectnumber ) ] = weight
					
	def restartServer( self ):
		n = system( "killall -TERM %s" % self.serverBinary )
		return n

	def stopServer( self ):
		n = system( "killall -TERM %s %s" % ( self.SVr, self.serverBinary ) )
		return n

	def startServer( self ):
		# first check to make sure that the server is not running--this is
		# important
		
		# also cd to server2! then cd back?

		print "Starting server is not yet implemented."

	def runSetupDataDirs( self ):
		olddir = abspath( "." )
		chdir( self.server2dir )
		n = system( "./SetupDataDirs" )
		chdir( olddir )
		return n 	
