- """Close and remove all files in IO files DB."""
- io_db["file_out"].close()
- os.remove(io_db["path_out"])
- io_db["file_in"].close()
- os.remove(io_db["path_in"])
- if "file_worldstate" in io_db: # This file's only set up
- io_db["file_worldstate"].close() # properly when the game
- if os.access(io_db["path_worldstate"], os.F_OK): # world is active, which
- os.remove(io_db["path_worldstate"]) # is not guaranteed.
+ """Close and remove all files open in IO files DB."""
+ def helper(file_key, path_key):
+ if file_key in io_db:
+ io_db[file_key].close()
+ os.remove(io_db[path_key])
+ helper("file_out", "path_out")
+ helper("file_in", "path_in")
+ helper("file_worldstate", "path_worldstate")
+
+
+def detect_atomic_leftover(path, tmp_suffix):
+ """Raise explained SystemExit if file is found at path + tmp_suffix."""
+ path_tmp = path + tmp_suffix
+ msg = "Found file '" + path_tmp + "' that may be a leftover from an " \
+ "aborted previous attempt to write '" + path + "'. Aborting until " \
+ "the matter is resolved by removing it from its current path."
+ if os.access(path_tmp, os.F_OK):
+ raise SystemExit(msg)
+
+
+def obey(cmd, io_db, prefix):
+ """"""
+ print("input " + prefix + ": " + cmd)
+ try:
+ tokens = shlex.split(cmd, comments=True)
+ except ValueError as err:
+ print("Can't tokenize command string: " + str(err) + ".")
+ return
+ if 0 == len(tokens):
+ pass
+ elif "PING" == tokens[0] and 1 == len(tokens):
+ io_db["file_out"].write("PONG\n")
+ elif "QUIT" == tokens[0] and 1 == len(tokens):
+ record("# " + cmd, path_recordfile)
+ raise SystemExit("received QUIT command")
+ elif "MAKE_WORLD" == tokens[0] and 2 == len(tokens):
+ print("I would generate a new world now, if only I knew how.")
+ record(cmd, io_db)
+ else:
+ print("Invalid command/argument, or bad number of tokens.")
+
+
+def record(cmd, io_db):
+ """Append cmd string plus newline to file at path_recordfile. (Atomic.)"""
+ # This misses some optimizations from the original record(), namely only
+ # finishing the atomic write with flush() and fsync() every 15 seconds
+ # unless explicitely forced. Implement as needed.
+ path_tmp = io_db["path_record"] + io_db["tmp_suffix"]
+ if os.access(io_db["path_record"], os.F_OK):
+ shutil.copyfile(io_db["path_record"], path_tmp)
+ file = open(path_tmp, "a")
+ file.write(cmd + "\n")
+ file.flush()
+ os.fsync(file.fileno())
+ file.close()
+ if os.access(io_db["path_record"], os.F_OK):
+ os.remove(io_db["path_record"])
+ os.rename(path_tmp, io_db["path_record"])
+
+
+def obey_lines_in_file(path, name):
+ """Call obey() on each line of path's file, use name in input prefix."""
+ file = open(io_db["path_worldconf"], "r")
+ line_n = 1
+ for line in file.readlines():
+ obey(line.rstrip(), io_db, name + "file line " + str(line_n))
+ line_n = line_n + 1
+ file.close()
+