Compare commits
55 Commits
ejecutarsc
...
main
Author | SHA1 | Date |
---|---|---|
|
7624964ba1 | |
|
c3e86b7dc0 | |
|
a18e861bea | |
|
842dbf48c2 | |
|
d79c677f16 | |
|
bd056438a1 | |
|
fb665fa4ca | |
|
c76fd8388a | |
|
fac6e142f6 | |
|
e20bd46edb | |
|
f785143b73 | |
|
bf85cb1fed | |
|
e885302256 | |
|
ad3388d36e | |
|
46238456cb | |
|
0179d106e9 | |
|
697c60f812 | |
|
4353c74768 | |
|
2c18e6981f | |
|
c1f123b489 | |
|
1f92f54994 | |
|
bbaa6578e1 | |
|
e1a1be667b | |
|
44511c79a0 | |
|
a1493a827e | |
|
0352e3a2cc | |
|
e76fe57b1b | |
|
793705953f | |
|
782e5c8978 | |
|
0e979c46fa | |
|
6cbe28272f | |
|
565e3d4091 | |
|
5e9fb86f9f | |
|
df16663594 | |
|
48f6a41838 | |
|
288aa9cf09 | |
|
9847cad6a9 | |
|
1be353aa1d | |
|
78b76bcd6c | |
|
14b0f2db47 | |
|
f577311277 | |
|
a580a1a516 | |
|
feb4a80222 | |
|
90dd04b1db | |
|
85b7ef1452 | |
|
280d160a7a | |
|
3d35f0029b | |
|
ee164eda7b | |
|
2436904931 | |
|
b470c6e11f | |
|
f0c6856a55 | |
|
42b5e7a827 | |
|
d748bb18d1 | |
|
8a02db31cf | |
|
ba42dd9f42 |
126
CHANGELOG.md
|
@ -5,6 +5,132 @@ 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.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
|
||||
|
||||
### Removed
|
||||
|
||||
- Removed burg, QT4 stuff, rsync 3.1 and the old browser
|
||||
|
||||
## [0.2.3] - 2025-03-28
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed some errors in Configurar.py, ogCreateCache, ogCreatePartitions and initCache.py
|
||||
|
||||
## [0.2.2] - 2025-03-26
|
||||
|
||||
### Fixed
|
||||
|
||||
- Prevent EjecutarScript.py from capturing the output of the script
|
||||
|
||||
## [0.2.1] - 2025-03-26
|
||||
|
||||
### Fixed
|
||||
|
|
|
@ -48,16 +48,22 @@ 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') {
|
||||
steps {
|
||||
dir("${env.BUILD_DIR}") {
|
||||
sh '''
|
||||
dpkg-buildpackage -us -uc
|
||||
mkdir -p ../artifacts && mv ../*.deb ../*.changes ../*.buildinfo ../artifacts/
|
||||
ssh aptly@172.17.8.68 "rm -rf /var/tmp/opengnsys/debian-repo/ogclient && mkdir -p /var/tmp/opengnsys/debian-repo/ogclient"
|
||||
scp -r ../artifacts/* aptly@172.17.8.68:/var/tmp/opengnsys/debian-repo/ogclient
|
||||
'''
|
||||
script {
|
||||
construirPaquete(env.BUILD_DIR, "../artifacts", "172.17.8.68", "/var/tmp/opengnsys/debian-repo/ogclient")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -69,7 +75,24 @@ pipeline {
|
|||
}
|
||||
agent { label 'debian-repo' }
|
||||
steps {
|
||||
sh "aptly repo add opengnsys-devel /var/tmp/opengnsys/debian-repo/ogclient/*.deb"
|
||||
script {
|
||||
// Construir el patrón de versión esperado en el nombre del paquete
|
||||
def versionPattern = "${env.TAG_NAME}-${env.BUILD_NUMBER}"
|
||||
publicarEnAptly('/var/tmp/opengnsys/debian-repo/ogclient', 'opengnsys-devel', versionPattern)
|
||||
}
|
||||
}
|
||||
}
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,13 +23,7 @@ case "$1" in
|
|||
cp -a "$OLD_FILE" "$NEW_FILE"
|
||||
|
||||
# Append our configuration
|
||||
echo "include = /etc/samba/smb-ogclient.conf" >> "$NEW_FILE"
|
||||
|
||||
# Use ucf to handle the file update
|
||||
ucf --debconf-ok "$NEW_FILE" "$OLD_FILE"
|
||||
|
||||
# Clean up
|
||||
rm -f "$NEW_FILE"
|
||||
echo "include = /etc/samba/smb-ogclient.conf" >> "$OLD_FILE"
|
||||
|
||||
# Reload Samba
|
||||
if command -v systemctl >/dev/null 2>&1; then
|
||||
|
@ -48,6 +42,8 @@ case "$1" in
|
|||
;;
|
||||
esac
|
||||
|
||||
chown -R opengnsys:opengnsys /opt/opengnsys/ogclient
|
||||
chown -R opengnsys:opengnsys /opt/opengnsys/ogclient_log
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Asegurarse de que el usuario exista
|
||||
USER="opengnsys"
|
||||
HOME_DIR="/opt/opengnsys"
|
||||
if id "$USER" &>/dev/null; then
|
||||
echo "El usuario $USER ya existe."
|
||||
else
|
||||
echo "Creando el usuario $USER con home en $HOME_DIR."
|
||||
useradd -m -d "$HOME_DIR" -s /bin/bash "$USER"
|
||||
fi
|
||||
|
||||
exit 0
|
|
@ -1,7 +1,7 @@
|
|||
[ogclient]
|
||||
comment = OpenGnsys Client
|
||||
browseable = no
|
||||
writeable = no
|
||||
writeable = yes
|
||||
locking = no
|
||||
path = /opt/opengnsys/ogclient
|
||||
guest ok = no
|
||||
|
|
|
@ -55,6 +55,9 @@ elif 6 == len (sys.argv):
|
|||
args = parser.parse_args()
|
||||
src = { 'container': args.src_container, 'file': args.src_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)
|
||||
if ret is not None:
|
||||
|
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
os.system ('pkill -f OGAgent')
|
||||
time.sleep (3)
|
||||
os.system ('poweroff')
|
||||
sys.exit (0)
|
||||
|
|
|
@ -75,8 +75,11 @@ for item in tbprm:
|
|||
elif 'tch' == k: tch = v
|
||||
|
||||
# Error si no se define el parámetro de disco (dis).
|
||||
if dis is None: sys.exit (ogGlobals.OG_ERR_FORMAT)
|
||||
if tch is None: tch = '0'
|
||||
if dis is None:
|
||||
coproc.kill()
|
||||
sys.exit (ogGlobals.OG_ERR_FORMAT)
|
||||
if tch is None:
|
||||
tch = '0'
|
||||
|
||||
# Toma valores de distribución de particiones, separados por "%".
|
||||
tbp = [] # Valores de configuración (parámetros para ogCreatePartitions)
|
||||
|
@ -111,6 +114,7 @@ for item in tbprm:
|
|||
if tam is None: missing_params.append ('tam')
|
||||
if missing_params:
|
||||
print (f'partition data ({item}) missing required parameters ({' '.join (missing_params)})')
|
||||
coproc.kill()
|
||||
sys.exit (1)
|
||||
|
||||
# Componer datos de particionado.
|
||||
|
@ -147,7 +151,11 @@ if not cur_ptt or ptt != cur_ptt:
|
|||
if 'CACHE' in sparam:
|
||||
SystemLib.ogEcho (['session', 'log'], None, f'[30] {ogGlobals.lang.MSG_HELP_ogCreateCache}')
|
||||
SystemLib.ogEcho (['session', 'log'], None, f' initCache {tch}')
|
||||
SystemLib.ogExecAndLog ('command', CacheLib.initCache, tch)
|
||||
rc = SystemLib.ogExecAndLog ('command', CacheLib.initCache, tch)
|
||||
if rc:
|
||||
SystemLib.ogRaiseError (['log', 'session'], ogGlobals.OG_ERR_CACHE, f'initCache failed')
|
||||
coproc.kill()
|
||||
sys.exit (1)
|
||||
|
||||
# Definir particionado.
|
||||
SystemLib.ogEcho (['session', 'log'], None, f'[50] {ogGlobals.lang.MSG_HELP_ogCreatePartitions}')
|
||||
|
|
|
@ -66,7 +66,7 @@ repo = arg_repo
|
|||
if not repo: repo = 'REPO'
|
||||
if repo == ogGetIpAddress(): repo = 'CACHE'
|
||||
# Si es una ip y es distinta a la del recurso samba cambiamos de REPO.
|
||||
if 'REPO' == repo or StringLib.ogCheckIpAddress (repo):
|
||||
if 'REPO' == repo or ogCheckIpAddress (repo):
|
||||
# Si falla el cambio -> salimos con error repositorio no valido
|
||||
if not ogChangeRepo (repo):
|
||||
ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, repo)
|
||||
|
|
|
@ -34,7 +34,7 @@ with open (ogGlobals.OGLOGFILE, 'a') as logfd:
|
|||
|
||||
os.chmod (script_path, 0o755)
|
||||
# Si mandamos la salida a OGLOGCOMMAND reescribimos lo que manda el comando.
|
||||
RETVAL = subprocess.run (['bash', script_path], capture_output=True, text=True).returncode
|
||||
RETVAL = subprocess.run (['bash', script_path]).returncode
|
||||
|
||||
|
||||
TIME = time.time() - TIME1
|
||||
|
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
os.system ('pkill -f OGAgent')
|
||||
time.sleep (3)
|
||||
os.system ('reboot')
|
||||
sys.exit (0)
|
||||
|
|
|
@ -19,11 +19,11 @@ import ogGlobals
|
|||
|
||||
if __name__ == '__main__':
|
||||
prog = sys.argv[0]
|
||||
if len (sys.argv) < 7:
|
||||
print (f'Usage: {prog} <disk> <partition> <image_name> <repo_ip> <protocol> <protocol_options> [additional_args...]')
|
||||
if len (sys.argv) < 6:
|
||||
print (f'Usage: {prog} <disk> <partition> <image_name> <repo_ip> <protocol> [protocol_options] [additional_args...]')
|
||||
sys.exit (1)
|
||||
|
||||
disk, par, imgname, repo, proto, protoopt, *extra = sys.argv[1:]
|
||||
disk, par, imgname, repo, proto, *extra = sys.argv[1:]
|
||||
|
||||
rc = subprocess.run ([f'{ogGlobals.OGSCRIPTS}/deployImage.py', repo, imgname, disk, par, proto, protoopt] + extra).returncode
|
||||
rc = subprocess.run ([f'{ogGlobals.OGSCRIPTS}/deployImage.py', repo, imgname, disk, par, proto] + extra).returncode
|
||||
sys.exit (rc)
|
||||
|
|
|
@ -74,4 +74,5 @@ else:
|
|||
|
||||
# Borramos marcas de arranque de Windows
|
||||
for f in glob.glob ('/mnt/*/ogboot.*') + glob.glob ('/mnt/*/*/ogboot.*'):
|
||||
os.unlink (f)
|
||||
try: os.unlink (f)
|
||||
except: pass
|
||||
|
|
Before Width: | Height: | Size: 136 B |
Before Width: | Height: | Size: 73 KiB |
|
@ -1,79 +0,0 @@
|
|||
include "theme"
|
||||
|
||||
screen {
|
||||
background = "$$/background.png"
|
||||
|
||||
panel {
|
||||
halign = center
|
||||
attach_vcenter = 0
|
||||
height = 19
|
||||
# Flip so the cursor defaults to the main menu
|
||||
direction = bottom_to_top
|
||||
|
||||
### Main Menu ###
|
||||
panel {
|
||||
height = 15
|
||||
max_width = 120
|
||||
margin_top = 1
|
||||
class = container-body
|
||||
# No need for a min width and centering panel because extended width > min width
|
||||
|
||||
direction = left_to_right
|
||||
anchor = 1
|
||||
id = __menu__
|
||||
}
|
||||
|
||||
panel {
|
||||
height = 4
|
||||
width = 100%
|
||||
class = container-title
|
||||
|
||||
direction = left_to_right
|
||||
|
||||
image {
|
||||
image = "$$/images/txt-select.png"
|
||||
attach_top = 0
|
||||
attach_left = 0
|
||||
}
|
||||
|
||||
### Tools Menu ###
|
||||
image {
|
||||
attach_right = 2
|
||||
image = "$$/images/button-tools.png:$$/images/button-tools-hover.png"
|
||||
command = "menu_popup tools_menu"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
### Progress Bar ###
|
||||
panel {
|
||||
halign = center
|
||||
attach_vcenter = 20
|
||||
width = 80
|
||||
class = progressbar-background
|
||||
id = __timeout__
|
||||
|
||||
progressbar { }
|
||||
}
|
||||
}
|
||||
|
||||
template_menuitem {
|
||||
panel {
|
||||
width = 40
|
||||
height = 12
|
||||
|
||||
parameters = "class=image.class:title=panel.text.text"
|
||||
|
||||
image {
|
||||
attach_vcenter = 0
|
||||
attach_hcenter = 0
|
||||
}
|
||||
|
||||
panel {
|
||||
attach_vcenter = 0
|
||||
attach_hcenter = 0
|
||||
class = text-line
|
||||
text { font = "Helvetica Regular 22" }
|
||||
}
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 1.5 KiB |
|
@ -1,21 +0,0 @@
|
|||
+class
|
||||
{
|
||||
-opengnsys { image = "$$/normal_opengnsys.png:$$/hover_opengnsys.png" }
|
||||
-windows10 { image = "$$/normal_windows10.png:$$/hover_windows10.png" }
|
||||
-windows7 { image = "$$/normal_windows7.png:$$/hover_windows7.png" }
|
||||
-windows { image = "$$/normal_windows.png:$$/hover_windows.png" }
|
||||
-elementary { image = "$$/normal_elementary.png:$$/hover_elementary.png" }
|
||||
-elementaryos { image = "$$/normal_elementary.png:$$/hover_elementary.png" }
|
||||
-recovery { image = "$$/normal_recovery.png:$$/hover_recovery.png" }
|
||||
-shutdown { image = "$$/normal_shutdown.png:$$/hover_shutdown.png" }
|
||||
-restart { image = "$$/normal_restart.png:$$/hover_restart.png" }
|
||||
-linux { image = "$$/normal_linux.png:$$/hover_linux.png" }
|
||||
-ubuntu { image = "$$/normal_ubuntu.png:$$/hover_ubuntu.png" }
|
||||
-debian { image = "$$/normal_debian.png:$$/hover_debian.png" }
|
||||
-suse { image = "$$/normal_opensuse.png:$$/hover_opensuse.png" }
|
||||
-freebsd { image = "$$/normal_freebsd.png:$$/hover_freebsd.png" }
|
||||
-macosx { image = "$$/normal_osx.png:$$/hover_osx.png" }
|
||||
-haiku { image = "$$/normal_haiku.png:$$/hover_haiku.png" }
|
||||
-image { image = "$$/normal_os.png:$$/hover_os.png" }
|
||||
-os { image = "$$/normal_os.png:$$/hover_os.png" }
|
||||
}
|
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 109 B |
Before Width: | Height: | Size: 146 B |
Before Width: | Height: | Size: 146 B |
Before Width: | Height: | Size: 525 B |
Before Width: | Height: | Size: 671 B |
Before Width: | Height: | Size: 725 B |
Before Width: | Height: | Size: 562 B |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 153 B |
Before Width: | Height: | Size: 146 B |
Before Width: | Height: | Size: 154 B |
Before Width: | Height: | Size: 154 B |
Before Width: | Height: | Size: 155 B |
Before Width: | Height: | Size: 148 B |
Before Width: | Height: | Size: 159 B |
Before Width: | Height: | Size: 144 B |
Before Width: | Height: | Size: 139 B |
Before Width: | Height: | Size: 139 B |
Before Width: | Height: | Size: 151 B |
Before Width: | Height: | Size: 181 B |
Before Width: | Height: | Size: 188 B |
Before Width: | Height: | Size: 154 B |
Before Width: | Height: | Size: 154 B |
Before Width: | Height: | Size: 135 B |
Before Width: | Height: | Size: 144 B |
Before Width: | Height: | Size: 177 B |
Before Width: | Height: | Size: 168 B |
Before Width: | Height: | Size: 131 B |
Before Width: | Height: | Size: 140 B |
Before Width: | Height: | Size: 135 B |
Before Width: | Height: | Size: 181 B |
Before Width: | Height: | Size: 188 B |
Before Width: | Height: | Size: 156 B |
Before Width: | Height: | Size: 169 B |
Before Width: | Height: | Size: 215 B |
Before Width: | Height: | Size: 346 B |
Before Width: | Height: | Size: 165 B |
Before Width: | Height: | Size: 155 B |
Before Width: | Height: | Size: 183 B |
Before Width: | Height: | Size: 186 B |
Before Width: | Height: | Size: 152 B |
Before Width: | Height: | Size: 254 B |
Before Width: | Height: | Size: 260 B |
Before Width: | Height: | Size: 253 B |
Before Width: | Height: | Size: 905 B |
Before Width: | Height: | Size: 423 B |