diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml index 0eff8b4..ea5f6b0 100644 --- a/.forgejo/workflows/build.yml +++ b/.forgejo/workflows/build.yml @@ -1,9 +1,8 @@ name: image -# Builds the flashable postmarketOS images for the Fairphone 6 (kernel from -# milos-linux combined-stable + imsd) — Plasma Mobile (fp6-img.tar.xz) and -# Phosh (fp6-img-phosh.tar.xz) — and publishes both as the rolling 'latest' -# release. +# Builds a flashable postmarketOS image for the Fairphone 6 (kernel from +# milos-linux combined-stable + imsd) and publishes it as the rolling +# 'latest' release. # # Runs on the dedicated privileged runner label "pmos" (loop devices for # pmbootstrap install, qemu-user binfmt on the host for the aarch64 chroots). @@ -35,16 +34,9 @@ jobs: with: persist-credentials: true - - name: Build image (Plasma Mobile) + - name: Build image run: ./build.sh - # Second UI from the same package builds (the kernel and the aports - # above are already current in pmbootstrap's work dir, so this is the - # install + export only): fp6-img-phosh.tar.xz next to fp6-img.tar.xz - # in the same release. - - name: Build image (Phosh) - run: FP6IMG_UI=phosh FP6IMG_KEEP_DIST=1 ./build.sh - - name: Upload artifacts uses: actions/upload-artifact@v3 with: diff --git a/README.md b/README.md index aa8ee72..02529ce 100644 --- a/README.md +++ b/README.md @@ -31,11 +31,6 @@ cd fp6-img ./install.sh ``` -Two images are published per release, same kernel and packages, different -shell: `fp6-img.tar.xz` boots **Plasma Mobile** (calls through Plasma -Dialer), `fp6-img-phosh.tar.xz` boots **Phosh** (calls through GNOME Calls, -via imsd's `imsd-ofono` backend). Pick one; the install steps are identical. - `install.sh` erases dtbo, flashes the rootfs, **RAM-boots** the kernel, writes the boot partition from inside Linux where the bootloader's NV-wipe cannot see it, then reads the modem NV back and reports the result. The bootloader never writes `boot`. diff --git a/aports/device/callaudioshim/APKBUILD b/aports/device/callaudioshim/APKBUILD index f96686e..61b7685 100644 --- a/aports/device/callaudioshim/APKBUILD +++ b/aports/device/callaudioshim/APKBUILD @@ -3,27 +3,22 @@ # Earpiece port), leaving plasma-dialer's mute button dead and blocking # kde-telephony-daemon 25s per call; see the script header for the full # write-up. The callaudiod package stays installed (plasma-mobile depends on -# it); this package replaces its D-Bus activation file, so activating -# org.mobian_project.CallAudio starts the shim in any session. Phosh -# activates the name at startup, before autostart runs, and the stock daemon -# used to win there (1-r0). Removing this package removes the activation file -# too; 'apk fix callaudiod' restores callaudiod's. Deployed and tested on the -# development FP6. +# it) — this shim simply owns org.mobian_project.CallAudio first via an +# early-phase autostart, so D-Bus activation of the real daemon never fires. +# Deployed and tested on the development FP6. maintainer="Jorijn van der Graaf " pkgname=callaudioshim pkgver=1 -pkgrel=1 +pkgrel=0 pkgdesc="callaudiod replacement shim: working in-call mic mute on the FP6" url="https://forgejo.catcrafts.net/Catcrafts/fp6-img" arch="noarch" license="GPL-3.0-only" depends="python3 py3-dbus py3-gobject3 wireplumber" -replaces="callaudiod" options="!check" source=" callaudioshim.py callaudioshim.desktop - org.mobian_project.CallAudio.service " package() { @@ -31,12 +26,9 @@ package() { "$pkgdir"/usr/libexec/callaudioshim.py install -Dm644 "$srcdir"/callaudioshim.desktop \ "$pkgdir"/etc/xdg/autostart/callaudioshim.desktop - install -Dm644 "$srcdir"/org.mobian_project.CallAudio.service \ - "$pkgdir"/usr/share/dbus-1/services/org.mobian_project.CallAudio.service } sha512sums=" -05995f0f732319559ccd9a7f3891c6363261e52ddbdf13b812fce580dbb816c362bd76da36cb9f1c7ee203d5ce2486762ffe46a7660dd4bc10c8bf2b4cd1a8ca callaudioshim.py +7ca7d75402ea6c48a7c1c19c5c5ed6e556f2c0133aa6e32a12f5c5a1afc0c791f04ebd40102a4b92b0dd87f9330ae64ada025c344525b9ed17289acd8cb952d7 callaudioshim.py 060b76660398115af26463425db5a6a2d634b6bdbf48a8ae488528403f8e086a9ef23470316196e6ccd8cb65e0ebd09bbc0df2ff5f8a830407d98404f439c706 callaudioshim.desktop -6b44134e3f3ed0a8c3314b0b0cf9a9e5483850cdfb54f486d23199dd9f5f1ee66d674a391126e803796db69182f980b30a714457a81c9a447e146bc9ba5992bd org.mobian_project.CallAudio.service " diff --git a/aports/device/callaudioshim/callaudioshim.py b/aports/device/callaudioshim/callaudioshim.py index a4ae62c..b935be0 100644 --- a/aports/device/callaudioshim/callaudioshim.py +++ b/aports/device/callaudioshim/callaudioshim.py @@ -37,11 +37,9 @@ interface (verified against callaudiod's org.mobian_project.CallAudio.xml): dynamic in this setup — journal/audio.md 2026-07-18). SpeakerState defaults to ON. When an Earpiece UCM device exists these become real. -Stock callaudiod must not own the name. The package replaces callaudiod's -D-Bus activation file with one that starts this shim, so whichever client asks -first — Phosh activates the name at startup, before autostart runs — gets the -shim; the KDE early-phase autostart stays for the DialerUtils push at session -start. Runs as the session user, no root needed. +Stock callaudiod must not own the name: pkill it and mask its D-Bus +activation (see journal/ims.md s44 deploy notes). Runs as the session user +(autostart .desktop), no root needed. """ import subprocess @@ -187,12 +185,7 @@ class CallAudio(dbus.service.Object): def main(): dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) session = dbus.SessionBus() - try: - name = dbus.service.BusName(BUS_NAME, session, do_not_queue=True) # noqa: F841 - except dbus.exceptions.NameExistsException: - # activated and autostarted in the same session: the first one serves - log(f"callaudioshim: {BUS_NAME} already owned; exiting") - return + name = dbus.service.BusName(BUS_NAME, session, do_not_queue=True) # noqa: F841 CallAudio(session) log(f"callaudioshim: owning {BUS_NAME}") GLib.MainLoop().run() diff --git a/aports/device/callaudioshim/org.mobian_project.CallAudio.service b/aports/device/callaudioshim/org.mobian_project.CallAudio.service deleted file mode 100644 index 93109ef..0000000 --- a/aports/device/callaudioshim/org.mobian_project.CallAudio.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=org.mobian_project.CallAudio -Exec=/usr/libexec/callaudioshim.py diff --git a/build.sh b/build.sh index 6d9322b..82ae48e 100755 --- a/build.sh +++ b/build.sh @@ -30,18 +30,6 @@ KERNEL_BRANCH=combined-stable # sha256; that gated fresh installs only, never upgrades, and cost a commit # and an image run per release. REGISTRY=https://forgejo.catcrafts.net/api/packages/Catcrafts/alpine/edge/fp6 -# FP6IMG_UI: which postmarketOS UI the image boots into. plasma-mobile (the -# default) gets imsd-dialerd from the imsd package itself; phosh gets the -# opt-in imsd-ofono subpackage (imsd-ofonod + the GNOME Calls plugin -# override) on top. Everything else in the package set is UI-agnostic. The -# archive is named after it: fp6-img.tar.xz for plasma-mobile, -# fp6-img-.tar.xz otherwise, so one release can carry both. -FP6IMG_UI=${FP6IMG_UI:-plasma-mobile} -case "$FP6IMG_UI" in -plasma-mobile) UI_PACKAGES=; IMG_NAME=fp6-img ;; -phosh) UI_PACKAGES=,imsd-ofono; IMG_NAME=fp6-img-phosh ;; -*) echo "FP6IMG_UI=$FP6IMG_UI: expected plasma-mobile or phosh" >&2; exit 1 ;; -esac PMAPORTS_REPO=https://gitlab.postmarketos.org/postmarketOS/pmaports.git cd "$(dirname "$0")" @@ -95,13 +83,11 @@ if [ "$(id -u)" = 0 ]; then id build >/dev/null 2>&1 || adduser -D build echo 'build ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/build # empty dist in place (never delete the dir itself: a shell cd'd into it - # would poison the next podman invocation's cwd). FP6IMG_KEEP_DIST=1 keeps - # what is there: the second UI build of one run adds its archive next to - # the first one's. + # would poison the next podman invocation's cwd) install -d -o build dist - [ -n "${FP6IMG_KEEP_DIST:-}" ] || find dist -mindepth 1 -delete + find dist -mindepth 1 -delete # su scrubs the environment — carry the knobs that matter across it - exec su build -c "FP6IMG_NO_CROSSDIRECT='${FP6IMG_NO_CROSSDIRECT:-}' FP6IMG_UI='${FP6IMG_UI:-}' sh -eu '$PWD/build.sh'" + exec su build -c "FP6IMG_NO_CROSSDIRECT='${FP6IMG_NO_CROSSDIRECT:-}' sh -eu '$PWD/build.sh'" fi # git hosts occasionally hiccup (our forgejo lives on a small VM that also @@ -232,9 +218,9 @@ cat > "$HOME/.config/pmbootstrap_v3.cfg" <&2 @@ -339,22 +325,21 @@ pmbootstrap export "$EXPORT" # so the archive is built without a second 3 GiB copy on disk. STAGE="$WORK/stage" rm -rf "$STAGE" -mkdir -p "$STAGE/$IMG_NAME" -ln -s "$EXPORT/boot.img" "$STAGE/$IMG_NAME/boot.img" -ln -s "$EXPORT/fairphone-fp6.img" "$STAGE/$IMG_NAME/fairphone-fp6.img" -cp README.md install.sh "$STAGE/$IMG_NAME/" +mkdir -p "$STAGE/fp6-img" +ln -s "$EXPORT/boot.img" "$STAGE/fp6-img/boot.img" +ln -s "$EXPORT/fairphone-fp6.img" "$STAGE/fp6-img/fairphone-fp6.img" +cp README.md install.sh "$STAGE/fp6-img/" { echo "kernel: $KERNEL_REPO $KERNEL_BRANCH @ $COMMIT" - echo "ui: $FP6IMG_UI" echo "built: $(date -u +%Y-%m-%dT%H:%M:%SZ)" echo "default login: user / 147147 (same as official postmarketOS images)" while read -r _n _v _s; do printf '%-14s %s %s-%s (newest registry package, sha256 %s)\n' "$_n:" "$REGISTRY" "$_n" "$_v" "$_s" done < "$REG_DL/manifest" -} > "$STAGE/$IMG_NAME/build-info.txt" +} > "$STAGE/fp6-img/build-info.txt" # sums of the extracted contents -(cd "$STAGE/$IMG_NAME" && sha256sum -- * > sha256sums.txt) -tar -C "$STAGE" -chf - "$IMG_NAME" | xz -T0 -6 > "dist/$IMG_NAME.tar.xz" +(cd "$STAGE/fp6-img" && sha256sum -- * > sha256sums.txt) +tar -C "$STAGE" -chf - fp6-img | xz -T0 -6 > dist/fp6-img.tar.xz rm -rf "$STAGE" ls -la dist/