new_contents: """
  The most basic (working) CherryPy 3.1 Windows service possible.
  Requires Mark Hammond's pywin32 package.
  """
  
  import win32serviceutil
  import win32service
  
  import cherrypy
  import os
  from rfid import ten_digit_to_comma_format, RFIDClient
  
  ip_address = '192.168.1.20'
  controller_serial = 11111111
  client = RFIDClient(ip_address, controller_serial)   
  
  class RootServer:
  	@cherrypy.expose
  	def index(self, apiKey=None, action=None, badge=None):
  		if (apiKey == "secret"):
  			if badge:
  				badge = ten_digit_to_comma_format(int(badge)) 
  				if (action == "remove"):
  					try:
  						client.remove_user(badge)
  						return "User Removed Successfully"
  					except:
  						return "Failed To Remove User"
  				elif (action == "add"):
  					try:
  						client.add_user(badge, [1,2])
  						return "User Added Successfully"
  					except:
  						return "Failed To Add User"
  				else:
  					return "must specify an action"
  			else:
  				return "no badge number entered"
  		else:
  			return "" #return nothing when no API key is entered
  	
  
  class MyService(win32serviceutil.ServiceFramework):
  	"""NT Service."""
  	
  	_svc_name_ = "CherryPyService"
  	_svc_display_name_ = "CherryPy Service"
  
  	def SvcDoRun(self):
  		cherrypy.tree.mount(RootServer(), '/accessControlApi')
  		
  		# in practice, you will want to specify a value for
  		# log.error_file below or in your config file.  If you
  		# use a config file, be sure to use an absolute path to
  		# it, as you can't be assured what path your service
  		# will run in.
  		cherrypy.config.update({
  			'global': {'server.socket_host': '0.0.0.0',
  			'server.socket_port':443,
  			'server.ssl_module':'pyopenssl',
  			'server.ssl_certificate':'server.crt',
  			'server.ssl_private_key':'server.key',
  			'log.access_file' : os.path.join("access.log")}
  		})
  		
  		cherrypy.engine.start()
  		cherrypy.engine.block()
  		
  	def SvcStop(self):
  		self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
  		cherrypy.engine.exit()
  		
  		self.ReportServiceStatus(win32service.SERVICE_STOPPED) 
  		# very important for use with py2exe
  		# otherwise the Service Controller never knows that it is stopped !
  		
  if __name__ == '__main__':
  	win32serviceutil.HandleCommandLine(MyService)
  
subject: add webservice for windows, as an example of how to install it as a service