diff --git a/sys/BootSync/bootsync.py b/sys/BootSync/bootsync.py
index 774ba1b..b42195d 100755
--- a/sys/BootSync/bootsync.py
+++ b/sys/BootSync/bootsync.py
@@ -15,14 +15,15 @@ from lxml import etree
class BootSync(object):
- def __init__(self, cfg = None, *args, **kwargs):
+ def __init__(self, cfg = None, validate = True, *args, **kwargs):
if not cfg:
self.cfgfile = '/etc/bootsync.xml'
else:
self.cfgfile = os.path.abspath(os.path.expanduser(cfg))
- self.ns = '{http://git.square-r00t.net/OpTools/tree/sys/BootSync/}'
+ self.ns = None
self.cfg = None
self.xml = None
+ self.schema = None
# This is the current live kernel.
self.currentKernVer = self._getRunningKernel()
# This is the installed kernel from the package manager.
@@ -33,15 +34,13 @@ class BootSync(object):
self.dummy_uuid = None
self.syncs = {}
##
- self.getCfg()
+ self.getCfg(validate = validate)
self.chkMounts()
self.chkReboot()
self.getHashes()
self.getBlkids()
- # self.sync()
- # self.writeConfs()
- def getCfg(self):
+ def getCfg(self, validate = True):
if not os.path.isfile(self.cfgfile):
raise FileNotFoundError('Configuration file {0} does not exist!'.format(self.cfgfile))
try:
@@ -53,6 +52,19 @@ class BootSync(object):
# self.logger.error('{0} is invalid XML'.format(self.cfgfile))
raise ValueError(('{0} does not seem to be valid XML. '
'See sample.config.xml for an example configuration.').format(self.cfgfile))
+ self.ns = self.cfg.nsmap.get(None, 'http://git.square-r00t.net/OpTools/tree/sys/BootSync/')
+ self.ns = '{{{0}}}'.format(self.ns)
+ if validate:
+ if not self.schema:
+ from urllib.request import urlopen
+ xsi = self.cfg.nsmap.get('xsi', 'http://www.w3.org/2001/XMLSchema-instance')
+ schemaLocation = '{{{0}}}schemaLocation'.format(xsi)
+ schemaURL = self.cfg.attrib.get(schemaLocation,
+ ('http://git.square-r00t.net/OpTools/plain/sys/BootSync/bootsync.xsd'))
+ with urlopen(schemaURL) as url:
+ self.schema = url.read()
+ self.schema = etree.XMLSchema(etree.XML(self.schema))
+ self.schema.assertValid(self.xml)
return()
def chkMounts(self):
@@ -278,6 +290,11 @@ class BootSync(object):
def parseArgs():
args = argparse.ArgumentParser(description = ('Sync files to assist using mdadm RAID arrays with UEFI'))
+ args.add_argument('-V', '--no-validate',
+ dest = 'validate',
+ action = 'store_false',
+ help = ('If specified, do not attempt to validate the configuration file (-c/--cfg) against'
+ 'its schema (otherwise it is fetched dynamically and requires network connection)'))
args.add_argument('-c', '--cfg',
dest = 'cfg',
default = '/etc/bootsync.xml',
diff --git a/sys/BootSync/bootsync.xsd b/sys/BootSync/bootsync.xsd
index 4ab4c7d..6ea587e 100644
--- a/sys/BootSync/bootsync.xsd
+++ b/sys/BootSync/bootsync.xsd
@@ -24,6 +24,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -56,11 +78,14 @@
+
+
@@ -76,9 +101,12 @@
+
+
diff --git a/sys/BootSync/sample.config.xml b/sys/BootSync/sample.config.xml
index b982ae9..43e564c 100644
--- a/sys/BootSync/sample.config.xml
+++ b/sys/BootSync/sample.config.xml
@@ -17,33 +17,72 @@ SEE prep.txt FOR WHAT MUST BE DONE BEFORE RUNNING BOOTSYNC.
-
-
-
+ Only *the last* with isKernel="true" listed is used as the kernel identifier.
+ -->
+
+
initramfs-linux.img
intel-ucode.img
memtest86+/memtest.bin
- vmlinuz-linux
+ vmlinuz-linux
-
-
+ "pattern" is a regex to match to restrict *filenames* to sync. Use ".*" for all files.
+ -->
+
-
+
\ No newline at end of file