refs #1333 add ogCreateImage
parent
4cc8b1be1d
commit
424248b353
|
@ -516,7 +516,10 @@ def ogLockPartition (disk, par):
|
||||||
if not PART: return
|
if not PART: return
|
||||||
|
|
||||||
LOCKFILE = f"/var/lock/lock{PART.replace('/', '-')}"
|
LOCKFILE = f"/var/lock/lock{PART.replace('/', '-')}"
|
||||||
open(LOCKFILE, 'w').close()
|
try:
|
||||||
|
open (LOCKFILE, 'w').close()
|
||||||
|
except:
|
||||||
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
@ -781,7 +784,8 @@ def ogUnlockPartition (disk, par):
|
||||||
if not PART: return
|
if not PART: return
|
||||||
|
|
||||||
LOCKFILE = f"/var/lock/lock{PART.replace('/', '-')}"
|
LOCKFILE = f"/var/lock/lock{PART.replace('/', '-')}"
|
||||||
os.remove(LOCKFILE)
|
if os.path.exists (LOCKFILE):
|
||||||
|
os.remove (LOCKFILE)
|
||||||
|
|
||||||
|
|
||||||
#/**
|
#/**
|
||||||
|
|
|
@ -13,6 +13,7 @@ import SystemLib
|
||||||
import ogGlobals
|
import ogGlobals
|
||||||
import FileLib
|
import FileLib
|
||||||
import CacheLib
|
import CacheLib
|
||||||
|
import NetLib
|
||||||
|
|
||||||
## ProtocolLib.ogUcastSyntax() calls ogCreateImageSyntax()
|
## ProtocolLib.ogUcastSyntax() calls ogCreateImageSyntax()
|
||||||
## in ogCreateImageSyntax(), param2 may contain a pipe or may be empty
|
## in ogCreateImageSyntax(), param2 may contain a pipe or may be empty
|
||||||
|
@ -216,6 +217,52 @@ def ogRestoreImageSyntax (imgfile, part, tool=None, level=None):
|
||||||
#@exception OG_ERR_IMAGE error al crear la imagen del sistema.
|
#@exception OG_ERR_IMAGE error al crear la imagen del sistema.
|
||||||
#@todo Comprobaciones, control de errores, definir parámetros, etc.
|
#@todo Comprobaciones, control de errores, definir parámetros, etc.
|
||||||
#*/ ##
|
#*/ ##
|
||||||
|
def ogCreateImage (disk, par, container, imgfile, tool='partclone', level='gzip'):
|
||||||
|
PART = DiskLib.ogDiskToDev (disk, par)
|
||||||
|
if not PART: return None
|
||||||
|
|
||||||
|
if FileSystemLib.ogIsLocked (disk, par):
|
||||||
|
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_LOCKED, f'{ogGlobals.lang.MSG_ERR_LOCKED} {disk}, {par}')
|
||||||
|
return None
|
||||||
|
|
||||||
|
imgtype = 'img' # Extensión genérica de imágenes.
|
||||||
|
imgdir = FileLib.ogGetParentPath (src=container, file=imgfile)
|
||||||
|
if not imgdir:
|
||||||
|
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, f'{container} {imgfile}')
|
||||||
|
return None
|
||||||
|
|
||||||
|
bn = os.path.basename (imgfile)
|
||||||
|
IMGFILE = f'{imgdir}/{bn}.{imgtype}'
|
||||||
|
if ogIsImageLocked (IMGFILE):
|
||||||
|
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_LOCKED, f'{ogGlobals.lang.MSG_IMAGE} {container}, {imgfile}')
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Generar la instruccion a ejecutar antes de aplicar los bloqueos.
|
||||||
|
program = ogCreateImageSyntax (PART, IMGFILE, tool=tool, level=level)
|
||||||
|
# Desmontar partición, bloquear partición e imagen.
|
||||||
|
FileSystemLib.ogUnmount (disk, par)
|
||||||
|
if not FileSystemLib.ogLock (disk, par):
|
||||||
|
return None
|
||||||
|
if not ogLockImage (container, f'{imgfile}.{imgtype}'):
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Crear Imagen.
|
||||||
|
#trap
|
||||||
|
p = subprocess.run (program, shell=True, check=True)
|
||||||
|
errcode = p.returncode
|
||||||
|
if 0 == errcode:
|
||||||
|
i = ogGetImageInfo (IMGFILE)
|
||||||
|
h = NetLib.ogGetHostname()
|
||||||
|
with open (f'{IMGFILE}.info', 'w') as fd:
|
||||||
|
fd.write (f'{i}:{h}\n')
|
||||||
|
else:
|
||||||
|
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_IMAGE, f'{disk} {par} {IMGFILE}')
|
||||||
|
if os.path.exists (IMGFILE):
|
||||||
|
os.unlink (IMGFILE)
|
||||||
|
|
||||||
|
FileSystemLib.ogUnlock (disk, par)
|
||||||
|
ogUnlockImage (container, f'{imgfile}.{imgtype}')
|
||||||
|
return errcode
|
||||||
|
|
||||||
|
|
||||||
#/**
|
#/**
|
||||||
|
@ -371,6 +418,7 @@ def ogLockImage (container=None, imgfile=None):
|
||||||
try:
|
try:
|
||||||
bn = os.path.basename (imgfile)
|
bn = os.path.basename (imgfile)
|
||||||
open (f'{imgdir}/{bn}.lock', 'w').close()
|
open (f'{imgdir}/{bn}.lock', 'w').close()
|
||||||
|
return True
|
||||||
except:
|
except:
|
||||||
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTWRITE, f'{container} {imgfile}')
|
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTWRITE, f'{container} {imgfile}')
|
||||||
return None
|
return None
|
||||||
|
@ -507,6 +555,16 @@ def ogRestoreImage (repo, imgpath, disk, par):
|
||||||
#@note Se elimina el fichero de bloqueo con extensión .lock
|
#@note Se elimina el fichero de bloqueo con extensión .lock
|
||||||
#@exception OG_ERR_FORMAT formato incorrecto.
|
#@exception OG_ERR_FORMAT formato incorrecto.
|
||||||
#*/ ##
|
#*/ ##
|
||||||
|
#ogUnlockImage REPO /cucu.img
|
||||||
|
def ogUnlockImage (container=None, imgfile=None):
|
||||||
|
f = f'{imgfile}.lock'
|
||||||
|
if container:
|
||||||
|
p = FileLib.ogGetPath (src=container, file=f)
|
||||||
|
else:
|
||||||
|
p = FileLib.ogGetPath (file=f)
|
||||||
|
|
||||||
|
if os.path.exists (p):
|
||||||
|
os.unlink (p)
|
||||||
|
|
||||||
|
|
||||||
#/**
|
#/**
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
from SystemLib import ogHelp
|
||||||
|
from ImageLib import ogCreateImage
|
||||||
|
|
||||||
|
if 2 == len (sys.argv) and 'help' == sys.argv[1]:
|
||||||
|
#parser.print_help() sale en inglés aunque la locale indique otra cosa
|
||||||
|
ogHelp ('ogCreateImage', 'ogCreateImage int_ndisk int_npart str_repo path_image', ['ogCreateImage 1 1 REPO /aula1/win7'])
|
||||||
|
sys.exit (0)
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser (add_help=False)
|
||||||
|
if 5 == len (sys.argv):
|
||||||
|
parser.add_argument ('disk')
|
||||||
|
parser.add_argument ('par')
|
||||||
|
parser.add_argument ('container')
|
||||||
|
parser.add_argument ('imgfile')
|
||||||
|
elif 7 == len (sys.argv):
|
||||||
|
parser.add_argument ('disk')
|
||||||
|
parser.add_argument ('par')
|
||||||
|
parser.add_argument ('container')
|
||||||
|
parser.add_argument ('imgfile')
|
||||||
|
parser.add_argument ('tool')
|
||||||
|
parser.add_argument ('level')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if 5 == len (sys.argv):
|
||||||
|
ret = ogCreateImage (args.disk, args.par, args.container, args.imgfile)
|
||||||
|
elif 7 == len (sys.argv):
|
||||||
|
ret = ogCreateImage (args.disk, args.par, args.container, args.imgfile, args.tool, args.level)
|
||||||
|
|
||||||
|
if ret is not None:
|
||||||
|
if ret == True: sys.exit (0)
|
||||||
|
elif ret == False: sys.exit (1)
|
||||||
|
else: print (ret)
|
|
@ -0,0 +1,30 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
from SystemLib import ogHelp
|
||||||
|
from ImageLib import ogUnlockImage
|
||||||
|
|
||||||
|
if 2 == len (sys.argv) and 'help' == sys.argv[1]:
|
||||||
|
#parser.print_help() sale en inglés aunque la locale indique otra cosa
|
||||||
|
ogHelp ('ogUnlockImage', 'ogUnlockImage [str_repo] path_image', ['ogUnlockImage /opt/opengnsys/images/aula1/win7.img', 'ogUnlockImage REPO /aula1/win7.img'])
|
||||||
|
sys.exit (0)
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser (add_help=False)
|
||||||
|
if 2 == len (sys.argv):
|
||||||
|
parser.add_argument ('file')
|
||||||
|
elif 3 == len (sys.argv):
|
||||||
|
parser.add_argument ('container')
|
||||||
|
parser.add_argument ('file')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if 2 == len (sys.argv):
|
||||||
|
ret = ogUnlockImage (imgfile=args.file)
|
||||||
|
elif 3 == len (sys.argv):
|
||||||
|
ret = ogUnlockImage (container=args.container, imgfile=args.file)
|
||||||
|
|
||||||
|
if ret is not None:
|
||||||
|
if ret == True: sys.exit (0)
|
||||||
|
elif ret == False: sys.exit (1)
|
||||||
|
else: print (ret)
|
Loading…
Reference in New Issue