Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add: standalone plugin for evaluating dependencies with a graph #774

Draft
wants to merge 18 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
2cee561
Add: standalone plugin for evaluating dependencies with a graph
NiklasHargarter Dec 11, 2024
f4763b6
Change: dependency_graph codeql mixed returns fix
NiklasHargarter Dec 11, 2024
413b876
Change: Revert "Change: dependency_graph codeql mixed returns fix"
NiklasHargarter Dec 12, 2024
eb6bd0b
Add: standalone dependency_graph unittests
NiklasHargarter Dec 12, 2024
f973706
Add: include when a dependency is gated in the dependency graph
NiklasHargarter Dec 31, 2024
e621f1a
Change: dependency_graph minor restructure and changes
NiklasHargarter Jan 6, 2025
63c0f64
Add: category order, deprecated dependencies to graph standalone plugin
NiklasHargarter Jan 16, 2025
8dc409b
Change: dependency_graph checks result structure and output
NiklasHargarter Jan 20, 2025
bd47514
Change: various refactors in dependency graph standalone
NiklasHargarter Jan 22, 2025
77ea91f
Change: correct dependency graph unittests not fixed in last commit
NiklasHargarter Jan 22, 2025
0fc9cae
Change: dependency graph minor refactors
NiklasHargarter Jan 24, 2025
5b0e94e
Change: dependency graph rename variables
NiklasHargarter Jan 27, 2025
6bbdbd6
Add: dir and file type for argparser that only allow existing
NiklasHargarter Jan 28, 2025
d8693a6
Change: reuse method for splitting dependencies
NiklasHargarter Jan 28, 2025
ad39133
Change: Cleanup dependency_graph
mbrinkhoff Jan 29, 2025
192d38b
Change: use restructured imports in dependency graph test
NiklasHargarter Jan 30, 2025
66fe3de
Merge pull request #789 from greenbone/dependecy_graph_cleanup
NiklasHargarter Jan 31, 2025
3a529e5
Merge branch 'main' into dependency_graph
NiklasHargarter Jan 31, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -136,3 +136,4 @@ link.sh

# vts/nasl folder used for testing
nasl
!tests/standalone_plugins/nasl/
29 changes: 24 additions & 5 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ chardet = ">=4,<6"
validators = "^0.34.0"
gitpython = "^3.1.31"
charset-normalizer = "^3.2.0"
networkx = "^3.4.2"

[tool.poetry.group.dev.dependencies]
autohooks = ">=21.7.0"
Expand Down Expand Up @@ -81,6 +82,7 @@ troubadix-changed-cves = 'troubadix.standalone_plugins.changed_cves:main'
troubadix-allowed-rev-diff = 'troubadix.standalone_plugins.allowed_rev_diff:main'
troubadix-file-extensions = 'troubadix.standalone_plugins.file_extensions:main'
troubadix-deprecate-vts = 'troubadix.standalone_plugins.deprecate_vts:main'
troubadix-dependency-graph = 'troubadix.standalone_plugins.dependency_graph:main'

[build-system]
requires = ["poetry-core>=1.0.0"]
Expand Down
6 changes: 6 additions & 0 deletions tests/standalone_plugins/nasl/21.04/21_script.nasl
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
if(description)
{
script_category(ACT_GATHER_INFO);
script_dependencies( "foo.nasl" );
exit(0);
}
6 changes: 6 additions & 0 deletions tests/standalone_plugins/nasl/22.04/22_script.nasl
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
if(description)
{
script_category(ACT_GATHER_INFO);
script_dependencies( "foo.nasl" );
exit(0);
}
10 changes: 10 additions & 0 deletions tests/standalone_plugins/nasl/common/bar.nasl
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
if(description)
{
script_category(ACT_GATHER_INFO);
script_dependencies( "foo.nasl", "foo.nasl" );

if(FEED_NAME == "GSF" || FEED_NAME == "GEF" || FEED_NAME == "SCM")
script_dependencies("gsf/enterprise_script.nasl");

exit(0);
}
8 changes: 8 additions & 0 deletions tests/standalone_plugins/nasl/common/foo.nasl
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
if(description)
{
script_category(ACT_ATTACK);
script_dependencies( "foobar.nasl", "gsf/enterprise_script.nasl" );
exit(0);
}

script_dependencies( "missing.nasl" );
7 changes: 7 additions & 0 deletions tests/standalone_plugins/nasl/common/foobar.nasl
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
if(description)
{
script_category(ACT_GATHER_INFO);
script_dependencies( "bar.nasl" );
exit(0);
script_tag(name:"deprecated", value:TRUE);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
if(description)
{
script_category(ACT_GATHER_INFO);
exit(0);
}
72 changes: 72 additions & 0 deletions tests/standalone_plugins/test_dependency_graph.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2024 Greenbone AG
import sys
import unittest
from contextlib import redirect_stderr, redirect_stdout
from io import StringIO
from pathlib import Path
from unittest.mock import patch

from troubadix.standalone_plugins.dependency_graph import (
Feed,
Script,
create_graph,
get_feed,
main,
parse_args,
)

NASL_DIR = "tests/standalone_plugins/nasl"


class TestDependencyGraph(unittest.TestCase):

def test_parse_args_ok(self):
test_args = [
"prog",
NASL_DIR,
"--feed",
"feed_22_04",
"--log",
"info",
]
with patch.object(sys, "argv", test_args):
args = parse_args()
self.assertTrue(args)
self.assertEqual(args.root, Path(NASL_DIR))
self.assertEqual(args.feed, [Feed.FEED_22_04])
self.assertEqual(args.log, "info")

@patch("sys.stderr", new_callable=StringIO)
def test_parse_args_no_dir(self, mock_stderr):
test_args = ["prog", "not_real_dir"]
with patch.object(sys, "argv", test_args):
with self.assertRaises(SystemExit):
parse_args()
self.assertRegex(mock_stderr.getvalue(), "invalid directory_type")

def test_get_feed(self):
feed = [Feed.FULL]
scripts = get_feed(Path(NASL_DIR), feed)
self.assertEqual(len(scripts), 6)

def test_create_graph(self):
scripts = [
Script("foo.nasl", "community", [("bar.nasl", False)], 0, False),
Script("bar.nasl", "enterprise", [], 0, False),
]
graph = create_graph(scripts)
self.assertEqual(len(list(graph.nodes)), 2)

def test_full_run(self):
test_args = [
"prog",
NASL_DIR,
]
with (
redirect_stdout(StringIO()),
redirect_stderr(StringIO()),
patch.object(sys, "argv", test_args),
):
return_code = main()
self.assertEqual(return_code, 1)
1 change: 1 addition & 0 deletions tests/test_naslinter.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ def test_generate_file_list_with_exclude_patterns(self):
"**/templates/*/*.nasl",
"**/test_files/*",
"**/test_files/**/*.nasl",
"**/tests/standalone_plugins/**/*.nasl",
],
include_patterns=["**/*.nasl", "**/*.inc"],
)
Expand Down
Loading
Loading