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

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

# =============================================================================
# OpenCloudOS Live Desktop — Kickstart 主入口
# =============================================================================
#
# 本地 livecd-creator / livemedia-creator 调通后，同一份给 Koji spin-livecd。
#
# 暂不包含：自定义内核现场编译；仅有 zip 的 GNOME 扩展；非 Live 安装 ISO。
# 模块：本文件只 %include；不支持 include 时跑 scripts/flatten-kickstart.sh
# 软件源：本地改 modules/10-repos.ks 或 --repo=；Koji 一般用 target 仓库
#
# 注意：pykickstart / livecd-creator 按「当前工作目录」解析 %include，
# 请在仓库根目录执行，路径写成 modules/...（不要写成相对本文件的 ../modules/）。
#
#version=RHEL9

# -----------------------------------------------------------------------------
# 【模块】会话默认：语言 / 键盘 / 时区 / 网络
# -----------------------------------------------------------------------------

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

# =============================================================================
# 【模块】00 — Live 会话默认项
# =============================================================================
# 说明：
#   这些值只影响 Live 试用会话的默认环境。
#   安装到硬盘后的语言/时区等，由 GNOME 首启向导（gnome-initial-setup）处理。
# =============================================================================

# 图形 Live（非 text 安装器模式）
graphical

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

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

# Live 介质本身不在这里清盘分区；安装由桌面上的 Anaconda liveinst 完成
firewall --enabled
selinux --enforcing
services --enabled=NetworkManager,gdm

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

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


# -----------------------------------------------------------------------------
# 【模块】软件源（本地改 10-repos.ks / --repo=；Koji 多用 target 仓）
# -----------------------------------------------------------------------------

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

# =============================================================================
# 【模块】10 — 软件源
# =============================================================================
# 注意（本机构建机 livecd-tools / pykickstart）：
#   kickstart 的 url 命令经 methodToRepo() 后不会真正加入 dnf 仓库列表
#   （只 return RepoData，未 append）。因此 BaseOS 必须写成显式 repo，
#   否则只会刷到 AppStream/extras，随后出现 nothing provides glibc/bash。
#
# EPOL：桌面扩展等额外包（DING / AppIndicator 等）不在 AppStream，必须显式加。
# 对照旧流水线 oc-desktop-image/scripts/12-install-gnome-extension.sh。
# =============================================================================

repo --name=OC9BaseOS --baseurl=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


# -----------------------------------------------------------------------------
# 【模块】软件包
#   顺序：桌面基础 → 硬件支持 → GNOME 扩展 RPM → Live 安装器运行时
# -----------------------------------------------------------------------------

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

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

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

# 图形与会话常用组件（组已覆盖大部分；显式列出便于审计）
gdm
gnome-initial-setup
NetworkManager

# 默认图形目标依赖（%post 里会 systemctl set-default）
kernel
grub2
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/自打 RPM 的扩展：Dash to Panel / ArcMenu / Clipboard Indicator
# 默认启用见 modules/post/31-gnome-extensions.ks
# =============================================================================

%packages
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


# -----------------------------------------------------------------------------
# 【模块】Live 用户（正式用户由安装后首启向导创建）
# -----------------------------------------------------------------------------

# >>> 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


# -----------------------------------------------------------------------------
# 【模块】%post
#   顺序：Live 会话 → 扩展 dconf → 桌面安装入口 → 安装后清理钩子
# -----------------------------------------------------------------------------

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

# =============================================================================
# 【模块】30 — Live 会话 %post
# =============================================================================
# 清空 liveuser 密码、免密 sudo、GDM 自动登录、关 sshd、图形目标。
# 不改动 D-Bus provider，跟随发行版默认。
# =============================================================================

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

LIVE_USER="liveuser"

# ---- 账户：无密码登录 Live ----
if id "${LIVE_USER}" >/dev/null 2>&1; then
  passwd -d "${LIVE_USER}" >/dev/null || true
fi

# ---- 免密 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 set-default graphical.target
systemctl disable sshd.service sshd-keygen.target >/dev/null 2>&1 || true

# 不改动 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 扩展默认启用（dconf）
# =============================================================================
# 仅启用模块 22 中的 RPM 扩展 UUID；其它扩展打成 RPM 后再追加。
# =============================================================================

%post --erroronfail --log=/root/oc-live-compose-31-gnome-extensions.log
set -eux

mkdir -p /etc/dconf/profile /etc/dconf/db/local.d

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

# UUID 须与已安装的 gnome-shell-extension-* RPM 一致
cat > /etc/dconf/db/local.d/00-gnome-extensions <<'EOF'
[org/gnome/shell]
enabled-extensions=['drive-menu@gnome-shell-extensions.gcampax.github.com', 'appindicatorsupport@rgcjonas.gmail.com', 'ding@rastersoft.com']
EOF

if command -v dconf >/dev/null 2>&1; then
  dconf update
else
  echo "警告: 未找到 dconf，跳过默认启用扩展" >&2
fi
%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

