Skip to content

feat: add 3 game engines: Open 3D Engine (COPR, BETA), Unreal Engine 5.8 (guided zip), Unigine (guided .run with EULA gate)#74

Open
KernelChief wants to merge 21 commits into
mainfrom
feat/new-apps-o3de-unreal-unigine
Open

feat: add 3 game engines: Open 3D Engine (COPR, BETA), Unreal Engine 5.8 (guided zip), Unigine (guided .run with EULA gate)#74
KernelChief wants to merge 21 commits into
mainfrom
feat/new-apps-o3de-unreal-unigine

Conversation

@KernelChief

@KernelChief KernelChief commented Jul 2, 2026

Copy link
Copy Markdown
Owner

Summary

Adds 3 game engines to the catalog, introducing two new install patterns (one-click COPR install, guided .run install behind a GUI EULA consent gate) plus a reusable BETA chip for pre-release apps.

Related Issue

Closes #73, closes #70, closes #67

Why this change?

Fills out the Game Engines category with the three most-requested engines from the issue tracker: a fully open source Unreal alternative (O3DE), Unreal Engine itself, and Unigine.

Type of change

  • 🐛 Bug fix
  • ✨ New feature
  • 🎨 UI/UX improvement
  • 📝 Documentation update
  • 🧹 Refactor / cleanup
  • 🧹 GitHub Action Change

What was done?

New Apps

App Category Method EL9 EL10
Open 3D Engine Game Engines COPR hellaenergy/o3de, one click ✅ (BETA)
Unreal Engine 5.8 Game Engines Guided: Epic login → zip → /opt/unreal-engine/ ✅ (preview)
Unigine Game Engines Guided: EULA gate → vendor .run/opt/unigine/

Implementation details

  • BETA chip: new optional "beta": True app field renders an amber BETA pill next to the app name (same construction as the EL chip). Applied to O3DE and Unreal 5.8.
  • O3DE: helper enables the COPR with an explicit centos-stream-10-x86_64 chroot (the project has no epel-10 chroot, so a bare copr enable would fail on AlmaLinux 10), then auto-detects the newest versioned major (o3deNNNN, currently o3de2605) via repoquery and installs it. Remove uninstalls all o3deNNNN packages and disables the COPR. EL10 only.
  • Unreal Engine 5.8: guided flow opens unrealengine.com/linux (Epic account required), user picks the downloaded zip, helper extracts under /opt (not /tmp, the engine is tens of GB), handles both zip layouts (root Engine/ or single top-level folder), chowns to the invoking user (the editor writes into its own tree), and writes a desktop entry.
  • Unigine: the vendor .run shows an interactive terminal EULA, so the GUI collects explicit consent first (dialog links to the UNIGINE EULA, with an "I Agree" button), then the helper runs the installer into /opt/unigine with piped acceptance, chowns to the invoking user so the SDK Browser can self-update, and writes a proper named desktop entry (the vendor one is nameless). Post-install log reminds the user to create their UNIGINE account inside the Browser, per vendor policy.
  • Icons follow the repo convention: no bundled images; theme/AppStream lookup with the letter-badge fallback (o3de keeps an icon_appid for post-install theme lookup).
  • Website Game Development card (3 → 6 apps) and README EL table plus Target Applications list updated.

