You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
2.8 KiB

10 months ago
import errno
import re
from leapp.libraries.stdlib import api
_sections = ('defaults', 'blacklist', 'blacklist_exceptions', 'devices',
'overrides', 'multipaths')
_subsections = {'blacklist': 'device', 'blacklist_exceptions': 'device',
'devices': 'device', 'multipaths': 'multipath'}
def read_config(path):
try:
with open(path, 'r') as f:
return f.read()
except IOError as e:
if e.errno == errno.ENOENT:
api.current_logger().debug(
'multipath configuration file {} does not exist.'.format(path)
)
else:
api.current_logger().warning(
'Failed to read multipath configuration file {}: {}'.
format(path, e)
)
return None
def write_config(path, contents):
try:
with open(path, 'w') as f:
f.write(contents)
except IOError as e:
api.current_logger().warning(
'Failed to write multipath configuration file {}: {}'.
format(path, e)
)
class LineData(object):
TYPE_BLANK = 0
TYPE_SECTION_START = 1
TYPE_SECTION_END = 2
TYPE_OPTION = 3
def __init__(self, line, section, in_subsection):
comment_pattern = re.compile('^([^"#!]*)[#!]')
string_pattern = re.compile('^([^"]*)"([^"]*)')
utf8_pattern = re.compile('[^\x00-\x7F]+')
line_pattern = re.compile(r'^([^\s{}]+)\s*(\S*)')
value = None
r = comment_pattern.match(line)
if r:
line = r.group(1)
r = string_pattern.match(line)
if r:
line = r.group(1)
value = r.group(2)
line = utf8_pattern.sub(' ', line)
line = line.strip()
if line == '':
self.type = self.TYPE_BLANK
return
if line[0] == '}':
self.type = self.TYPE_SECTION_END
return
r = line_pattern.match(line)
if r is None:
raise ValueError
keyword = r.group(1)
if r.group(2) != '':
value = r.group(2) # even if value was set before
if section is None:
if keyword in _sections:
self.type = self.TYPE_SECTION_START
self.section = keyword
return
raise ValueError
if not in_subsection and section in _subsections and \
keyword == _subsections[section]:
self.type = self.TYPE_SECTION_START
self.section = keyword
return
if value is None:
raise ValueError
self.type = self.TYPE_OPTION
self.option = keyword
self.value = value
def is_enabled(self):
if self.value in ('yes', '1'):
return True
if self.value in ('no', '0'):
return False
return None