Integrate Core Desktop 24 as a Core subproject

This patch updates Core Desktop to version 24, and also makes
it a subproject of Core, so it shares nearly the whole project
files and simplifies maintenance. It is based on a proposal from
Michael Hudson-Doyle. https://git.launchpad.net/~mwhudson/livecd-rootfs/+git/livecd-rootfs/commit/?id=94cb68d47530a564060155f985f963f59786809f
ubuntu/oracular
Sergio Costas Rodriguez 5 months ago
parent ee0a30b589
commit d8fa3db5dc
No known key found for this signature in database
GPG Key ID: D4A5410CE1372A40

@ -20,8 +20,7 @@ fi
# Link output files somewhere launchpad-buildd will be able to find them.
PREFIX="livecd.$PROJECT${SUBARCH:+-$SUBARCH}"
if [ "${IMAGEFORMAT:-}" = "ubuntu-image" ] \
|| [ "$PROJECT" = "ubuntu-core-desktop" ]; then
if [ "${IMAGEFORMAT:-}" = "ubuntu-image" ]; then
# Use ubuntu-image instead (or as part) of live-build
export SNAPPY_STORE_NO_CDN=1
@ -47,37 +46,6 @@ if [ "${IMAGEFORMAT:-}" = "ubuntu-image" ] \
# All the builds are finished now, exit
exit 0
elif [ "$PROJECT" = "ubuntu-core-desktop" ]; then
# Ubuntu Core Desktop payload image
# Special case for ubuntu-core-desktop - we need to call
# ubuntu-image twice, once for the core image payload and
# then for the actual image.
echo "Building the core image payload"
cd config/
/snap/bin/ubuntu-image snap $UBUNTU_IMAGE_PAYLOAD_ARGS \
-O output ubuntu-core-desktop*.model-assertion
mv output/*.img pc.img
xz -0 -T4 pc.img
rm -rf output/
# Prepare the source catalogue
cat install-sources-in.yaml | sed "s/@SIZE@/$(stat -c%s pc.img.xz)/g" > ../"$PREFIX".install-sources.yaml
# We need to rename the image file so that it can be pulled
# by the builder.
mv pc.img.xz ../"$PREFIX".img.xz
# We need to make sure the autoinstall file is also exported.
mv autoinstall.yaml ../"$PREFIX".autoinstall.yaml
# Useful to have the model-assertion exported as well.
mv ubuntu-core-desktop*.model-assertion ../"$PREFIX".model-assertion
# Important: return to the previous directory
cd ../
# Payload build finished, but now we need to build the rest with the
# usual live-build tools.
else
# Ubuntu classic preinstalled images
/snap/bin/ubuntu-image classic --verbose $UBUNTU_IMAGE_ARGS \

@ -382,7 +382,7 @@ if [ -z "${IMAGEFORMAT:-}" ]; then
;;
esac
;;
ubuntu-server:live|ubuntu-mini-iso:|ubuntu-core-installer:)
ubuntu-server:live|ubuntu-mini-iso:|ubuntu-core-installer:*)
IMAGEFORMAT=plain
;;
esac
@ -422,7 +422,7 @@ case $IMAGEFORMAT in
;;
plain)
case $PROJECT:${SUBPROJECT:-} in
ubuntu-server:live|ubuntu-core-installer:)
ubuntu-server:live|ubuntu-core-installer:*)
touch config/universe-enabled
;;
ubuntu-mini-iso:)
@ -843,26 +843,6 @@ case $PROJECT in
esac
;;
ubuntu-core-desktop)
touch config/universe-enabled
KERNEL_FLAVOURS='generic-hwe-22.04'
PASSES_TO_LAYERS="true"
# the minimal layer, for minimal installs
add_task minimal minimal
# the live layer, contains all packages for the live session installer
add_snap minimal.live ubuntu-core-desktop-installer/classic core22 snapd
add_package minimal.live linux-$KERNEL_FLAVOURS plymouth-theme-spinner squashfs-tools snapd cloud-init gsettings-desktop-schemas yaru-theme-gtk lshw
echo "Configuring for additional payload preparation"
UBUNTU_IMAGE_PAYLOAD_ARGS="--image-size 12G"
EXTRA_SNAPS="$EXTRA_SNAPS evince firefox gnome-calculator gnome-characters gnome-clocks gnome-font-viewer gnome-logs gnome-system-monitor gnome-text-editor gnome-weather loupe snapd-desktop-integration snap-store ubuntu-core-desktop-init workshops"
for snap in $EXTRA_SNAPS; do
UBUNTU_IMAGE_PAYLOAD_ARGS="$UBUNTU_IMAGE_PAYLOAD_ARGS --snap $snap"
done
echo "UBUNTU_IMAGE_PAYLOAD_ARGS=\"$UBUNTU_IMAGE_PAYLOAD_ARGS\"" >> config/common
;;
ubuntu-oem)
HAS_MINIMAL=yes
MINIMAL_NAME="Ubuntu Desktop for OEM (minimal)"
@ -1058,6 +1038,9 @@ case $PROJECT in
# installer but it has a source catalog entry that points to the model
# created in ubuntu-core-installer/hooks/05-prepare-image.binary, which
# subiquity knows how to install.
if [ ${SUBPROJECT} == "desktop" ]; then
cp /usr/share/livecd-rootfs/live-build/${PROJECT}/ubuntu-core-desktop-24-amd64.model-assertion config/
fi
OPTS="${OPTS:+$OPTS }--bootstrap-flavour=minimal"
PASSES_TO_LAYERS=true
add_task base server-minimal server
@ -1443,7 +1426,7 @@ case $PROJECT:${SUBPROJECT:-} in
ubuntu-cpc:*|ubuntu-server:live|ubuntu:desktop-preinstalled| \
ubuntu-wsl:*|ubuntu-mini-iso:*|ubuntu:|ubuntu-oem:*| \
ubuntustudio:*|edubuntu:*|ubuntu-budgie:*|ubuntucinnamon:*|xubuntu:*| \
ubuntukylin:*|ubuntu-mate:*|ubuntu-core-desktop:*|ubuntu-core-installer:*)
ubuntukylin:*|ubuntu-mate:*|ubuntu-core-installer:*)
# Ensure that most things e.g. includes.chroot are copied as is
for entry in /usr/share/livecd-rootfs/live-build/${PROJECT}/*; do
case $entry in

@ -1,12 +0,0 @@
version: 1
source:
id: ubuntu-core-desktop
search_drivers: false
interactive-sections:
- locale
- keyboard
- storage
identity:
username: ubuntu
password: '$1$zB3Qu2ef$TKLhQpQlKRyCZGUdHFFMH/'
hostname: ubuntu

@ -1,21 +0,0 @@
#! /bin/sh
set -eu
case ${PASS:-} in
minimal.live)
;;
*)
exit 0
;;
esac
mkdir -p "/etc/initramfs-tools/conf.d"
cat <<EOF > /etc/initramfs-tools/conf.d/casperize.conf
export CASPER_GENERATE_UUID=1
EOF
cat <<EOF > /etc/initramfs-tools/conf.d/default-layer.conf
LAYERFS_PATH=${PASS}.squashfs
EOF

@ -1,117 +0,0 @@
# The top level settings are used as module
# and system configuration.
# A set of users which may be applied and/or used by various modules
# when a 'default' entry is found it will reference the 'default_user'
# from the distro configuration specified below
users:
- default
# If this is set, 'root' will not be able to ssh in and they
# will get a message to login instead as the default $user
disable_root: true
# This will cause the set+update hostname module to not operate (if true)
preserve_hostname: true
ssh_pwauth: yes
chpasswd:
expire: false
# This is the initial network config.
# It can be overwritten by cloud-init or subiquity.
network:
version: 2
ethernets:
zz-all-en:
match:
name: "en*"
dhcp4: true
zz-all-eth:
match:
name: "eth*"
dhcp4: true
# We used to have a custom final_message here. Just use the default instead.
# Example datasource config
# datasource:
# Ec2:
# metadata_urls: [ 'blah.com' ]
# timeout: 5 # (defaults to 50 seconds)
# max_wait: 10 # (defaults to 120 seconds)
# The modules that run in the 'init' stage
cloud_init_modules:
- bootcmd
- write-files
- ca-certs
- rsyslog
- users-groups
- ssh
# The modules that run in the 'config' stage
cloud_config_modules:
# Emit the cloud config ready event
# this can be used by upstart jobs for 'start on cloud-config'.
- ssh-import-id
- set-passwords
- timezone
- disable-ec2-metadata
- runcmd
# The modules that run in the 'final' stage
cloud_final_modules:
- scripts-per-once
- scripts-user
- ssh-authkey-fingerprints
- keys-to-console
- phone-home
- final-message
# System and/or distro specific settings
# (not accessible to handlers/transforms)
system_info:
# This will affect which distro class gets used
distro: ubuntu
# Default user name + that default users groups (if added/used)
default_user:
name: installer
lock_passwd: false
gecos: Ubuntu
groups: [adm, audio, cdrom, dialout, dip, floppy, lxd, netdev, plugdev, sudo, video]
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
shell: /usr/bin/subiquity-shell
# Automatically discover the best ntp_client
ntp_client: auto
# Other config here will be given to the distro class and/or path classes
paths:
cloud_dir: /var/lib/cloud/
templates_dir: /etc/cloud/templates/
upstart_dir: /etc/init/
package_mirrors:
- arches: [i386, amd64]
failsafe:
primary: http://archive.ubuntu.com/ubuntu
security: http://security.ubuntu.com/ubuntu
search:
primary:
- http://%(ec2_region)s.ec2.archive.ubuntu.com/ubuntu/
- http://%(availability_zone)s.clouds.archive.ubuntu.com/ubuntu/
- http://%(region)s.clouds.archive.ubuntu.com/ubuntu/
security: []
- arches: [arm64, armel, armhf]
failsafe:
primary: http://ports.ubuntu.com/ubuntu-ports
security: http://ports.ubuntu.com/ubuntu-ports
search:
primary:
- http://%(ec2_region)s.ec2.ports.ubuntu.com/ubuntu-ports/
- http://%(availability_zone)s.clouds.ports.ubuntu.com/ubuntu-ports/
- http://%(region)s.clouds.ports.ubuntu.com/ubuntu-ports/
security: []
- arches: [default]
failsafe:
primary: http://ports.ubuntu.com/ubuntu-ports
security: http://ports.ubuntu.com/ubuntu-ports
ssh_svcname: ssh

@ -1,4 +0,0 @@
output: {all: '>> /var/log/cloud-init-output.log'}
no_ssh_fingerprints: true
ssh:
emit_keys_to_console: false

@ -1,4 +0,0 @@
# systemd in 23.04+ uses a newer "compact" format by default which is not
# understood by the systemd libraries from jammy used in the subiquity snap.
[Service]
Environment="SYSTEMD_JOURNAL_COMPACT=0"

@ -1,4 +0,0 @@
# systemd in 22.04+ uses "hash table hardening" by default which is not
# understood by the systemd libraries from focal used in the subiquity snap.
[Service]
Environment="SYSTEMD_JOURNAL_KEYED_HASH=0"

@ -1,3 +0,0 @@
[Service]
ExecStart=
ExecStart=-/sbin/agetty --noclear -n --autologin ubuntu-server %I $TERM

@ -1,9 +0,0 @@
[Unit]
Description=Subiquity, the installer for Ubuntu Server %I
After=snapd.seeded.service
StartLimitInterval=0
[Service]
Environment=SNAP_REEXEC=0
ExecStart=
ExecStart=/usr/bin/snap run subiquity.subiquity-service %I

@ -1,14 +0,0 @@
[Unit]
IgnoreOnIsolate=yes
After=systemd-user-sessions.service plymouth-quit-wait.service snap.seeded.service
[Service]
Environment=SNAP_REEXEC=0
UtmpIdentifier=tty1
TTYPath=/dev/tty1
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes

@ -1,4 +0,0 @@
[Mount]
What=/dev/disk/by-uuid/00c629d6-06ab-4dfd-b21e-c3186f34105d
Where=/subiquity_config
Type=ext4

@ -1,9 +0,0 @@
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

@ -1,11 +0,0 @@
- default: true
description:
en: Ubuntu Core Desktop.
id: ubuntu-core-desktop
locale_support: none
name:
en: Ubuntu Core Desktop
path: filesystem.img.xz
type: dd-xz:file
size: @SIZE@
variant: core

@ -1,187 +0,0 @@
type: model
authority-id: canonical
revision: 5
series: 16
brand-id: canonical
model: ubuntu-core-desktop-22-amd64
architecture: amd64
base: core22-desktop
display-name: Ubuntu Core Desktop 22 (amd64)
grade: signed
snaps:
-
default-channel: 22/stable
id: mZqHskGgGDECRCKP7h7ef3Rl2wTwyNfy
name: pc-desktop
type: gadget
-
default-channel: 23.10/stable
id: pYVQrBcKmBa0mZ4CCN7ExT6jH8rY1hza
name: pc-kernel
type: kernel
-
default-channel: latest/edge/ubuntu-core-desktop
id: PMrrV4ml8uWuEUDBT8dSGnKUYbevVhc4
name: snapd
type: snapd
-
default-channel: latest/stable
id: qRMmQqNDz8kRUTqFIgqk2RzNNoC7jUZ6
name: core22-desktop
type: base
-
default-channel: latest/stable
id: LVkazk0JLrL0ivuHRlv3wp3bK1nAgwtN
name: ubuntu-desktop-session
type: app
-
default-channel: latest/stable
id: amcUKQILKXHHTlmSa7NMdnXSx02dNeeT
name: core22
type: base
-
default-channel: 22/stable
id: RmBXKl6HO6YOC2DE4G2q1JzWImC04EUy
name: network-manager
type: app
-
default-channel: latest/stable
id: EISPgh06mRh1vordZY9OZ34QHdd7OrdR
name: bare
type: base
-
default-channel: latest/stable
id: jZLfBRzf1cYlYysIjD2bwSzNtngY0qit
name: gtk-common-themes
type: app
-
default-channel: latest/stable
id: lATO8HzwVvrAPrlZRAWpfyrJKlAJrZS3
name: gnome-42-2204
type: app
-
default-channel: latest/stable
id: m1eQacDdXCthEwWQrESei3Zao3d5gfJF
name: cups
type: app
-
default-channel: latest/stable
id: WJKWBUuCDufOFw2p24tvkbbw02plGkbd
name: ipp-usb
type: app
-
default-channel: 22/stable
id: dVK2PZeOLKA7vf1WPCap9F8luxTk9Oll
name: avahi
type: app
-
default-channel: 22/stable
id: JmzJi9kQvHUWddZ32PDJpBRXUpGRxvNS
name: bluez
type: app
-
default-channel: latest/stable
id: Si21Q1kjaZpyJ8TfGbAnxJ4y6KMv7FuW
name: loupe
presence: optional
type: app
-
default-channel: latest/stable
id: EDFg87ESUg9sAIlm0Vm5Wmr0LjiEonSm
name: evince
presence: optional
type: app
-
default-channel: latest/stable/ubuntu-23.10
id: 3wdHCAVyZEmYsCMFDE9qt92UV8rC8Wdk
name: firefox
presence: optional
type: app
-
default-channel: latest/stable
id: J8OcDPQ0JM8dbvk29HRqpWVI9kBw0atG
name: gnome-calculator
presence: optional
type: app
-
default-channel: latest/stable
id: qJcS3UjpF9AMJKWAiKwA5EWbm0y6Uduw
name: gnome-characters
presence: optional
type: app
-
default-channel: latest/stable
id: 8NtSF2nXW6krsxbXBYydy1j985k6ZsVK
name: gnome-clocks
presence: optional
type: app
-
default-channel: latest/stable
id: BzJuWXmCIpyjUKotXPWU2psnl8gEh4hm
name: gnome-font-viewer
presence: optional
type: app
-
default-channel: latest/stable
id: kIMfmZTJspWa8vtfbgU3W9Nbv4V5Qgmh
name: gnome-logs
presence: optional
type: app
-
default-channel: latest/stable
id: PZj2sEabMQrVUV1HKZmmmXSk3E6wKC9i
name: gnome-text-editor
presence: optional
type: app
-
default-channel: latest/stable
id: LhzK7p8214jufMYx1kz43QkWhFnOKdbr
name: gnome-weather
presence: optional
type: app
-
default-channel: latest/stable
id: J60k4JY0HppjwOjW8dZdYc8obXKxujRu
name: lxd
type: app
-
default-channel: latest/edge/ubuntu-core-desktop
id: IrwRHakqtzhFRHJOOPxKVPU0Kk7Erhcu
name: snapd-desktop-integration
type: app
-
default-channel: latest/stable/ubuntu-23.10
id: gjf3IPXoRiipCu9K0kVu52f0H56fIksg
name: snap-store
type: app
-
default-channel: latest/stable
id: JMjaFobGn56fh1HepiaGuCxQgbWYnHc8
name: workshops
presence: optional
type: app
-
default-channel: latest/stable
id: 9BTClmjz31r0UltmbJ5nnGe0Xm1AzfMp
name: gnome-system-monitor
presence: optional
type: app
-
default-channel: latest/stable
id: xODwiAdjx9KGChvI1z9Xx2JWJE7oLFF6
name: ubuntu-core-desktop-init
type: app
storage-safety: prefer-encrypted
timestamp: 2023-10-21T10:19:41+00:00
sign-key-sha3-384: 9tydnLa6MTJ-jaQTFUXEwHl1yRx7ZS4K5cyFDhYDcPzhS7uyEkDxdUjg9g08BtNn
AcLBXAQAAQoABgUCZTP+wgAKCRDgT5vottzAEia0D/9FyEOb4Qai+sJQ/ilVqZ1L0FicTIwa9/Ae
khv5xXYGmukSzkIUGNYjvcCJByxgMiDsFOIIzrOYlJPmRFtdFOwm3KGS2JGthIUbQfElVbyPswZh
cgqYVuGMiRw8udlZHOmy2rWIKxo/uLMEsZzZuk83nC+ZzAoQoHOmcELuRtIc1qz9XAf6n7pd79S2
10cxG7vuaA1iVbqqtbSlQCAdKTdOCxw2/NHTZ8mIRtAQZGA1LP8IMEyv2Fi3FVpmN2derV78sO3f
kCf/KdYeD6d1a03WchIDsuPlvTpTOU3TSX07QWj+WrZHMDh9gpQHDdSIWswBCPIHa10R6aDRRUUK
/5dJDq77/CyY/Q/ivcAuFiTceghKVcx3Zci+VX2WgvLK9qYHYHSilb70nTvsDFUA/bKep57/xqeG
j03cvUaqHb6li2T2SmyzaQOGV5MF6XxlhcLWY19PHc2/ocLpukL4vxkl18Ur3FoYAOLODwrlxueS
FDu7u+qf+Ki2+f0ZtN70EPcFAQAJ4C0N6f9j9Z+9BQptTlVwrIzIUxIwxtkp27YvERno6bZPBRYs
T4YdzVSdPKXsItT/GUiqYwdgPTi61FZXTN/47yIaHZLUwMT9gg/9XgNqIHKIdFHxm6GWVxL0AqOp
JPIfqrsmVbewevzwV1Rgo1LbPKVVrjqPtW0QQlkS8w==

@ -13,13 +13,27 @@ esac
. config/binary
. config/functions
env SNAPPY_STORE_NO_CDN=1 snap known --remote model series=16 brand-id=canonical model=ubuntu-core-24-amd64 > config/ubuntu-core-24-amd64.model
case ${SUBPROJECT} in
desktop)
env SNAPPY_STORE_NO_CDN=1 snap prepare-image \
config/ubuntu-core-desktop-24-amd64.model-assertion --snap firefox chroot
cat <<-EOF > config/edge.catalog-in.yaml
name: "Ubuntu Core Desktop 24"
description: >-
Ubuntu Core Desktop.
id: ubuntu-core-desktop
type: null
variant: core
locale_support: none
snapd_system_label: ubuntu-core-desktop-24-amd64
EOF
mv chroot/system-seed/systems/* chroot/system-seed/systems/ubuntu-core-desktop-24-amd64
;;
*)
env SNAPPY_STORE_NO_CDN=1 snap known --remote model series=16 brand-id=canonical model=ubuntu-core-24-amd64 > config/ubuntu-core-24-amd64.model
env SNAPPY_STORE_NO_CDN=1 snap prepare-image \
config/ubuntu-core-24-amd64.model --snap console-conf chroot
mv chroot/system-seed/systems/* chroot/system-seed/systems/ubuntu-core-24-amd64
rsync -av chroot/system-seed/{systems,snaps} chroot/var/lib/snapd/seed
rm -rf chroot/system-seed
cat <<-EOF > config/edge.catalog-in.yaml
name: "Ubuntu Core 24"
@ -31,6 +45,13 @@ variant: core
locale_support: none
snapd_system_label: ubuntu-core-24-amd64
EOF
mv chroot/system-seed/systems/* chroot/system-seed/systems/ubuntu-core-24-amd64
;;
esac
rsync -av chroot/system-seed/{systems,snaps} chroot/var/lib/snapd/seed
rm -rf chroot/system-seed
PROJECT_FULL=$PROJECT${SUBARCH:+-$SUBARCH}
usc_opts="--output livecd.${PROJECT_FULL}.install-sources.yaml \
--template config/edge.catalog-in.yaml \

@ -0,0 +1,120 @@
type: model
authority-id: canonical
series: 16
brand-id: canonical
model: ubuntu-core-desktop-24-amd64
architecture: amd64
base: core24-desktop
display-name: Ubuntu Core Desktop 24 (amd64)
grade: signed
snaps:
-
default-channel: 24/stable
id: mZqHskGgGDECRCKP7h7ef3Rl2wTwyNfy
name: pc-desktop
type: gadget
-
default-channel: 24-hwe/stable
id: pYVQrBcKmBa0mZ4CCN7ExT6jH8rY1hza
name: pc-kernel
type: kernel
-
default-channel: latest/edge/ubuntu-core-desktop
id: PMrrV4ml8uWuEUDBT8dSGnKUYbevVhc4
name: snapd
type: snapd
-
default-channel: latest/stable
id: GY5GohJ4F1ZsWpkosG0joeZyDfHzTZrD
name: core24-desktop
type: base
-
default-channel: 24/stable
id: LVkazk0JLrL0ivuHRlv3wp3bK1nAgwtN
name: ubuntu-desktop-session
type: app
-
default-channel: latest/stable
id: amcUKQILKXHHTlmSa7NMdnXSx02dNeeT
name: core22
type: base
-
default-channel: latest/stable
id: dwTAh7MZZ01zyriOZErqd1JynQLiOGvM
name: core24
type: base
-
default-channel: 24/stable
id: RmBXKl6HO6YOC2DE4G2q1JzWImC04EUy
name: network-manager
type: app
-
default-channel: latest/stable
id: EISPgh06mRh1vordZY9OZ34QHdd7OrdR
name: bare
type: base
-
default-channel: latest/stable
id: jZLfBRzf1cYlYysIjD2bwSzNtngY0qit
name: gtk-common-themes
type: app
-
default-channel: latest/stable
id: lATO8HzwVvrAPrlZRAWpfyrJKlAJrZS3
name: gnome-42-2204
type: app
-
default-channel: latest/stable
id: m1eQacDdXCthEwWQrESei3Zao3d5gfJF
name: cups
type: app
-
default-channel: latest/stable
id: WJKWBUuCDufOFw2p24tvkbbw02plGkbd
name: ipp-usb
type: app
-
default-channel: 24/stable
id: dVK2PZeOLKA7vf1WPCap9F8luxTk9Oll
name: avahi
type: app
-
default-channel: 24/stable
id: JmzJi9kQvHUWddZ32PDJpBRXUpGRxvNS
name: bluez
type: app
-
default-channel: latest/stable/ubuntu-24.04
id: 3wdHCAVyZEmYsCMFDE9qt92UV8rC8Wdk
name: firefox
presence: optional
type: app
-
default-channel: latest/edge/ubuntu-core-desktop
id: IrwRHakqtzhFRHJOOPxKVPU0Kk7Erhcu
name: snapd-desktop-integration
type: app
-
default-channel: latest/stable/ubuntu-24.04
id: gjf3IPXoRiipCu9K0kVu52f0H56fIksg
name: snap-store
type: app
-
default-channel: latest/candidate
id: tBdYpKjXcW5farGGJaWiYXrxIwMVMtx5
name: ubuntu-desktop-init
type: app
storage-safety: prefer-encrypted
timestamp: 2024-07-04T10:33:44+08:00
sign-key-sha3-384: 9tydnLa6MTJ-jaQTFUXEwHl1yRx7ZS4K5cyFDhYDcPzhS7uyEkDxdUjg9g08BtNn
AcLBXAQAAQoABgUCZoYTygAKCRDgT5vottzAEnlLD/4toc4w5IiLm/xmBFL8BVwXXVQsvNNtVYaT
NGSa+q7OJXeVbPQnnRMK4oH31IbGFngK3IHoc04LK76W2GQzAE4SQxTcV9VTlyPrVc6OeCn9rSWj
zFX/fOVuD5Wd6OOgNitaHqVHh8CDQFcsdOBICImHG6s0Au1mIDVQvV/DxcnnprJ53yXFCeastuX+
CnZiB6wOv/dzGHnIbhpUtKg5HV5jZoIkmplWAZr1IXd8gAPvltDzpJYwN6GMHK6SLUD1tgviP4ZB
gw9IT11DCeB9TOEnsAs7y1YApUdkxMSv4B+Jwew/lkjysncULqFCt6fCD3HEw+OdULb/OrFnYcSV
4NqPBop/9mi+CB5Fs3ubtlKxK9VnSJbLpXsyBeDvljVKp0MvNBpCTJnlGtRvQE/bHLpaAhRRsP0R
6cUqd1ieRm4wp/1/v+zMjdp6VL7co0/a6jZgtfptCMnCC6Z0KdLWGQjaXDwxNStqMK3h/Au2YWDc
ZgZ/+wTxMlDyU4i4gg+rByV2yPHfGeVpN7D7nuY8OWXq1ezESY6K5fsOW77/XEjZJOI3BFOJ6Xnl
2ATKBs6uSmMPQSZo21sk+E0c2gH8qj6L6mUcAz2qvilur9w4uEM3TRfZcAKPN+8lV44eB8/aZpq7
GfjsXFa+DpXJzWdC91SP4yIeojoj3OAl4gNwt0c85g==
Loading…
Cancel
Save