Merge pull request 'junctions' (#132) from junctions into main
ogclient/pipeline/head This commit looks good Details
ogclient/pipeline/tag This commit looks good Details

Reviewed-on: #132
main 1.7.7
Natalia Serrano 2025-10-22 10:36:31 +02:00
commit d74dd1875d
5 changed files with 55 additions and 2 deletions

View File

@ -5,6 +5,14 @@ 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/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.7.7] - 2025-10-22
### Fixed
- gitlib: save and restore symlink info
- gitlib: support nvme disks
- netlib: fix getting net info
## [1.7.6] - 2025-10-16
### Fixed

View File

@ -664,7 +664,7 @@ def ogReduceFs (disk, par):
extrasize = 0
retval = 1
while retval != 0 and size+extrasize < maxsize:
nr = subprocess.run (['ntfsresize', '-fns', str(size), PART], capture_output=True, text=True)
nr = subprocess.run (['ntfsresize', '--no-progress-bar', '-fns', str(size), PART], capture_output=True, text=True)
for l in nr.stdout.splitlines():
if 'Needed relocations' not in l: continue
extrasize = int ((int (l.split()[3])*1.1/1024+1)*1024)

View File

@ -647,6 +647,15 @@ class OpengnsysGitLibrary:
return results
def _getfattr(self, file_type, path, path_rel, fd):
getfattr_out = subprocess.run (['getfattr', '--no-dereference', '--encoding', 'hex', '--name', 'system.ntfs_reparse_data', path], capture_output=True, text=True).stdout
if getfattr_out:
reparse_data = re.search ('ntfs_reparse_data=(0x[0-9a-fA-F]*)', getfattr_out).groups()[0]
fd.write(json.dumps({"file" : path_rel, "type" : file_type, "reparse_data" : reparse_data}) + "\n")
else:
self.logger.warning (f'{path}: symlink with no reparse data')
def _create_metadata(self, path, initial_creation=False):
"""Calculate metadata for a filesystem
@ -719,6 +728,7 @@ class OpengnsysGitLibrary:
renamed_file = open(os.path.join(meta_dir, "renamed.jsonl.new"), "w", encoding='utf-8')
filesystems_file = open(os.path.join(meta_dir, "filesystems.json.new"), "w", encoding='utf-8')
partitions_file = open(os.path.join(meta_dir, "partitions.json.new"), "w", encoding='utf-8')
symlinks_file = open(os.path.join(meta_dir, "symlinks.jsonl.new"), "w", encoding='utf-8')
partitions_file.write(self.disk.get_disk_json_data(self.fs.find_device(mountpoint=path)))
@ -919,9 +929,11 @@ class OpengnsysGitLibrary:
# Git falla al encontrarse con archivos especiales como dispositivos. De momento debemos
# eliminarlos.
os.unlink(full_path)
if os.path.islink(full_path):
#self.logger.debug(f"Symlink: {full_path_rel}")
return_data['symlinks'].append(full_path_rel)
self._getfattr ("file", full_path, full_path_rel, symlinks_file)
if os.path.isfile(full_path) and file in self.rename_list and root != path:
# Process this last so that all the metadata references the real names.
@ -955,6 +967,9 @@ class OpengnsysGitLibrary:
os.rename(full_path, renamed_dir_path)
if os.path.islink(full_path):
self._getfattr ("dir", full_path, full_path_rel, symlinks_file)
if not ntfs and os.path.isdir(full_path) and not os.path.islink(full_path):
stat_data = os.stat(full_path)
@ -996,6 +1011,7 @@ class OpengnsysGitLibrary:
filesystems_file.close()
metadata_file.close()
partitions_file.close()
symlinks_file.close()
os.rename(os.path.join(meta_dir, "empty_directories.jsonl.new"), os.path.join(meta_dir, "empty_directories.jsonl"))
os.rename(os.path.join(meta_dir, "special_files.jsonl.new"), os.path.join(meta_dir, "special_files.jsonl"))
@ -1006,6 +1022,7 @@ class OpengnsysGitLibrary:
os.rename(os.path.join(meta_dir, "filesystems.json.new"), os.path.join(meta_dir, "filesystems.json"))
os.rename(os.path.join(meta_dir, "metadata.json.new"), os.path.join(meta_dir, "metadata.json"))
os.rename(os.path.join(meta_dir, "partitions.json.new"), os.path.join(meta_dir, "partitions.json"))
os.rename(os.path.join(meta_dir, "symlinks.jsonl.new"), os.path.join(meta_dir, "symlinks.jsonl"))
self.logger.debug("Processing pending NTFS secaudits...")
@ -1613,6 +1630,33 @@ class OpengnsysGitLibrary:
if self.fs.filesystem_type(mountpoint = destination_dir) == "ntfs":
self._ntfs_restore_secaudit(destination_dir)
self.logger.info("Processing symlinks.jsonl")
meta_dir = os.path.join(destination_dir, ".opengnsys-metadata")
with open(os.path.join(meta_dir, "symlinks.jsonl"), "r", encoding='utf-8') as symlinks_file:
for line in symlinks_file:
if line.isspace():
self.logger.debug("Empty line, skipping")
continue
symlink_data = json.loads(line)
symlink_file = symlink_data['file']
symlink_type = symlink_data['type']
symlink_reparse_data = symlink_data['reparse_data']
full_path = os.path.join(destination_dir,symlink_file)
if os.path.islink (full_path):
rp = os.path.realpath (full_path)
if not os.path.exists (full_path): continue ## broken symlink but that's fine
## islink and exists: that's how it should be
continue
self.logger.info(f'({full_path}): not a symlink, restoring ntfs reparse data...')
os.unlink (full_path)
if 'dir' == symlink_type: os.mkdir (full_path)
else: open (full_path, 'w').close()
p = subprocess.run (['setfattr', '--no-dereference', '--value', symlink_reparse_data, '--name', 'system.ntfs_reparse_data', full_path], capture_output=True, text=True)
if p.returncode or p.stderr:
self.logger.warning(f'setfattr rc ({p.returncode}) out ({p.stdout}) err ({p.stderr})')
else:
self.logger.debug(f'setfattr rc ({p.returncode}) out ({p.stdout}) err ({p.stderr})')
if repo_is_efi:
self._efi_install(root_directory=destination_dir)
else:

View File

@ -22,7 +22,7 @@ class DiskLibrary:
[base_device, partno]
"""
r = re.compile("^(.*?)(\\d+)$")
r = re.compile("^(.*?)p?(\\d+)$")
m = r.match(device)
disk = m.group(1)
partno = int(m.group(2))

View File

@ -143,6 +143,7 @@ def ogGetIpAddress():
ipasj = json.loads (ipas)
addresses = []
for e in ipasj:
if 'ifname' not in e: continue
if 'lo' == e['ifname']: continue
if 'addr_info' not in e: continue
addrs = e['addr_info']