Compare commits

..

No commits in common. "main" and "delete-stuff" have entirely different histories.

27 changed files with 103 additions and 252 deletions

View File

@ -5,114 +5,6 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.8.0] - 2025-04-23
### Added
- Have the oglive agent send /stopped on poweroff or restart
## [0.7.2] - 2025-04-21
### Fixed
- Have the partitioning functions return a meaningful rc
## [0.7.1] - 2025-04-15
### Fixed
- getConfiguration.py: don't fail if NTFS filesystems are mounted ro
## [0.7.0] - 2025-04-15
### Removed
- Removed references to ogGlobals.OGLOG in python code
## [0.6.1] - 2025-04-15
### Fixed
- Fixed capturing of partclone output and management of return value
## [0.6.0] - 2025-04-15
### Changed
- ogGetIpAddress() is no longer required in ogGlobals--move it back into NetLib
## [0.5.0] - 2025-04-15
### Changed
- Log to /var/log/clone-engine.log and clone-engine.json.log
## [0.4.1] - 2025-04-10
### Fixed
- restoreImage.py: return negated rc to the shell
## [0.4.0] - 2025-04-10
### Changed
- Make /opt/opengnsys writable in clients, just like it used to be
## [0.3.6] - 2025-04-09
### Fixed
- Fixed ogReduceFs
## [0.3.5] - 2025-04-09
### Fixed
- Fixed syntax
## [0.3.4] - 2025-04-09
### Fixed
- Fixed usage of ogEcho in FileSystemLib
## [0.3.3] - 2025-04-09
### Fixed
- Kill coproc'ed browser in all execution branches in Configurar.py
## [0.3.2] - 2025-04-07
### Fixed
- Handle invalid number of arguments pass to functions/ogCopyFile
## [0.3.1] - 2025-04-03
### Fixed
- Fixed invocation to ogCheckIpAddress in interfaceAdm/CrearImagen.py
## [0.3.0] - 2025-04-03
### Removed
- Removed burg and rsync 3.1
## [0.2.6] - 2025-03-31
### Fixed
- Restore qt4 browser
## [0.2.5] - 2025-03-31
### Fixed
- Don't require protoopts in interfaceAdm/RestaurarImagen.py
## [0.2.4] - 2025-03-28 ## [0.2.4] - 2025-03-28
### Removed ### Removed

View File

