first changes so far to handling how autism bots connect and their resource ussage
This commit is contained in:
		
							parent
							
								
									ba06b94845
								
							
						
					
					
						commit
						de458c3c37
					
				| @ -23,7 +23,8 @@ | ||||
| 
 | ||||
|     #probably good idea to symlink the download folder | ||||
|     ln -s /home/autismbot1/.steam/debian-installation/steamapps/common/Counter-Strike\ Source/cstrike/download /home/autismbot2/.steam/debian-installation/steamapps/common/Counter-Strike\ Source/cstrike/download | ||||
|     chmod g+x /home/user1 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 	dpkg-reconfigure locales | ||||
| @ -83,3 +84,9 @@ now using tigervnc instead of x2go. | ||||
| vncviewer -SecurityTypes VncAuth,TLSVnc ip:X Display | ||||
| 
 | ||||
| for example: vncviewer -SecurityTypes VncAuth,TLSVnc 127.0.0.1:1 | ||||
| 
 | ||||
| limiting cpu can throttle the download speed as well. if bots cant connect and are missing files, let them try to download stuff with the cpu limiting commented out instead. | ||||
| 
 | ||||
| #pip3 extra | ||||
| 
 | ||||
| pip3 install watchdog | ||||
|  | ||||
| @ -3,11 +3,10 @@ import os | ||||
| import sys | ||||
| import subprocess | ||||
| import atexit | ||||
| from threading import Timer | ||||
| import string | ||||
| from watchdog.observers import Observer | ||||
| from watchdog.events import FileSystemEventHandler | ||||
| import random | ||||
| import signal | ||||
| import traceback | ||||
| import socket | ||||
| import codecs | ||||
| import json | ||||
| @ -15,8 +14,8 @@ import datetime | ||||
| import time | ||||
| import glob | ||||
| 
 | ||||
| connection_issue_counter = 0; | ||||
| call_bot_connect = True | ||||
| restart_time = datetime.datetime.now() + datetime.timedelta(hours=5) | ||||
| 
 | ||||
| whoami = subprocess.getoutput(["whoami"]) | ||||
| with open(f'/home/{whoami}/ze_runner/config.json') as jsonfile: | ||||
| @ -24,6 +23,10 @@ with open(f'/home/{whoami}/ze_runner/config.json') as jsonfile: | ||||
| looptestPath = f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/cfg/looptest.cfg" | ||||
| chatmsg = "" | ||||
| 
 | ||||
