# 由 scripts/flatten-kickstart.sh 自动生成，请勿手改。
# 源入口: /data/workspace/oc-live-compose/kickstarts/desktop-live.ks
# 生成时间: 2026-07-23T18:23:42+08:00

# >>> BEGIN include: /data/workspace/oc-live-compose/kickstarts/desktop-live.ks

# =============================================================================
# OpenCloudOS Live Desktop — Kickstart 主入口
# =============================================================================
# livemedia-creator / Koji spin-livemedia。
# 含：EPOL 扩展 RPM + vendor/ 离线 zip。不含：自定义内核；非 Live 安装 ISO。
# livemedia 请 flatten（compose-livemedia.sh 会做）。在仓库根执行。
#version=RHEL9


# >>> BEGIN include: /data/workspace/oc-live-compose/modules/00-session-defaults.ks

# =============================================================================
# 【模块】00 — Live 会话默认项
# =============================================================================
# 说明：
#   这些值只影响 Live 试用会话的默认环境。
#   安装到硬盘后的语言/时区等，由 GNOME 首启向导（gnome-initial-setup）处理。
#
# 注意：不要写 graphical / text / cmdline —— livemedia-creator 会拒绝。
#
# lang 在 compose 阶段用 en_US：Anaconda 进度走英文 ASCII，避免本机 pylorax
# 按管道块严格 UTF-8 解码时截断中文多字节而崩溃（无需改宿主 /usr）。
# Live 默认中文在 post/30 写 /etc/locale.conf（并装 langpack）。
# =============================================================================

lang en_US.UTF-8
keyboard us
timezone Asia/Shanghai --utc

network --bootproto=dhcp --device=link --activate

# ---- livemedia-creator / Anaconda 组装磁盘镜像时需要 ----
# （装到用户硬盘仍由桌面 liveinst 完成；这里只服务 compose。）
shutdown
bootloader --location=none
clearpart --all --initlabel
reqpart
# 根文件系统镜像大小（MB）。不写时过小，桌面+firmware 装不下。
part / --fstype=ext4 --size=10240

firewall --enabled
selinux --enforcing
services --enabled=NetworkManager,gdm --disabled=sshd

# 关闭首启向导对 Live 用户的干扰；安装后的系统会由清理钩子重新打开
firstboot --disable

# <<< END include: /data/workspace/oc-live-compose/modules/00-session-defaults.ks


# >>> BEGIN include: /data/workspace/oc-live-compose/modules/10-repos.ks

# =============================================================================
# 【模块】10 — 软件源
# =============================================================================
# Anaconda：一条 url（BaseOS）+ 其余 repo。勿命名 updates。
# EPOL：DING / AppIndicator 等。
# =============================================================================

url --url=https://mirrors.opencloudos.tech/opencloudos/9.6/BaseOS/x86_64/os/
repo --name=OC9AppStream --baseurl=https://mirrors.opencloudos.tech/opencloudos/9.6/AppStream/x86_64/os/
repo --name=OC9Extras --baseurl=https://mirrors.opencloudos.tech/opencloudos/9.6/extras/x86_64/os/
repo --name=OC9EPOL --baseurl=https://mirrors.opencloudos.tech/epol/9/Everything/x86_64/os/

# <<< END include: /data/workspace/oc-live-compose/modules/10-repos.ks



# >>> BEGIN include: /data/workspace/oc-live-compose/modules/packages/20-desktop-base.ks

# =============================================================================
# 【模块】20 — 桌面基础软件包
# =============================================================================
# 环境组 Server with GUI。组名若与目标发行版不一致，用 dnf group list 核对后改本文件。
# --ignoremissing：个别可选包缺失时不中断 compose。
# =============================================================================

%packages --ignoremissing
# 最小系统基座（保证 glibc/bash 等从 BaseOS 进入事务）
@core

# 桌面环境组（GNOME + 服务器带 GUI）
@^Server with GUI

# 图形与会话常用组件（组已覆盖大部分；显式列出便于审计）
gdm
gnome-initial-setup
NetworkManager
shadow-utils
# Live 默认中文（locale.conf 在 post/30）；compose 时 ks lang 为 en_US
glibc-langpack-zh
langpacks-zh_CN

# 默认图形目标依赖（%post 里会 systemctl set-default）
kernel
grub2
grub2-efi-x64
grub2-efi-x64-cdboot
shim-x64
efibootmgr
%end

