checking in before i restructure some stuff
This commit is contained in:
		
							parent
							
								
									af2cd9dd0e
								
							
						
					
					
						commit
						f96c815d8d
					
				@ -1,3 +1,13 @@
 | 
			
		||||
from . import disk
 | 
			
		||||
from . import system
 | 
			
		||||
from . import config
 | 
			
		||||
from . import constants
 | 
			
		||||
from . import envsetup
 | 
			
		||||
from . import log
 | 
			
		||||
from . import network
 | 
			
		||||
from . import pacman
 | 
			
		||||
from . import utils
 | 
			
		||||
 | 
			
		||||
class AIF(object):
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
@ -1,9 +0,0 @@
 | 
			
		||||
def xmlBool(xmlobj):
 | 
			
		||||
    if isinstance(xmlobj, bool):
 | 
			
		||||
        return (xmlobj)
 | 
			
		||||
    if xmlobj.lower() in ('1', 'true'):
 | 
			
		||||
        return(True)
 | 
			
		||||
    elif xmlobj.lower() in ('0', 'false'):
 | 
			
		||||
        return(False)
 | 
			
		||||
    else:
 | 
			
		||||
        return(None)
 | 
			
		||||
@ -5,10 +5,6 @@ import re
 | 
			
		||||
import requests
 | 
			
		||||
from lxml import etree, objectify
 | 
			
		||||
 | 
			
		||||
_patterns = {'raw': re.compile(r'^\s*(?P<xml><(\?xml|aif)\s+.*)\s*$', re.DOTALL|re.MULTILINE),
 | 
			
		||||
             'remote': re.compile(r'^(?P<uri>(?P<proto>(https?|ftps?)://)(?P<path>.*))\s*$'),
 | 
			
		||||
             'local': re.compile(r'^(file://)?(?P<path>(/?[^/]+)+/?)$')}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Config(object):
 | 
			
		||||
    def __init__(self, xsd_path = None, *args, **kwargs):
 | 
			
		||||
@ -197,22 +193,21 @@ class ConfigBin(Config):
 | 
			
		||||
        return()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
detector = {'raw': (re.compile(r'^\s*(?P<xml><(\?xml|aif)\s+.*)\s*$', re.DOTALL | re.MULTILINE), ConfigStr),
 | 
			
		||||
            'remote': (re.compile(r'^(?P<uri>(?P<proto>(https?|ftps?)://)(?P<path>.*))\s*$'), RemoteFile),
 | 
			
		||||
            'local': (re.compile(r'^(file://)?(?P<path>(/?[^/]+)+/?)$'), LocalFile)}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def getConfig(cfg_ref, validate = True, populate_defaults = True, xsd_path = None):
 | 
			
		||||
    cfgobj = None
 | 
			
		||||
    # This is kind of gross.
 | 
			
		||||
    for configtype, pattern in _patterns.items():
 | 
			
		||||
    for configtype, (pattern, configClass) in detector.items():
 | 
			
		||||
        try:
 | 
			
		||||
            if pattern.search(cfg_ref):
 | 
			
		||||
                if configtype == 'raw':
 | 
			
		||||
                    cfgobj = ConfigStr(cfg_ref, xsd_path = xsd_path)
 | 
			
		||||
                elif configtype == 'remote':
 | 
			
		||||
                    cfgobj = RemoteFile(cfg_ref, xsd_path = xsd_path)
 | 
			
		||||
                elif configtype == 'local':
 | 
			
		||||
                    cfgobj = LocalFile(cfg_ref, xsd_path = xsd_path)
 | 
			
		||||
                if cfgobj:
 | 
			
		||||
                    break
 | 
			
		||||
                cfgobj = configClass(cfg_ref, xsd_path = xsd_path)
 | 
			
		||||
                break
 | 
			
		||||
        except TypeError:
 | 
			
		||||
            ptrn = re.compile(_patterns['raw'].pattern.encode('utf-8'))
 | 
			
		||||
            ptrn = re.compile(detector['raw'][0].pattern.encode('utf-8'))
 | 
			
		||||
            if not ptrn.search(cfg_ref):
 | 
			
		||||
                raise ValueError('Received junk data for cfg_ref')
 | 
			
		||||
            else:
 | 
			
		||||
 | 
			
		||||
@ -18,7 +18,7 @@ import blkinfo
 | 
			
		||||
