mirror of
https://github.com/CumulusNetworks/ifupdown2.git
synced 2024-05-06 15:54:50 +00:00
networkinterfaces: support source-directory statement
ifupdown supports the "source-directory" statement that include the content of the specified directory. See [1] for details. Implement the statement to improve compatibility with ifupdown. Fixes #191 [1] https://manpages.debian.org/buster/ifupdown/interfaces.5.en.html
This commit is contained in:
committed by
Peter Keresztes Schmidt
parent
b5bed16cbe
commit
0845cc57b2
@@ -7,11 +7,12 @@
|
|||||||
# ifupdown network interfaces file parser
|
# ifupdown network interfaces file parser
|
||||||
#
|
#
|
||||||
|
|
||||||
import re
|
import collections
|
||||||
import copy
|
import copy
|
||||||
import glob
|
import glob
|
||||||
import logging
|
import logging
|
||||||
import collections
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from ifupdown2.ifupdown.iface import *
|
from ifupdown2.ifupdown.iface import *
|
||||||
@@ -176,6 +177,21 @@ class networkInterfaces():
|
|||||||
'unable to read source line')
|
'unable to read source line')
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
def process_source_directory(self, lines, cur_idx, lineno):
|
||||||
|
self.logger.debug('processing source-directory line ..\'%s\'' % lines[cur_idx])
|
||||||
|
sourced_directory = re.split(self._ws_split_regex, lines[cur_idx], 2)[1]
|
||||||
|
if sourced_directory:
|
||||||
|
folders = glob.glob(sourced_directory)
|
||||||
|
for folder in folders:
|
||||||
|
filenames = [file for file in os.listdir(folder) if re.match(r'^[a-zA-Z0-9_-]+$', file)]
|
||||||
|
|
||||||
|
for f in filenames:
|
||||||
|
self.read_file(os.path.join(folder, f))
|
||||||
|
else:
|
||||||
|
self._parse_error(self._currentfile, lineno,
|
||||||
|
'unable to read source-directory line')
|
||||||
|
return 0
|
||||||
|
|
||||||
def process_auto(self, lines, cur_idx, lineno):
|
def process_auto(self, lines, cur_idx, lineno):
|
||||||
auto_ifaces = re.split(self._ws_split_regex, lines[cur_idx])[1:]
|
auto_ifaces = re.split(self._ws_split_regex, lines[cur_idx])[1:]
|
||||||
if not auto_ifaces:
|
if not auto_ifaces:
|
||||||
@@ -388,11 +404,14 @@ class networkInterfaces():
|
|||||||
|
|
||||||
return lines_consumed # Return next index
|
return lines_consumed # Return next index
|
||||||
|
|
||||||
network_elems = { 'source' : process_source,
|
network_elems = {
|
||||||
'allow' : process_allow,
|
'source': process_source,
|
||||||
'auto' : process_auto,
|
'source-directory': process_source_directory,
|
||||||
'iface' : process_iface,
|
'allow': process_allow,
|
||||||
'vlan' : process_vlan}
|
'auto': process_auto,
|
||||||
|
'iface': process_iface,
|
||||||
|
'vlan': process_vlan
|
||||||
|
}
|
||||||
|
|
||||||
def _is_keyword(self, str):
|
def _is_keyword(self, str):
|
||||||
# The additional split here is for allow- keyword
|
# The additional split here is for allow- keyword
|
||||||
@@ -401,9 +420,12 @@ class networkInterfaces():
|
|||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def _get_keyword_func(self, str):
|
def _get_keyword_func(self, str_):
|
||||||
tmp_str = str.split('-')[0]
|
tmp_str = str_.split('-')[0]
|
||||||
|
if tmp_str == "allow":
|
||||||
return self.network_elems.get(tmp_str)
|
return self.network_elems.get(tmp_str)
|
||||||
|
else:
|
||||||
|
return self.network_elems.get(str_)
|
||||||
|
|
||||||
def get_allow_classes_for_iface(self, ifacename):
|
def get_allow_classes_for_iface(self, ifacename):
|
||||||
classes = []
|
classes = []
|
||||||
|
Reference in New Issue
Block a user