WebHost: Log: handle FileNotFoundError (#3603)
This commit is contained in:
		
							parent
							
								
									401606e8e3
								
							
						
					
					
						commit
						b6925c593e
					
				| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
import datetime
 | 
					import datetime
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
from typing import Dict, Iterator, List, Tuple, Union
 | 
					from typing import Any, IO, Dict, Iterator, List, Tuple, Union
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import jinja2.exceptions
 | 
					import jinja2.exceptions
 | 
				
			||||||
from flask import request, redirect, url_for, render_template, Response, session, abort, send_from_directory
 | 
					from flask import request, redirect, url_for, render_template, Response, session, abort, send_from_directory
 | 
				
			||||||
| 
						 | 
					@ -97,13 +97,13 @@ def new_room(seed: UUID):
 | 
				
			||||||
    return redirect(url_for("host_room", room=room.id))
 | 
					    return redirect(url_for("host_room", room=room.id))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def _read_log(path: str, offset: int = 0) -> Iterator[bytes]:
 | 
					def _read_log(log: IO[Any], offset: int = 0) -> Iterator[bytes]:
 | 
				
			||||||
    with open(path, "rb") as log:
 | 
					    marker = log.read(3)  # skip optional BOM
 | 
				
			||||||
        marker = log.read(3)  # skip optional BOM
 | 
					    if marker != b'\xEF\xBB\xBF':
 | 
				
			||||||
        if marker != b'\xEF\xBB\xBF':
 | 
					        log.seek(0, os.SEEK_SET)
 | 
				
			||||||
            log.seek(0, os.SEEK_SET)
 | 
					    log.seek(offset, os.SEEK_CUR)
 | 
				
			||||||
        log.seek(offset, os.SEEK_CUR)
 | 
					    yield from log
 | 
				
			||||||
        yield from log
 | 
					    log.close()  # free file handle as soon as possible
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@app.route('/log/<suuid:room>')
 | 
					@app.route('/log/<suuid:room>')
 | 
				
			||||||
| 
						 | 
					@ -114,6 +114,7 @@ def display_log(room: UUID) -> Union[str, Response, Tuple[str, int]]:
 | 
				
			||||||
    if room.owner == session["_id"]:
 | 
					    if room.owner == session["_id"]:
 | 
				
			||||||
        file_path = os.path.join("logs", str(room.id) + ".txt")
 | 
					        file_path = os.path.join("logs", str(room.id) + ".txt")
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
 | 
					            log = open(file_path, "rb")
 | 
				
			||||||
            range_header = request.headers.get("Range")
 | 
					            range_header = request.headers.get("Range")
 | 
				
			||||||
            if range_header:
 | 
					            if range_header:
 | 
				
			||||||
                range_type, range_values = range_header.split('=')
 | 
					                range_type, range_values = range_header.split('=')
 | 
				
			||||||
| 
						 | 
					@ -121,8 +122,8 @@ def display_log(room: UUID) -> Union[str, Response, Tuple[str, int]]:
 | 
				
			||||||
                if range_type != "bytes" or end != "":
 | 
					                if range_type != "bytes" or end != "":
 | 
				
			||||||
                    return "Unsupported range", 500
 | 
					                    return "Unsupported range", 500
 | 
				
			||||||
                # NOTE: we skip Content-Range in the response here, which isn't great but works for our JS
 | 
					                # NOTE: we skip Content-Range in the response here, which isn't great but works for our JS
 | 
				
			||||||
                return Response(_read_log(file_path, int(start)), mimetype="text/plain", status=206)
 | 
					                return Response(_read_log(log, int(start)), mimetype="text/plain", status=206)
 | 
				
			||||||
            return Response(_read_log(file_path), mimetype="text/plain")
 | 
					            return Response(_read_log(log), mimetype="text/plain")
 | 
				
			||||||
        except FileNotFoundError:
 | 
					        except FileNotFoundError:
 | 
				
			||||||
            return Response(f"Logfile {file_path} does not exist. "
 | 
					            return Response(f"Logfile {file_path} does not exist. "
 | 
				
			||||||
                            f"Likely a crash during spinup of multiworld instance or it is still spinning up.",
 | 
					                            f"Likely a crash during spinup of multiworld instance or it is still spinning up.",
 | 
				
			||||||
| 
						 | 
					@ -152,15 +153,16 @@ def host_room(room: UUID):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_log(max_size: int = 1024000) -> str:
 | 
					    def get_log(max_size: int = 1024000) -> str:
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            raw_size = 0
 | 
					            with open(os.path.join("logs", str(room.id) + ".txt"), "rb") as log:
 | 
				
			||||||
            fragments: List[str] = []
 | 
					                raw_size = 0
 | 
				
			||||||
            for block in _read_log(os.path.join("logs", str(room.id) + ".txt")):
 | 
					                fragments: List[str] = []
 | 
				
			||||||
                if raw_size + len(block) > max_size:
 | 
					                for block in _read_log(log):
 | 
				
			||||||
                    fragments.append("…")
 | 
					                    if raw_size + len(block) > max_size:
 | 
				
			||||||
                    break
 | 
					                        fragments.append("…")
 | 
				
			||||||
                raw_size += len(block)
 | 
					                        break
 | 
				
			||||||
                fragments.append(block.decode("utf-8"))
 | 
					                    raw_size += len(block)
 | 
				
			||||||
            return "".join(fragments)
 | 
					                    fragments.append(block.decode("utf-8"))
 | 
				
			||||||
 | 
					                return "".join(fragments)
 | 
				
			||||||
        except FileNotFoundError:
 | 
					        except FileNotFoundError:
 | 
				
			||||||
            return ""
 | 
					            return ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue