コード例 #1
0
ファイル: servermgr.py プロジェクト: nationgaming/openmaul
	def processCommand(self, cmd, args):
		if(args == None and cmd == "status"):
			server_name = '*';
		elif(len(args) != 1):
			return "Usage: %s <server>"%(cmd);
		else:
			server_name = args[0];
			
		server_list = parseServer(self.state, server_name);
		if(len(server_list) == 0):
			return "No server matched server name '%s'"%(server_name);
			
		if(cmd == "start"):
			for server_key in server_list:
				self.startServer(server_key);		
				
		elif(cmd == "stop"):
			for server_key in server_list:
				self.stopServer(server_key);
		elif(cmd == "restart"):
			for server_key in server_list:
				self.restartServer(server_key);
		elif(cmd == "status"):
			result = "";
			for server_key in server_list:
				result = "\n".join((result,self.getStatus(server_key)));
			return result;
		
		return "Operation complete, check log for details";		
コード例 #2
0
ファイル: mapcycle.py プロジェクト: nationgaming/openmaul
	def processCommand(self, cmd, args):
		config = self.state['config'];
		if(cmd == "mapcycle_list"):
			if(len(args) != 1):
				return "[mapcycle]: Usage: mapcycle_list <server>";
			else:
				server_name = args[0];
				server_list = parseServer(self.state, server_name);
				if(len(server_list) == 0):
					return "[mapcycle]: No server matched server name '%s'"%(server_name);
				result = "[mapcycle]: Map cycle, by server:";
				for server_key in server_list:
					server = config.getServer(server_key);
					mapcyclefile = self.getMapcycleFile(server);
					if(mapcyclefile == None):
						result = "\n".join((result, "[mapcycle %s]: Unable to complete mapcycle operation.  Check the log for details."%(server['name'])));
						continue;
					map_list = self.readMapcycleFile(server, mapcyclefile);
					if(map_list == None):
						result = "\n".join((result, "[mapcycle %s]: Unable to complete mapcycle operation.  Check the log for details."%(server['name'])));
						continue;
					map_text = "";
					i = 1;
					for mapname in map_list:
						map_text = "%s #%d) %s,"%(map_text, i, mapname);
						i = i+1;
					result = "\n".join((result, "[mapcycle %s]: Current map cycle: %s"%(server['name'], map_text)));
				return result;
		elif(cmd == "mapcycle_add" or cmd == "mapcycle_del"):
			if(len(args) < 2):
				return "[mapcycle]: Usage: %s <server> <map>";
			else:
				server_name = args[0];
				server_list = parseServer(self.state, server_name);
				if(len(server_list) == 0):
					return "[mapcycle]: No server matched server name '%s'"%(server_name);
				result = "[mapcycle]: Mapcycle update results, by server:";
				target_map = args[1];
				for server_key in server_list:
					server = config.getServer(server_key);
					mapcyclefile = self.getMapcycleFile(server);
					if(mapcyclefile == None):
						result = "\n".join((result, "[mapcycle %s]: Unable to complete mapcycle operation.  Check the log for details."%(server['name'])));
						continue;
					map_list = self.readMapcycleFile(server, mapcyclefile);
					if(map_list == None):
						result = "\n".join((result, "[mapcycle %s]: Unable to complete mapcycle operation.  Check the log for details."%(server['name'])));
						continue;
					if(cmd=="mapcycle_del"):
						if(target_map[0] == '#'):
							try:
								target_map_idx = int(target_map[1:]) - 1;
								if(len(map_list) <= target_map_idx):
									result = "\n".join((result, "[mapcycle %s]: Invalid map number specified."%(server['name'])));
									continue;
								else:
									del map_list[target_map_idx];
									if(self.writeMapcycleFile(server, mapcyclefile, map_list) == True):
										result = "\n".join((result, "[mapcycle %s]: Removed map %s."%(server['name'], target_map)));
									else:
										result = "\n".join((result, "[mapcycle %s]: Error occured writing map file.  Check the logs for more information."%(server['name'])));
									continue;
							except:
								pass;
						if(target_map not in map_list):
							result = "\n".join((result, "[mapcycle %s]: Map (%s) not in the mapcycle."%(server['name'],target_map)));
							continue;
						map_list.remove(target_map);
						if(self.writeMapcycleFile(server, mapcyclefile, map_list) == True):
							result = "\n".join((result, "[mapcycle %s]: Removed map %s."%(server['name'], target_map)));
						else:
							result = "\n".join((result, "[mapcycle %s]: Error occured writing map file.  Check the logs for more information."%(server['name'])));
					elif(cmd == "mapcycle_add"):
						map_list.append(target_map);
						if(self.writeMapcycleFile(server, mapcyclefile, map_list) == True):
							result = "\n".join((result, "[mapcycle %s]: Added map %s."%(server['name'], target_map)));
						else:
							result = "\n".join((result, "[mapcycle %s]: Error occured writing map file.  Check the logs for more information."%(server['name'])));

				return result;