# <<< END include: /data/workspace/oc-live-compose/modules/packages/20-desktop-base.ks


# >>> BEGIN include: /data/workspace/oc-live-compose/modules/packages/21-hardware.ks

# =============================================================================
# 【模块】21 — 常用硬件支持包
# =============================================================================
# --ignoremissing：源里没有的包跳过，不中断 compose。
# =============================================================================

%packages --ignoremissing
# ---- 网络 / Wi-Fi ----
NetworkManager-wifi
NetworkManager-bluetooth
wpa_supplicant
wireless-regdb
iw
rfkill

# ---- 蓝牙 ----
bluez
bluez-cups
bluez-hid2hci
bluez-libs
bluez-obexd
gnome-bluetooth
gnome-bluetooth-libs
pulseaudio-module-bluetooth

# ---- Firmware（笔记本/台式机常见覆盖）----
linux-firmware
linux-firmware-whence
alsa-firmware
alsa-sof-firmware
alsa-tools-firmware
amd-gpu-firmware
amd-ucode-firmware
atheros-firmware
brcmfmac-firmware
cirrus-audio-firmware
dvb-firmware
intel-audio-firmware
intel-gpu-firmware
intel-vsc-firmware
iwlegacy-firmware
iwlwifi-dvm-firmware
iwlwifi-mld-firmware
iwlwifi-mvm-firmware
libertas-firmware
mt7xxx-firmware
netronome-firmware
nvidia-gpu-firmware
nxpwireless-firmware
qcom-accel-firmware
qcom-firmware
qcom-wwan-firmware
qed-firmware
realtek-firmware
tiwilink-firmware

# ---- 触控板 / 传感器 / 指纹 / 笔记本 I/O ----
libinput
xorg-x11-drv-libinput
libwacom
libwacom-data
iio-sensor-proxy
fprintd
fprintd-pam
bolt
upower
power-profiles-daemon
thermald
%end

# <<< END include: /data/workspace/oc-live-compose/modules/packages/21-hardware.ks


# >>> BEGIN include: /data/workspace/oc-live-compose/modules/packages/22-gnome-extensions-rpm.ks

# =============================================================================
# 【模块】22 — GNOME Shell 扩展（发行版已打包的 RPM）
# =============================================================================
# drive-menu：AppStream；appindicator / desktop-icons-ng（DING）：EPOL（见 10-repos.ks）
# 不用 --ignoremissing：缺源或缺包应直接失败，避免桌面图标静默丢失。
# Zip 扩展（Dash to Panel 等）在 modules/post/31 从 vendor/ 离线安装（Koji 无外网）。
# python3：桌面组通常已有；显式列出便于审计。
# =============================================================================

%packages
python3
gnome-shell-extension-drive-menu
gnome-shell-extension-appindicator
gnome-shell-extension-desktop-icons-ng
%end


# <<< END include: /data/workspace/oc-live-compose/modules/packages/22-gnome-extensions-rpm.ks


# >>> BEGIN include: /data/workspace/oc-live-compose/modules/packages/23-live-installer.ks

# =============================================================================
# 【模块】23 — Live 安装器 / Live 启动运行时
# =============================================================================
# 服务「边用边装」；装到硬盘后由清理钩子移除（见 post/33）。
# =============================================================================

%packages --ignoremissing
# ---- Anaconda（桌面 liveinst）----
anaconda
anaconda-core
anaconda-gui
anaconda-tui

# ---- LiveOS / squashfs 启动 ----
dracut-live
dracut-squash
device-mapper
kpartx

# ---- Anaconda 存储栈插件 ----
libblockdev-dm
libblockdev-lvm
libblockdev-mpath
libblockdev-nvdimm

# ---- Live 会话辅助 ----
sudo
polkit
passwd
%end

# <<< END include: /data/workspace/oc-live-compose/modules/packages/23-live-installer.ks



# >>> BEGIN include: /data/workspace/oc-live-compose/modules/15-live-user.ks

# =============================================================================
# 【模块】15 — Live 用户账户
# =============================================================================
# 说明：
#   - Live 会话使用无密码 liveuser，并加入 wheel，配合免密 sudo（见 post/30）。
#   - root 锁定，避免 Live 环境留下可用 root 密码。
#   - 安装到目标盘后，清理钩子会删除 liveuser，并打开 gnome-initial-setup。
# =============================================================================

