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";
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;
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
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;