@ -48,18 +48,7 @@ pipeline {
} }
} }
} }
stage('Generate Changelog (Nightly)'){
when {
branch 'main'
}
steps {
script {
def devName = params.DEV_NAME ? params.DEV_NAME : env.DEFAULT_DEV_NAME
def devEmail = params.DEV_EMAIL ? params.DEV_EMAIL : env.DEFAULT_DEV_EMAIL
generateDebianChangelog(env.BUILD_DIR, devName, devEmail,"nightly")
}
}
}
stage('Build') { stage('Build') {
steps { steps {
script { script {
@ -82,19 +71,6 @@ pipeline {
} }
} }
} }
stage ('Publish to Debian Repository (Nightly)') {
when {
branch 'main'
}
agent { label 'debian-repo' }
steps {
script {
// Construir el patrón de versión esperado en el nombre del paquete
def versionPattern = "-${env.BUILD_NUMBER}~nightly"
publicarEnAptly('/var/tmp/opengnsys/debian-repo/ogclient', 'nightly', versionPattern)
}
}
}
} }
post { post {
always { always {

View File

@ -1,7 +1,7 @@
[ogclient] [ogclient]
comment = OpenGnsys Client comment = OpenGnsys Client
browseable = no browseable = no
writeable = yes writeable = no
locking = no locking = no
path = /opt/opengnsys/ogclient path = /opt/opengnsys/ogclient
guest ok = no guest ok = no

Binary file not shown.

View File

@ -55,9 +55,6 @@ elif 6 == len (sys.argv):
args = parser.parse_args() args = parser.parse_args()
src = { 'container': args.src_container, 'file': args.src_file } src = { 'container': args.src_container, 'file': args.src_file }
dst = { 'disk': args.dst_disk, 'par': args.dst_par, 'file': args.dst_file } dst = { 'disk': args.dst_disk, 'par': args.dst_par, 'file': args.dst_file }
else:
ogHelp ('ogCopyFile', 'ogCopyFile [ str_repo | int_ndisk int_npartition ] path_source [ str_repo | int_ndisk int_npartition ] path_target', ['ogCopyFile REPO newfile.txt 1 2 /tmp/newfile.txt'])
sys.exit (1)
ret = ogCopyFile (src, dst) ret = ogCopyFile (src, dst)
if ret is not None: if ret is not None:

View File

@ -2,9 +2,6 @@
import os import os
import sys import sys
import time
os.system ('pkill -f OGAgent')
time.sleep (3)
os.system ('poweroff') os.system ('poweroff')
sys.exit (0) sys.exit (0)

View File

@ -75,11 +75,8 @@ for item in tbprm:
elif 'tch' == k: tch = v elif 'tch' == k: tch = v
# Error si no se define el parámetro de disco (dis). # Error si no se define el parámetro de disco (dis).
if dis is None: if dis is None: sys.exit (ogGlobals.OG_ERR_FORMAT)
coproc.kill() if tch is None: tch = '0'
sys.exit (ogGlobals.OG_ERR_FORMAT)
if tch is None:
tch = '0'
# Toma valores de distribución de particiones, separados por "%". # Toma valores de distribución de particiones, separados por "%".
tbp = [] # Valores de configuración (parámetros para ogCreatePartitions) tbp = [] # Valores de configuración (parámetros para ogCreatePartitions)
@ -114,7 +111,6 @@ for item in tbprm:
if tam is None: missing_params.append ('tam') if tam is None: missing_params.append ('tam')
if missing_params: if missing_params:
print (f'partition data ({item}) missing required parameters ({' '.join (missing_params)})') print (f'partition data ({item}) missing required parameters ({' '.join (missing_params)})')
coproc.kill()
sys.exit (1) sys.exit (1)
# Componer datos de particionado. # Componer datos de particionado.
@ -154,7 +150,6 @@ if 'CACHE' in sparam:
rc = SystemLib.ogExecAndLog ('command', CacheLib.initCache, tch) rc = SystemLib.ogExecAndLog ('command', CacheLib.initCache, tch)
if rc: if rc:
SystemLib.ogRaiseError (['log', 'session'], ogGlobals.OG_ERR_CACHE, f'initCache failed') SystemLib.ogRaiseError (['log', 'session'], ogGlobals.OG_ERR_CACHE, f'initCache failed')
coproc.kill()
sys.exit (1) sys.exit (1)
# Definir particionado. # Definir particionado.

View File

@ -66,7 +66,7 @@ repo = arg_repo
if not repo: repo = 'REPO' if not repo: repo = 'REPO'
if repo == ogGetIpAddress(): repo = 'CACHE' if repo == ogGetIpAddress(): repo = 'CACHE'
# Si es una ip y es distinta a la del recurso samba cambiamos de REPO. # Si es una ip y es distinta a la del recurso samba cambiamos de REPO.
if 'REPO' == repo or ogCheckIpAddress (repo): if 'REPO' == repo or StringLib.ogCheckIpAddress (repo):
# Si falla el cambio -> salimos con error repositorio no valido # Si falla el cambio -> salimos con error repositorio no valido
if not ogChangeRepo (repo): if not ogChangeRepo (repo):
ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, repo) ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, repo)

View File

@ -2,9 +2,6 @@
import os import os
import sys import sys
import time
os.system ('pkill -f OGAgent')
time.sleep (3)
os.system ('reboot') os.system ('reboot')
sys.exit (0) sys.exit (0)

View File

@ -19,11 +19,11 @@ import ogGlobals
if __name__ == '__main__': if __name__ == '__main__':
prog = sys.argv[0] prog = sys.argv[0]
if len (sys.argv) < 6: if len (sys.argv) < 7:
print (f'Usage: {prog} <disk> <partition> <image_name> <repo_ip> <protocol> [protocol_options] [additional_args...]') print (f'Usage: {prog} <disk> <partition> <image_name> <repo_ip> <protocol> <protocol_options> [additional_args...]')
sys.exit (1) sys.exit (1)
disk, par, imgname, repo, proto, *extra = sys.argv[1:] disk, par, imgname, repo, proto, protoopt, *extra = sys.argv[1:]
rc = subprocess.run ([f'{ogGlobals.OGSCRIPTS}/deployImage.py', repo, imgname, disk, par, proto] + extra).returncode rc = subprocess.run ([f'{ogGlobals.OGSCRIPTS}/deployImage.py', repo, imgname, disk, par, proto, protoopt] + extra).returncode
sys.exit (rc) sys.exit (rc)

View File

@ -74,5 +74,4 @@ else:
# Borramos marcas de arranque de Windows # Borramos marcas de arranque de Windows
for f in glob.glob ('/mnt/*/ogboot.*') + glob.glob ('/mnt/*/*/ogboot.*'): for f in glob.glob ('/mnt/*/ogboot.*') + glob.glob ('/mnt/*/*/ogboot.*'):
try: os.unlink (f) os.unlink (f)
except: pass

View File

@ -179,7 +179,7 @@ def ogCreatePartitions (disk, parts):
p = subprocess.run (['sfdisk', DISK], input=sfdisk_input, capture_output=True, text=True) p = subprocess.run (['sfdisk', DISK], input=sfdisk_input, capture_output=True, text=True)
subprocess.run (['partprobe', DISK]) subprocess.run (['partprobe', DISK])
if CACHESIZE: CacheLib.ogMountCache() if CACHESIZE: CacheLib.ogMountCache()
return not p.returncode return True
#/** #/**
@ -285,7 +285,7 @@ def ogCreateGptPartitions (disk, parts):
p = subprocess.run (['sgdisk'] + DELOPTIONS + OPTIONS + [DISK], capture_output=True, text=True) p = subprocess.run (['sgdisk'] + DELOPTIONS + OPTIONS + [DISK], capture_output=True, text=True)
subprocess.run (['partprobe', DISK]) subprocess.run (['partprobe', DISK])
if CACHESIZE: CacheLib.ogMountCache() if CACHESIZE: CacheLib.ogMountCache()
return not p.returncode return True
#/** #/**

View File

@ -286,7 +286,11 @@ def ogGetFsSize (disk, par, unit='KB'):
elif unit.upper() == "TB": elif unit.upper() == "TB":
factor = 1024 * 1024 * 1024 factor = 1024 * 1024 * 1024
elif unit.upper() != "KB": elif unit.upper() != "KB":
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, f"{unit} != {{ KB, MB, GB, TB }}") SystemLib.ogRaiseError (
[],
ogGlobals.OG_ERR_FORMAT,
f"{unit} != {{ KB, MB, GB, TB }}"
)
return return
# Obtener el tamaño del sistema de archivo (si no está formateado; tamaño = 0). # Obtener el tamaño del sistema de archivo (si no está formateado; tamaño = 0).
@ -327,7 +331,11 @@ def ogGetFsType(disk, part):
try: try:
subprocess.run(["zfs", "mount", PART]) subprocess.run(["zfs", "mount", PART])
except FileNotFoundError: except FileNotFoundError:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTEXEC, 'zfs') SystemLib.ogRaiseError (
[],
ogGlobals.OG_ERR_NOTEXEC,
'zfs'
)
return return
out = subprocess.run(["mount"], capture_output=True, text=True).stdout.splitlines() out = subprocess.run(["mount"], capture_output=True, text=True).stdout.splitlines()
for line in out: for line in out:
@ -336,7 +344,11 @@ def ogGetFsType(disk, part):
break break
if not TYPE: if not TYPE:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, f'{disk} {part}') SystemLib.ogRaiseError (
[],
ogGlobals.OG_ERR_NOTFOUND,
f'{disk} {part}'
)
return return
# Componer valores correctos. # Componer valores correctos.
@ -580,7 +592,11 @@ def ogMountFs (disk, par):
try: try:
rc = subprocess.run(['mount', dev, mntdir, '-o', 'force,remove_hiberfile'], check=True).returncode rc = subprocess.run(['mount', dev, mntdir, '-o', 'force,remove_hiberfile'], check=True).returncode
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, f"{disk}, {par}") SystemLib.ogRaiseError (
[],
ogGlobals.OG_ERR_PARTITION,
f"{disk}, {par}"
)
return return
if 0 == rc: if 0 == rc:
@ -589,18 +605,26 @@ def ogMountFs (disk, par):
try: try:
subprocess.run (['ntfsfix', '-d', par], check=True) subprocess.run (['ntfsfix', '-d', par], check=True)
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, f"{disk, par}") SystemLib.ogRaiseError (
[],
ogGlobals.OG_ERR_PARTITION,
f"{disk, par}"
)
#return #return
else: else:
try: try:
subprocess.run (['mount', par, mntdir, '-o', 'ro'], check=True) subprocess.run (['mount', par, mntdir, '-o', 'ro'], check=True)
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, f"{disk, par}") SystemLib.ogRaiseError (
[],
ogGlobals.OG_ERR_PARTITION,
f"{disk, par}"
)
#return #return
# Aviso de montaje de solo lectura. # Aviso de montaje de solo lectura.
if ogIsReadonly(disk, par): if ogIsReadonly(disk, par):
SystemLib.ogEcho ([], "warning", f'ogMountFs: {ogGlobals.lang.MSG_MOUNTREADONLY}: "{disk}, {par}"') SystemLib.ogEcho("warning", f'ogMountFs: {ogGlobals.lang.MSG_MOUNTREADONLY}: "{disk}, {par}"')
else: else:
# Montar sistema de archivos ZFS (un ZPOOL no comienza por "/"). # Montar sistema de archivos ZFS (un ZPOOL no comienza por "/").
subprocess.run(['zfs', 'mount', dev]) subprocess.run(['zfs', 'mount', dev])
@ -692,8 +716,7 @@ def ogReduceFs (disk, par):
break break
elif type == 'NTFS': elif type == 'NTFS':
ogUnmount (disk, par) ogUnmount (disk, par)
ntfsresize_out = subprocess.run (['ntfsresize', '-fi', PART], capture_output=True, text=True).stdout nr_lines = subprocess.run (['ntfsresize', '-fi', PART], capture_output=True, text=True).stdout.splitlines()
nr_lines = ntfsresize_out.splitlines()
maxsize = None maxsize = None
size = None size = None
for l in nr_lines: for l in nr_lines:
@ -703,10 +726,12 @@ def ogReduceFs (disk, par):
size = l.split()[4] size = l.split()[4]
size = int ((int (size) * 1.1 / 1024 + 1) * 1024) size = int ((int (size) * 1.1 / 1024 + 1) * 1024)
if not maxsize or not size: if not maxsize and not size:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, f'{disk},{par} ({ntfsresize_out})') SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, f'{disk},{par}')
return None return None
import time
extrasize = 0 extrasize = 0
retval = 1 retval = 1
while retval != 0 and size+extrasize < maxsize: while retval != 0 and size+extrasize < maxsize:
@ -784,14 +809,18 @@ def ogUnmountFs(disk, par):
if MNTDIR: if MNTDIR:
# Error si la particion está bloqueada. # Error si la particion está bloqueada.
if ogIsLocked (disk, par): if ogIsLocked (disk, par):
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_LOCKED, f"{ogGlobals.lang.MSG_PARTITION}, {disk} {par}") SystemLib.ogRaiseError (
[],
ogGlobals.OG_ERR_LOCKED,
f"{ogGlobals.lang.MSG_PARTITION}, {disk} {par}"
)
return return
# Desmontar y borrar punto de montaje. # Desmontar y borrar punto de montaje.
try: try:
subprocess.run(["umount", PART], check=True) subprocess.run(["umount", PART], check=True)
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
SystemLib.ogEcho ([], "warning", f'ogUnmountFs: {ogGlobals.lang.MSG_DONTUNMOUNT}: "{disk}, {par}"') SystemLib.ogEcho("warning", f'ogUnmountFs: {ogGlobals.lang.MSG_DONTUNMOUNT}: "{disk}, {par}"')
try: try:
os.rmdir(MNTDIR) os.rmdir(MNTDIR)
except: except:

View File

@ -512,8 +512,6 @@ def ogRestoreImage (repo, imgpath, disk, par):
rc = None rc = None
try: try:
p = subprocess.run (program, shell=True, capture_output=True, text=True) p = subprocess.run (program, shell=True, capture_output=True, text=True)
print (p.stdout)
print (p.stderr)
rc = p.returncode rc = p.returncode
if not rc: if not rc:
SystemLib.ogRaiseError ([], ogGlobalsOG_ERR_IMAGE, f'{imgfile}, {disk}, {par}') SystemLib.ogRaiseError ([], ogGlobalsOG_ERR_IMAGE, f'{imgfile}, {disk}, {par}')

View File

@ -142,29 +142,7 @@ def ogGetHostname():
#@note Usa las variables utilizadas por el initrd "/etc/net-ethX.conf #@note Usa las variables utilizadas por el initrd "/etc/net-ethX.conf
#*/ ## #*/ ##
def ogGetIpAddress(): def ogGetIpAddress():
if "IPV4ADDR" in os.environ: return ogGlobals.ogGetIpAddress()
ip = os.environ["IPV4ADDR"]
if '/' in ip: ip = ip.split ('/')[0]
return ip
extra_args = []
if "DEVICE" in os.environ:
extra_args = [ "dev", os.environ["DEVICE"] ]
ipas = subprocess.run (['ip', '-json', 'address', 'show', 'up'] + extra_args, capture_output=True, text=True).stdout
ipasj = json.loads (ipas)
addresses = []
for e in ipasj:
if 'lo' == e['ifname']: continue
if 'addr_info' not in e: continue
addrs = e['addr_info']
for a in addrs:
if 'inet' != a['family']: continue
addresses.append ({ 'local': a['local'], 'prefixlen': a['prefixlen'] })
if 1 != len (addresses):
raise Exception ('more than one local IP address found')
return addresses[0]
#/** #/**