import parted  # https://www.gnu.org/software/parted/api/index.html
 | 
			
		||||
import psutil
 | 
			
		||||
##
 | 
			
		||||
from aif.aif_util import xmlBool
 | 
			
		||||
from aif.utils import xmlBool
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
PARTED_FSTYPES = sorted(list(dict(vars(parted.filesystem))['fileSystemType'].keys()))
 | 
			
		||||
@ -148,6 +148,9 @@ class Partition(object):
 | 
			
		||||
            _pedpart = self.partition.getPedPartition()
 | 
			
		||||
            _pedpart.set_name(self.xml.attrib.get('name'))
 | 
			
		||||
 | 
			
		||||
    def detect(self):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Disk(object):
 | 
			
		||||
    def __init__(self, disk_xml):
 | 
			
		||||
 | 
			
		||||
@ -3,6 +3,7 @@ import datetime
 | 
			
		||||
import math
 | 
			
		||||
import re
 | 
			
		||||
import subprocess
 | 
			
		||||
import uuid
 | 
			
		||||
##
 | 
			
		||||
import mdstat
 | 
			
		||||
##
 | 
			
		||||
@ -88,7 +89,7 @@ class Member(object):
 | 
			
		||||
                v = re.sub(r'^raid', '', v)
 | 
			
		||||
            elif k == 'checksum':
 | 
			
		||||
                cksum, status = [i.strip() for i in v.split('-')]
 | 
			
		||||
                v = (int(cksum), status)
 | 
			
		||||
                v = (bytes.fromhex(cksum), status)
 | 
			
		||||
            elif k == 'unused_space':
 | 
			
		||||
                r = _mdblock_unused_re.search(v)
 | 
			
		||||
                if not r:
 | 
			
		||||
@ -108,6 +109,10 @@ class Member(object):
 | 
			
		||||
                v = {}
 | 
			
		||||
                for i in ('entries', 'offset'):
 | 
			
		||||
                    v[i] = int(r.group(i)) # offset is in sectors
 | 
			
		||||
            elif k == 'array_state':
 | 
			
		||||
                v = [i.strip() for i in v.split(None, 1)][0].split()
 | 
			
		||||
            elif k == 'device_uuid':
 | 
			
		||||
                v = uuid.UUID(hex = v.replace(':', '-'))
 | 
			
		||||
            elif re.search((r'^(creation|update)_time$'), k):
 | 
			
		||||
                # TODO: Is this portable/correct? Or do I need to do '%a %b %d %H:%M:%s %Y'?
 | 
			
		||||
                v = datetime.datetime.strptime(v, '%c')
 | 
			
		||||
@ -119,7 +124,9 @@ class Member(object):
 | 
			
		||||
                                                                  self.devpath))
 | 
			
		||||
                v = {}
 | 
			
		||||
                for i in ('sectors', 'GB', 'GiB'):
 | 
			
		||||
                    v[i] = int(r.group(i))
 | 
			
		||||
                    v[i] = float(r.group(i))
 | 
			
		||||
                    if i == 'sectors':
 | 
			
		||||
                        v[i] = int(v[i])
 | 
			
		||||
            elif re.search(r'^(data|super)_offset$', k):
 | 
			
		||||
                v = int(v.split(None, 1)[0])
 | 
			
		||||
            block[k] = v
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										75
									
								
								aif/utils.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								aif/utils.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,75 @@
 | 
			
		||||
def xmlBool(xmlobj):
 | 
			
		||||
    # https://bugs.launchpad.net/lxml/+bug/1850221
 | 
			
		||||
    if isinstance(xmlobj, bool):
 | 
			
		||||
        return (xmlobj)
 | 
			
		||||
    if xmlobj.lower() in ('1', 'true'):
 | 
			
		||||
        return(True)
 | 
			
		||||
    elif xmlobj.lower() in ('0', 'false'):
 | 
			
		||||
        return(False)
 | 
			
		||||
    else:
 | 
			
		||||
        return(None)
 | 
			
		||||
 | 
			
		||||
