diff --git a/flag-rebuild.py b/flag-rebuild.py new file mode 100755 index 0000000..325eecb --- /dev/null +++ b/flag-rebuild.py @@ -0,0 +1,110 @@ +#! /usr/bin/python3 +# Copyright (C) 2018-2020 Merspieler, merspieler _at_ airmail.cc +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import socket +import re +import sys + +host = socket.gethostname() +port = 12345 +tile = "" +status = "" +verbose = False + +argc = len(sys.argv) +first = True +i = 1 +while i < argc: + if sys.argv[i] == "--port": + i += 1 + port = int(sys.argv[i]) + elif sys.argv[i] == "--host": + i += 1 + host = sys.argv[i] + elif sys.argv[i] == "-v" or sys.argv[i] == "--verbose": + verbose = True + elif sys.argv[i] == "-h" or sys.argv[i] == "--help": + print("usage: flag-rebuild.py [OPTIONS]") + print("Flags tiles for rebuild based on terrasync log file") + print("") + print(" Terrasync log file") + print("OPTIONS") + print(" , --host Manager host") + print(" , --port Manager port") + print(" -v, --verbose Verbose printouts") + print(" -h, --help Shows this help and exit") + sys.exit(0) + else: + if first: + lfile = sys.argv[i] + else: + print("Unknown option " + sys.argv[i]) + sys.exit(1) + i += 1 + +if lfile == "": + print("ERROR: No file given") + sys.exit(1) + +def get_status(name): + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.connect((host, port)) + sock.send(("status " + name).encode()) + msg = sock.recv(128) + sock.close() + msg = msg.decode() + match = re.match(r"pending|done|rebuild|skip|started", msg) + if match != None: + return match.group(0) + else: + print("ERROR: Recived invalid state for tile " + name) + sys.exit(1) + except IOError: + print("ERROR: Unable to send status.") + sys.exit(1) + +def flag_tile(name): + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.connect((host, port)) + sock.send(("set " + name + " rebuild").encode()) + sock.close() + except IOError: + print("Unable to send status. Aborting...") + sys.exit(1) + +try: + tiles = [] + with open(lfile) as f: + for line in f: + match = re.match(r"[ew]\d{3}[ns]\d{2}/[ew]\d{3}[ns]\d{2}*.\.stg'", line) + if match != None: + tiles.append(match.group(1)) +except IOError: + print("ERROR: Failed to read file") + sys.exit(1) + +tiles = set(tiles) + +for tile in tiles: + if get_status(tile) == "done": + if verbose: + print("Flagging " + tile) + flag_tile(tile) + elif verbose: + print("Skipping " + tile + ". Not yet build")