rootpw --lock
user --name=liveuser --gecos="Live User" --groups=wheel --password="" --plaintext

# <<< END include: /data/workspace/oc-live-compose/modules/15-live-user.ks



# >>> BEGIN include: /data/workspace/oc-live-compose/modules/post/30-live-session.ks

# =============================================================================
# 【模块】30 — Live 会话 %post
# =============================================================================
# 确保 liveuser 存在、清空密码、免密 sudo、GDM 自动登录、关 sshd、图形目标。
# =============================================================================

%post --erroronfail --log=/root/oc-live-compose-30-live-session.log
set -eux

LIVE_USER="liveuser"

# ---- 账户：kickstart user 若未生效，这里补建 ----
if ! id "${LIVE_USER}" >/dev/null 2>&1; then
  # %post 默认 PATH 往往不含 /usr/sbin
  /usr/sbin/useradd -m -G wheel -c "Live User" "${LIVE_USER}"
fi
/usr/bin/passwd -d "${LIVE_USER}" >/dev/null || true

# ---- 免密 sudo（仅 Live；安装后由清理钩子删除）----
mkdir -p /etc/sudoers.d
cat > /etc/sudoers.d/99-opencloudos-live-user <<EOF
${LIVE_USER} ALL=(ALL) NOPASSWD: ALL
EOF
chmod 0440 /etc/sudoers.d/99-opencloudos-live-user

# ---- GDM：自动登录 liveuser，关闭 Live 上的首启向导 ----
mkdir -p /etc/gdm
cat > /etc/gdm/custom.conf <<EOF
[daemon]
AutomaticLoginEnable=True
AutomaticLogin=${LIVE_USER}
InitialSetupEnable=false
EOF

# ---- 服务策略（不用 systemctl，避免 chroot 里拖住宿主 /sys 挂载）----
mkdir -p /etc/systemd/system
ln -sfn /usr/lib/systemd/system/graphical.target /etc/systemd/system/default.target
rm -f /etc/systemd/system/multi-user.target.wants/sshd.service \
      /etc/systemd/system/sshd.service \
      /etc/systemd/system/sshd-keygen.target \
      /etc/systemd/system/multi-user.target.wants/sshd-keygen.target \
      2>/dev/null || true

# ---- Live 默认中文（ks lang 为避开 pylorax UTF-8 坑用了 en_US）----
printf 'LANG=zh_CN.UTF-8\n' > /etc/locale.conf

# 不改动 D-Bus provider：跟随发行版默认（OpenCloudOS 多为 dbus-broker）
%end

# <<< END include: /data/workspace/oc-live-compose/modules/post/30-live-session.ks


# >>> BEGIN include: /data/workspace/oc-live-compose/modules/post/31-gnome-extensions.ks

# =============================================================================
# 【模块】31 — GNOME 扩展：离线 zip 安装 + dconf 默认启用
# =============================================================================
# 对照：oc-desktop-image/scripts/12-install-gnome-extension.sh
#
# RPM 扩展（模块 22 + EPOL）：drive-menu / appindicator / desktop-icons-ng(DING)
# Zip 扩展：从仓库 vendor/gnome-shell-extensions/*.zip 离线解压（Koji 无外网）。
#   清单：config/gnome-extensions-zip.list
#   刷新（有外网的维护机）：bash scripts/vendor-gnome-extensions.sh
#
# 使用 %post --nochroot：读宿主 vendor/，写入安装根（Anaconda：/mnt/sysimage）。
# 须 livemedia --no-virt；在仓库根 compose（或设 OC_LIVE_COMPOSE_ROOT）。
# =============================================================================

%post --nochroot --erroronfail
set -eux

INSTALL_ROOT="${INSTALL_ROOT:-/mnt/sysimage}"
[[ -d "$INSTALL_ROOT/usr" ]] || {
  echo "错误: 安装根不可用: $INSTALL_ROOT" >&2
  exit 1
}

LOG="$INSTALL_ROOT/root/oc-live-compose-31-gnome-extensions.log"
mkdir -p "$INSTALL_ROOT/root"
exec > >(tee -a "$LOG") 2>&1