コード例 #3
0
ファイル: srcds_update.py プロジェクト: nationgaming/openmaul
	def processCommand(self, cmd, args):
		config = self.state['config']
		if(len(args) != 1):
			return "Usage: update <server>";
		
		if(cmd == "autoupdate"):
			all_servers = config.getServerList();
			if(args[0] in all_servers):
				server_list = [args[0]];
			else:
				return "Auto-update error, invalid server key: %s"%(args[0],);
		elif(args[0] != self.auth_key):
			all_servers = config.getServerList();
			server_name = args[0];
			server_key_list = parseServer(self.state, server_name);
			if(len(server_key_list) == 0):
				return "No server matched server name '%s'"%(server_name);
			auth_key = "".join(random.sample(string.letters+string.digits, 6))
			self.auth_key = auth_key;
			self.auth_server_list = server_key_list;
			server_names_list = list();
			for server_key in server_key_list:
				server = config.getServer(server_key);
				server_names_list.append(server['name']);
			return "***WARNING: Each server will shut down before it updates, \
if it is SCI controlled.\nDo NOT restart the server(s) until \
all updates are complete.\nWhen you are ready, proceed with the \
update by issuing the command: update %s\n\
Servers marked for update: %s"%(auth_key,", ".join(server_names_list));
		else:
			server_list = self.auth_server_list;
			self.auth_key = None;
			self.auth_server_list = None;
		
		rcon_result = "Server update request status:";
		for server_key in server_list:		
			server = config.getServer(server_key);
			if('update_cmd' not in server):
				rcon_result = "\n".join((rcon_result,"Can't update '%s' - no update command specified.."%(server['name'],)));
				continue;
			update_cmd = server['update_cmd'];
			if(server_key in self.update_queue or server_key == self.current_update):
				rcon_result = "\n".join((rcon_result,"Update process is already queued for '%s'."%(server['name'],)));
			else:
				self.update_queue[server_key] = (update_cmd,);
				rcon_result = "\n".join((rcon_result,"Server update for %s is now queued."%(server['name'],)));
		
		if(self.current_update == None and len(self.update_queue) > 0):	
			(server_key, (update_cmd,)) = self.update_queue.popitem();
			server = config.getServer(server_key);
			self.state['router'].routeLocalCommand("stop %s"%(server['name']));
			update_obj = SCIUpdateProtocol(server_key, server['name'], self.state['log']);
			update_obj.deferred.addCallback(lambda x, x_server_key: self.updateComplete(x_server_key), server_key);
			self.current_update = server_key;
			self.state['log'].printStatus("[update]: Starting update for %s, %d items left in queue."%(server['name'], len(self.update_queue)));
			try:
				p = reactor.spawnProcess(update_obj, update_cmd, (update_cmd,), env=None);
			except:
				self.state['log'].printStatus("[update %s]: Error starting update."%(server['name']));
				self.updateComplete(server_key);	

		return rcon_result
