blob: 933cf06bbaf8b2a019bff8aa51db8bfa33294fc3 [file] [log] [blame]
#!/usr/local/bin/python3
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import queue
import os
import sys
import traceback
import command_line
from client_message_decoder import ClientMessageDecoder
from server_message_decoder import ServerMessageDecoder
from handshake_decoder import HandshakeDecoder
def scan_opened_file(
file,
handshake_decoder,
client_decoder,
server_decoder,
output_queue,
dump_handshake,
dump_messages,
thread_id,
start_string,
):
separator = start_string
for line in file:
linestr = line.decode("utf-8").rstrip()
client_decoder.process_line(linestr)
server_decoder.process_line(linestr)
handshake_decoder.process_line(linestr)
try:
data = output_queue.get_nowait()
for key, value in data.items():
if (
"tid" not in value.keys()
or ("tid" in value.keys() and value["tid"] == thread_id)
or thread_id is None
):
if key == "message" and dump_messages:
print(separator + json.dumps(value, indent=2, default=str))
separator = ","
elif key == "handshake" and dump_handshake:
print(separator + json.dumps(value, indent=2, default=str))
separator = ","
except queue.Empty:
continue
except:
traceback.print_exc()
continue
while True:
try:
data = output_queue.get_nowait()
for key, value in data.items():
if key == "message" and dump_messages:
print(separator + json.dumps(data, indent=2, default=str))
separator = ","
except queue.Empty:
break
def scan_file(filename, dump_handshake, dump_messages, thread_id):
print("[")
output_queue = queue.Queue()
f = open(filename, "rb")
print("Scanning " + filename, file=sys.stderr)
scan_opened_file(
f,
HandshakeDecoder(output_queue),
ClientMessageDecoder(output_queue),
ServerMessageDecoder(output_queue),
output_queue,
dump_handshake,
dump_messages,
thread_id,
"",
)
f.close()
print("]")
def scan_file_sequence(file, handshake, messages, thread_id):
dirname = os.path.dirname(file)
basename, ext = os.path.splitext(os.path.basename(file))
base_parts = basename.split("-")
if len(base_parts) == 2:
print("[")
root = base_parts[0]
roll_index = int(base_parts[1])
output_queue = queue.Queue()
handshake_decoder = HandshakeDecoder(output_queue)
client_decoder = ClientMessageDecoder(output_queue)
server_decoder = ServerMessageDecoder(output_queue)
start_string = ""
last_chance = False
while True:
if last_chance:
if len(dirname) > 0:
filename = dirname + os.sep + root + ext
else:
filename = root + ext
else:
if len(dirname) > 0:
filename = dirname + os.sep + root + "-" + str(roll_index) + ext
else:
filename = root + "-" + str(roll_index) + ext
try:
print("Scanning " + filename, file=sys.stderr)
f = open(filename, "rb")
scan_opened_file(
f,
handshake_decoder,
client_decoder,
server_decoder,
output_queue,
handshake,
messages,
thread_id,
start_string,
)
start_string = ","
f.close()
roll_index += 1
if last_chance:
break
except FileNotFoundError:
if last_chance:
break
last_chance = True
continue
print("]")
else:
raise ValueError(basename + " is not a valid rolled logfile name")
if __name__ == "__main__":
(file, handshake, messages, thread_id, rolled) = command_line.parse_command_line()
if rolled:
scan_file_sequence(file, handshake, messages, thread_id)
else:
scan_file(file, handshake, messages, thread_id)