Example #1
0
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)
Example #2
0
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
Example #3
0
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
Example #4
0
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)