def filesystem_diff(container): client = Client() raw_changes = client.diff(container) changes = {} for raw_change in raw_changes: changes[raw_change['Path']] = raw_change['Kind'] return changes
def track_state_changes(container_name, persisted_fs_changes): fout_cmd = open(get_command_track_filename(container_name), 'ab', 0) fout_fs = open(get_filesystem_track_filename(container_name), 'ab', 0) # react to every line added in the 'diff_trigger' file by the instrumented container client = Client() previous_changes = set() fs_changes = persisted_fs_changes print(fs_changes) for line in execute_lines(['docker', 'exec', container_name, 'tail', '-f', '/tmp/record/diff_trigger']): # store changes for every command raw_changes = client.diff(container_name) current_command_changes = [] for raw_change in raw_changes: path = raw_change['Path'] if not path in fs_changes: previous_changes.add(path) path_change_timestamp = get_container_file_timestamp(container_name, path) fs_changes[path] = path_change_timestamp current_command_changes.append({'path': path, 'timestamp': path_change_timestamp}) fout_cmd.write((line.rstrip() + "\n").encode()) write_filesystem_changes(current_command_changes, fout_fs) fout_fs.close() fout_cmd.close()