def print_db(database): """Prints out database content. """ if PY3: # On PY3, connect() only accepts unicode conn = sqlite3.connect(str(database)) else: conn = sqlite3.connect(database.path) conn.row_factory = sqlite3.Row conn.text_factory = lambda x: unicode_(x, 'utf-8', 'replace') cur = conn.cursor() rows = cur.execute(''' SELECT id, parent, timestamp, exitcode FROM processes; ''') print("\nProcesses:") header = "+------+--------+-------+------------------+" print(header) print("| id | parent | exit | timestamp |") print(header) for r_id, r_parent, r_timestamp, r_exit in rows: f_id = "{0: 5d} ".format(r_id) if r_parent is not None: f_parent = "{0: 7d} ".format(r_parent) else: f_parent = " " if r_exit & 0x0100: f_exit = " sig{0: <2d} ".format(r_exit) else: f_exit = " {0: <2d} ".format(r_exit) f_timestamp = "{0: 17d} ".format(r_timestamp) print('|'.join(('', f_id, f_parent, f_exit, f_timestamp, ''))) print(header) cur.close() cur = conn.cursor() rows = cur.execute(''' SELECT id, name, timestamp, process, argv FROM executed_files; ''') print("\nExecuted files:") header = ("+--------+------------------+---------+------------------------" "---------------+") print(header) print("| id | timestamp | process | name and argv " " |") print(header) for r_id, r_name, r_timestamp, r_process, r_argv in rows: f_id = "{0: 7d} ".format(r_id) f_timestamp = "{0: 17d} ".format(r_timestamp) f_proc = "{0: 8d} ".format(r_process) argv = r_argv.split('\0') if not argv[-1]: argv = argv[:-1] cmdline = ' '.join(shell_escape(a) for a in argv) if argv[0] not in (r_name, os.path.basename(r_name)): cmdline = "(%s) %s" % (shell_escape(r_name), cmdline) f_cmdline = " {0: <37s} ".format(cmdline) print('|'.join(('', f_id, f_timestamp, f_proc, f_cmdline, ''))) print(header) cur.close() cur = conn.cursor() rows = cur.execute(''' SELECT id, name, timestamp, mode, process FROM opened_files; ''') print("\nFiles:") header = ("+--------+------------------+---------+------+-----------------" "---------------+") print(header) print("| id | timestamp | process | mode | name " " |") print(header) for r_id, r_name, r_timestamp, r_mode, r_process in rows: f_id = "{0: 7d} ".format(r_id) f_timestamp = "{0: 17d} ".format(r_timestamp) f_proc = "{0: 8d} ".format(r_process) f_mode = "{0: 5d} ".format(r_mode) f_name = " {0: <30s} ".format(r_name) print('|'.join(('', f_id, f_timestamp, f_proc, f_mode, f_name, ''))) print(header) cur.close() conn.close()
def get_files(conn): """Find all the files used by the experiment by reading the trace. """ files = {} access_files = [set()] # Finds run timestamps, so we can sort input/output files by run proc_cursor = conn.cursor() executions = proc_cursor.execute(''' SELECT timestamp FROM processes WHERE parent ISNULL ORDER BY id; ''') run_timestamps = [r_timestamp for r_timestamp, in executions][1:] proc_cursor.close() # Adds dynamic linkers for libdir in (Path('/lib'), Path('/lib64')): if libdir.exists(): for linker in libdir.listdir('*ld-linux*'): for filename in find_all_links(linker, True): if filename not in files: f = TracedFile(filename) f.read() files[f.path] = f # Loops on executed files, and opened files, at the same time cur = conn.cursor() rows = cur.execute(''' SELECT 'exec' AS event_type, name, NULL AS mode, timestamp FROM executed_files UNION ALL SELECT 'open' AS event_type, name, mode, timestamp FROM opened_files ORDER BY timestamp; ''') executed = set() for event_type, r_name, r_mode, r_timestamp in rows: if event_type == 'exec': r_mode = FILE_READ r_name = Path(r_name) if event_type == 'exec': executed.add(r_name) # Stays on the current run while run_timestamps and r_timestamp > run_timestamps[0]: del run_timestamps[0] access_files.append(set()) # Adds symbolic links as read files for filename in find_all_links( r_name.parent if r_mode & FILE_LINK else r_name, False): if filename not in files: f = TracedFile(filename) f.read() files[f.path] = f # Go to final target if not r_mode & FILE_LINK: r_name = r_name.resolve() if r_name not in files: f = TracedFile(r_name) files[f.path] = f else: f = files[r_name] if r_mode & FILE_WRITE: f.write() # Mark the parent directory as read if r_name.parent not in files: fp = TracedFile(r_name.parent) fp.read() files[fp.path] = fp elif r_mode & FILE_READ: f.read() # Identifies input files if r_name.is_file() and r_name not in executed: access_files[-1].add(f) cur.close() # Further filters input files inputs = [ [ fi.path for fi in lst # Input files are regular files, if fi.path.is_file() and # ONLY_READ, fi.what == TracedFile.ONLY_READ and # not executable, # FIXME : currently disabled; only remove executed files # not fi.path.stat().st_mode & 0b111 and fi.path not in executed and # not in a system directory not any(fi.path.lies_under(m) for m in magic_dirs + system_dirs) ] for lst in access_files ] # Identify output files outputs = [ [ fi.path for fi in lst # Output files are regular files, if fi.path.is_file() and # WRITTEN fi.what == TracedFile.WRITTEN and # not in a system directory not any(fi.path.lies_under(m) for m in magic_dirs + system_dirs) ] for lst in access_files ] # Displays a warning for READ_THEN_WRITTEN files read_then_written_files = [ fi for fi in itervalues(files) if fi.what == TracedFile.READ_THEN_WRITTEN and not any( fi.path.lies_under(m) for m in magic_dirs) ] if read_then_written_files: logging.warning( "Some files were read and then written. We will only pack the " "final version of the file; reproducible experiments shouldn't " "change their input files:\n%s", ", ".join(unicode_(fi.path) for fi in read_then_written_files)) files = set(fi for fi in itervalues(files) if fi.what != TracedFile.WRITTEN and not any( fi.path.lies_under(m) for m in magic_dirs)) return files, inputs, outputs
def print_db(database): """Prints out database content. """ if PY3: # On PY3, connect() only accepts unicode conn = sqlite3.connect(str(database)) else: conn = sqlite3.connect(database.path) conn.row_factory = sqlite3.Row conn.text_factory = lambda x: unicode_(x, 'utf-8', 'replace') cur = conn.cursor() processes = cur.execute(''' SELECT id, parent, timestamp, exit_timestamp, exitcode, cpu_time FROM processes; ''') print("\nProcesses:") header = ("+------+--------+-------+------------------+------------------+" "----------+") print(header) print("| id | parent | exit | timestamp | exit timestamp |" " cpu time |") print(header) for (r_id, r_parent, r_timestamp, r_endtime, r_exit, r_cpu_time) in processes: f_id = "{0: 5d} ".format(r_id) if r_parent is not None: f_parent = "{0: 7d} ".format(r_parent) else: f_parent = " " if r_exit & 0x0100: f_exit = " sig{0: <2d} ".format(r_exit) else: f_exit = " {0: <2d} ".format(r_exit) f_timestamp = "{0: 17d} ".format(r_timestamp) f_endtime = "{0: 17d} ".format(r_endtime) if r_cpu_time >= 0: f_cputime = "{0: 9.2f} ".format(r_cpu_time * 0.001) else: f_cputime = " " print('|'.join(('', f_id, f_parent, f_exit, f_timestamp, f_endtime, f_cputime, ''))) print(header) cur.close() cur = conn.cursor() processes = cur.execute(''' SELECT id, name, timestamp, process, argv FROM executed_files; ''') print("\nExecuted files:") header = ("+--------+------------------+---------+------------------------" "---------------+") print(header) print("| id | timestamp | process | name and argv " " |") print(header) for r_id, r_name, r_timestamp, r_process, r_argv in processes: f_id = "{0: 7d} ".format(r_id) f_timestamp = "{0: 17d} ".format(r_timestamp) f_proc = "{0: 8d} ".format(r_process) argv = r_argv.split('\0') if not argv[-1]: argv = argv[:-1] cmdline = ' '.join(shell_escape(a) for a in argv) if argv[0] not in (r_name, os.path.basename(r_name)): cmdline = "(%s) %s" % (shell_escape(r_name), cmdline) f_cmdline = " {0: <37s} ".format(cmdline) print('|'.join(('', f_id, f_timestamp, f_proc, f_cmdline, ''))) print(header) cur.close() cur = conn.cursor() processes = cur.execute(''' SELECT id, name, timestamp, mode, process FROM opened_files; ''') print("\nFiles:") header = ("+--------+------------------+---------+------+-----------------" "---------------+") print(header) print("| id | timestamp | process | mode | name " " |") print(header) for r_id, r_name, r_timestamp, r_mode, r_process in processes: f_id = "{0: 7d} ".format(r_id) f_timestamp = "{0: 17d} ".format(r_timestamp) f_proc = "{0: 8d} ".format(r_process) f_mode = "{0: 5d} ".format(r_mode) f_name = " {0: <30s} ".format(r_name) print('|'.join(('', f_id, f_timestamp, f_proc, f_mode, f_name, ''))) print(header) cur.close() cur = conn.cursor() connections = cur.execute(''' SELECT DISTINCT inbound, family, protocol, address FROM connections ORDER BY inbound, family, timestamp; ''') header_shown = -1 current_family = current_protocol = None for r_inbound, r_family, r_protocol, r_address in connections: if header_shown < r_inbound: if r_inbound: print("\nIncoming connections:") else: print("\nRemote connections:") header_shown = r_inbound current_family = None if current_family != r_family: print(" %s" % r_family) current_family = r_family current_protocol = None if current_protocol != r_protocol: print(" %s" % r_protocol) current_protocol = r_protocol print(" %s" % r_address) conn.close()
def write_configuration(directory, sort_packages, find_inputs_outputs, overwrite=False): """Writes the canonical YAML configuration file. """ database = directory / 'trace.sqlite3' if PY3: # On PY3, connect() only accepts unicode conn = sqlite3.connect(str(database)) else: conn = sqlite3.connect(database.path) conn.row_factory = sqlite3.Row # Reads info from database files, inputs, outputs = get_files(conn) # Identifies which file comes from which package if sort_packages: files, packages = identify_packages(files) else: packages = [] # Writes configuration file config = directory / 'config.yml' distribution = platform.linux_distribution()[0:2] cur = conn.cursor() if overwrite or not config.exists(): runs = [] # This gets all the top-level processes (p.parent ISNULL) and the first # executed file for that process (sorting by ids, which are # chronological) executions = cur.execute(''' SELECT e.name, e.argv, e.envp, e.workingdir, p.exitcode FROM processes p JOIN executed_files e ON e.id=( SELECT id FROM executed_files e2 WHERE e2.process=p.id ORDER BY e2.id LIMIT 1 ) WHERE p.parent ISNULL; ''') else: # Loads in previous config runs, oldpkgs, oldfiles = load_config(config, canonical=False, File=TracedFile) # Same query as previous block but only gets last process executions = cur.execute(''' SELECT e.name, e.argv, e.envp, e.workingdir, p.exitcode FROM processes p JOIN executed_files e ON e.id=( SELECT id FROM executed_files e2 WHERE e2.process=p.id ORDER BY e2.id LIMIT 1 ) WHERE p.parent ISNULL ORDER BY p.id DESC LIMIT 1; ''') inputs = inputs[-1:] outputs = outputs[-1:] files, packages = merge_files(files, packages, oldfiles, oldpkgs) for r_name, r_argv, r_envp, r_workingdir, r_exitcode in executions: # Decodes command-line argv = r_argv.split('\0') if not argv[-1]: argv = argv[:-1] # Decodes environment envp = r_envp.split('\0') if not envp[-1]: envp = envp[:-1] environ = dict(v.split('=', 1) for v in envp) runs.append({ 'binary': r_name, 'argv': argv, 'workingdir': unicode_(Path(r_workingdir)), 'architecture': platform.machine().lower(), 'distribution': distribution, 'hostname': platform.node(), 'system': [platform.system(), platform.release()], 'environ': environ, 'uid': os.getuid(), 'gid': os.getgid(), 'signal' if r_exitcode & 0x0100 else 'exitcode': r_exitcode & 0xFF }) cur.close() conn.close() if find_inputs_outputs: inputs_outputs = compile_inputs_outputs(runs, inputs, outputs) else: inputs_outputs = {} save_config(config, runs, packages, files, reprozip_version, inputs_outputs) print("Configuration file written in {0!s}".format(config)) print("Edit that file then run the packer -- " "use 'reprozip pack -h' for help")
def get_files(conn): """Find all the files used by the experiment by reading the trace. """ files = {} access_files = [set()] # Finds run timestamps, so we can sort input/output files by run proc_cursor = conn.cursor() executions = proc_cursor.execute( ''' SELECT timestamp FROM processes WHERE parent ISNULL ORDER BY id; ''') run_timestamps = [r_timestamp for r_timestamp, in executions][1:] proc_cursor.close() # Adds dynamic linkers for libdir in (Path('/lib'), Path('/lib64')): if libdir.exists(): for linker in libdir.listdir('*ld-linux*'): for filename in find_all_links(linker, True): if filename not in files: f = TracedFile(filename) f.read() files[f.path] = f # Loops on executed files, and opened files, at the same time cur = conn.cursor() rows = cur.execute( ''' SELECT 'exec' AS event_type, name, NULL AS mode, timestamp FROM executed_files UNION ALL SELECT 'open' AS event_type, name, mode, timestamp FROM opened_files ORDER BY timestamp; ''') executed = set() for event_type, r_name, r_mode, r_timestamp in rows: if event_type == 'exec': r_mode = FILE_READ r_name = Path(r_name) if event_type == 'exec': executed.add(r_name) # Stays on the current run while run_timestamps and r_timestamp > run_timestamps[0]: del run_timestamps[0] access_files.append(set()) # Adds symbolic links as read files for filename in find_all_links(r_name.parent if r_mode & FILE_LINK else r_name, False): if filename not in files: f = TracedFile(filename) f.read() files[f.path] = f # Go to final target if not r_mode & FILE_LINK: r_name = r_name.resolve() if r_name not in files: f = TracedFile(r_name) files[f.path] = f else: f = files[r_name] if r_mode & FILE_WRITE: f.write() # Mark the parent directory as read if r_name.parent not in files: fp = TracedFile(r_name.parent) fp.read() files[fp.path] = fp elif r_mode & FILE_READ: f.read() # Identifies input files if r_name.is_file() and r_name not in executed: access_files[-1].add(f) cur.close() # Further filters input files inputs = [[fi.path for fi in lst # Input files are regular files, if fi.path.is_file() and # ONLY_READ, fi.what == TracedFile.ONLY_READ and # not executable, # FIXME : currently disabled; only remove executed files # not fi.path.stat().st_mode & 0b111 and fi.path not in executed and # not in a system directory not any(fi.path.lies_under(m) for m in magic_dirs + system_dirs)] for lst in access_files] # Identify output files outputs = [[fi.path for fi in lst # Output files are regular files, if fi.path.is_file() and # WRITTEN fi.what == TracedFile.WRITTEN and # not in a system directory not any(fi.path.lies_under(m) for m in magic_dirs + system_dirs)] for lst in access_files] # Displays a warning for READ_THEN_WRITTEN files read_then_written_files = [ fi for fi in itervalues(files) if fi.what == TracedFile.READ_THEN_WRITTEN and not any(fi.path.lies_under(m) for m in magic_dirs)] if read_then_written_files: logging.warning( "Some files were read and then written. We will only pack the " "final version of the file; reproducible experiments shouldn't " "change their input files:\n%s", ", ".join(unicode_(fi.path) for fi in read_then_written_files)) files = set( fi for fi in itervalues(files) if fi.what != TracedFile.WRITTEN and not any(fi.path.lies_under(m) for m in magic_dirs)) return files, inputs, outputs
def write_configuration(directory, sort_packages, find_inputs_outputs, overwrite=False): """Writes the canonical YAML configuration file. """ database = directory / 'trace.sqlite3' if PY3: # On PY3, connect() only accepts unicode conn = sqlite3.connect(str(database)) else: conn = sqlite3.connect(database.path) conn.row_factory = sqlite3.Row # Reads info from database files, inputs, outputs = get_files(conn) # Identifies which file comes from which package if sort_packages: files, packages = identify_packages(files) else: packages = [] # Writes configuration file config = directory / 'config.yml' distribution = platform.linux_distribution()[0:2] cur = conn.cursor() if overwrite or not config.exists(): runs = [] # This gets all the top-level processes (p.parent ISNULL) and the first # executed file for that process (sorting by ids, which are # chronological) executions = cur.execute( ''' SELECT e.name, e.argv, e.envp, e.workingdir, p.exitcode FROM processes p JOIN executed_files e ON e.id=( SELECT id FROM executed_files e2 WHERE e2.process=p.id ORDER BY e2.id LIMIT 1 ) WHERE p.parent ISNULL; ''') else: # Loads in previous config runs, oldpkgs, oldfiles = load_config(config, canonical=False, File=TracedFile) # Same query as previous block but only gets last process executions = cur.execute( ''' SELECT e.name, e.argv, e.envp, e.workingdir, p.exitcode FROM processes p JOIN executed_files e ON e.id=( SELECT id FROM executed_files e2 WHERE e2.process=p.id ORDER BY e2.id LIMIT 1 ) WHERE p.parent ISNULL ORDER BY p.id DESC LIMIT 1; ''') inputs = inputs[-1:] outputs = outputs[-1:] files, packages = merge_files(files, packages, oldfiles, oldpkgs) for r_name, r_argv, r_envp, r_workingdir, r_exitcode in executions: # Decodes command-line argv = r_argv.split('\0') if not argv[-1]: argv = argv[:-1] # Decodes environment envp = r_envp.split('\0') if not envp[-1]: envp = envp[:-1] environ = dict(v.split('=', 1) for v in envp) runs.append({'binary': r_name, 'argv': argv, 'workingdir': unicode_(Path(r_workingdir)), 'architecture': platform.machine().lower(), 'distribution': distribution, 'hostname': platform.node(), 'system': [platform.system(), platform.release()], 'environ': environ, 'uid': os.getuid(), 'gid': os.getgid(), 'signal' if r_exitcode & 0x0100 else 'exitcode': r_exitcode & 0xFF}) cur.close() conn.close() if find_inputs_outputs: inputs_outputs = compile_inputs_outputs(runs, inputs, outputs) else: inputs_outputs = {} save_config(config, runs, packages, files, reprozip_version, inputs_outputs) print("Configuration file written in {0!s}".format(config)) print("Edit that file then run the packer -- " "use 'reprozip pack -h' for help")
def print_db(database): """Prints out database content. """ if PY3: # On PY3, connect() only accepts unicode conn = sqlite3.connect(str(database)) else: conn = sqlite3.connect(database.path) conn.row_factory = sqlite3.Row conn.text_factory = lambda x: unicode_(x, 'utf-8', 'replace') cur = conn.cursor() rows = cur.execute( ''' SELECT id, parent, timestamp, exit_timestamp, exitcode, cpu_time FROM processes; ''') print("\nProcesses:") header = ("+------+--------+-------+------------------+------------------+" "----------+") print(header) print("| id | parent | exit | timestamp | exit timestamp |" " cpu time |") print(header) for (r_id, r_parent, r_timestamp, r_endtime, r_exit, r_cpu_time) in rows: f_id = "{0: 5d} ".format(r_id) if r_parent is not None: f_parent = "{0: 7d} ".format(r_parent) else: f_parent = " " if r_exit & 0x0100: f_exit = " sig{0: <2d} ".format(r_exit) else: f_exit = " {0: <2d} ".format(r_exit) f_timestamp = "{0: 17d} ".format(r_timestamp) f_endtime = "{0: 17d} ".format(r_endtime) if r_cpu_time >= 0: f_cputime = "{0: 9.2f} ".format(r_cpu_time * 0.001) else: f_cputime = " " print('|'.join(('', f_id, f_parent, f_exit, f_timestamp, f_endtime, f_cputime, ''))) print(header) cur.close() cur = conn.cursor() rows = cur.execute( ''' SELECT id, name, timestamp, process, argv FROM executed_files; ''') print("\nExecuted files:") header = ("+--------+------------------+---------+------------------------" "---------------+") print(header) print("| id | timestamp | process | name and argv " " |") print(header) for r_id, r_name, r_timestamp, r_process, r_argv in rows: f_id = "{0: 7d} ".format(r_id) f_timestamp = "{0: 17d} ".format(r_timestamp) f_proc = "{0: 8d} ".format(r_process) argv = r_argv.split('\0') if not argv[-1]: argv = argv[:-1] cmdline = ' '.join(shell_escape(a) for a in argv) if argv[0] not in (r_name, os.path.basename(r_name)): cmdline = "(%s) %s" % (shell_escape(r_name), cmdline) f_cmdline = " {0: <37s} ".format(cmdline) print('|'.join(('', f_id, f_timestamp, f_proc, f_cmdline, ''))) print(header) cur.close() cur = conn.cursor() rows = cur.execute( ''' SELECT id, name, timestamp, mode, process FROM opened_files; ''') print("\nFiles:") header = ("+--------+------------------+---------+------+-----------------" "---------------+") print(header) print("| id | timestamp | process | mode | name " " |") print(header) for r_id, r_name, r_timestamp, r_mode, r_process in rows: f_id = "{0: 7d} ".format(r_id) f_timestamp = "{0: 17d} ".format(r_timestamp) f_proc = "{0: 8d} ".format(r_process) f_mode = "{0: 5d} ".format(r_mode) f_name = " {0: <30s} ".format(r_name) print('|'.join(('', f_id, f_timestamp, f_proc, f_mode, f_name, ''))) print(header) cur.close() cur = conn.cursor() rows = cur.execute( ''' SELECT DISTINCT inbound, family, protocol, address FROM connections ORDER BY inbound, family, timestamp; ''') header_shown = -1 current_family = current_protocol = None for r_inbound, r_family, r_protocol, r_address in rows: if header_shown < r_inbound: if r_inbound: print("\nIncoming connections:") else: print("\nRemote connections:") header_shown = r_inbound current_family = None if current_family != r_family: print(" %s" % r_family) current_family = r_family current_protocol = None if current_protocol != r_protocol: print(" %s" % r_protocol) current_protocol = r_protocol print(" %s" % r_address) conn.close()
def print_db(database): """Prints out database content. """ if PY3: # On PY3, connect() only accepts unicode conn = sqlite3.connect(str(database)) else: conn = sqlite3.connect(database.path) conn.row_factory = sqlite3.Row conn.text_factory = lambda x: unicode_(x, 'utf-8', 'replace') cur = conn.cursor() processes = cur.execute( ''' SELECT id, parent, timestamp, exitcode FROM processes; ''') print("\nProcesses:") header = "+------+--------+-------+------------------+" print(header) print("| id | parent | exit | timestamp |") print(header) for r_id, r_parent, r_timestamp, r_exit in processes: f_id = "{0: 5d} ".format(r_id) if r_parent is not None: f_parent = "{0: 7d} ".format(r_parent) else: f_parent = " " if r_exit & 0x0100: f_exit = " sig{0: <2d} ".format(r_exit) else: f_exit = " {0: <2d} ".format(r_exit) f_timestamp = "{0: 17d} ".format(r_timestamp) print('|'.join(('', f_id, f_parent, f_exit, f_timestamp, ''))) print(header) cur.close() cur = conn.cursor() processes = cur.execute( ''' SELECT id, name, timestamp, process, argv FROM executed_files; ''') print("\nExecuted files:") header = ("+--------+------------------+---------+------------------------" "---------------+") print(header) print("| id | timestamp | process | name and argv " " |") print(header) for r_id, r_name, r_timestamp, r_process, r_argv in processes: f_id = "{0: 7d} ".format(r_id) f_timestamp = "{0: 17d} ".format(r_timestamp) f_proc = "{0: 8d} ".format(r_process) argv = r_argv.split('\0') if not argv[-1]: argv = argv[:-1] cmdline = ' '.join(shell_escape(a) for a in argv) if argv[0] not in (r_name, os.path.basename(r_name)): cmdline = "(%s) %s" % (shell_escape(r_name), cmdline) f_cmdline = " {0: <37s} ".format(cmdline) print('|'.join(('', f_id, f_timestamp, f_proc, f_cmdline, ''))) print(header) cur.close() cur = conn.cursor() processes = cur.execute( ''' SELECT id, name, timestamp, mode, process FROM opened_files; ''') print("\nFiles:") header = ("+--------+------------------+---------+------+-----------------" "---------------+") print(header) print("| id | timestamp | process | mode | name " " |") print(header) for r_id, r_name, r_timestamp, r_mode, r_process in processes: f_id = "{0: 7d} ".format(r_id) f_timestamp = "{0: 17d} ".format(r_timestamp) f_proc = "{0: 8d} ".format(r_process) f_mode = "{0: 5d} ".format(r_mode) f_name = " {0: <30s} ".format(r_name) print('|'.join(('', f_id, f_timestamp, f_proc, f_mode, f_name, ''))) print(header) cur.close() conn.close()