View File

@ -3,7 +3,6 @@ import datetime
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
import sys import sys
import os import os
import json
import shutil import shutil
import inspect import inspect
import glob import glob
@ -21,7 +20,6 @@ import StringLib
def _logtype2logfile (t): def _logtype2logfile (t):
if 'log' == t.lower(): return ogGlobals.OGLOGFILE if 'log' == t.lower(): return ogGlobals.OGLOGFILE
if 'jsonlog' == t.lower(): return ogGlobals.OGJSONLOGFILE
elif 'command' == t.lower(): return ogGlobals.OGLOGCOMMAND elif 'command' == t.lower(): return ogGlobals.OGLOGCOMMAND
elif 'session' == t.lower(): return ogGlobals.OGLOGSESSION elif 'session' == t.lower(): return ogGlobals.OGLOGSESSION
else: raise Exception (f'unknown log type ({t})') else: raise Exception (f'unknown log type ({t})')
@ -37,40 +35,24 @@ def ogEcho (logtypes, loglevel, msg):
logfiles = ['/dev/stdout'] logfiles = ['/dev/stdout']
if type (logtypes) is list: if type (logtypes) is list:
for l in logtypes: for l in logtypes:
if 'log' == l: logfiles.append (_logtype2logfile (l))
logfiles.append (_logtype2logfile ('log'))
logfiles.append (_logtype2logfile ('jsonlog'))
else:
logfiles.append (_logtype2logfile (l))
else: ## string else: ## string
if 'log' == logtypes: logfiles.append (_logtype2logfile (logtypes))
logfiles.append (_logtype2logfile ('log'))
logfiles.append (_logtype2logfile ('jsonlog'))
else:
logfiles.append (_logtype2logfile (logtypes))
if loglevel is None or 'help' == loglevel: if loglevel is None or 'help' == loglevel:
if ogGlobals.DEBUG.lower() != "no": if ogGlobals.DEBUG.lower() != "no":
logfiles.append (ogGlobals.OGLOGFILE) logfiles.append (ogGlobals.OGLOGFILE)
logfiles.append (ogGlobals.OGJSONLOGFILE)
for f in logfiles: for f in logfiles:
with open (f, 'a') as fd: with open (f, 'a') as fd:
if ogGlobals.OGJSONLOGFILE == f: fd.write (msg + '\n')
fd.write (json.dumps ({'message':msg}) + '\n')
else:
fd.write (msg + '\n')
return return
if 'info' == loglevel or 'warning' == loglevel or 'error' == loglevel: if 'info' == loglevel or 'warning' == loglevel or 'error' == loglevel:
DATETIME = datetime.datetime.now (ZoneInfo (ogGlobals.TZ)).strftime ('%F %T %Z') DATETIME = datetime.datetime.now(ZoneInfo(ogGlobals.TZ)).strftime("%F %T %Z")
DATETIME_json = datetime.datetime.now (ZoneInfo (ogGlobals.TZ)).strftime ('%Y-%m-%d %H:%M:%S')
for f in logfiles: for f in logfiles:
with open (f, 'a') as fd: with open (f, 'a') as fd:
if ogGlobals.OGJSONLOGFILE == f: fd.write (f"OpenGnsys {loglevel} {DATETIME} {msg}\n")
fd.write (json.dumps ({'timestamp':DATETIME_json, 'severity':loglevel, 'message':msg}) + '\n')
else:
fd.write (f"OpenGnsys {loglevel} {DATETIME} {msg}\n")
else: else:
raise Exception (f'unknown loglevel ({loglevel})') raise Exception (f'unknown loglevel ({loglevel})')
@ -93,18 +75,10 @@ def ogExecAndLog (logtypes, fun, *args, **kwargs):
if type (logtypes) is list: if type (logtypes) is list:
for l in logtypes: for l in logtypes:
logtypes = list (map (lambda x: x.lower(), logtypes)) logtypes = list (map (lambda x: x.lower(), logtypes))
if 'log' == l: logfiles.append (_logtype2logfile (l))
logfiles.append (_logtype2logfile ('log'))
logfiles.append (_logtype2logfile ('jsonlog'))
else:
logfiles.append (_logtype2logfile (l))
else: ## string else: ## string
logtypes = logtypes.lower() logtypes = logtypes.lower()
if 'log' == logtypes: logfiles.append (_logtype2logfile (logtypes))
logfiles.append (_logtype2logfile ('log'))
logfiles.append (_logtype2logfile ('jsonlog'))
else:
logfiles.append (_logtype2logfile (logtypes))
if not fun: if not fun:
ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, 'no function provided') ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, 'no function provided')
@ -129,6 +103,7 @@ def ogExecAndLog (logtypes, fun, *args, **kwargs):
# ## redirect stdout only # ## redirect stdout only
# eval $COMMAND | tee -a $FILES # eval $COMMAND | tee -a $FILES
import time
sout = serr = '' sout = serr = ''
if 'command' in logtypes: if 'command' in logtypes:
os.unlink (ogGlobals.OGLOGCOMMAND) os.unlink (ogGlobals.OGLOGCOMMAND)
@ -146,19 +121,14 @@ def ogExecAndLog (logtypes, fun, *args, **kwargs):
if sout or serr or ('True' != rc_str and 'False' != rc_str and 'None' != rc_str): if sout or serr or ('True' != rc_str and 'False' != rc_str and 'None' != rc_str):
for f in logfiles: for f in logfiles:
with open (f, 'a') as fd: with open (f, 'a') as fd:
if ogGlobals.OGJSONLOGFILE == f: if sout: fd.write (f'{sout}\n')
if sout: fd.write (json.dumps ({'message':sout}) + '\n') if serr: fd.write (f'{serr}\n')
if serr: fd.write (json.dumps ({'message':serr}) + '\n') if rc_str: fd.write (f'{rc_str}\n')
if rc_str: fd.write (json.dumps ({'message':rc_str}) + '\n') #fd.write (f"ogExecAndLog: {fun.__name__} rc:\n{rc_str}\n")
else: #if sout: fd.write (f"ogExecAndLog: {fun.__name__} stdout:\n{sout}\n")
if sout: fd.write (f'{sout}\n') #else: fd.write (f"ogExecAndLog: {fun.__name__} stdout: (none)\n")
if serr: fd.write (f'{serr}\n') #if serr: fd.write (f"ogExecAndLog: {fun.__name__} stderr:\n{serr}\n")
if rc_str: fd.write (f'{rc_str}\n') #else: fd.write (f"ogExecAndLog: {fun.__name__} stderr: (none)\n")
#fd.write (f"ogExecAndLog: {fun.__name__} rc:\n{rc_str}\n")
#if sout: fd.write (f"ogExecAndLog: {fun.__name__} stdout:\n{sout}\n")
#else: fd.write (f"ogExecAndLog: {fun.__name__} stdout: (none)\n")
#if serr: fd.write (f"ogExecAndLog: {fun.__name__} stderr:\n{serr}\n")
#else: fd.write (f"ogExecAndLog: {fun.__name__} stderr: (none)\n")
return rc return rc