class _Sizer(object):
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        def _getKeys(d, keylist = None):
 | 
			
		||||
            if not keylist:
 | 
			
		||||
                keylist = []
 | 
			
		||||
            for k, v in d.items():
 | 
			
		||||
                if isinstance(v, dict):
 | 
			
		||||
                    keylist.append(k)
 | 
			
		||||
                    keylist = _getKeys(v, keylist = keylist)
 | 
			
		||||
                else:
 | 
			
		||||
                    keylist.append(k)
 | 
			
		||||
            return (keylist)
 | 
			
		||||
        # We use different methods for converting between storage and BW, and different multipliers for each subtype.
 | 
			
		||||
        # https://stackoverflow.com/questions/5194057/better-way-to-convert-file-sizes-in-python
 | 
			
		||||
        # https://en.wikipedia.org/wiki/Orders_of_magnitude_(data)
 | 
			
		||||
        # https://en.wikipedia.org/wiki/Binary_prefix
 | 
			
		||||
        self.storageUnits = {'decimal': {'B': 0,
 | 
			
		||||
                                         'kB': 7,  # Kilobyte
 | 
			
		||||
                                         'MB': 17,  # Megabyte...
 | 
			
		||||
                                         'GB': 27,
 | 
			
		||||
                                         'TB': 37},
 | 
			
		||||
                             'binary': {'KiB': 10,  # Kibibyte
 | 
			
		||||
                                        'MiB': 20,  # Mebibyte...
 | 
			
		||||
                                        'GiB': 30,
 | 
			
		||||
                                        'TiB': 40}}
 | 
			
		||||
        # https://en.wikipedia.org/wiki/Bit#Multiple_bits
 | 
			
		||||
        self.bwUnits = {'b': None,
 | 
			
		||||
                        'bit': None,
 | 
			
		||||
                        'k': }
 | 
			
		||||
        self.valid_storage = list(self.storageUnits.keys())
 | 
			
		||||
        self.valid_storage.insert('nibble')
 | 
			
		||||
        self.valid_bw = _getKeys(self.bwUnits)
 | 
			
		||||
 | 
			
		||||
    def convert(self, n, suffix, target = None):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    def convertBW(self, n, suffix, target = None):
 | 
			
		||||
        inBits = n
 | 
			
		||||
        if suffix not in self.valid_bw:
 | 
			
		||||
            raise ValueError('suffix must be one of {0}'.format(', '.format(self.valid_bw)))
 | 
			
		||||
        if suffix != 'b':
 | 
			
		||||
            if self.bwUnits[suffix]:
 | 
			
		||||
                inBits = n * (10 ** self.bwUnits[suffix])
 | 
			
		||||
            else:
 | 
			
		||||
                inBits = None
 | 
			
		||||
 | 
			
		||||
    def convertStorage(self, n, suffix, target = None):
 | 
			
		||||
        inBytes = n
 | 
			
		||||
        if suffix not in self.valid_storage:
 | 
			
		||||
            raise ValueError('suffix must be one of {0}'.format(', '.format(self.valid_storage)))
 | 
			
		||||
        if suffix == 'nibble':
 | 
			
		||||
            inBytes = n * 0.5
 | 
			
		||||
        elif suffix != 'B':
 | 
			
		||||
            inBytes = float(n << self.storageUnits[suffix])
 | 
			
		||||
        if target:
 | 
			
		||||
            conversion = float(inBytes / float(1 << self.storageUnits[target]))
 | 
			
		||||
        else:
 | 
			
		||||
            conversion = {}
 | 
			
		||||
            for unit, shifter in self.storageUnits.items():
 | 
			
		||||
                conversion[unit] = float(inBytes / float(1 << self.storageUnits[unit]))
 | 
			
		||||
        return(conversion)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
size = _Sizer()
 | 
			
		||||
@ -23,9 +23,11 @@
 | 
			
		||||
                <part id="raid1_d2" start="55%" stop="80%" fsType="ext4">
 | 
			
		||||
                    <partitionFlag>raid</partitionFlag>
 | 
			
		||||
                </part>
 | 
			
		||||
                <part id="swap" start="80%" stop="100%" fsType="linux-swap(v1)">
 | 
			
		||||
                <part id="swap" start="80%" stop="90%" fsType="linux-swap(v1)">
 | 
			
		||||
                    <partitionFlag>swap</partitionFlag>
 | 
			
		||||
                </part>
 | 
			
		||||
                <!-- You can also create a partition with no flags (and not use). -->
 | 
			
		||||
                <part id="grow" start="90%" stop="100%" fsType="ext4"/>
 | 
			
		||||
            </disk>
 | 
			
		||||
        </blockDevices>
 | 
			
		||||
        <!-- "Special" devices are processed *in the order they are specified*. This is important if you wish to
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user