# 仓库根：compose 的 CWD；也可用 OC_LIVE_COMPOSE_ROOT 覆盖
REPO_ROOT="${OC_LIVE_COMPOSE_ROOT:-$(pwd)}"
VENDOR_DIR="${REPO_ROOT}/vendor/gnome-shell-extensions"
[[ -d "$VENDOR_DIR" ]] || {
  echo "错误: 找不到离线扩展目录: $VENDOR_DIR" >&2
  echo "请在仓库根执行 compose（livemedia --no-virt），并准备 vendor/*.zip" >&2
  exit 1
}

command -v python3 >/dev/null || {
  echo "错误: 构建机无 python3" >&2
  exit 1
}

EXT_ROOT="$INSTALL_ROOT/usr/share/gnome-shell/extensions"
mkdir -p "$EXT_ROOT"

# 与 config/gnome-extensions-zip.list 一致
EXTENSIONS="
dash-to-panel@jderose9.github.com
arcmenu@arcmenu.com
clipboard-indicator@tudmotu.com
"

install_one_zip() {
  local uuid="$1"
  local zip_path="$VENDOR_DIR/${uuid}.zip"
  local ext_dir="$EXT_ROOT/${uuid}"

  [[ -f "$zip_path" ]] || {
    echo "错误: 缺少离线包 $zip_path" >&2
    exit 1
  }

  python3 - "$zip_path" "$ext_dir" <<'PY'
import shutil
import sys
import zipfile
from pathlib import Path

zip_path, ext_dir = sys.argv[1:]
ext_path = Path(ext_dir)
if ext_path.exists():
    shutil.rmtree(ext_path)
ext_path.mkdir(parents=True, exist_ok=True)

with zipfile.ZipFile(zip_path, "r") as zf:
    for info in zf.infolist():
        zf.extract(info, ext_path)

if not (ext_path / "metadata.json").exists():
    raise SystemExit(f"zip 缺少 metadata.json: {zip_path}")

for target in ext_path.rglob("*"):
    if target.is_dir():
        target.chmod(0o755)
    elif target.is_file():
        mode = 0o644
        with target.open("rb") as f:
            if f.read(2) == b"#!":
                mode = 0o755
        target.chmod(mode)
ext_path.chmod(0o755)
print(f"Installed {ext_path.name} from {zip_path}")
PY

  if [[ -d "${ext_dir}/schemas" ]]; then
    if [[ -x "$INSTALL_ROOT/usr/bin/glib-compile-schemas" ]]; then
      chroot "$INSTALL_ROOT" /usr/bin/glib-compile-schemas \
        "/usr/share/gnome-shell/extensions/${uuid}/schemas"
    else
      echo "警告: 无 glib-compile-schemas，跳过 ${uuid} schemas" >&2
    fi
  fi
}

while read -r uuid; do
  [[ -z "${uuid}" ]] && continue
  install_one_zip "${uuid}"
done <<< "$(echo "${EXTENSIONS}" | sed '/^[[:space:]]*$/d')"

# ---- dconf：RPM + zip 全部默认启用 ----
mkdir -p "$INSTALL_ROOT/etc/dconf/profile" "$INSTALL_ROOT/etc/dconf/db/local.d"

cat > "$INSTALL_ROOT/etc/dconf/profile/user" <<'EOF'
user-db:user
system-db:local
EOF

cat > "$INSTALL_ROOT/etc/dconf/db/local.d/00-gnome-extensions" <<'EOF'
[org/gnome/shell]
enabled-extensions=['dash-to-panel@jderose9.github.com', 'appindicatorsupport@rgcjonas.gmail.com', 'arcmenu@arcmenu.com', 'clipboard-indicator@tudmotu.com', 'drive-menu@gnome-shell-extensions.gcampax.github.com', 'ding@rastersoft.com']

[org/gnome/shell/extensions/dash-to-panel]
panel-position='BOTTOM'
EOF

if [[ -x "$INSTALL_ROOT/usr/bin/dconf" ]]; then
  chroot "$INSTALL_ROOT" /usr/bin/dconf update
else
  echo "错误: 镜像内未找到 dconf" >&2
  exit 1
fi

if command -v restorecon >/dev/null 2>&1; then
  restorecon -RF "$EXT_ROOT" "$INSTALL_ROOT/etc/dconf" || {
    echo "警告: restorecon 失败" >&2
  }