View File

@ -6,6 +6,33 @@ import os.path
import locale import locale
import importlib.util import importlib.util
## required for defining OGLOGFILE
def ogGetIpAddress():
if "IPV4ADDR" in os.environ:
ip = os.environ["IPV4ADDR"]
if '/' in ip: ip = ip.split ('/')[0]
return ip
extra_args = []
if "DEVICE" in os.environ:
extra_args = [ "dev", os.environ["DEVICE"] ]
ipas = subprocess.run (['ip', '-json', 'address', 'show', 'up'] + extra_args, capture_output=True, text=True).stdout
ipasj = json.loads (ipas)
addresses = []
for e in ipasj:
if 'lo' == e['ifname']: continue
if 'addr_info' not in e: continue
addrs = e['addr_info']
for a in addrs:
if 'inet' != a['family']: continue
addresses.append ({ 'local': a['local'], 'prefixlen': a['prefixlen'] })
if 1 != len (addresses):
raise Exception ('more than one local IP address found')
return addresses[0]
ip = ogGetIpAddress()
def load_lang (name): def load_lang (name):
global lang global lang
if name in sys.modules: if name in sys.modules:
@ -61,8 +88,8 @@ OGPYFUNCS = os.path.join (OPENGNSYS, 'functions')
OGSCRIPTS = os.path.join (OPENGNSYS, 'scripts') OGSCRIPTS = os.path.join (OPENGNSYS, 'scripts')
OGIMG = os.path.join (OPENGNSYS, 'images') OGIMG = os.path.join (OPENGNSYS, 'images')
OGCAC = os.path.join (OPENGNSYS, 'cache') OGCAC = os.path.join (OPENGNSYS, 'cache')
OGLOGFILE = '/var/log/clone-engine.log' OGLOG = os.path.join (OPENGNSYS, 'log')
OGJSONLOGFILE = '/var/log/clone-engine.json.log' OGLOGFILE = f'{OGLOG}/{ip}.log'
DEBUG = 'yes' DEBUG = 'yes'
_path = os.environ['PATH'] + ':/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin:/opt/oglive/rootfs/opt/drbl/sbin' _path = os.environ['PATH'] + ':/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin:/opt/oglive/rootfs/opt/drbl/sbin'
os.environ['PATH'] = ':'.join ([OGSCRIPTS, _path, OGAPI, OGBIN]) os.environ['PATH'] = ':'.join ([OGSCRIPTS, _path, OGAPI, OGBIN])

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -145,10 +145,6 @@ def main (repo, imgname, disk, par, proto='UNICAST', protoopt=''):
SystemLib.ogEcho (['log', 'session'], None, f'[55] {ogGlobals.lang.MSG_HELP_ogRestoreImage}: restoreImage {params}') SystemLib.ogEcho (['log', 'session'], None, f'[55] {ogGlobals.lang.MSG_HELP_ogRestoreImage}: restoreImage {params}')
retval = subprocess.run (['restoreImage.py'] + params).returncode retval = subprocess.run (['restoreImage.py'] + params).returncode
## turn shell's success into python success (without ending up with True or False)
if retval: retval = 0
else: retval = 1
# Mostrar resultados. # Mostrar resultados.
resumerestoreimage = subprocess.run (['grep', '--max-count', '1', 'Total Time:', ogGlobals.OGLOGCOMMAND], capture_output=True, text=True).stdout resumerestoreimage = subprocess.run (['grep', '--max-count', '1', 'Total Time:', ogGlobals.OGLOGCOMMAND], capture_output=True, text=True).stdout
SystemLib.ogEcho (['log', 'session'], None, f' [ ] {resumerestoreimage} ') SystemLib.ogEcho (['log', 'session'], None, f' [ ] {resumerestoreimage} ')

