diff --git a/docs/manpage.rst b/docs/manpage.rst index e5906eb..33e3373 100644 --- a/docs/manpage.rst +++ b/docs/manpage.rst @@ -305,6 +305,17 @@ Arguments read from a file must be one per line, as shown below:: --option2 value2 +Comments in config file +....................... + +It's possible to add comments in the configuration file. This allows annotating the +various subnets with human-readable descriptions, like:: + + # company-internal API + 8.8.8.8/32 + # home IoT + 192.168.63.0/24 + Examples -------- diff --git a/sshuttle/options.py b/sshuttle/options.py index 7c6b0b0..42e3ffe 100644 --- a/sshuttle/options.py +++ b/sshuttle/options.py @@ -152,6 +152,10 @@ class Concat(Action): # beginning/end of the lines. class MyArgumentParser(ArgumentParser): def convert_arg_line_to_args(self, arg_line): + # Ignore comments + if arg_line.startswith("#"): + return [] + # strip whitespace at beginning and end of line arg_line = arg_line.strip() diff --git a/tests/client/test_options.py b/tests/client/test_options.py index 611f22f..6f86a8a 100644 --- a/tests/client/test_options.py +++ b/tests/client/test_options.py @@ -100,3 +100,8 @@ def test_parse_subnetport_ip6_with_mask_and_port(): == [(socket.AF_INET6, ip, 128, 80, 80)] assert sshuttle.options.parse_subnetport('[' + ip_repr + '/16]:80-90')\ == [(socket.AF_INET6, ip, 16, 80, 90)] + + +def test_convert_arg_line_to_args_skips_comments(): + parser = sshuttle.options.MyArgumentParser() + assert parser.convert_arg_line_to_args("# whatever something") == []