mirror of
https://github.com/CumulusNetworks/ifupdown2.git
synced 2024-05-06 15:54:50 +00:00
some fixes + template support
Ticket: CM-1438 Reviewed By: Testing Done: This patch adds support for mako style templates. Example: % for v in [20,30,40]: auto vlan${v} iface vlan${v} inet static address 10.20.${v}.3/24 mstpctl_ports glob swp1-52.${v} mstpctl_stp on % endfor open items: - currently templates will only work if python-mako is installed (Its apt-gettable from debian wheezy).
This commit is contained in:
@ -22,6 +22,8 @@ CONFIGURE_INTERFACES=yes
|
|||||||
EXCLUDE_INTERFACES=
|
EXCLUDE_INTERFACES=
|
||||||
VERBOSE=no
|
VERBOSE=no
|
||||||
|
|
||||||
|
verbose=
|
||||||
|
|
||||||
[ -f /etc/default/networking ] && . /etc/default/networking
|
[ -f /etc/default/networking ] && . /etc/default/networking
|
||||||
|
|
||||||
[ "$VERBOSE" = yes ] && verbose=-v
|
[ "$VERBOSE" = yes ] && verbose=-v
|
||||||
@ -128,7 +130,7 @@ start)
|
|||||||
set -f
|
set -f
|
||||||
exclusions=$(process_exclusions)
|
exclusions=$(process_exclusions)
|
||||||
log_action_begin_msg "Configuring network interfaces"
|
log_action_begin_msg "Configuring network interfaces"
|
||||||
if ifup -a $exclusions $verbose && ifup_hotplug $exclusions $verbose
|
if ifup -a $verbose --perfmode
|
||||||
then
|
then
|
||||||
log_action_end_msg $?
|
log_action_end_msg $?
|
||||||
else
|
else
|
||||||
@ -144,7 +146,7 @@ stop)
|
|||||||
check_network_swap
|
check_network_swap
|
||||||
|
|
||||||
log_action_begin_msg "Deconfiguring network interfaces"
|
log_action_begin_msg "Deconfiguring network interfaces"
|
||||||
if ifdown -a --exclude=lo $verbose; then
|
if ifdown -a --exclude=lo $verbose --perfmode --force; then
|
||||||
log_action_end_msg $?
|
log_action_end_msg $?
|
||||||
else
|
else
|
||||||
log_action_end_msg $?
|
log_action_end_msg $?
|
||||||
@ -156,7 +158,7 @@ reload)
|
|||||||
|
|
||||||
log_action_begin_msg "Reloading network interfaces configuration"
|
log_action_begin_msg "Reloading network interfaces configuration"
|
||||||
state=$(cat /run/network/ifstate)
|
state=$(cat /run/network/ifstate)
|
||||||
ifdown -a --exclude=lo $verbose || true
|
ifdown -a --exclude=lo $verbose --perfmode --force || true
|
||||||
if ifup --exclude=lo $state $verbose ; then
|
if ifup --exclude=lo $state $verbose ; then
|
||||||
log_action_end_msg $?
|
log_action_end_msg $?
|
||||||
else
|
else
|
||||||
@ -172,10 +174,10 @@ force-reload|restart)
|
|||||||
|
|
||||||
#log_warning_msg "Running $0 $1 is deprecated because it may not re-enable some interfaces"
|
#log_warning_msg "Running $0 $1 is deprecated because it may not re-enable some interfaces"
|
||||||
log_action_begin_msg "Reconfiguring network interfaces"
|
log_action_begin_msg "Reconfiguring network interfaces"
|
||||||
ifdown -a --exclude=lo $verbose || true
|
ifdown -a --exclude=lo $verbose --perfmode --force || true
|
||||||
set -f
|
set -f
|
||||||
exclusions=$(process_exclusions)
|
exclusions=$(process_exclusions)
|
||||||
if ifup -a --exclude=lo $exclusions $verbose && ifup_hotplug $exclusions $verbose
|
if ifup -a --exclude=lo $verbose --perfmode
|
||||||
then
|
then
|
||||||
log_action_end_msg $?
|
log_action_end_msg $?
|
||||||
else
|
else
|
||||||
|
@ -259,7 +259,7 @@ class ifupdownMain():
|
|||||||
continue
|
continue
|
||||||
dlist = module.get_dependent_ifacenames(ifaceobj,
|
dlist = module.get_dependent_ifacenames(ifaceobj,
|
||||||
self.ifaceobjdict.keys())
|
self.ifaceobjdict.keys())
|
||||||
if dlist:
|
if dlist is not None:
|
||||||
self.logger.debug('%s: ' %ifaceobj.get_name() +
|
self.logger.debug('%s: ' %ifaceobj.get_name() +
|
||||||
'got dependency list: %s' %str(dlist))
|
'got dependency list: %s' %str(dlist))
|
||||||
break
|
break
|
||||||
|
@ -89,6 +89,7 @@ class networkInterfaces():
|
|||||||
|
|
||||||
def process_iface(self, lines, cur_idx, lineno):
|
def process_iface(self, lines, cur_idx, lineno):
|
||||||
lines_consumed = 0
|
lines_consumed = 0
|
||||||
|
line_idx = cur_idx
|
||||||
|
|
||||||
ifaceobj = iface()
|
ifaceobj = iface()
|
||||||
|
|
||||||
@ -174,47 +175,64 @@ class networkInterfaces():
|
|||||||
|
|
||||||
return classes
|
return classes
|
||||||
|
|
||||||
|
def process_filedata(self, filedata):
|
||||||
def read_file(self, filename=None):
|
|
||||||
lineno = 0
|
lineno = 0
|
||||||
line_idx = 0
|
line_idx = 0
|
||||||
lines_consumed = 0
|
lines_consumed = 0
|
||||||
|
|
||||||
|
raw_lines = filedata.split('\n')
|
||||||
|
lines = [l.strip(' \n') for l in raw_lines]
|
||||||
|
|
||||||
|
while (line_idx < len(lines)):
|
||||||
|
lineno = lineno + 1
|
||||||
|
|
||||||
|
if self.ignore_line(lines[line_idx]):
|
||||||
|
line_idx += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
words = lines[line_idx].split()
|
||||||
|
|
||||||
|
# Check if first element is a supported keyword
|
||||||
|
if self.is_keyword(words[0]):
|
||||||
|
keyword_func = self.get_keyword_func(words[0])
|
||||||
|
lines_consumed = keyword_func(self, lines, line_idx, lineno)
|
||||||
|
line_idx += lines_consumed
|
||||||
|
else:
|
||||||
|
self.logger.warning('could not process line %s' %l + ' at' +
|
||||||
|
' lineno %d' %lineno)
|
||||||
|
|
||||||
|
line_idx += 1
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def run_template_engine(self, textdata):
|
||||||
|
try:
|
||||||
|
from mako.template import Template
|
||||||
|
except:
|
||||||
|
self.logger.warning('template engine mako not found ' +
|
||||||
|
'skipping template parsing');
|
||||||
|
return textdata
|
||||||
|
|
||||||
|
t = Template(text=textdata, output_encoding='utf-8')
|
||||||
|
return t.render()
|
||||||
|
|
||||||
|
def read_file(self, filename=None):
|
||||||
ifaces_file = filename
|
ifaces_file = filename
|
||||||
if ifaces_file == None:
|
if ifaces_file == None:
|
||||||
ifaces_file=self.ifaces_file
|
ifaces_file=self.ifaces_file
|
||||||
|
|
||||||
self.logger.debug('reading ifaces_file %s' %ifaces_file)
|
self.logger.debug('reading ifaces_file %s' %ifaces_file)
|
||||||
|
f = open(ifaces_file)
|
||||||
|
filedata = f.read()
|
||||||
|
f.close()
|
||||||
|
|
||||||
with open(ifaces_file) as f:
|
# process line continuations
|
||||||
raw_lines = f.readlines()
|
filedata = ' '.join(d.strip() for d in filedata.split('\\'))
|
||||||
lines = [l.strip(' \n') for l in raw_lines]
|
|
||||||
|
|
||||||
while (line_idx < len(lines)):
|
# run through template engine
|
||||||
lineno = lineno + 1
|
filedata = self.run_template_engine(filedata)
|
||||||
|
|
||||||
if self.ignore_line(lines[line_idx]):
|
self.process_filedata(filedata)
|
||||||
line_idx += 1
|
|
||||||
continue
|
|
||||||
|
|
||||||
words = lines[line_idx].split()
|
|
||||||
|
|
||||||
# Check if first element is a supported keyword
|
|
||||||
if self.is_keyword(words[0]):
|
|
||||||
keyword_func = self.get_keyword_func(
|
|
||||||
words[0])
|
|
||||||
lines_consumed = keyword_func(self,
|
|
||||||
lines, line_idx, lineno)
|
|
||||||
|
|
||||||
line_idx += lines_consumed
|
|
||||||
else:
|
|
||||||
self.logger.warning('could not ' +
|
|
||||||
'process line %s' %l + ' at' +
|
|
||||||
' lineno %d' %lineno)
|
|
||||||
|
|
||||||
line_idx += 1
|
|
||||||
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
def load(self, filename=None):
|
def load(self, filename=None):
|
||||||
|
Reference in New Issue
Block a user