Review notes

  • Whole-branch code review and a security review were run before opening this PR; no blocking findings. The Unigine .run executes as root (same model as InstaMaterial's install.sh), which is intentional and signed off.

Beta RPM / Release Draft checks

  • I confirmed this PR generated beta RPM artifacts in Actions (rpm-el9-pr<PR#> and rpm-el10-pr<PR#>)
  • I validated the sticky PR comment includes the beta RPM artifacts link
  • If this change impacts release flow, I confirmed tag builds create a Draft GitHub Release

Testing Done

  • Verified on AlmaLinux Version: EL10 container (O3DE COPR enable + latest-major detection returns o3de2605)
  • Verified Desktop Environment (if applicable): ______
  • Successfully completed a test installation run
  • Verified logs for any new errors (helper validation probes fail cleanly with clear errors, exit=2)

Additional checks: python3 -m py_compile and bash -n pass; AST check confirms all new flow methods and constants are wired; helper dispatcher falls through to usage text on unknown actions.

Screenshots (if UI changed)

BETA chip renders next to the app name for O3DE and Unreal 5.8 (amber pill, same style as the EL chip). Screenshot to follow after a desktop run.

Checklist

  • I've read CONTRIBUTING.md
  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I've confirmed this PR follows the Code of Conduct

@KernelChief KernelChief requested a review from kernelqa July 2, 2026 12:20
@KernelChief KernelChief added this to the v2.0.3 milestone Jul 2, 2026
@KernelChief

Copy link
Copy Markdown
Owner Author

@kernelqa I'll also need new screenshot of the v2.0.x for the website and main github page please

@kernelqa

kernelqa commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

@KernelChief

unzip errors for Unreal and Unigine on Alma9

  • $ pkexec /usr/libexec/almalinux-creative-installer-helper install_unigine /home/qa/Downloads/UNIGINE_SDK_Browser2_Linux_2.1.2.run
    Error executing command as another user: Not authorized

  • $ pkexec /usr/libexec/almalinux-creative-installer-helper install_unreal /home/qa/Downloads/Linux_Unreal_Engine_5.8.0.zip
    Error executing command as another user: Not authorized

KernelChief and others added 10 commits July 10, 2026 13:27
- install_unreal: EL9's unzip 6.0 can fail silently on ZIP64 archives
  (Epic's Linux UE downloads). Drop -q so errors surface; add python3
  zipfile module as an automatic fallback when unzip exits non-zero.
- install_unigine: add chcon -t bin_t on the copied .run so SELinux
  enforcing on EL9 doesn't block execution from /opt (best-effort, no-op
  on permissive or when chcon is absent).
- polkit policy: allow_inactive=auth_admin (was: no) so CLI and SSH
  sessions can also authenticate via pkexec without a desktop session.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add GDM/GNOME-gated "Windows-style UI" row in the Setup tab: installs
  Dash to Panel, ArcMenu, System Monitor, Blur My Shell, GNOME Tweaks,
  and Nautilus copy-path extension system-wide in one click
- Bundle gnome-ui extensions and dconf profile in src/gnome-ui/ (packaged
  to /usr/share/almalinux-creative-installer/gnome-ui/ by the RPM)
- Add install_gnome_ui / remove_gnome_ui actions to the helper; dev mode
  resolves data dir relative to the helper script path
- Gate the Install/Remove buttons to GNOME Desktop sessions only
  (XDG_CURRENT_DESKTOP check); shows "GNOME only" badge on other DEs
- Rename all SHED / SHED MTL file names and content references:
  01-shed_gnome_defaults → 01-creative_gnome_defaults,
  SHED_UI_EL9.yaml → gnome-ui-setup.yaml,
  shed_launcher.desktop removed from dconf favorite-apps
- Fix polkit policy: allow_inactive=auth_admin (was: no) so QA and
  SSH sessions can authenticate via pkexec without a desktop session
- Update spec: install gnome-ui data tree; add %files entries; bump
  version notes in changelog

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
….sh (SC2004)

Third-party System Monitor extension script used \$var inside \$(( ))
which shellcheck flags as SC2004. All three copies fixed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…message

- install_unreal_flow: hint now says Linux_Unreal_Engine_5.8.0.zip
  (no longer mentions preview-1 which confused QA and is out of date)
- run_helper_with_callback: exit code 127 + "not authorized" now emits
  a clear message explaining the polkit agent requirement instead of
  surfacing the raw pkexec error

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…n + drop preview label

- run_helper_with_callback: check polkit policy file exists before calling
  pkexec; show a clear actionable error (install the RPM) instead of the
  cryptic "Not authorized / This incident has been reported" from pkexec
- Fix auth error detection: scan all captured output lines (not just last)
  so the "not authorized / incident" pattern matches correctly
- install_unreal helper: desktop entry Name drops "(preview)" label
- install_unreal helper: comment updated (preview-1 ref removed)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…t can authenticate

All guided install flows (Resolve, 3DCoat, InstaMaterial, JangaFX, Gaffer,
Unreal, Unigine) open the browser with xdg-open and then show a QFileDialog.
When the file dialog closes, focus is on the browser/desktop — not the app.
Polkit's auth agent needs to attach its password dialog to an active app
window; without focus it silently returns "Not authorized" (exit 127).

Fix: call raise_() + activateWindow() in every pick_* method immediately
after QFileDialog.getOpenFileName() returns, before pkexec is invoked.
This restores window focus and lets polkit show the authentication prompt.

Also: skip pkexec entirely when already running as root (os.getuid()==0),
since pkexec refuses to re-escalate from root and returns 127.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…-flight

The allow_inactive=auth_admin change caused polkitd to reload its policy
when the RPM was installed, clearing the auth_admin_keep session cache.
This forced re-authentication for ALL subsequent pkexec calls. Combined
with the focus issue (polkit agent can't show the dialog after xdg-open
steals window focus), this broke every app, not just the guided flows.

Reverted to allow_inactive=no (identical to main) so polkitd does not
trigger a cache-clearing reload on PR 74 RPM installs.

Also removed the POLKIT_POLICY pre-flight check — over-engineered and
not needed since the helper path check is sufficient.

Kept: raise_()/activateWindow() in all pick_* methods (the real fix for
the guided-flow pkexec focus issue), os.getuid()==0 root bypass, and the
improved auth error message detection.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ruff flags semicolon-joined statements as E702. Split all 7 instances
across the guided-flow pick_* methods onto individual lines.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…polkit env check

run_helper_with_callback is now byte-for-byte identical to main — the
os.getuid()==0 bypass, POLKIT_POLICY pre-flight, and custom error message
rewrites are all reverted. Any one of those could have broken pkexec
behaviour that works on main.

Added _check_polkit_environment() that runs in the background on startup
and logs a clear warning if polkitd is not running or loginctl reports
the session as inactive, so the QA can diagnose the root cause instead
of hunting through "Not authorized" messages.

Kept: raise_()/activateWindow() in all pick_* methods (focus fix for
guided flows), unzip fallback + chcon for EL9, desktop entry cleanup,
shellcheck fixes, and the GNOME UI setup feature.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…in spec

pkexec needs a running polkit authentication agent to show the password
prompt. Without it, every pkexec call silently returns "Not authorized"
(exit 127) instead of prompting.

- _ensure_polkit_agent(): called at app startup; on Wayland, gnome-shell
  is the built-in agent so nothing to do. On X11, checks if any
  polkit.*agent process is running; if not, launches
  polkit-gnome-authentication-agent-1 from /usr/lib/polkit-gnome/ or
  /usr/libexec/. Logs a clear dnf install hint if the binary is missing.
- spec: Recommends polkit-gnome so the agent binary is present on fresh
  installs; soft dep so Wayland-only setups are not forced to install it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

✅ Beta RPMs are ready for commit f002d38524a73130bdcd3ab8c1e257f998b02a4e.

Option 1: COPR testing repo (recommended, installs via DNF)

Enable the testing repo, then install. Works on both AlmaLinux 9
and AlmaLinux 10 (DNF auto-detects the right epel-9 / epel-10 build).

sudo dnf copr enable tristantheroux/AlmaLinux-Creative-Installer-Testing
sudo dnf install almalinux-creative-installer

The COPR build runs asynchronously. Wait ~5 min after this comment before installing.

Uninstall after QA

sudo dnf remove almalinux-creative-installer
sudo dnf copr remove tristantheroux/AlmaLinux-Creative-Installer-Testing

Option 2: Manual RPM download

Download from this run's artifacts:
https://github.com/KernelChief/almalinux-creative-installer/actions/runs/29116632490#artifacts

Artifact names:

  • rpm-el9-pr74
  • rpm-el10-pr74

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

App: [Open 3D Engine] App: [Unreal Engine 5.8] App: [Unigine]

2 participants