コード例 #4
0
ファイル: configfile.py プロジェクト: nationgaming/openmaul
	def processCommand(self, cmd, args):
		config = self.state['config']
		if(cmd == "cfgget" and len(args) != 2):
			return "Usage: %s <server> <option>"%(cmd,);
		if(cmd == "cfgset" and len(args) < 3):
			return "Usage: %s <server> <option> <value>"%(cmd,);
					
		server_name = args[0];
		server_list = parseServer(self.state, server_name);
		# print server_list
		if(len(server_list) == 0):
			return "No server matched server name '%s'"%(server_name);
		
		option = args[1];
		if(cmd == "cfgset"):
			value = " ".join(args[2:]).strip().replace(";","");
			if(value[0] == "\"" and value[-1] == "\""):
				value = value[1:-1];
		# this would match when there are unbalanced " marks, although I'm not 100% sure
		# which way I want to go here:
		# ^\s*(\w*)\s+(\"{0,1})(.*)\2\s*$
		cfg_searcher = re.compile(r"^\s*(\w*)\s+(\"{0,1})((\\.|[^\"])*)\2\s*$", re.IGNORECASE);
		
		output = "[%s] Config query results:"%(cmd,);
		
		for server_key in server_list:
			server = config.getServer(server_key);
			if("%s_allow"%(cmd,) in server):
				allowed_cmd_list = server["%s_allow"%(cmd,)].split(",");
				map(str.strip, allowed_cmd_list);
				if(option not in allowed_cmd_list):
					output = "\n".join((output, "[%s %s]: You may not modify this option for this server."%(cmd, server['name'])));
					continue;
			else:
				output = "\n".join((output, "[%s %s]: You may not modify the server.cfg for this server."%(cmd, server['name'])));
				continue;
			
			success = False;
			cfgfile_name = os.path.join(server['dir'], "cfg", "server.cfg");
			cfgfile_new_name = os.path.join(server['dir'], "cfg", "server.cfg.tmp");
			try:
				cfgfile_old = open(cfgfile_name, 'r');
				if(cmd=="cfgset"):
					cfgfile_new = open(cfgfile_new_name, "w+");
				else:
					cfgfile_new = None;
			except:
				output = "\n".join((output, "[%s %s]: File system error trying to open config file."%(cmd, server['name'])));
				continue;
				
			for line in cfgfile_old:
				cur_match = cfg_searcher.match(line);
				if(cur_match == None):
					continue;
				#print("Read option '%s', value '%s'"%cur_match.group(1,3));
				if(cur_match.group(1) == option):
					success = True;
					cur_result = cur_match.group(3);
					if(cmd == "cfgget"):
						output = "\n".join((output, "[%s %s]: Current value of '%s': %s"%(cmd, server['name'], option, cur_result)));
						break;
					elif(cmd == "cfgset"):
						output = "\n".join((output, "[%s %s]: Update OK!  Previous value of '%s': %s"%(cmd, server['name'], option, cur_result)));
						cfgfile_new.write("%s \"%s\"\n"%(option, value))
				elif(cmd=="cfgset"):
					cfgfile_new.write(line);

					
			if(success == False):
				if(cmd=="cfgget"):
					output = "\n".join((output, "[%s %s]: Could not find option %s in the config file!"%(cmd, server['name'], option)));
				else:
					cfgfile_new.write("%s \"%s\"\n"%(option, value))
					output = "\n".join((output, "[%s %s]: Added %s to the config file, with value %s"%(cmd, server['name'], option, value)));
			cfgfile_old.close();
			if(cfgfile_new != None):
				cfgfile_new.close();
				try:
					os.remove("%s.old"%(cfgfile_name));
					os.rename(cfgfile_name, "%s.old"%(cfgfile_name));
					os.rename(cfgfile_new_name, cfgfile_name);
				except:
					output = "\n".join((output, "[%s %s]: ERROR overwriting config file!"%(cmd, server['name'])));
		return output;