thin-wrappers #8
10
CHANGELOG.md
10
CHANGELOG.md
|
@ -1,12 +1,14 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## [0.1.1] - 2025-02-28
|
## [0.1.1] - 2025-03-19
|
||||||
|
|
||||||
### Changed - 2025-03-19
|
### Added
|
||||||
|
|
||||||
|
- Missing functions in BootLib
|
||||||
|
- Some interfaceAdm python scripts
|
||||||
|
|
||||||
## [0.1.0] - 2025-02-28
|
## [0.1.0] - 2025-02-28
|
||||||
|
|
||||||
### Addded
|
### Added
|
||||||
|
|
||||||
- Merge pull request 'Include all client files, build debian package' (#2) from deb-package into main
|
- Merge pull request 'Include all client files, build debian package' (#2) from deb-package into main
|
||||||
|
|
||||||
|
|
|
@ -1,80 +1,105 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
#_______________________________________________________________________________________________________________________________
|
||||||
|
#
|
||||||
|
# Formato de salida:
|
||||||
|
# disk=Número de disco\tpar=Número de particion\tcod=Código de partición\tsfi=Sistema de ficheros\tsoi=Sistema instalado\ttam=Tamaño de la partición\n
|
||||||
|
#_______________________________________________________________________________________________________________________________
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import glob
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
def run_command(command):
|
from InventoryLib import ogGetSerialNumber, ogGetOsVersion
|
||||||
result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
from DiskLib import ogDiskToDev, ogGetPartitionsNumber, ogGetPartitionTableType, ogGetDiskSize, ogGetPartitionId, ogGetPartitionSize
|
||||||
return result.stdout.decode().strip()
|
from FileSystemLib import ogMount, ogGetMountPoint, ogGetFsType
|
||||||
|
|
||||||
def main():
|
# No registrar los errores.
|
||||||
# No registrar los errores.
|
#os.environ['DEBUG'] = 'no'
|
||||||
os.environ["DEBUG"] = "no"
|
|
||||||
|
|
||||||
ser = run_command("ogGetSerialNumber")
|
ser = ogGetSerialNumber()
|
||||||
cfg = ""
|
cfg = ''
|
||||||
disks = int(run_command("ogDiskToDev | wc -w"))
|
disks = len (ogDiskToDev())
|
||||||
|
|
||||||
for dsk in range(1, disks + 1):
|
for dsk in range (1, disks+1):
|
||||||
particiones = run_command(f"ogGetPartitionsNumber {dsk}")
|
particiones = ogGetPartitionsNumber (dsk)
|
||||||
particiones = int(particiones) if particiones else 0
|
particiones = int (particiones) if particiones else 0
|
||||||
ptt = run_command(f"ogGetPartitionTableType {dsk}")
|
# Tipo de tabla de particiones: 1=MSDOS, 2=GPT
|
||||||
|
ptt = ogGetPartitionTableType (dsk)
|
||||||
ptt_map = {
|
ptt_map = {
|
||||||
"MSDOS": 1,
|
'MSDOS': 1,
|
||||||
"GPT": 2,
|
'GPT': 2,
|
||||||
"LVM": 3,
|
'LVM': 3,
|
||||||
"ZPOOL": 4
|
'ZPOOL': 4,
|
||||||
}
|
}
|
||||||
ptt = ptt_map.get(ptt, 0)
|
ptt = ptt_map.get (ptt, 0)
|
||||||
|
# Información de disco (partición 0)
|
||||||
cfg += f"{dsk}:0:{ptt}:::{run_command(f'ogGetDiskSize {dsk}')}:0;"
|
s = ogGetDiskSize (dsk)
|
||||||
|
cfg += f'{dsk}:0:{ptt}:::{s}:0;'
|
||||||
for par in range(1, particiones + 1):
|
for par in range (1, particiones+1):
|
||||||
cod = run_command(f"ogGetPartitionId {dsk} {par} 2>/dev/null")
|
# Código del identificador de tipo de partición
|
||||||
fsi = run_command(f"getFsType {dsk} {par} 2>/dev/null") or "EMPTY"
|
cod = ogGetPartitionId (dsk, par)
|
||||||
tam = run_command(f"ogGetPartitionSize {dsk} {par} 2>/dev/null") or "0"
|
# Tipo del sistema de ficheros
|
||||||
soi = ""
|
fsi = ogGetFsType (dsk, par)
|
||||||
uso = 0
|
if not fsi: fsi = 'EMPTY'
|
||||||
|
# Tamaño de la particón
|
||||||
if fsi not in ["", "EMPTY", "LINUX-SWAP", "LINUX-LVM", "ZVOL"]:
|
tam = ogGetPartitionSize (dsk, par)
|
||||||
if run_command(f"ogMount {dsk} {par} 2>/dev/null"):
|
if not tam: tam = '0'
|
||||||
soi = run_command(f"getOsVersion {dsk} {par} 2>/dev/null").split(":")[1]
|
# Sistema operativo instalado
|
||||||
if not soi:
|
soi = ''
|
||||||
soi = run_command(f"getOsVersion {dsk} {par} 2>/dev/null").split(":")[1]
|
uso = '0'
|
||||||
if not soi and fsi not in ["EMPTY", "CACHE"]:
|
if fsi not in ['', 'EMPTY', 'LINUX-SWAP', 'LINUX-LVM', 'ZVOL']:
|
||||||
soi = "DATA"
|
if ogMount (dsk, par):
|
||||||
uso = int(run_command(f"df $(ogGetMountPoint {dsk} {par}) | awk '{{getline; printf \"%d\",$5}}'") or 0)
|
soi = ogGetOsVersion (dsk, par)
|
||||||
else:
|
# Hacer un 2º intento para algunos casos especiales.
|
||||||
soi = ""
|
if not soi:
|
||||||
uso = 0
|
soi = ogGetOsVersion (dsk, par)
|
||||||
|
if not soi: soi = ''
|
||||||
cfg += f"{dsk}:{par}:{cod}:{fsi}:{soi}:{tam}:{uso};"
|
if soi: soi = soi.split (':')[1]
|
||||||
|
# Sistema de archivos para datos (sistema operativo "DATA")
|
||||||
if not cfg:
|
if not soi and fsi not in ['EMPTY', 'CACHE']:
|
||||||
cfg = "1:0:0:::0;"
|
soi = 'DATA'
|
||||||
|
# Obtener porcentaje de uso.
|
||||||
cfgfile = "/tmp/getconfig"
|
mntpt = ogGetMountPoint (dsk, par)
|
||||||
with open(cfgfile, "w") as f:
|
uso = subprocess.run (['df', mntpt], capture_output=True, text=True).stdout.splitlines()[-1].split()[4].replace ('%', '')
|
||||||
f.write(f"{ser + ';' if ser else ''}{cfg}")
|
if not uso: uso = '0'
|
||||||
|
|
||||||
run_command("generateMenuDefault &>/dev/null")
|
|
||||||
|
|
||||||
with open(cfgfile, "r") as f:
|
|
||||||
data = f.read()
|
|
||||||
|
|
||||||
lines = data.split(";")
|
|
||||||
for line in lines:
|
|
||||||
if line:
|
|
||||||
parts = line.split(":")
|
|
||||||
if len(parts) == 1:
|
|
||||||
print(f"ser={parts[0]}")
|
|
||||||
else:
|
else:
|
||||||
print(f"disk={parts[0]}\tpar={parts[1]}\tcpt={parts[2]}\tfsi={parts[3]}\tsoi={parts[4]}\ttam={parts[5]}\tuso={parts[6]}")
|
soi = ''
|
||||||
|
uso = '0'
|
||||||
|
|
||||||
run_command("rm -f /mnt/*/ogboot.* /mnt/*/*/ogboot.*")
|
cfg += f'{dsk}:{par}:{cod}:{fsi}:{soi}:{tam}:{uso};'
|
||||||
|
|
||||||
# Volver a registrar los errores.
|
# Crear configuración por defecto para cliente sin disco.
|
||||||
os.environ.pop("DEBUG", None)
|
if not cfg:
|
||||||
|
cfg = '1:0:0:::0;'
|
||||||
|
|
||||||
|
# Guardar salida en fichero temporal.
|
||||||
|
cfgfile = '/tmp/getconfig'
|
||||||
|
with open (cfgfile, 'w') as f:
|
||||||
|
if ser: f.write (f'{ser};\n')
|
||||||
|
f.write (cfg + '\n')
|
||||||
|
|
||||||
|
# Crear el menú por defecto a partir del fichero generado (no dar ninguna salida).
|
||||||
|
#subprocess.run ([f'{ogGlobals.OGSCRIPTS}/generateMenuDefault'])
|
||||||
|
|
||||||
|
# Componer salida formateada.
|
||||||
|
awk_script = r'''{ n=split($0,sep,";");
|
||||||
|
for (i=1; i<n; i++){
|
||||||
|
c=split (sep[i],dua,":");
|
||||||
|
if (i==1 && c==1)
|
||||||
|
printf ("ser=%s\n", dua[1]);
|
||||||
|
else
|
||||||
|
printf ("disk=%s\tpar=%s\tcpt=%s\tfsi=%s\tsoi=%s\ttam=%s\tuso=%s\n",
|
||||||
|
dua[1],dua[2],dua[3],dua[4],dua[5],dua[6],dua[7]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'''
|
||||||
|
subprocess.run (['awk', awk_script, cfgfile])
|
||||||
|
|
||||||
|
# Borramos marcas de arranque de Windows
|
||||||
|
for f in glob.glob ('/mnt/*/ogboot.*') + glob.glob ('/mnt/*/*/ogboot.*'):
|
||||||
|
os.unlink (f)
|
||||||
|
|
||||||
|
# Volver a registrar los errores.
|
||||||
|
#os.environ.pop('DEBUG', None)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
|
|
|
@ -1,10 +1,5 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/python3
|
||||||
import socket
|
|
||||||
|
|
||||||
def get_ip_address():
|
from NetLib import ogGetIpAddress
|
||||||
hostname = socket.gethostname()
|
|
||||||
ip_address = socket.gethostbyname(hostname)
|
|
||||||
return ip_address
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
print (ogGetIpAddress())
|
||||||
print(get_ip_address())
|
|
||||||
|
|
|
@ -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]
|
|
||||||
|
|
||||||
|
|
||||||
#/**
|
#/**
|
||||||
|
|
|
@ -7,8 +7,31 @@ import locale
|
||||||
import importlib.util
|
import importlib.util
|
||||||
|
|
||||||
## required for defining OGLOGFILE
|
## required for defining OGLOGFILE
|
||||||
import NetLib
|
def ogGetIpAddress():
|
||||||
ip = NetLib.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
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
# Script de ejemplo para arancar un sistema operativo instalado.
|
||||||
|
# Nota: se usa como base para el programa de arranque de OpenGnsys Admin.
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
import ogGlobals
|
||||||
|
from SystemLib import ogRaiseError, ogEcho
|
||||||
|
from DiskLib import ogDiskToDev
|
||||||
|
from FileSystemLib import ogMount, ogUnmount, ogCheckFs, ogUnmountAll
|
||||||
|
from CacheLib import ogUnmountCache
|
||||||
|
from BootLib import ogBoot
|
||||||
|
|
||||||
|
prog = sys.argv[0]
|
||||||
|
if len (sys.argv) < 3 or len (sys.argv) > 4:
|
||||||
|
ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, f'Formato: {prog} ndisco nfilesys [str_kernel str_initrd str_kernelparams]')
|
||||||
|
sys.exit (1)
|
||||||
|
disk, par, *other = sys.argv[1:]
|
||||||
|
params = other[0] if len (other) > 0 else ''
|
||||||
|
|
||||||
|
# Comprobar errores.
|
||||||
|
part = ogDiskToDev (disk, par)
|
||||||
|
if not part: sys.exit (1)
|
||||||
|
mntdir = ogMount (disk, par)
|
||||||
|
if not mntdir: sys.exit (1)
|
||||||
|
|
||||||
|
print ('[0] Inicio del proceso de arranque.')
|
||||||
|
|
||||||
|
# Si el equipo está hibernado chequeamos el f.s. y borramos el hiberfile (error cod.6)
|
||||||
|
mount_out = subprocess.run (['mount'], capture_output=True, text=True).stdout
|
||||||
|
if not mount_out or not re.search (rf'{mntdir}.*\(rw', mount_out):
|
||||||
|
ogEcho (['log', 'session'], None, f'{ogGlobals.lang.MSG_WARNING}: {ogGlobals.lang.MSG_MOUNTREADONLY}')
|
||||||
|
ogUnmount (disk, par)
|
||||||
|
ogCheckFs (disk, par)
|
||||||
|
|
||||||
|
part = ogDiskToDev (disk, par)
|
||||||
|
os.makedirs (mntdir, exist_ok=True)
|
||||||
|
subprocess.run (['ntfs-3g', '-o', 'remove_hiberfile', part, mntdir])
|
||||||
|
ogEcho (['log', 'session'], None, 'Particion desbloqueada')
|
||||||
|
|
||||||
|
ogUnmount (disk, par)
|
||||||
|
ogMount (disk, par)
|
||||||
|
|
||||||
|
if shutil.which ('bootOsCustom.py'):
|
||||||
|
print ('[10] Configuración personalizada del inicio.')
|
||||||
|
subprocess.run ([f'{ogGlobals.OGSCRIPTS}/bootOsCustom.py'])
|
||||||
|
|
||||||
|
print ('[70] Desmontar todos los sistemas de archivos.')
|
||||||
|
subprocess.run (['sync'])
|
||||||
|
for i in range (1, 1+len(ogDiskToDev())):
|
||||||
|
ogUnmountAll (i)
|
||||||
|
print ('[80] Desmontar cache local.')
|
||||||
|
ogUnmountCache()
|
||||||
|
print (f'[90] Arrancar sistema operativo.')
|
||||||
|
ogBoot (disk, par, params=params)
|
|
@ -1,16 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
import sys
|
|
||||||
import NetLib
|
|
||||||
|
|
||||||
def get_ip_address(*args):
|
|
||||||
try:
|
|
||||||
# Llama a ogGetIpAddress desde NetLib y captura el resultado
|
|
||||||
result = NetLib.ogGetIpAddress(*args)
|
|
||||||
print(result.strip())
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error ejecutando ogGetIpAddress: {e}", file=sys.stderr)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
get_ip_address(*sys.argv[1:])
|
|
||||||
|
|
Loading…
Reference in New Issue