fi

for uuid in \
  dash-to-panel@jderose9.github.com \
  arcmenu@arcmenu.com \
  clipboard-indicator@tudmotu.com
do
  [[ -f "${EXT_ROOT}/${uuid}/metadata.json" ]] || {
    echo "错误: zip 扩展未落地: ${uuid}" >&2
    exit 1
  }
done

for uuid in \
  drive-menu@gnome-shell-extensions.gcampax.github.com \
  appindicatorsupport@rgcjonas.gmail.com \
  ding@rastersoft.com
do
  [[ -d "${EXT_ROOT}/${uuid}" ]] || {
    echo "错误: RPM 扩展目录缺失: ${uuid}（检查 10-repos EPOL 与模块 22）" >&2
    exit 1
  }
done

echo "GNOME 扩展（RPM + 离线 zip）安装并启用完成"
%end

# <<< END include: /data/workspace/oc-live-compose/modules/post/31-gnome-extensions.ks


# >>> BEGIN include: /data/workspace/oc-live-compose/modules/post/32-live-installer.ks

# =============================================================================
# 【模块】32 — 桌面安装入口（liveinst 包装）
# =============================================================================
# opencloudos-liveinst、桌面图标、信任启动器、Anaconda live profile。
# 优先 sudo -n；使用 anaconda --liveinst；启动前清理残留进程/挂载。
# =============================================================================

%post --erroronfail --log=/root/oc-live-compose-32-live-installer.log
set -eux

LIVE_USER="liveuser"

mkdir -p /usr/local/bin /usr/share/applications /etc/xdg/autostart \
  /etc/anaconda/profile.d /home/"${LIVE_USER}"/Desktop

# ---- Anaconda UI：Live 安装只暴露存储等必要 spoke ----
cat > /etc/anaconda/profile.d/opencloudos-live-desktop.conf <<'EOF'
# OpenCloudOS Live Desktop 安装器配置
# 语言/键盘/网络/时间在 Live 会话已有默认；用户账户留给安装后首启向导。

[Profile]
profile_id = opencloudos-live-desktop
base_profile = opencloudos

[User Interface]
hidden_spokes =
    NetworkSpoke
    PasswordSpoke
    UserSpoke
    DatetimeSpoke
    KeyboardSpoke
    LangsupportSpoke
    SourceSpoke
    SoftwareSelectionSpoke
    SubscriptionSpoke
EOF

# ---- 安装器启动脚本 ----
cat > /usr/local/bin/opencloudos-liveinst <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

cleanup_previous_anaconda() {
  pkill -TERM -f '/sbin/anaconda|/usr/sbin/anaconda|pyanaconda|org.fedoraproject.Anaconda' 2>/dev/null || true
  sleep 1
  pkill -KILL -f '/sbin/anaconda|/usr/sbin/anaconda|pyanaconda|org.fedoraproject.Anaconda' 2>/dev/null || true

  shopt -s nullglob
  for mountpoint in /run/install/sources/mount-*-live_os_image; do
    umount -l "${mountpoint}" 2>/dev/null || true
    rmdir "${mountpoint}" 2>/dev/null || true
  done
  shopt -u nullglob
}

if [[ $(id -u) -eq 0 ]]; then
  cleanup_previous_anaconda
  exec anaconda --liveinst --profile opencloudos-live-desktop "$@"
fi

if command -v sudo >/dev/null 2>&1; then
  sudo -n /usr/local/bin/opencloudos-liveinst "$@"
  exit $?
fi

exec pkexec env \
  DISPLAY="${DISPLAY:-}" \
  WAYLAND_DISPLAY="${WAYLAND_DISPLAY:-}" \
  XAUTHORITY="${XAUTHORITY:-}" \
  DBUS_SESSION_BUS_ADDRESS="${DBUS_SESSION_BUS_ADDRESS:-}" \
  XDG_CURRENT_DESKTOP="${XDG_CURRENT_DESKTOP:-}" \
  XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR:-}" \
  /usr/local/bin/opencloudos-liveinst "$@"
EOF
chmod 0755 /usr/local/bin/opencloudos-liveinst