| def overwrite_file_access(): | ||||
|     #setting defaults with setfacl for the download directory does not work seemingly | ||||
|     subprocess.Popen(["chmod", "-R", "g+rwx", f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/download"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL).communicate() | ||||
| 
 | ||||
| def writeCfgInput(Input_user): | ||||
|     with open(looptestPath, 'w') as f: | ||||
|         f.write(Input_user) | ||||
| @ -37,17 +40,21 @@ def writeCfgInput(Input_user): | ||||
|         time.sleep(0.5) | ||||
|         open(looptestPath, 'w').close() #clearing file. | ||||
| 
 | ||||
| def close_observer(observer): | ||||
|     observer.stop() | ||||
|     observer.join() #supposedly needed to clear resources again. | ||||
| 
 | ||||
| def clean_up_files(): | ||||
|     #deleting POSIX shared memory objects, as long as one process has them open they exist. THis is to prevent /dev/shm from being full | ||||
|     #due to steam child processes. | ||||
|     #even with steam turned offline might there be chromium web browsers left over from steam who still hold processes open. | ||||
|     #only kind of potential issues from this is steam cloud being out of sync, which is really fucking irrelevant.  | ||||
|     subprocess.Popen(["rm -rf /tmp/steam*"], shell=True, stdout=subprocess.PIPE).communicate()[0] | ||||
|     subprocess.Popen(["rm -rf /tmp/dbus*"], shell=True, stdout=subprocess.PIPE).communicate()[0] | ||||
|     subprocess.Popen(["rm -rf /tmp/pressure*"], shell=True, stdout=subprocess.PIPE).communicate()[0] | ||||
|     subprocess.Popen(["rm -rf /tmp/tigervnc*"], shell=True, stdout=subprocess.PIPE).communicate()[0] | ||||
|     subprocess.Popen(["rm -rf /tmp/dumps*"], shell=True, stdout=subprocess.PIPE).communicate()[0] | ||||
|     subprocess.Popen(["rm -rf /dev/shm/u100*"], shell=True, stdout=subprocess.PIPE).communicate()[0]  | ||||
|     subprocess.Popen(["rm -rf /tmp/steam*"], shell=True, stdout=subprocess.DEVNULL).communicate()[0] | ||||
|     subprocess.Popen(["rm -rf /tmp/dbus*"], shell=True, stdout=subprocess.DEVNULL).communicate()[0] | ||||
|     subprocess.Popen(["rm -rf /tmp/pressure*"], shell=True, stdout=subprocess.DEVNULL).communicate()[0] | ||||
|     subprocess.Popen(["rm -rf /tmp/tigervnc*"], shell=True, stdout=subprocess.DEVNULL).communicate()[0] | ||||
|     subprocess.Popen(["rm -rf /tmp/dumps*"], shell=True, stdout=subprocess.DEVNULL).communicate()[0] | ||||
|     subprocess.Popen(["rm -rf /dev/shm/u100*"], shell=True, stdout=subprocess.DEVNULL).communicate()[0]  | ||||
|     #users should only have permissions to delete their own files probably | ||||
| 
 | ||||
| def exit_handler(): | ||||
| @ -104,7 +111,7 @@ def strinput_append(strInput, nth): | ||||
|     return strInput | ||||
| 
 | ||||
| def kill_user_owned_pid(pid): | ||||
|     print('pid: ', pid, ' killed') | ||||
|     #print('pid: ', pid, ' killed') | ||||
|     pid = int(pid.strip()) | ||||
|     os.kill(pid, signal.SIGKILL) | ||||
|     time.sleep(10) | ||||
| @ -133,11 +140,10 @@ def restart_sdl_and_steam(): | ||||
|     time.sleep(5) | ||||
|      | ||||
|     cmd = f'vncserver -localhost no -geometry 1x1 -depth 24' | ||||
|     #cmd = f'vncserver -localhost no -geometry 800x800 -depth 24' | ||||
|     #print(f'cmd: {cmd}') | ||||
|     subprocess.getoutput([cmd]) | ||||
|     print('reached .bashrc executing steam and variables') | ||||
|     time.sleep(10) | ||||
|     #we sleep here to wait for .bashrc to launch steam. It takes some time | ||||
| 
 | ||||
| def bot_connect(data): | ||||
|     #use whatever ip you want here to connect with | ||||
| @ -149,46 +155,67 @@ def bot_connect(data): | ||||
|     writeCfgInput(str1) | ||||
|     time.sleep(1) | ||||
| 
 | ||||
|     handle_bz2_map_files() | ||||
|     t = Timer(30, attempt_bot_connect) | ||||
|     t.start() | ||||
| 
 | ||||
| def cpulimit_pid_of_game(): | ||||
|     # ' > /dev/null' redirects stdout to /dev/null | ||||
|     # '2>&1' redirects stderr to the same place as stdout | ||||
|     pid = return_user_owned_pid("pidof cstrike_linux64") | ||||
|     cmd = f"cpulimit --pid={pid} --limit=5 --background" | ||||
|     #print('the command is: ', cmd) | ||||
|     cmd = f"cpulimit --pid={pid} --limit=5 --background  > /dev/null 2>&1" | ||||
|     subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE).communicate()[0] | ||||
| 
 | ||||
| def delete_lock_file(): | ||||
|     #just delete the tmp source_engine .lock file here so multiple instances can run at same time. | ||||
|     subprocess.Popen(["rm -f /tmp/source_engine*.lock"], shell=True, stdout=subprocess.PIPE).communicate()[0] | ||||
|     subprocess.Popen(["rm -f /tmp/source_engine*.lock"], shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL).communicate()[0] | ||||
| 
 | ||||
| def attempt_bot_connect(): | ||||
|     global connection_issue_counter | ||||
| def my_file_created_function(event_path): | ||||
|     global call_bot_connect | ||||
|     connection_issue_counter += 1 | ||||
|     call_bot_connect = True | ||||
|     print('finished timer callback') | ||||
|     call_bot_connect = False | ||||
| 
 | ||||
| def handle_bz2_map_files(): | ||||
|     #if downloading maps we give it 10 seconds delay to see if the size changed, if not its probably safe to delete the .bz2 file as no download in progress | ||||
|     bz2_maps = {} | ||||
|     #print(f"New file created: {event_path}") | ||||
|     if not event_path.lower().endswith(".bsp.bz2"): | ||||
|         return | ||||
| 
 | ||||
|     file_size = None | ||||
|     while True: | ||||
|         found = False | ||||
|         for f in glob.glob(f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/download/maps/*.bz2"): | ||||
|             found = True | ||||
|             fsize = subprocess.Popen(["du", "-sh", f], stdout=subprocess.PIPE).communicate()[0].decode().split("\t")[0] | ||||
|             #deleting left over bz2 files because they give missing map issue | ||||
|             if f in bz2_maps: | ||||
|                 #if the size is still the same it should be abandoned bz2 file that we can delete | ||||
|                 if bz2_maps[f] == fsize: | ||||
|                     subprocess.Popen(["rm", f], stdout=subprocess.PIPE).communicate()[0] | ||||
|             bz2_maps[f] = fsize | ||||
|         #no bz2 maps left to be concerned about | ||||
|         if not found: | ||||
|             break | ||||
|         #repeatedly spamming to kill cpu limitting, its bottlenecking the download speed  | ||||
|         kill_owned_process("pidof cpulimit") | ||||
|         time.sleep(10) | ||||
| 
 | ||||
|         stdout, stderr = subprocess.Popen(["ls", "-l", event_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() | ||||
|         #print('stdout: ', stdout) | ||||
|         #print('stderr: ', stderr) | ||||
|         if stderr:  | ||||
|             print('finished downloading the bz2 file.') | ||||
|             break  | ||||
|         user = stdout.decode().split("autismbots")[0] | ||||
|         if whoami not in user: | ||||
|             writeCfgInput("disconnect;") | ||||
|             print("disconnected from server until other user finished downloading bz2 file") | ||||
|             continue | ||||
| 
 | ||||
|         #in case the bz2 download is not progressing just delete the file and disconnect. | ||||
|         cur_file_size = stdout.decode().split("autismbots")[1].strip().split(" ")[0] | ||||
|         if file_size == cur_file_size: | ||||
|             print("Aborting connection. file download is stuck.") | ||||
|             writeCfgInput("disconnect;") | ||||
|             break | ||||
|         file_size = cur_file_size | ||||
| 
 | ||||
|     call_bot_connect = True | ||||
| 
 | ||||
| class NewFileHandler(FileSystemEventHandler): | ||||
|     def on_created(self, event): | ||||
|         my_file_created_function(event.src_path) | ||||
| 
 | ||||
| def handle_bz2_files(): | ||||
|     #mostly its just downloading maps that we will be doing | ||||
|     root_dir = f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/download" | ||||
|     event_handler = NewFileHandler() | ||||
|     observer = Observer() | ||||
|     # Schedule the observer to watch the root directory and its subdirectories recursively | ||||
|     observer.schedule(event_handler, root_dir, recursive=True) | ||||
|     observer.start() | ||||
|     return observer | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     atexit.register(exit_handler) | ||||
|     local_port = data_ports['udp_port'] | ||||
| @ -197,10 +224,10 @@ if __name__ == '__main__': | ||||
| 
 | ||||
|     clean_up_files() | ||||
|     delete_lock_file() | ||||
|     handle_bz2_map_files() | ||||
|     observer = handle_bz2_files() | ||||
| 
 | ||||
|     maps_folder_size = subprocess.Popen(["du", "-sh", f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/download/maps"], stdout=subprocess.PIPE).communicate()[0].decode().split("\t")[0] | ||||
|     #deleting when maps folder larger than 150GB | ||||
|     #deleting when maps folder larger than some GB | ||||
|     if maps_folder_size.endswith("G"):  | ||||
|         maps_folder_size = float(maps_folder_size[:-1]) | ||||
|         if maps_folder_size > 40.0: | ||||
| @ -217,9 +244,16 @@ if __name__ == '__main__': | ||||
|     sock.settimeout(5.0) | ||||
|     messager_name = "" | ||||
| 
 | ||||
|     #limit the cpu allowed to be used by the game instance.  | ||||
|     time.sleep(11) | ||||
|     cpulimit_pid_of_game() | ||||
|     #give the game some time to launch | ||||
|     fail_safe = 5 | ||||
|     while return_user_owned_pid("pidof cstrike_linux64") is None: | ||||
|         #just a fail safe to prevent being stuck forever. | ||||
|         if fail_safe <= 0: | ||||
|             sys.exit(1) | ||||
|         time.sleep(10) | ||||
|         print("launching game...") | ||||
|         fail_safe -= 1 | ||||
|     time.sleep(10) | ||||
| 
 | ||||
|     try: | ||||
|         while True: | ||||
| @ -252,25 +286,32 @@ if __name__ == '__main__': | ||||
|                 print('bot kicked server full: ', datetime.datetime.now().time()) | ||||
|             elif "autismo connected to ze" == data: | ||||
|                 print('Bot connected to ze!') | ||||
|                 connection_issue_counter = 0 | ||||
|                 cpulimit_pid_of_game() | ||||
|                 call_bot_connect = True | ||||
|                 is_bot_connected_to_ze2 = False | ||||
|                 overwrite_file_access() | ||||
|             elif "not connected to ze2" == data: | ||||
|                 is_bot_connected_to_ze2 = False | ||||
|             elif "autismo connected to ze2" == data: | ||||
|                 print('Bot connected to ze2!') | ||||
|                 connection_issue_counter = 0 | ||||
|                 cpulimit_pid_of_game() | ||||
|                 call_bot_connect = True | ||||
|                 is_bot_connected_to_ze2 = True | ||||
|                 overwrite_file_access() | ||||
|             elif "connect to ze" == data or ("connect to ze2" == data and not is_bot_connected_to_ze2): | ||||
|                 if connection_issue_counter == 5: | ||||
|                 if datetime.datetime.now() >= restart_time: | ||||
|                     kill_owned_process("pidof cstrike_linux64") | ||||
|                     sock.close() | ||||
|                     print('exiting') | ||||
|                     close_observer(observer) | ||||
|                     print('exiting after running the game for several hours.') | ||||
|                     sys.exit(1) | ||||
|                 else: | ||||
|                     if call_bot_connect: | ||||
|                         call_bot_connect = False | ||||
|                         #stop cpu limitting, its bottlenecking the connection to the server. | ||||
|                         kill_owned_process("pidof cpulimit") | ||||
| 
 | ||||
|                         print('data: ', data) | ||||
|                         print("connection_issue_counter: ", connection_issue_counter) | ||||
|                         call_bot_connect = False | ||||
|                         bot_connect(data) | ||||
|             elif "clientmessage:" in data: | ||||
|                 messager_name = data.split("clientmessage:", 1)[1].split(f" {data_ports['magic_secret']}")[0] | ||||
| @ -291,3 +332,4 @@ if __name__ == '__main__': | ||||
|                 writeCfgInput(strInput) | ||||
|     finally: | ||||
|         sock.close() | ||||
|         close_observer(observer) | ||||
|  | ||||
| @ -13,6 +13,7 @@ | ||||
| #include <cstrike> | ||||
| #include <dhooks> | ||||
| #include <socket> | ||||
| #include <UNLOZE.secret> | ||||
| 
 | ||||
| int target_friend_afk_counter[MAXPLAYERS][MAXPLAYERS + 1]; | ||||
| int target_friend[MAXPLAYERS + 1]; | ||||
| @ -336,7 +337,7 @@ public void cmd_talk_help(int port, int client, char[] info) | ||||
| 	char msg[generic_length * 5]; | ||||
| 	chat_cooldown = true; | ||||
| 	char magic_code[16]; | ||||
| 	Format(magic_code, sizeof(magic_code), "add_magic_value_here"); | ||||
| 	Format(magic_code, sizeof(magic_code), autism_bot_code); //included with unloze.secrets simply. | ||||
| 	Format(msg, sizeof(msg), "clientmessage:%N %s %s", client, magic_code, info); | ||||
| 	send_socket_msg(msg, strlen(msg), port); | ||||
| 	CreateTimer(2.0, bot_chat_cooldown); | ||||
| @ -513,7 +514,6 @@ public Action bot_check_connect(Handle timer, any data) | ||||
| 
 | ||||
|     if (i_port == server_ports[0]) | ||||
|     { | ||||
|         //revert again to either 10 or 55 | ||||
|         int max_allowed_players = 55; | ||||
|         char current_map[128]; | ||||
|         GetCurrentMap(current_map, sizeof(current_map)); | ||||
| @ -525,7 +525,7 @@ public Action bot_check_connect(Handle timer, any data) | ||||
|             send_socket_msg(msg, strlen(msg), ports[2]); | ||||
|             send_socket_msg(msg, strlen(msg), ports[3]); | ||||
|         } | ||||
|         else if (client_count < 50) | ||||
|         else if (client_count < max_allowed_players) | ||||
|         { | ||||
|             Format(msg, sizeof(msg), "connect to ze"); | ||||
|             if (!bot1_connected) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user