|
|
|
@ -18,6 +18,56 @@ class DistributiveError(Exception):
|
|
|
|
|
"""Error for distributive operations"""
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
class DistributiveRepository:
|
|
|
|
|
system = {
|
|
|
|
|
'cds':'server',
|
|
|
|
|
'cld':'desktop',
|
|
|
|
|
'cldg':'desktop',
|
|
|
|
|
'cldx':'desktop',
|
|
|
|
|
'cls':'desktop',
|
|
|
|
|
'css':'server'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
marches = ['i686','x86_64']
|
|
|
|
|
|
|
|
|
|
extensiton = ['iso','tar.bz2','tar.gz','tar.7z','tar.lzma']
|
|
|
|
|
|
|
|
|
|
reDistName = re.compile("""
|
|
|
|
|
^(?P<name>%(name)s)
|
|
|
|
|
-(?P<ver>%(ver)s)
|
|
|
|
|
-(?P<march>%(march)s)
|
|
|
|
|
.(?P<ext>%(ext)s)$""" %
|
|
|
|
|
{'name':"|".join(system.keys()),
|
|
|
|
|
'ver':r"(\d+\.)*\d+",
|
|
|
|
|
'march':"|".join(marches),
|
|
|
|
|
'ext':"|".join(extensiton)
|
|
|
|
|
}, re.X)
|
|
|
|
|
|
|
|
|
|
def __init__(self,directory):
|
|
|
|
|
self.root = directory
|
|
|
|
|
|
|
|
|
|
def _getAvailableDistributives(self,system=None,shortname=None,march=None,
|
|
|
|
|
version=None):
|
|
|
|
|
def distfilter(dist):
|
|
|
|
|
match = self.reDistName.match(dist)
|
|
|
|
|
if not match:
|
|
|
|
|
return False
|
|
|
|
|
d = match.groupdict()
|
|
|
|
|
# check filter conditions
|
|
|
|
|
if system and self.system(d['name']) != system or \
|
|
|
|
|
shortname and d['name'] != shortname or \
|
|
|
|
|
march and d['march'] != march or \
|
|
|
|
|
version and d['ver'] != version:
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
return True
|
|
|
|
|
return [ dist for dist in os.listdir(self.root) if distfilter(dist) ]
|
|
|
|
|
|
|
|
|
|
def getLastDistributive(self,system=None,shortname=None,march=None,
|
|
|
|
|
version=None):
|
|
|
|
|
return self._getAvailableDistributives(system,shortname,march,
|
|
|
|
|
version)[0]
|
|
|
|
|
|
|
|
|
|
class Distributive(object):
|
|
|
|
|
"""Distributive object. Parent object for all distributive."""
|
|
|
|
|
mountError = "Cann't mount %s:\n%s"
|
|
|
|
@ -185,8 +235,8 @@ class Distributive(object):
|
|
|
|
|
return newDirectoryName
|
|
|
|
|
|
|
|
|
|
class DirectoryDistributive(Distributive):
|
|
|
|
|
def __init__(self,directory=None,parent=None):
|
|
|
|
|
DirectoryDistributive.__init__(self,parent=parent)
|
|
|
|
|
def __init__(self,directory,parent=None):
|
|
|
|
|
Distributive.__init__(self,parent=parent)
|
|
|
|
|
self.directory = directory
|
|
|
|
|
if not parent:
|
|
|
|
|
self._makeDirectory(self.directory)
|
|
|
|
@ -206,10 +256,15 @@ class DirectoryDistributive(Distributive):
|
|
|
|
|
self.copy(dFrom.directory,self.directory)
|
|
|
|
|
|
|
|
|
|
class PartitionDistributive(Distributive):
|
|
|
|
|
def __init__(self,partition=None,parent=None,mdirectory="/mnt/calculate"):
|
|
|
|
|
DirectoryDistributive.__init__(self,parent=parent)
|
|
|
|
|
reRightPartition = re.compile(r"^/dev/(sd[a-z]\d+|cciss/c\d+d\d+)$")
|
|
|
|
|
|
|
|
|
|
def __init__(self,partition,parent=None,mdirectory="/mnt/calculate"):
|
|
|
|
|
"""Raise DistributiveError if partition has bad name"""
|
|
|
|
|
Distributive.__init__(self,parent=parent)
|
|
|
|
|
self.partition = partition
|
|
|
|
|
self.mdirectory = mdirectory
|
|
|
|
|
if not self.reRightPartition.match(partition):
|
|
|
|
|
raise DistributiveError("Wrong partition name '%s'"%partition)
|
|
|
|
|
|
|
|
|
|
def _mountPartition(self,partition,directory):
|
|
|
|
|
"""Mount partition to directory"""
|
|
|
|
@ -235,7 +290,7 @@ class PartitionDistributive(Distributive):
|
|
|
|
|
return child
|
|
|
|
|
mdirectory = self._getMntDirectory(mdirectory)
|
|
|
|
|
self._mountPartition(self.partition,mdirectory)
|
|
|
|
|
return DirectoryDistributive(directory=mdirectory,parent=self)
|
|
|
|
|
return DirectoryDistributive(mdirectory,parent=self)
|
|
|
|
|
|
|
|
|
|
def _convertTo(self,typeDistributive):
|
|
|
|
|
if typeDistributive == DirectoryDistributive:
|
|
|
|
@ -251,8 +306,8 @@ class PartitionDistributive(Distributive):
|
|
|
|
|
distrTo.installFrom(source)
|
|
|
|
|
|
|
|
|
|
class ArchiveDistributive(Distributive):
|
|
|
|
|
def __init__(self,file=None,parent=None,mdirectory="/var/calculate/tmp/stage"):
|
|
|
|
|
DirectoryDistributive.__init__(self,parent=parent)
|
|
|
|
|
def __init__(self,file,parent=None,mdirectory="/var/calculate/tmp/stage"):
|
|
|
|
|
Distributive.__init__(self,parent=parent)
|
|
|
|
|
self.file = file
|
|
|
|
|
self.mdirectory = mdirectory
|
|
|
|
|
|
|
|
|
@ -306,7 +361,7 @@ class ArchiveDistributive(Distributive):
|
|
|
|
|
return child
|
|
|
|
|
# get temporary directory for unpacking
|
|
|
|
|
mdirectory = self._getMntDirectory(mdirectory)
|
|
|
|
|
dirdist = DirectoryDistributive(directory=mdirectory,parent=self)
|
|
|
|
|
dirdist = DirectoryDistributive(mdirectory,parent=self)
|
|
|
|
|
self._unpackArchive(self.file,mdirectory)
|
|
|
|
|
return dirdist
|
|
|
|
|
|
|
|
|
@ -337,8 +392,8 @@ class ArchiveDistributive(Distributive):
|
|
|
|
|
self.packToArchive(dFrom.directory, self.file)
|
|
|
|
|
|
|
|
|
|
class SquashDistributive(Distributive):
|
|
|
|
|
def __init__(self,file=None,parent=None,mdirectory="/mnt/livecd"):
|
|
|
|
|
DirectoryDistributive.__init__(self,parent=parent)
|
|
|
|
|
def __init__(self,file,parent=None,mdirectory="/mnt/livecd"):
|
|
|
|
|
Distributive.__init__(self,parent=parent)
|
|
|
|
|
self.file = file
|
|
|
|
|
self.mdirectory = mdirectory
|
|
|
|
|
|
|
|
|
@ -359,7 +414,7 @@ class SquashDistributive(Distributive):
|
|
|
|
|
return child
|
|
|
|
|
mdirectory = self._getMntDirectory(mdirectory)
|
|
|
|
|
self._mountSquash(self.file,mdirectory)
|
|
|
|
|
return DirectoryDistributive(directory=mdirectory,parent=self)
|
|
|
|
|
return DirectoryDistributive(mdirectory,parent=self)
|
|
|
|
|
|
|
|
|
|
def releaseChild(self,child):
|
|
|
|
|
"""Umount child Directory distributive"""
|
|
|
|
@ -390,9 +445,9 @@ class SquashDistributive(Distributive):
|
|
|
|
|
class IsoDistributive(Distributive):
|
|
|
|
|
reLive = re.compile(r"^live[^.]*(\.(\d+))?\.squashfs$",re.S)
|
|
|
|
|
|
|
|
|
|
def __init__(self,file=None,parent=None,mdirectory="/mnt/cdrom",
|
|
|
|
|
def __init__(self,file,parent=None,mdirectory="/mnt/cdrom",
|
|
|
|
|
bdirectory="/var/calculate/tmp/iso"):
|
|
|
|
|
DirectoryDistributive.__init__(self,parent=parent)
|
|
|
|
|
Distributive.__init__(self,parent=parent)
|
|
|
|
|
self.file = file
|
|
|
|
|
self.mdirectory = mdirectory
|
|
|
|
|
self.bdirectory = bdirectory
|
|
|
|
@ -432,7 +487,7 @@ class IsoDistributive(Distributive):
|
|
|
|
|
if not fileLive:
|
|
|
|
|
raise DistributiveError("Iso %s doesn't contain live image" %
|
|
|
|
|
self.file)
|
|
|
|
|
return SquashDistributive(file=pathjoin(mdirectory,fileLive),
|
|
|
|
|
return SquashDistributive(pathjoin(mdirectory,fileLive),
|
|
|
|
|
parent=self)
|
|
|
|
|
|
|
|
|
|
def releaseChild(self,child):
|
|
|
|
@ -446,7 +501,7 @@ class IsoDistributive(Distributive):
|
|
|
|
|
return self.convertTo(SquashDistributive).\
|
|
|
|
|
convertTo(DirectoryDistributive)
|
|
|
|
|
if typeDistributive == SquashDistributive:
|
|
|
|
|
return self._Squash()
|
|
|
|
|
return self._convertToSquash()
|
|
|
|
|
if typeDistributive == IsoDistributive:
|
|
|
|
|
return self
|
|
|
|
|
|
|
|
|
@ -487,7 +542,7 @@ class IsoDistributive(Distributive):
|
|
|
|
|
else:
|
|
|
|
|
distDirectory = source.convertTo(DirectoryDistributive)
|
|
|
|
|
squashDistr = SquashDistributive(
|
|
|
|
|
file=pathjoin(isoDirectory,"livecd.squashfs"))
|
|
|
|
|
pathjoin(isoDirectory,"livecd.squashfs"))
|
|
|
|
|
squashDistr.installFrom(distDirectory)
|
|
|
|
|
|
|
|
|
|
# prepare iso
|
|
|
|
|