# ---- 应用菜单入口 ----
cat > /usr/share/applications/opencloudos-liveinst.desktop <<'EOF'
[Desktop Entry]
Type=Application
Name=安装 OpenCloudOS
Name[en_US]=Install OpenCloudOS
Exec=/usr/local/bin/opencloudos-liveinst
Icon=system-software-install
Terminal=false
Categories=System;
EOF

# ---- 放到 liveuser 桌面 ----
install -m 0755 -D \
  /usr/share/applications/opencloudos-liveinst.desktop \
  /home/"${LIVE_USER}"/Desktop/opencloudos-liveinst.desktop
chown "${LIVE_USER}:${LIVE_USER}" /home/"${LIVE_USER}"/Desktop/opencloudos-liveinst.desktop

# ---- 登录后标记桌面图标为受信任（GNOME 需要）----
cat > /etc/xdg/autostart/opencloudos-liveinst-trust.desktop <<'EOF'
[Desktop Entry]
Type=Application
Name=Trust OpenCloudOS Live Installer Launcher
Exec=sh -c 'gio set "$HOME/Desktop/opencloudos-liveinst.desktop" metadata::trusted true 2>/dev/null || true'
OnlyShowIn=GNOME;
NoDisplay=true
X-GNOME-Autostart-enabled=true
EOF
%end

# <<< END include: /data/workspace/oc-live-compose/modules/post/32-live-installer.ks


# >>> BEGIN include: /data/workspace/oc-live-compose/modules/post/33-install-cleanup-hook.ks

# =============================================================================
# 【模块】33 — 安装后清理钩子（Anaconda post-scripts）
# =============================================================================
# 写入 /usr/share/anaconda/post-scripts/，liveinst 会追加到目标系统 %post。
# 目标系统去掉 liveuser / 免密 sudo / 安装入口，并打开首启向导。
#
# 注意：不能在本 %post 里用 heredoc 直接写裸的「%post / %end」行，
# pykickstart 会当成 Kickstart 分段符（与 shell heredoc 无关）。下面用
# echo/printf 生成钩子文件，避免解析器误读。
# =============================================================================

%post --erroronfail --log=/root/oc-live-compose-33-cleanup-hook.log
set -eux

mkdir -p /usr/share/anaconda/post-scripts
HOOK=/usr/share/anaconda/post-scripts/opencloudos-live-cleanup.ks

{
  # 钩子文件自身的分段头/尾：不要写成 kickstart 源码里的独立行
  echo '%post --log=/root/opencloudos-live-cleanup.log --erroronfail'
  cat <<'BODY'
set -eux

LIVE_USER="liveuser"

# ---- 删除 Live 专用用户与提权配置 ----
if id "${LIVE_USER}" >/dev/null 2>&1; then
  userdel -r "${LIVE_USER}" 2>/dev/null || userdel "${LIVE_USER}" 2>/dev/null || true
fi

rm -f /etc/sudoers.d/99-opencloudos-live-user
rm -f /usr/local/bin/opencloudos-liveinst
rm -f /usr/share/applications/opencloudos-liveinst.desktop
rm -f /etc/xdg/autostart/opencloudos-liveinst-trust.desktop
rm -f /etc/anaconda/profile.d/opencloudos-live-desktop.conf
rm -f /usr/share/anaconda/post-scripts/opencloudos-live-cleanup.ks
rm -f /home/*/Desktop/opencloudos-liveinst.desktop 2>/dev/null || true
rm -f /tmp/opencloudos-liveinst.log

# ---- 打开安装后首启向导 ----
mkdir -p /etc/gdm
cat > /etc/gdm/custom.conf <<'GDMEOF'
[daemon]
InitialSetupEnable=true
GDMEOF

passwd -l root 2>/dev/null || true
rm -f /etc/skel/.config/gnome-initial-setup-done
find /home -name gnome-initial-setup-done -delete 2>/dev/null || true

# ---- 移除仅 Live 需要的安装器 / live 启动包 ----
if command -v dnf >/dev/null 2>&1; then
  dnf -y remove anaconda anaconda-core anaconda-gui anaconda-tui anaconda-widgets \
    dracut-live dracut-squash || true
fi

systemctl set-default graphical.target
BODY
  printf '%s\n' '%end'
} > "${HOOK}"
%end

# <<< END include: /data/workspace/oc-live-compose/modules/post/33-install-cleanup-hook.ks


# <<< END include: /data/workspace/oc-live-compose/kickstarts/desktop-live.ks

