def test_move_file(): filename = Path("tests", "data", "sample_data") with open(filename, 'w') as f: f.write('sample data\n') assert os.path.exists(filename) filename_new = Path("tests", "data", "new_sample_data") fs.move_file(filename, filename_new) assert not os.path.exists(filename) assert os.path.exists(filename_new)
def update_artifact(conn, old_artifact: Artifact, args: Dict[str, str], config: Dict[str, str], attachment): """ Update artifact properties within the knowledge base of kb. Arguments: old_artifact: - an object of type Artifact containing the old artifact details args: - a dictionary containing the following fields: id -> an id of an artifact - note - the ACTUAL db_id title -> the title to be assigned to the artifact to update category -> the category to be assigned to the artifact to update tags -> the tags to be assigned to the artifact to update author -> the author to be assigned to the artifact to update status -> the status to be assigned to the artifact to update template -> the template to be assigned to the artifact to update config: - a configuration dictionary containing at least the following keys: PATH_KB_DB - the database path of KB PATH_KB_DATA - the data directory of KB PATH_KB_HIST - the history menu path of KB attachment: - new file content """ initializer.init(config) template_name = args.get("template", "") updated_artifact = Artifact( id=None, title=args.get("title", old_artifact.title), category=args.get("category", old_artifact.category), tags=args.get("tags", old_artifact.tags), author=args.get("author", old_artifact.author), status=args.get("status", old_artifact.status), template=args.get("template", old_artifact.template), path=args.get("category", old_artifact.category) + '/' + args.get("title", old_artifact.title) ) db.update_artifact_by_id(conn, old_artifact.id, updated_artifact) # If either title or category has been changed, we must move the file if args["category"] or args["title"]: old_category_path = Path( config["PATH_KB_DATA"], old_artifact.category) new_category_path = Path( config["PATH_KB_DATA"], args["category"] or old_artifact.category) fs.create_directory(new_category_path) fs.move_file(Path(old_category_path, old_artifact.title), Path( new_category_path, args["title"] or old_artifact.title)) return -200
def ingest_kb(args: Dict[str, str], config: Dict[str, str]): """ Import an entire kb knowledge base. Arguments: args: - a dictionary containing the following fields: file -> a string representing the path to the archive to be imported config: - a configuration dictionary containing at least the following keys: PATH_KB - the main path of KB """ tar = tarfile.open(args["file"], "r:gz") t = tar.getmembers()[0] # GET TAR METADATA STORED IN PAX HEADERS tar.extractall(Path(config["PATH_KB"])) tar.close() """ Version 1 (pre 0.1.6 multi kb version) export files don't contain any metadata. This means that the original export files assume that the destination is ".kb" This will not work in post 0.1.6. Therefore, they need to be moved to fit in with this schema. For 0.1.6 and above exports, a simple untar will work. NOTE THAT THE EXPORTS ARE NOT BACKWARDLY COMPATIBLE. """ if t.pax_headers.get('kb-export-format-version', '1') == '1': # Version 1 import file detected kb_path_base = kb_path_base = config["PATH_KB"] # Move data, templates and db into newly created directory (and optionally recent.hist) fs.move_file(str(Path(kb_path_base, '.kb', 'data')), str(Path(kb_path_base, 'data'))) fs.move_file(str(Path(kb_path_base, '.kb', 'templates')), str(Path(kb_path_base, 'templates'))) fs.move_file(str(Path(kb_path_base, '.kb', 'kb.db')), str(Path(kb_path_base, 'kb.db'))) fs.move_file(str(Path(kb_path_base, '.kb', 'recent.hist')), str(Path(kb_path_base, 'recent.hist'))) fs.remove_directory(str(Path(kb_path_base, '.kb'))) else: # Version 2 import file detected pass return -200
def update(args: Dict[str, str], config: Dict[str, str]): """ Update artifact properties within the knowledge base of kb. Arguments: args: - a dictionary containing the following fields: id -> a list of IDs (the ones you see with kb list) associated to the artifact to update title -> the title to be assigned to the artifact to update category -> the category to be assigned to the artifact to update tags -> the tags to be assigned to the artifact to update author -> the author to be assigned to the artifact to update status -> the status to be assigned to the artifact to update template -> the template to be assigned to the artifact to update edit_content -> a boolean, if True -> also open the artifact to edit the content config: - a configuration dictionary containing at least the following keys: PATH_KB_DB - the database path of KB PATH_KB_DATA - the data directory of KB PATH_KB_HIST - the history menu path of KB EDITOR - the editor program to call """ initializer.init(config) conn = db.create_connection(config["PATH_KB_DB"]) # if an ID is specified, load artifact with that ID if args["id"]: old_artifact = history.get_artifact(conn, config["PATH_KB_HIST"], args["id"]) if not old_artifact: print("The artifact you are trying to update does not exist! " "Please insert a valid ID...") return None updated_artifact = Artifact(id=None, title=args["title"], category=args["category"], tags=args["tags"], author=args["author"], status=args["status"], template=args["template"]) db.update_artifact_by_id(conn, old_artifact.id, updated_artifact) # If either title or category has been changed, we must move the file if args["category"] or args["title"]: old_category_path = Path(config["PATH_KB_DATA"], old_artifact.category) new_category_path = Path(config["PATH_KB_DATA"], args["category"] or old_artifact.category) fs.create_directory(new_category_path) fs.move_file( Path(old_category_path, old_artifact.title), Path(new_category_path, args["title"] or old_artifact.title)) # else if a title is specified elif args["title"]: artifact = db.get_uniq_artifact_by_filter(conn, title=args["title"], category=args["category"], author=args["author"], status=args["status"], is_strict=True) if artifact: category_path = Path(config["PATH_KB_DATA"], artifact.category) else: print( "There is none or more than one artifact with that title, please specify a category" ) if args["edit_content"] or args["body"]: if args["title"]: artifact_path = str(Path(category_path, artifact.title)) shell_cmd = shlex.split(config["EDITOR"]) + [artifact_path] elif args["id"]: artifact_path = str( Path(config["PATH_KB_DATA"]) / old_artifact.category / old_artifact.title) shell_cmd = shlex.split(config["EDITOR"]) + [artifact_path] if args["body"]: args["body"] = args["body"].replace("\\n", "\n") with open(artifact_path, 'w') as art_file: art_file.write(args["body"]) else: call(shell_cmd)