Compare commits
No commits in common. "main" and "remove_systemd_block" have entirely different histories.
main
...
remove_sys
|
|
@ -7,5 +7,3 @@ debian/files
|
||||||
debian/*.debhelper
|
debian/*.debhelper
|
||||||
debian/*.debhelper.log
|
debian/*.debhelper.log
|
||||||
debian/debhelper-build-stamp
|
debian/debhelper-build-stamp
|
||||||
.venv/
|
|
||||||
.vscode/
|
|
||||||
|
|
|
||||||
59
CHANGELOG.md
59
CHANGELOG.md
|
|
@ -1,71 +1,14 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
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).
|
|
||||||
|
|
||||||
## [0.10.7] - 2026-09-17
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- **createTorrentSum**: Corregido error (`OSError: [Errno 22] Invalid argument`) al calcular la suma de verificación MD5 de los ficheros de imagen cuando estos ocupan menos de 1 MB, ajustando dinámicamente el `seek_offset` al tamaño real del fichero.
|
|
||||||
|
|
||||||
## [0.10.6] - 2026-07-27
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- API de Repositorios Git (`repo_api.py`): Implementado el endpoint `DELETE /ogrepository/v1/git/repositories/<repo>` que sustituye al antiguo código "Not implemented". Ahora se encarga de eliminar el repositorio correctamente de la base de datos de Forgejo y de purgar el directorio `.git` del disco duro.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- **createTorrentSum**: Optimizada la creación de ficheros torrent (`mktorrent`) calculando el tamaño de pieza (`-l`) de forma dinámica según el tamaño de la imagen, evitando archivos `.torrent` con cientos de miles de piezas que saturaban el tracker en imágenes muy grandes. Se ha incrementado `target_pieces` a 200.000 para garantizar que las piezas no superen los 2 MB en imágenes de hasta 400 GB.
|
|
||||||
|
|
||||||
## [0.10.5] - 2026-04-14
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Force 755 permissions on `/opt/opengnsys` in `preinst` to prevent `oggit` user from being locked out when `useradd` creates the directory with a restrictive umask (e.g. 027), which caused `opengnsys-forgejo` to fail to start during installation before `postinst` could apply the correct permissions
|
|
||||||
- Ensure forgejo working directory (`var/lib/forgejo/work`) is created in `postinst` before setting ownership, and restart `opengnsys-forgejo` after fixing permissions so it recovers from a failed state caused by the ordering between dependency and package configuration
|
|
||||||
|
|
||||||
## [0.10.4] - 2025-09-30
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Set safe.directory just once
|
|
||||||
|
|
||||||
## [0.10.3] - 2025-09-18
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Create tags via a query to the forgejo API
|
|
||||||
|
|
||||||
## [0.10.2] - 2025-09-01
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Corregida la logica en el endpoint create torrent sum
|
|
||||||
- Mejoras en los mensajes de logs
|
|
||||||
- Mejoras en la validación de los archivos info e info.checked
|
|
||||||
|
|
||||||
## [0.10.1] - 2025-08-25
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Import images problems when there is not info.checked file (#2723, #2726)
|
|
||||||
- Improves logging (#2727)
|
|
||||||
|
|
||||||
## [0.10.0] - 2025-07-07
|
## [0.10.0] - 2025-07-07
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- OgGit functionality (#2371, #2363, #2363, #2317)
|
- OgGit functionality (#2371, #2363, #2363, #2317)
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- Removed unused BitTorrent-related packages and logic
|
|
||||||
|
|
||||||
## [0.9.0] - 2025-06-25
|
## [0.9.0] - 2025-06-25
|
||||||
|
|
||||||
### Added
|
## Added
|
||||||
|
|
||||||
- Changed old tools for tools non dependant of Pyhton2 in repo
|
- Changed old tools for tools non dependant of Pyhton2 in repo
|
||||||
- mktorrent to handle creation of torrent files
|
- mktorrent to handle creation of torrent files
|
||||||
|
|
|
||||||
|
|
@ -62,19 +62,6 @@ pipeline {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage('Generate Changelog (Devel)') {
|
|
||||||
when {
|
|
||||||
branch 'devel'
|
|
||||||
}
|
|
||||||
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, "devel")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stage('Build') {
|
stage('Build') {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
|
|
@ -110,44 +97,17 @@ pipeline {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage ('Publish to Debian Repository (Devel)') {
|
|
||||||
when {
|
|
||||||
branch 'devel'
|
|
||||||
}
|
|
||||||
agent { label 'debian-repo' }
|
|
||||||
steps {
|
|
||||||
script {
|
|
||||||
def versionPattern = "-${env.BUILD_NUMBER}~devel"
|
|
||||||
publicarEnAptly('/var/tmp/opengnsys/debian-repo/ogrepository', 'devel', versionPattern)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
post {
|
post {
|
||||||
success {
|
|
||||||
script {
|
|
||||||
// Solo lanzar cuando el build sea exitoso y en la rama main
|
|
||||||
if (env.BRANCH_NAME == 'main') {
|
|
||||||
build job: 'Aptly publish nightly repository',
|
|
||||||
wait: false,
|
|
||||||
parameters: [
|
|
||||||
string(name: 'TRIGGERED_BY', value: "${env.JOB_NAME}-${env.BUILD_NUMBER}")
|
|
||||||
]
|
|
||||||
}
|
|
||||||
if (env.BRANCH_NAME == 'devel') {
|
|
||||||
build job: 'Aptly publish develop repository',
|
|
||||||
wait: false,
|
|
||||||
parameters: [
|
|
||||||
string(name: 'TRIGGERED_BY', value: "${env.JOB_NAME}-${env.BUILD_NUMBER}")
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
always {
|
always {
|
||||||
notifyBuildStatus('opengnsys@qindel.com')
|
notifyBuildStatus('narenas@qindel.com')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// stage ('Publish to Debian Repository') {
|
||||||
|
// agent { label 'debian-repo' }
|
||||||
|
// steps {
|
||||||
|
// sh "aptly repo add opengnsys-devel /var/tmp/opengnsys/debian-repo/*.deb"
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
|
||||||
471
api/repo_api.py
471
api/repo_api.py
File diff suppressed because it is too large
Load Diff
197
api/swagger.yaml
197
api/swagger.yaml
|
|
@ -2087,203 +2087,6 @@ paths:
|
||||||
error:
|
error:
|
||||||
type: string
|
type: string
|
||||||
example: "Parameters missing"
|
example: "Parameters missing"
|
||||||
/ogrepository/v1/git/repositories/{repository}:
|
|
||||||
delete:
|
|
||||||
summary: "Eliminar repositorio"
|
|
||||||
description: |
|
|
||||||
Elimina un repositorio de Git
|
|
||||||
tags:
|
|
||||||
- "Git"
|
|
||||||
parameters:
|
|
||||||
- name: repository
|
|
||||||
in: path
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
description: "Nombre de repositorio"
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: "Repositorio eliminado"
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
status:
|
|
||||||
type: string
|
|
||||||
example: deleted
|
|
||||||
"404":
|
|
||||||
description: "Repositorio no encontrado"
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
status:
|
|
||||||
type: string
|
|
||||||
example: not found
|
|
||||||
"500":
|
|
||||||
description: "Excepción"
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
success:
|
|
||||||
type: boolean
|
|
||||||
example: false
|
|
||||||
exception:
|
|
||||||
type: string
|
|
||||||
example: "(Exception description)"
|
|
||||||
|
|
||||||
/ogrepository/v1/git/repositories/{repository}/sync:
|
|
||||||
post:
|
|
||||||
summary: "Sincronizar con repositorio remoto"
|
|
||||||
description: |
|
|
||||||
Sincroniza un repositorio de Git con uno remoto.
|
|
||||||
tags:
|
|
||||||
- "Git"
|
|
||||||
parameters:
|
|
||||||
- name: repository
|
|
||||||
in: path
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
description: "Nombre de repositorio"
|
|
||||||
- name: JSON
|
|
||||||
in: body
|
|
||||||
required: true
|
|
||||||
description: |
|
|
||||||
* **remote_repository** - Reposition remoto al que hacer push
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: "Repositorio en proceso de sincronización"
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
success:
|
|
||||||
type: boolean
|
|
||||||
example: True
|
|
||||||
output:
|
|
||||||
type: string
|
|
||||||
example: "Synchronizing..."
|
|
||||||
job_id:
|
|
||||||
type: string
|
|
||||||
example: "GitSync_02345"
|
|
||||||
"404":
|
|
||||||
description: "Repositorio no encontrado"
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
status:
|
|
||||||
type: string
|
|
||||||
example: not found
|
|
||||||
"500":
|
|
||||||
description: "Excepción"
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
success:
|
|
||||||
type: boolean
|
|
||||||
example: false
|
|
||||||
exception:
|
|
||||||
type: string
|
|
||||||
example: "(Exception description)"
|
|
||||||
/ogrepository/v1/git/repositories/{repository}/backup:
|
|
||||||
post:
|
|
||||||
summary: "Sincronizar con repositorio remoto"
|
|
||||||
description: |
|
|
||||||
Sincroniza un repositorio de Git con uno remoto.
|
|
||||||
tags:
|
|
||||||
- "Git"
|
|
||||||
parameters:
|
|
||||||
- name: repository
|
|
||||||
in: path
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
description: "Nombre de repositorio"
|
|
||||||
- name: JSON
|
|
||||||
in: body
|
|
||||||
required: true
|
|
||||||
description: |
|
|
||||||
* **ssh_server** - Servidor SSH al que enviar el backup
|
|
||||||
* **ssh_port** - Puerto del servidor SSH al que enviar el backup
|
|
||||||
* **ssh_user** - Usuario del servidor SSH al que enviar el backup
|
|
||||||
* **filename** - Nombre de archivo del backup
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: "Repositorio en proceso de sincronización"
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
success:
|
|
||||||
type: boolean
|
|
||||||
example: True
|
|
||||||
output:
|
|
||||||
type: string
|
|
||||||
example: "Backing up..."
|
|
||||||
job_id:
|
|
||||||
type: string
|
|
||||||
example: "GitBackup_02345"
|
|
||||||
"404":
|
|
||||||
description: "Repositorio no encontrado"
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
status:
|
|
||||||
type: string
|
|
||||||
example: not found
|
|
||||||
"500":
|
|
||||||
description: "Excepción"
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
success:
|
|
||||||
type: boolean
|
|
||||||
example: false
|
|
||||||
exception:
|
|
||||||
type: string
|
|
||||||
example: "(Exception description)"
|
|
||||||
/ogrepository/v1/git/repositories/{repository}/compact:
|
|
||||||
post:
|
|
||||||
summary: "Compactar repositorio"
|
|
||||||
description: |
|
|
||||||
Compacta un repositorio de Git para optimizar el rendimiento y liberar espacio
|
|
||||||
tags:
|
|
||||||
- "Git"
|
|
||||||
parameters:
|
|
||||||
- name: repository
|
|
||||||
in: path
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
description: "Nombre de repositorio"
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: "Repositorio en proceso de compactación"
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
success:
|
|
||||||
type: boolean
|
|
||||||
example: True
|
|
||||||
output:
|
|
||||||
type: string
|
|
||||||
example: "Compacting..."
|
|
||||||
job_id:
|
|
||||||
type: string
|
|
||||||
example: "GitGC_02345"
|
|
||||||
"404":
|
|
||||||
description: "Repositorio no encontrado"
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
status:
|
|
||||||
type: string
|
|
||||||
example: not found
|
|
||||||
"500":
|
|
||||||
description: "Excepción"
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
success:
|
|
||||||
type: boolean
|
|
||||||
example: false
|
|
||||||
exception:
|
|
||||||
type: string
|
|
||||||
example: "(Exception description)"
|
|
||||||
|
|
||||||
/ogrepository/v1/git/repositories/{repository}/tags:
|
/ogrepository/v1/git/repositories/{repository}/tags:
|
||||||
get:
|
get:
|
||||||
summary: "Obtener lista de tags"
|
summary: "Obtener lista de tags"
|
||||||
|
|
|
||||||
|
|
@ -96,13 +96,8 @@ def get_md5_sum(file_path, megabytes=1):
|
||||||
Se utiliza para crear el archivo ".sum" (para transferencias Unicast y Multicast).
|
Se utiliza para crear el archivo ".sum" (para transferencias Unicast y Multicast).
|
||||||
"""
|
"""
|
||||||
hash_md5 = hashlib.md5()
|
hash_md5 = hashlib.md5()
|
||||||
file_size = os.path.getsize(file_path)
|
|
||||||
seek_offset = -megabytes * 1024 * 1024
|
|
||||||
if file_size < (-seek_offset):
|
|
||||||
seek_offset = -file_size
|
|
||||||
|
|
||||||
with open(file_path, "rb") as f:
|
with open(file_path, "rb") as f:
|
||||||
f.seek(seek_offset, os.SEEK_END)
|
f.seek(-megabytes * 1024 * 1024, os.SEEK_END)
|
||||||
data = f.read(megabytes * 1024 * 1024)
|
data = f.read(megabytes * 1024 * 1024)
|
||||||
hash_md5.update(data)
|
hash_md5.update(data)
|
||||||
return hash_md5.hexdigest()
|
return hash_md5.hexdigest()
|
||||||
|
|
@ -139,18 +134,8 @@ def create_torrent(file_path, torrent_file, datafullsum):
|
||||||
repo_ip = get_IPlocal()
|
repo_ip = get_IPlocal()
|
||||||
tracker_url = f"http://{repo_ip}:6969/announce"
|
tracker_url = f"http://{repo_ip}:6969/announce"
|
||||||
|
|
||||||
import math
|
|
||||||
file_size = os.path.getsize(file_path)
|
|
||||||
target_pieces = 200000
|
|
||||||
piece_size_target = file_size / target_pieces
|
|
||||||
if piece_size_target <= 262144:
|
|
||||||
l_val = 18
|
|
||||||
else:
|
|
||||||
l_val = math.ceil(math.log(piece_size_target, 2))
|
|
||||||
l_val = max(18, min(26, l_val))
|
|
||||||
|
|
||||||
# Creamos una litas para ejecutar el comando mktorrent para crear el archivo torrent
|
# Creamos una litas para ejecutar el comando mktorrent para crear el archivo torrent
|
||||||
splitted_cmd = f"nice -n 0 mktorrent -l {l_val} -a {tracker_url} -c {datafullsum} -o {torrent_file} {file_path}".split()
|
splitted_cmd = f"nice -n 0 mktorrent -a {tracker_url} -c {datafullsum} -o {torrent_file} {file_path}".split()
|
||||||
print(f"Sending command: {' '.join(splitted_cmd)}")
|
print(f"Sending command: {' '.join(splitted_cmd)}")
|
||||||
|
|
||||||
# Ejecutamos el comando en el sistema, e imprimimos el resultado:
|
# Ejecutamos el comando en el sistema, e imprimimos el resultado:
|
||||||
|
|
@ -199,17 +184,12 @@ def main():
|
||||||
# Obtenemos la ruta completa de la imagen:
|
# Obtenemos la ruta completa de la imagen:
|
||||||
file_path = build_file_path()
|
file_path = build_file_path()
|
||||||
|
|
||||||
# Si no existe el archivo de imagen o el .info, imprimimos un mensaje de error y salimos del script:
|
# Si no existe el archivo de imagen, imprimimos un mensaje de error y salimos del script:
|
||||||
if not os.path.exists(file_path) or not (os.path.exists(f"{file_path}.info.checked") or os.path.exists(f"{file_path}.info")):
|
|
||||||
if not os.path.exists(file_path):
|
if not os.path.exists(file_path):
|
||||||
journal.send(f"createTorrentSum.py: Image file '{file_path}' not found", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
journal.send("createTorrentSum.py: Image not found", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||||
print(f"Image file '{file_path}' doesn't exist")
|
print("Image file doesn't exist")
|
||||||
if not os.path.exists(f"{file_path}.info.checked") and not os.path.exists(f"{file_path}.info"):
|
|
||||||
journal.send(f"createTorrentSum.py: Neither '{file_path}.info.checked' nor '{file_path}.info' found", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
|
||||||
print(f"Neither info file '{file_path}.info.checked' nor '{file_path}.info' exists")
|
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
|
|
||||||
# Si la imagen está bloqueada, imprimimos un mensaje de error y salimos del script:
|
# Si la imagen está bloqueada, imprimimos un mensaje de error y salimos del script:
|
||||||
if os.path.exists(f"{file_path}.lock"):
|
if os.path.exists(f"{file_path}.lock"):
|
||||||
journal.send("createTorrentSum.py: Image is locked", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
journal.send("createTorrentSum.py: Image is locked", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||||
|
|
@ -277,7 +257,6 @@ def main():
|
||||||
# Actualizamos la información del repositorio, ejecutando el script "updateRepoInfo.py":
|
# Actualizamos la información del repositorio, ejecutando el script "updateRepoInfo.py":
|
||||||
journal.send("createTorrentSum.py: Updating repository info...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
journal.send("createTorrentSum.py: Updating repository info...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
||||||
print("Updating Repository Info...")
|
print("Updating Repository Info...")
|
||||||
if os.path.exists(f"{file_path}.info"):
|
|
||||||
update_repo_info()
|
update_repo_info()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,6 @@ def check_files():
|
||||||
continue
|
continue
|
||||||
# Comprobamos si existe un archivo ".info" asociado a la imagen actual:
|
# Comprobamos si existe un archivo ".info" asociado a la imagen actual:
|
||||||
info_file = f"{img_path}.info"
|
info_file = f"{img_path}.info"
|
||||||
try:
|
|
||||||
if os.path.exists(info_file):
|
if os.path.exists(info_file):
|
||||||
# Si la fecha de modificación del archivo ".info" es anterior a la de la imagen, lo eliminamos (porque estará desactualizado):
|
# Si la fecha de modificación del archivo ".info" es anterior a la de la imagen, lo eliminamos (porque estará desactualizado):
|
||||||
if os.path.getmtime(info_file) < os.path.getmtime(img_path):
|
if os.path.getmtime(info_file) < os.path.getmtime(img_path):
|
||||||
|
|
@ -81,36 +80,20 @@ def check_files():
|
||||||
with open(f"{img_path}.size", 'r') as file:
|
with open(f"{img_path}.size", 'r') as file:
|
||||||
size = file.read().strip('\n')
|
size = file.read().strip('\n')
|
||||||
with open(f"{img_path}.sum", 'r') as file:
|
with open(f"{img_path}.sum", 'r') as file:
|
||||||
sum = file.read().strip('\n')
|
_sum = file.read().strip('\n')
|
||||||
with open(f"{img_path}.full.sum", 'r') as file:
|
with open(f"{img_path}.full.sum", 'r') as file:
|
||||||
fullsum = file.read().strip('\n')
|
fullsum = file.read().strip('\n')
|
||||||
|
# Llamamos a la función "add_to_json", para que inserte la información de la imagen en el archivo json
|
||||||
|
# (pasándole el nombre de la imagen, la extensión, y los datos extraídos del archivo ".info"):
|
||||||
|
img_name = os.path.relpath(img_path, repo_path)
|
||||||
|
add_to_json(os.path.splitext(img_name)[0], os.path.splitext(img_name)[1][1:], info_data, size, _sum, fullsum)
|
||||||
|
|
||||||
# Renombramos el archivo ".info" a ".info.checked", para que ya no se añada la información que contiene
|
# Renombramos el archivo ".info" a ".info.checked", para que ya no se añada la información que contiene
|
||||||
# (originalmente se eliminaba el archivo, pero creo que es mejor mantenerlo):
|
# (originalmente se eliminaba el archivo, pero creo que es mejor mantenerlo):
|
||||||
os.rename(info_file, f"{info_file}.checked")
|
os.rename(info_file, f"{info_file}.checked")
|
||||||
|
|
||||||
# Llamamos a la función "add_to_json", para que inserte la información de la imagen en el archivo json
|
|
||||||
# (pasándole el nombre de la imagen, la extensión, y los datos extraídos del archivo ".info"):
|
|
||||||
img_name = os.path.relpath(img_path, repo_path)
|
|
||||||
add_to_json(os.path.splitext(img_name)[0], os.path.splitext(img_name)[1][1:], info_data, size, sum, fullsum)
|
|
||||||
|
|
||||||
except (IOError, OSError, PermissionError) as e:
|
def add_to_json(image_name, image_type, data, size, _sum, fullsum):
|
||||||
# Si hay algún error leyendo los archivos, registramos el error y continuamos con la siguiente imagen
|
|
||||||
journal.send(f"updateRepoInfo.py: Error processing files for {img_path}: {str(e)}", PRIORITY=journal.LOG_WARNING, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
|
||||||
print(f"Warning: Could not process files for {item}: {str(e)}")
|
|
||||||
continue
|
|
||||||
except ValueError as e:
|
|
||||||
# Si hay algún error con el formato de los datos en los archivos
|
|
||||||
journal.send(f"updateRepoInfo.py: Data format error for {img_path}: {str(e)}", PRIORITY=journal.LOG_WARNING, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
|
||||||
print(f"Warning: Data format error for {item}: {str(e)}")
|
|
||||||
continue
|
|
||||||
except Exception as e:
|
|
||||||
# Para cualquier otra excepción inesperada
|
|
||||||
journal.send(f"updateRepoInfo.py: Unexpected error processing {img_path}: {str(e)}", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
|
|
||||||
print(f"Error: Unexpected error processing {item}: {str(e)}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
def add_to_json(image_name, image_type, data, size, sum, fullsum):
|
|
||||||
""" Esta función añade al archivo "repoinfo.json" la información de las imágenes que aun no ha sido introducida en él (imágenes nuevas, básicamente).
|
""" Esta función añade al archivo "repoinfo.json" la información de las imágenes que aun no ha sido introducida en él (imágenes nuevas, básicamente).
|
||||||
"""
|
"""
|
||||||
# Almacenamos el contenido de la variable "data" (del tipo "PARTCLONE:LZOP:EXTFS:8500000:Ubuntu_20") en variables separadas:
|
# Almacenamos el contenido de la variable "data" (del tipo "PARTCLONE:LZOP:EXTFS:8500000:Ubuntu_20") en variables separadas:
|
||||||
|
|
@ -126,7 +109,7 @@ def add_to_json(image_name, image_type, data, size, sum, fullsum):
|
||||||
"filesystem": fstype.upper(),
|
"filesystem": fstype.upper(),
|
||||||
"datasize": int(datasize) * 1024, # Convertimos el valor a bytes (desde KB)
|
"datasize": int(datasize) * 1024, # Convertimos el valor a bytes (desde KB)
|
||||||
"size": int(size),
|
"size": int(size),
|
||||||
"sum": sum,
|
"sum": _sum,
|
||||||
"fullsum": fullsum
|
"fullsum": fullsum
|
||||||
}
|
}
|
||||||
# Almacenamos el contenido del archivo "repoinfo.json" en la variable "info_data"
|
# Almacenamos el contenido del archivo "repoinfo.json" en la variable "info_data"
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
api/* /opt/opengnsys/ogrepository/api/
|
api/* /opt/opengnsys/ogrepository/api/
|
||||||
bin/* /opt/opengnsys/ogrepository/bin/
|
bin/* /opt/opengnsys/ogrepository/bin/
|
||||||
etc/* /opt/opengnsys/ogrepository/etc/
|
etc/* /opt/opengnsys/ogrepository/etc/
|
||||||
|
installer/files/ctorrent.sources /etc/apt/sources.list.d/
|
||||||
installer/files/ogrepo-api.service /etc/systemd/system/
|
installer/files/ogrepo-api.service /etc/systemd/system/
|
||||||
installer/files/ogrepo-smb.conf /etc/samba/
|
installer/files/ogrepo-smb.conf /etc/samba/
|
||||||
installer/ssh-keys/* /opt/opengnsys/ogrepository/etc/
|
installer/ssh-keys/* /opt/opengnsys/ogrepository/etc/
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,18 @@ USER="opengnsys"
|
||||||
|
|
||||||
# Provisionar base de datos si es necesario en caso de instalación.
|
# Provisionar base de datos si es necesario en caso de instalación.
|
||||||
|
|
||||||
|
|
||||||
|
# Detectar si es una instalación nueva o una actualización
|
||||||
|
# if [ "$1" = "configure" ] && [ -z "$2" ]; then
|
||||||
|
# systemd-run --no-block /bin/bash -c "
|
||||||
|
# sleep 10;
|
||||||
|
# apt update -y;
|
||||||
|
# for pkg in bittorrent bittornado ctorrent; do
|
||||||
|
# if ! dpkg -l | grep -qw \"\$pkg\"; then
|
||||||
|
# apt install -y \"\$pkg\"
|
||||||
|
# fi
|
||||||
|
# done
|
||||||
|
# "
|
||||||
if [ "$1" = "configure" ] && [ -z "$2" ]; then
|
if [ "$1" = "configure" ] && [ -z "$2" ]; then
|
||||||
|
|
||||||
sed -i "s/%%OGREPOSITORY_USER%%/$SAMBA_USER/g" /etc/systemd/system/ogrepo-api.service
|
sed -i "s/%%OGREPOSITORY_USER%%/$SAMBA_USER/g" /etc/systemd/system/ogrepo-api.service
|
||||||
|
|
@ -110,13 +122,9 @@ chmod 755 /opt/opengnsys/ogrepository/bin/*
|
||||||
# oggit -- these are from opengnsys-forgejo, and we're overwriting their
|
# oggit -- these are from opengnsys-forgejo, and we're overwriting their
|
||||||
# permissions above.
|
# permissions above.
|
||||||
#
|
#
|
||||||
# Ensure the forgejo working directory exists and has the right ownership
|
# Check if the paths exist just in case the opengnsys-forgejo package
|
||||||
# before the service tries to start. This is needed because opengnsys-forgejo
|
# stops being a dependency.
|
||||||
# is configured (and starts its service) before ogrepository's postinst runs,
|
if [ -d "/opt/opengnsys/ogrepository/var/lib/forgejo/" ] ; then
|
||||||
# so without this the service fails with CHDIR/Permission denied.
|
|
||||||
if getent passwd oggit > /dev/null 2>&1; then
|
|
||||||
mkdir -p /opt/opengnsys/ogrepository/var/lib/forgejo/work
|
|
||||||
mkdir -p /opt/opengnsys/ogrepository/var/lib/forgejo/data
|
|
||||||
chown -R oggit:oggit /opt/opengnsys/ogrepository/var/lib/forgejo/
|
chown -R oggit:oggit /opt/opengnsys/ogrepository/var/lib/forgejo/
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -124,13 +132,6 @@ if [ -d "/opt/opengnsys/ogrepository/oggit/" ] ; then
|
||||||
chown -R oggit:oggit /opt/opengnsys/ogrepository/oggit/
|
chown -R oggit:oggit /opt/opengnsys/ogrepository/oggit/
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Restart forgejo now that permissions are correct (it may have failed during
|
|
||||||
# opengnsys-forgejo's own postinst due to the chown above overwriting its dirs)
|
|
||||||
if getent passwd oggit > /dev/null 2>&1; then
|
|
||||||
systemctl reset-failed opengnsys-forgejo 2>/dev/null || true
|
|
||||||
systemctl restart opengnsys-forgejo 2>/dev/null || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Install http server stuff
|
# Install http server stuff
|
||||||
# Reiniciar servicios si es necesario
|
# Reiniciar servicios si es necesario
|
||||||
# systemctl restart nombre_del_servicio
|
# systemctl restart nombre_del_servicio
|
||||||
|
|
@ -139,8 +140,39 @@ systemctl daemon-reload
|
||||||
systemctl enable ogrepo-api
|
systemctl enable ogrepo-api
|
||||||
systemctl restart ogrepo-api
|
systemctl restart ogrepo-api
|
||||||
systemctl restart smbd
|
systemctl restart smbd
|
||||||
systemctl enable --now opentracker || true
|
|
||||||
systemctl restart opentracker || true
|
|
||||||
|
|
||||||
|
# echo "ogrepository-trigger" > /var/lib/dpkg/triggers/ogrepository.trigger
|
||||||
|
# POST_INVOKE_SCRIPT="/var/lib/dpkg/info/ogrepository.trigger"
|
||||||
|
|
||||||
|
# echo "Registrando post-invoke para instalación de paquetes adicionales..."
|
||||||
|
|
||||||
|
# cat <<EOF > "$POST_INVOKE_SCRIPT"
|
||||||
|
# #!/bin/sh
|
||||||
|
# set -e
|
||||||
|
|
||||||
|
# echo "Ejecutando post-trigger: Instalando bittorrent, bittornado y ctorrent..."
|
||||||
|
|
||||||
|
# export DEBIAN_FRONTEND=noninteractive
|
||||||
|
# apt-get update
|
||||||
|
# apt-get install -y bittorrent bittornado ctorrent
|
||||||
|
|
||||||
|
# echo "Instalación de paquetes adicionales completada."
|
||||||
|
|
||||||
|
# exit 0
|
||||||
|
# EOF
|
||||||
|
|
||||||
|
# chmod +x "$POST_INVOKE_SCRIPT"
|
||||||
|
|
||||||
|
# # Intentar ejecutar el script ahora si no hay otro proceso de apt corriendo
|
||||||
|
# if ! pgrep -x "apt" > /dev/null; then
|
||||||
|
# echo "Ejecutando instalación de paquetes adicionales inmediatamente..."
|
||||||
|
# "$POST_INVOKE_SCRIPT"
|
||||||
|
# else
|
||||||
|
# echo "Apt está en uso, los paquetes se instalarán después."
|
||||||
|
# fi
|
||||||
|
|
||||||
|
# find /opt/opengnsys/ogrepository -type f -name "*.py" -exec chmod +x {} \;
|
||||||
|
|
||||||
|
# dpkg-trigger --by-package=ogrepository ogrepository-trigger
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|
|
||||||
|
|
@ -24,13 +24,6 @@ else
|
||||||
echo "Creando el usuario $USER con home en $HOME_DIR."
|
echo "Creando el usuario $USER con home en $HOME_DIR."
|
||||||
useradd -m -d "$HOME_DIR" -s /bin/bash "$USER"
|
useradd -m -d "$HOME_DIR" -s /bin/bash "$USER"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Forzar 755 en /opt/opengnsys independientemente del umask del sistema.
|
|
||||||
# useradd -m puede crear el directorio con 750 si el umask es 027, lo que
|
|
||||||
# impide que el usuario oggit (de opengnsys-forgejo) atraviese el árbol
|
|
||||||
# antes de que el postinst de ogrepository aplique su propio chmod.
|
|
||||||
mkdir -p "$HOME_DIR"
|
|
||||||
chmod 755 "$HOME_DIR"
|
|
||||||
echo "Añadiendo el repositorio de Debian Buster en $REPO_FILE..."
|
echo "Añadiendo el repositorio de Debian Buster en $REPO_FILE..."
|
||||||
|
|
||||||
# Crear el directorio si no existe
|
# Crear el directorio si no existe
|
||||||
|
|
|
||||||
|
|
@ -10,25 +10,6 @@ Cmnd_Alias MOUNT_RECOVERY = \
|
||||||
/usr/bin/umount /mnt/recovery/sys, \
|
/usr/bin/umount /mnt/recovery/sys, \
|
||||||
/usr/bin/umount -l /mnt/recovery
|
/usr/bin/umount -l /mnt/recovery
|
||||||
|
|
||||||
Cmnd_Alias OGBOOT = \
|
|
||||||
/opt/bin/oglivecli, \
|
|
||||||
/usr/bin/chmod, \
|
|
||||||
/usr/bin/chown, \
|
|
||||||
/usr/bin/md5sum, \
|
|
||||||
/usr/bin/smbpasswd, \
|
|
||||||
/usr/bin/cat, \
|
|
||||||
/usr/bin/tee, \
|
|
||||||
/usr/bin/sed, \
|
|
||||||
/usr/bin/gzip, \
|
|
||||||
/usr/bin/lz4, \
|
|
||||||
/usr/bin/cpio, \
|
|
||||||
/usr/bin/find, \
|
|
||||||
/bin/tee, \
|
|
||||||
/usr/bin/dd, \
|
|
||||||
/usr/bin/mkfs.ext4, \
|
|
||||||
/usr/bin/rsync, \
|
|
||||||
/opt/opengnsys/ogboot/lib/*.iso /mnt
|
|
||||||
|
|
||||||
Cmnd_Alias CHROOT_GRUB = \
|
Cmnd_Alias CHROOT_GRUB = \
|
||||||
/usr/sbin/chroot /mnt/recovery /usr/sbin/grub-install --target=i386-pc *, \
|
/usr/sbin/chroot /mnt/recovery /usr/sbin/grub-install --target=i386-pc *, \
|
||||||
/usr/sbin/chroot /mnt/recovery /usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg
|
/usr/sbin/chroot /mnt/recovery /usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg
|
||||||
|
|
@ -47,4 +28,4 @@ Cmnd_Alias KILL_BT = \
|
||||||
Cmnd_Alias PYTHON_OGREPO = /usr/bin/python3 /opt/opengnsys/ogrepository/bin/*
|
Cmnd_Alias PYTHON_OGREPO = /usr/bin/python3 /opt/opengnsys/ogrepository/bin/*
|
||||||
|
|
||||||
# Permitir al usuario opengnsys ejecutar estos comandos sin contraseña
|
# Permitir al usuario opengnsys ejecutar estos comandos sin contraseña
|
||||||
opengnsys ALL=(root) NOPASSWD: MOUNT_RECOVERY, CHROOT_GRUB, LOOP_KPARTX, OGBOOT, KILL_BT, PYTHON_OGREPO
|
opengnsys ALL=(root) NOPASSWD: MOUNT_RECOVERY, CHROOT_GRUB, LOOP_KPARTX, KILL_BT, PYTHON_OGREPO
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
Types: deb
|
||||||
|
URIs: http://ftp.de.debian.org/debian
|
||||||
|
Suites: buster
|
||||||
|
Components: main
|
||||||
|
Signed-By: /usr/share/keyrings/debian-archive-buster-stable.gpg
|
||||||
|
|
||||||
Loading…
Reference in New Issue