View File

@ -21,7 +21,7 @@ if len (sys.argv) > 1:
#SERVERLOGDIR = unused #SERVERLOGDIR = unused
# Fichero de listado: hard-IP # Fichero de listado: hard-IP
HARDFILE = f'/tmp/hard-{ogGetIpAddress()}' HARDFILE = f'{ogGlobals.OGLOG}/hard-{ogGetIpAddress()}'
out = ogListHardwareInfo() out = ogListHardwareInfo()
with open (HARDFILE, 'w') as fd: with open (HARDFILE, 'w') as fd:
fd.write (out) fd.write (out)

View File

@ -18,7 +18,7 @@ prog = os.path.basename (sys.argv[0])
def main (disk, par, reduced): def main (disk, par, reduced):
ip = NetLib.ogGetIpAddress() ip = NetLib.ogGetIpAddress()
softfile = f'/tmp/soft-{ip}-{disk}-{par}' softfile = f'{ogGlobals.OGLOG}/soft-{ip}-{disk}-{par}'
software_list = InventoryLib.ogListSoftware (disk, par) software_list = InventoryLib.ogListSoftware (disk, par)
if reduced: if reduced:

View File

@ -114,5 +114,5 @@ t = time.time() - t0
SystemLib.ogEcho (['log', 'session'], None, f'[100] Duracion de la operacion {int (t/60)}m {int (t%60)}s') SystemLib.ogEcho (['log', 'session'], None, f'[100] Duracion de la operacion {int (t/60)}m {int (t%60)}s')
# Código de salida del comando prinicpal de restauración. # Código de salida del comando prinicpal de restauración.
sys.exit (not retval) ## negated for the shell sys.exit (retval)