diff --git a/.github/workflows/auto-update.yml b/.github/workflows/auto-update.yml index 64ca826..090a247 100644 --- a/.github/workflows/auto-update.yml +++ b/.github/workflows/auto-update.yml @@ -2,20 +2,39 @@ name: Push new tag update to stable branch on: schedule: - # Daily for now - cron: '9 7 * * *' workflow_dispatch: + inputs: + workflow_choice: + description: "Choose YAML to update" + required: true + default: "both" + type: choice + options: + - snapcraft + - rockcraft + - both jobs: - update-snapcraft-yaml: + update-yamls: runs-on: ubuntu-latest steps: - name: Checkout this repo uses: actions/checkout@v3 - - name: Run desktop-snaps action + + - name: Run desktop-snaps action (Snapcraft) + if: ${{ github.event_name == 'schedule' || github.event.inputs.workflow_choice == 'snapcraft' || github.event.inputs.workflow_choice == 'both' }} + uses: ubuntu/desktop-snaps@stable + with: + token: ${{ secrets.GITHUB_TOKEN }} + repo: ${{ github.repository }} + version-schema: '^(\d{8})' + + - name: Run desktop-snaps action (Rockcraft) + if: ${{ github.event_name == 'schedule' || github.event.inputs.workflow_choice == 'rockcraft' || github.event.inputs.workflow_choice == 'both' }} uses: ubuntu/desktop-snaps@stable with: token: ${{ secrets.GITHUB_TOKEN }} repo: ${{ github.repository }} - version-schema: '^debian/(\d+\.\d+\.\d+)' - \ No newline at end of file + rock-version-schema: '^(\d{8})' + yaml-path: 'rockcraft.yaml' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..0f2937c --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,33 @@ +name: CI Pipeline for gutenprint-printer-app + +on: + push: + branches: + - main + - master + pull_request: + branches: + - main + - master + workflow_dispatch: + +jobs: + build-rock: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Pack with Rockcraft + uses: canonical/craft-actions/rockcraft-pack@main + id: rockcraft + + build-snap: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Build Snap Package + uses: snapcore/action-build@v1 + id: snapcraft \ No newline at end of file diff --git a/.github/workflows/registry-actions.yml b/.github/workflows/registry-actions.yml new file mode 100644 index 0000000..6c909d5 --- /dev/null +++ b/.github/workflows/registry-actions.yml @@ -0,0 +1,113 @@ +name: Pack and Publish OCI Image to Docker Registry and GitHub Packages + +on: + push: + branches: + - main + - master + workflow_dispatch: + inputs: + workflow_choice: + description: "Choose Release Channel" + required: true + default: "edge" + type: choice + options: + - edge + - stable + - both + workflow_run: + workflows: ["Push new tag update to stable branch"] + types: + - completed + +jobs: + build-rock: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Pack with Rockcraft + uses: canonical/craft-actions/rockcraft-pack@main + id: rockcraft + + - name: Upload Rock Artifact + uses: actions/upload-artifact@v4 + with: + name: cups-rock + path: ${{ steps.rockcraft.outputs.rock }} + + publish-rock: + needs: build-rock + if: github.ref_name == 'main' || github.ref_name == 'master' + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Download Rock Artifact + uses: actions/download-artifact@v4 + with: + name: cups-rock + + - name: Install Dependencies + run: | + sudo snap install rockcraft --classic + sudo snap install docker + sudo snap install yq + + - name: Ensure Docker Daemon is Running + run: | + sudo systemctl start docker + sudo systemctl enable docker + sudo systemctl is-active --quiet docker || sudo systemctl start docker + + # - name: Log in to Docker Hub + # uses: docker/login-action@v3.2.0 + # with: + # username: ${{ secrets.DOCKER_USERNAME }} + # password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Log in to GitHub Packages + uses: docker/login-action@v3.2.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and Push Docker Image (Edge & Latest Channel) + if: github.event.inputs.workflow_choice == 'edge' || github.event.inputs.workflow_choice == 'both' || github.event_name == 'push' || github.event_name == 'workflow_run' + env: + USERNAME: ${{ secrets.DOCKER_USERNAME }} + run: | + IMAGE="$(yq '.name' rockcraft.yaml)" + VERSION="$(yq '.version' rockcraft.yaml)" + ROCK="$(ls *.rock | tail -n 1)" + sudo rockcraft.skopeo --insecure-policy copy oci-archive:"${ROCK}" docker-daemon:"${USERNAME}/${IMAGE}:${VERSION}-edge" + # Push to Docker Hub + # docker push ${USERNAME}/${IMAGE}:${VERSION}-edge + # docker tag ${USERNAME}/${IMAGE}:${VERSION}-edge ${USERNAME}/${IMAGE}:latest + # docker push ${USERNAME}/${IMAGE}:latest + # Push to GitHub Packages + GITHUB_IMAGE="ghcr.io/${{ github.repository_owner }}/${IMAGE}" + docker tag ${USERNAME}/${IMAGE}:${VERSION}-edge ${GITHUB_IMAGE}:${VERSION}-edge + docker push ${GITHUB_IMAGE}:${VERSION}-edge + docker tag ${GITHUB_IMAGE}:${VERSION}-edge ${GITHUB_IMAGE}:latest + docker push ${GITHUB_IMAGE}:latest + + - name: Build and Push Docker Image (Stable Channel) + if: github.event.inputs.workflow_choice == 'stable' || github.event.inputs.workflow_choice == 'both' + env: + USERNAME: ${{ secrets.DOCKER_USERNAME }} + run: | + IMAGE="$(yq '.name' rockcraft.yaml)" + VERSION="$(yq '.version' rockcraft.yaml)" + ROCK="$(ls *.rock | tail -n 1)" + sudo rockcraft.skopeo --insecure-policy copy oci-archive:"${ROCK}" docker-daemon:"${USERNAME}/${IMAGE}:${VERSION}-stable" + # Push to Docker Hub + # docker push ${USERNAME}/${IMAGE}:${VERSION}-stable + # Push to GitHub Packages + GITHUB_IMAGE="ghcr.io/${{ github.repository_owner }}/${IMAGE}" + docker tag ${USERNAME}/${IMAGE}:${VERSION}-stable ${GITHUB_IMAGE}:${VERSION}-stable + docker push ${GITHUB_IMAGE}:${VERSION}-stable diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d68f8e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.snap +*.rock +.DS_Store diff --git a/README.md b/README.md index cc52acb..0463c58 100644 --- a/README.md +++ b/README.md @@ -211,8 +211,99 @@ You can edit the `/var/snap/gutenprint-printer-app/common/cups/snmp.conf` file for configuring SNMP network printer discovery. +## THE ROCK (OCI CONTAINER IMAGE) -## BUILDING WITHOUT SNAP +### Install from Docker Hub +#### Prerequisites + +1. **Docker Installed**: Ensure Docker is installed on your system. You can download it from the [official Docker website](https://www.docker.com/get-started). +```sh + sudo snap install docker +``` + +#### Step-by-Step Guide + +The first step is to pull the gutenprint-printer-app Docker image from Docker Hub. +```sh + sudo docker pull openprinting/gutenprint-printer-app +``` + +Run the following Docker command to run the gutenprint-printer-app image: +```sh + sudo docker run --rm -d \ + --name gutenprint-printer-app \ + --network host \ + -e PORT= \ + openprinting/gutenprint-printer-app:latest +``` +- `PORT` is an optional environment variable used to start the printer-app on a specified port. If not provided, it will start on the default port 8000 or, if port 8000 is busy, on 8001 and so on. +- **The container must be started in `--network host` mode** to allow the Printer-Application instance inside the container to access and discover printers available in the local network where the host system is in. +- Alternatively using the internal network of the Docker instance (`-p :8000` instead of `--network host -e PORT=`) only gives access to local printers running on the host system itself. + +### Setting Up and Running gutenprint-printer-app locally + +#### Prerequisites + +**Docker Installed**: Ensure Docker is installed on your system. You can download it from the [official Docker website](https://www.docker.com/get-started) or from the Snap Store: +```sh + sudo snap install docker +``` + +**Rockcraft**: Rockcraft should be installed. You can install Rockcraft using the following command: +```sh + sudo snap install rockcraft --classic +``` + +**Skopeo**: Skopeo should be installed to compile `*.rock` files into Docker images. It comes bundled with Rockcraft, so no separate installation is required. + +#### Step-by-Step Guide + +**Build gutenprint-printer-app rock** + +The first step is to build the Rock from the `rockcraft.yaml`. This image will contain all the configurations and dependencies required to run gutenprint-printer-app. + +Open your terminal and navigate to the directory containing your `rockcraft.yaml`, then run the following command: + +```sh + rockcraft pack -v +``` + +**Compile to Docker Image** + +Once the rock is built, you need to compile docker image from it. + +```sh + sudo rockcraft.skopeo --insecure-policy copy oci-archive: docker-daemon:gutenprint-printer-app:latest +``` + +**Run the gutenprint-printer-app Docker Container** + +```sh + sudo docker run --rm -d \ + --name gutenprint-printer-app \ + --network host \ + -e PORT= \ + gutenprint-printer-app:latest +``` +- `PORT` is an optional environment variable used to start the printer-app on a specified port. If not provided, it will start on the default port 8000 or, if port 8000 is busy, on 8001 and so on. +- **The container must be started in `--network host` mode** to allow the Printer-Application instance inside the container to access and discover printers available in the local network where the host system is in. +- Alternatively using the internal network of the Docker instance (`-p :8000` instead of `--network host -e PORT=`) only gives access to local printers running on the host system itself. + +#### Setting up + +Enter the web interface + +```sh +http://localhost:/ +``` + +Use the web interface to add a printer. Supply a name, select the +discovered printer, then select make and model. Also set the installed +accessories, loaded media and the option defaults. If the printer is a +PostScript printer, accessory configuration and option defaults can +also often get polled from the printer. + +## BUILDING WITHOUT PACKAGING OR INSTALLATION You can also do a "quick-and-dirty" build without snapping and without needing to install [PAPPL](https://www.msweet.org/pappl), @@ -307,4 +398,4 @@ The HP PCL Printer Application is Copyright © 2019-2020 by Michael R Sweet. This software is licensed under the Apache License Version 2.0 with an exception to allow linking against GPL2/LGPL2 software (like older versions of CUPS). See -the files "LICENSE" and "NOTICE" for more information. +the files "LICENSE" and "NOTICE" for more information. \ No newline at end of file diff --git a/snap/local/cups-dnssd-backend-socket-only.patch b/patches/cups-dnssd-backend-socket-only.patch similarity index 100% rename from snap/local/cups-dnssd-backend-socket-only.patch rename to patches/cups-dnssd-backend-socket-only.patch diff --git a/rockcraft.yaml b/rockcraft.yaml new file mode 100644 index 0000000..de31cb1 --- /dev/null +++ b/rockcraft.yaml @@ -0,0 +1,603 @@ +name: gutenprint-printer-app +base: ubuntu@22.04 +version: '5.3.4-11' +summary: Gutenprint Printer Application +description: | + The Gutenprint Printer Application is a PAPPL (Printer Application + Framework) based Printer Application to support printers using the + Gutenprint printer driver. + +adopt-info: gutenprint + +# Only build on the architectures supported +platforms: + arm64: + amd64: + armhf: + +services: + dbus: + command: /scripts/run-dbus.sh + override: replace + on-failure: restart + startup: enabled + + gutenprint-printer-app: + command: /scripts/start-server.sh + override: replace + on-failure: restart + startup: enabled + after: [dbus] + +parts: + pappl: + source: https://github.com/michaelrsweet/pappl + source-type: git + source-tag: 'v1.4.8' + source-depth: 1 +# ext:updatesnap +# version-format: +# lower-than: '2' +# no-9x-revisions: true + plugin: autotools + override-build: | + set -eux + # Raise the supported number of vendor-specific options/attributes in + # PAPPL to 256, as the original 32 is too small for Gutenprint's + # expert PPDs + perl -p -i -e 's/(define\s+PAPPL_MAX_VENDOR\s+)32/\1 256/' pappl/printer.h + # De-activate log-rotating. It does not work with the forked processes + # of the filters + perl -p -i -e 's/(system->logmaxsize\s+=).*/\1 0;/' pappl/system.c + # As we do not use PAPPL's own backends but the CUPS backends using the + # "cups" device scheme of pappl-retrofit, we let the manual "Network + # Printer" device on the "Add Printer" page of the web interface use a + # "cups:socket://..." URI instead of simply "socket://..." + perl -p -i -e 's/(httpAssembleURI\(.*?)"socket"(.*?\))/\1"cups:socket"\2/' pappl/system-webif.c + # PAPPL's build system does not insert the LDFLAGS when linking. + # Patching Makedefs.in to fix this + perl -p -i -e 's/^(\s*DSOFLAGS\s*=\s*\S*\s+)/\1\$\(LDFLAGS\) /' Makedefs.in + craftctl default + autotools-configure-parameters: + - --prefix=/usr + - --enable-libjpeg + - --enable-libpng + - --enable-libusb + - --with-dnssd=avahi + build-packages: + - libavahi-client-dev + - libgnutls28-dev + - libjpeg-dev + - libpam0g-dev + - libpng-dev + - libusb-1.0-0-dev + - zlib1g-dev + - perl-base + stage-packages: + # We stage libavahi-client3 already in the "cups" part, to stage + # everything Avahi-related there, to avoid any file clashes. + #- libavahi-client3 + - libpng16-16 + - libusb-1.0-0 + prime: + - -etc/fonts + - -var + - lib/*/lib*.so* + - usr/lib/lib*.so* + - usr/lib/*/lib*.so* + - -usr/include + - -usr/lib/pkgconfig + - -usr/share/fonts + - -usr/share/man + - -usr/share/doc + - -usr/share/doc-base + - -usr/share/lintian + after: [cups] + + pappl-retrofit: + source: https://github.com/openprinting/pappl-retrofit + source-type: git + # source-tag: '1.0b2' + source-depth: 1 +# ext:updatesnap +# version-format: +# ignore: true +# format: '%V' + plugin: autotools + autotools-configure-parameters: + - --prefix=/usr + # To find the libraries built in this Snap + build-environment: + - LD_LIBRARY_PATH: "${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$CRAFT_STAGE/usr/lib" + build-packages: + - autoconf + - automake + - libtool + - autotools-dev + - pkg-config + - perl-base + stage-packages: + - libusb-1.0-0 + organize: + usr/share/legacy-printer-app/testpage.pdf: usr/share/gutenprint-printer-app/testpage.pdf + prime: + - lib/*/lib*.so* + - usr/lib/lib*.so* + - usr/lib/*/lib*.so* + - usr/share/gutenprint-printer-app/testpage.pdf + - -var + - -usr/var + - -usr/bin/legacy-printer-app + - -usr/include + - -usr/lib/pkgconfig + - -usr/lib/legacy-printer-app + - -usr/share/legacy-printer-app + - -usr/share/fonts + - -usr/share/man + - -usr/share/doc + - -usr/share/doc-base + - -usr/share/lintian + after: [cups, pappl, libcupsfilters, libppd] + + qpdf: + source: https://github.com/qpdf/qpdf/ + source-type: git + source-tag: 'v11.9.1' + source-depth: 1 +# ext:updatesnap +# version-format: +# lower-than: '12' +# no-9x-revisions: true + plugin: cmake + cmake-parameters: + - -DCMAKE_INSTALL_PREFIX=/ + - -DCMAKE_BUILD_RPATH_USE_ORIGIN=1 + - -DUSE_IMPLICIT_CRYPTO=0 + - -DREQUIRE_CRYPTO_GNUTLS=1 + - -DSHOW_FAILED_TEST_OUTPUT=1 + - -DCMAKE_BUILD_TYPE=RelWithDebInfo + - -DQTEST_COLOR=0 + build-packages: + - cmake + - g++ + - libjpeg-dev + - zlib1g-dev + - libgnutls28-dev + stage-packages: + - libjpeg-turbo8 + stage: + # The *.la file which gets installed by "make install" contains a + # wrong prefix, breaking parts of this Snap which use this library + - -usr/lib/lib*.la + prime: + - lib/*/lib*.so* + - usr/lib/lib*.so* + - usr/lib/*/lib*.so* + - -etc/fonts + - -var + - -usr/include + - -share/man + - -share/doc + - -share/lintian + - -usr/share/fonts + - -usr/share/man + - -usr/share/doc + - -usr/share/doc-base + - -usr/share/lintian + - -usr/lib/libqpdf.a + - -usr/lib/libqpdf.la + - -usr/lib/pkgconfig + + ghostscript: + #source: https://git.ghostscript.com/ghostpdl.git + source: https://github.com/ArtifexSoftware/ghostpdl.git + source-type: git + source-tag: 'ghostpdl-10.05.0-test-base-001' + source-depth: 1 +# ext:updatesnap +# version-format: +# format: "ghostpdl-%M.%m.%R" +# lower-than: '11' +# no-9x-revisions: true + plugin: autotools + # We only need Raster and PostScript output + autotools-configure-parameters: + - --prefix=/usr + - --without-x + - --disable-gtk + - --with-drivers=cups,pwgraster,ps2write + - --enable-freetype + - --without-tesseract + - --without-gpdl + - --without-xps + - --without-pcl + stage-packages: + - libpaper1 + - libfontconfig1 + - libfreetype6 + - libpng16-16 + prime: + - usr/bin/gs + - lib/*/lib*.so* + - usr/lib/*/lib*.so* + - usr/share/ghostscript + - -etc/fonts + - -var + - -usr/include + - -usr/lib/pkgconfig + - -usr/share/fonts + - -usr/share/man + - -usr/share/doc + - -usr/share/doc-base + - -usr/share/lintian + after: [cups] + + cups: + source: https://github.com/OpenPrinting/cups + source-type: git + source-tag: 'v2.4.11' + source-depth: 1 +# ext:updatesnap +# version-format: +# lower-than: '3' +# no-9x-revisions: true + plugin: autotools + # We only need libcups (with headers, ...) and the backends + override-build: | + set -eux + patch -p1 < $CRAFT_PROJECT_DIR/patches/cups-dnssd-backend-socket-only.patch + # We use "--with-tls=gnutls" here, as current CUPS defaults to SSL here + # and this is buggy, causing a segfault when serving out a HTTPS web + # interface page. + ./configure --sysconfdir=/var/snap/gutenprint-printer-app/common/ --with-tls=gnutls + cd cups + make + cd .. + cd backend + # Have USB quirk files in user-modifiable space for debugging + perl -p -i -e 's/"CUPS_DATADIR"/"USB_QUIRK_DIR"/' usb-libusb.c + make snmp dnssd socket ipp ipps lpd usb + cd .. + mkdir -p $CRAFT_PART_INSTALL/usr/lib + cp cups/libcups*.a $CRAFT_PART_INSTALL/usr/lib/ + cp -P cups/libcups.so* $CRAFT_PART_INSTALL/usr/lib/ + mkdir -p $CRAFT_PART_INSTALL/usr/include/cups + cp cups/*.h $CRAFT_PART_INSTALL/usr/include/cups/ + mkdir -p $CRAFT_PART_INSTALL/usr/bin + cp cups-config $CRAFT_PART_INSTALL/usr/bin/ + mkdir -p $CRAFT_PART_INSTALL/usr/lib/gutenprint-printer-app/backend/ + (cd backend; \ + cp snmp dnssd socket ipp ipps lpd usb org.cups.usb-quirks $CRAFT_PART_INSTALL/usr/lib/gutenprint-printer-app/backend/ \ + ) + cp conf/snmp.conf $CRAFT_PART_INSTALL/usr/lib/gutenprint-printer-app/backend/ + build-packages: + - patch + - gettext + - autoconf + - automake + - libtool + - autotools-dev + - pkg-config + - libavahi-client-dev + - libavahi-common-dev + - libavahi-compat-libdnssd-dev + - libdbus-1-dev + - libfontconfig1-dev + - libfreetype6-dev + - libgnutls28-dev + - libjpeg-dev + - libkrb5-dev + - libpam0g-dev + - libpaper-dev + - libpng-dev + - libusb-1.0-0-dev + - perl-base + stage-packages: + - libusb-1.0-0 + # We stage everything Avahi-related here and do not stage + # anything of this in the pappl part to avoid any file clashes. + - libavahi-common3 + - libavahi-client3 + prime: + - -etc/fonts + - -var + - -usr/include + - -usr/lib/pkgconfig + - -usr/share/cups + - -usr/share/fonts + - -usr/share/man + - -usr/share/doc + - -usr/share/doc-base + - -usr/share/lintian + - lib/*/lib*.so* + - usr/lib/lib*.so* + - usr/lib/*/lib*.so* + - usr/lib/gutenprint-printer-app/backend/* + + libcupsfilters: + source: https://github.com/OpenPrinting/libcupsfilters + source-type: git + source-tag: '2.1.0' + source-depth: 1 +# ext:updatesnap +# version-format: +# lower-than: '3' +# no-9x-revisions: true + plugin: autotools + # We only need libcupsfilters itself. so we simply do not prime the + # auxiliary files (/usr/share) + autotools-configure-parameters: + - --prefix=/usr + - --disable-avahi + - --disable-mutool + build-packages: + - gettext + - autoconf + - automake + - autotools-dev + - pkg-config + - g++ + - sharutils + - liblcms2-dev + - libpoppler-cpp-dev + - libpng-dev + - libjpeg-dev + - libtiff5-dev + - zlib1g-dev + - libfontconfig1-dev + - libdbus-1-dev + - libexif-dev + stage-packages: + - libpoppler-cpp0v5 + - libjbig0 + - liblcms2-2 + - libnspr4 + - libnss3 + - libopenjp2-7 + - libpoppler118 + # We stage libtiff5 and libwebp7 here and do not stage them in the + # "gutenprint-printer-app" part to avoid any file clashes. + - libtiff5 + - libwebp7 + - libexif12 + stage: + - -usr/lib/lib*.la + # The *.la file which gets installed by "make install" contains a + # wrong prefix, breaking parts of this Snap which use this library + prime: + - -etc + - -var + - -usr/include + - -usr/lib/pkgconfig + - usr/share/cups + - -usr/share/fonts + - -usr/share/man + - -usr/share/doc + - -usr/share/doc-base + - -usr/share/lintian + - lib/*/lib*.so* + - usr/lib/lib*.so* + - usr/lib/*/lib*.so* + - usr/lib/*/nss + # Reported unused by snapcraft linter + - -usr/lib/*/libssl3.* + after: [cups, qpdf, ghostscript] + + libppd: + source: https://github.com/OpenPrinting/libppd + source-type: git + source-tag: '2.1.0' + source-depth: 1 +# ext:updatesnap +# version-format: +# lower-than: '3' +# no-9x-revisions: true + plugin: autotools + # We only need libppd itself + autotools-configure-parameters: + - --prefix=/usr + - --disable-mutool + - --disable-pdftocairo + - --disable-acroread + - --with-pdftops-path=/snap/gutenprint-printer-app/current/usr/bin/pdftops + # To find the libraries built in this Snap + build-environment: + - LD_LIBRARY_PATH: "${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$CRAFT_STAGE/usr/lib" + build-packages: + - gettext + - autoconf + - automake + - autotools-dev + - pkg-config + - g++ + - sharutils + - poppler-utils + prime: + - -etc + - -var + - -usr/include + - -usr/lib/pkgconfig + - -usr/share/ppdc + - -usr/share/fonts + - -usr/share/man + - -usr/share/doc + - -usr/share/doc-base + - -usr/share/lintian + - lib/*/lib*.so* + - usr/lib/lib*.so* + - usr/lib/*/lib*.so* + - usr/lib/*/nss + after: [cups, ghostscript, libcupsfilters] + + gutenprint: + # github source + # source: https://github.com/echiu64/gutenprint.git + source: https://salsa.debian.org/printing-team/gutenprint.git + source-type: git + source-tag: 'debian/5.3.4.20220624T01008808d602-4' + # github source tag + # source-tag: 'gutenprint-5_3_3' + source-depth: 1 +# ext:updatesnap +# version-format: +# format: 'debian/%V' +# lower-than: '6' +# no-9x-revisions: true + plugin: autotools + # We only need the library, the XML resources, and the CUPS driver + # (PPD generator, filter, backend) + autotools-configure-parameters: + - --prefix=/usr + - --datarootdir=/snap/gutenprint-printer-app/current/usr/share + - --enable-shared + - --disable-rpath + - --with-modules=static + - --without-gimp2 + - --disable-libgutenprintui2 + - --with-cups + - --enable-cups-level3-ppds + - --enable-translated-cups-ppds + - --enable-simplified-cups-ppds + - --enable-cups-1_2-enhancements + - --disable-cups-ppds + - --enable-escputil + - --disable-samples + - --disable-test + - --disable-testpattern + - --enable-nls + - --without-doc + build-packages: + - byacc + - libreadline-dev + - libusb-1.0-0-dev + - zlib1g-dev + - flex + - gettext + - chrpath + - libtool-bin + - curl + organize: + snap/gutenprint-printer-app/current/usr/share: usr/share + usr/lib/cups/filter/rastertogutenprint.5.3: usr/lib/gutenprint-printer-app/filter/rastertogutenprint.5.3 + usr/lib/cups/filter/commandtoepson: usr/lib/gutenprint-printer-app/filter/commandtoepson + usr/lib/cups/filter/commandtocanon: usr/lib/gutenprint-printer-app/filter/commandtocanon + usr/lib/cups/backend/gutenprint53+usb: usr/lib/gutenprint-printer-app/backend/gutenprint53+usb + usr/share/cups/usb/net.sf.gimp-print.usb-quirks: usr/lib/gutenprint-printer-app/backend/net.sf.gimp-print.usb-quirks + usr/lib/cups/driver/gutenprint.5.3: usr/share/ppd/gutenprint.5.3 + prime: + - usr/bin/cups-calibrate + - usr/bin/escputil + - usr/sbin/*genppd* + - usr/lib/lib*.so* + - usr/lib/gutenprint-printer-app + - usr/share/ppd/gutenprint.5.3 + - usr/share/gutenprint + - usr/share/locale + - usr/share/cups/calibrate.ppm + - -snap + - -etc/fonts + - -var + - -usr/include + - -share/man + - -share/doc + - -share/lintian + - -usr/share/fonts + - -usr/share/man + - -usr/share/doc + - -usr/share/doc-base + - -usr/share/lintian + - -usr/share/gutenprint/doc + - -usr/lib/gutenprint + - -usr/lib/libgutenprint.a + - -usr/lib/libgutenprint.la + - -usr/lib/pkgconfig + - -usr/lib/cups + after: [cups] + + gutenprint-printer-app: + plugin: make + source: . + make-parameters: + - LDFLAGS="$LDFLAGS -ljpeg" + - VERSION="$VERSION" + # To find the libraries built in this Snap + build-environment: + - LD_LIBRARY_PATH: "${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$CRAFT_STAGE/usr/lib" + # To improve convenience for developers (and everyone who wants to + # build from source), we do a "make clean" before "make" here, + # because if we had done "make" off-Snap, directly in the source + # tree. and afterwards build the Snap with snapcraft, the build + # sucks in our local binary of gutenprint-printer-app instead of + # compiling its own one in the Snap harness with the appropriate + # libraries, ending up with the Snap containing an executable + # which does not work inside the Snap. The "make clean" removes + # any accidentally grabbed binary. + # + # We need to directly call the "make" and "make install" commands + # here as we cannot inject an environment variable into the default + # build process ("craftctl default") and we also cannot call + # "craftctl get version" in the lines of "make-parameters:" or + # "build-environment:". This way we get the version number of our + # Snap (which is extracted from the Gutenprint upstream source) + # into the gutenprint-printer-app executable. + override-build: | + set -eux + make clean + VERSION="`craftctl get version`" + make -j"8" LDFLAGS="$LDFLAGS -ljpeg" VERSION="$VERSION" + make -j"8" install LDFLAGS="$LDFLAGS -ljpeg" VERSION="$VERSION" DESTDIR="$CRAFT_PART_INSTALL" + #craftctl default + build-packages: + - libusb-1.0-0-dev + stage-packages: + - libusb-1.0-0 + - libjbig0 + - liblcms2-2 + # We stage libtiff5 and libwebp7 already in the "libcupsfilters" part, so + # we do not stage them here again, to avoid any file clashes. + #- libtiff5 + #- libwebp7 + stage: + - -usr/lib/gutenprint-printer-app + prime: + - usr/bin/gutenprint-printer-app + - lib/*/lib*.so* + - usr/lib/*/lib*.so* + - usr/share/gutenprint-printer-app + - -var + - -usr/share/man + # Reported unused by snapcraft linter + - -usr/lib/*/libgssapi.* + after: [pappl-retrofit, pappl, libcupsfilters, libppd, gutenprint] + + avahi-daemon: + plugin: nil + overlay-packages: + - avahi-daemon + - avahi-utils + - libnss-mdns + - mdns-scan + - dbus + + utils: + plugin: nil + overlay-packages: + - python3 + + scripts: + plugin: dump + source: scripts/ + organize: + run-dbus.sh: /scripts/run-dbus.sh + start-server.sh: /scripts/start-server.sh + override-prime: | + set -eux + craftctl default + # Ensure the run-dbus.sh script has executable permissions + if [ -f "$CRAFT_PRIME/scripts/run-dbus.sh" ]; then + chmod +x "$CRAFT_PRIME/scripts/run-dbus.sh" + fi + # Ensure the start-server.sh script has executable permissions + if [ -f "$CRAFT_PRIME/scripts/start-server.sh" ]; then + chmod +x "$CRAFT_PRIME/scripts/start-server.sh" + fi diff --git a/scripts/run-dbus.sh b/scripts/run-dbus.sh new file mode 100644 index 0000000..23f91ea --- /dev/null +++ b/scripts/run-dbus.sh @@ -0,0 +1,32 @@ +#!/bin/sh +set -eux + +echo "Creating system users" + +# Create system users with system accounts and no home directories, using nologin shell +useradd --system --no-create-home --shell /usr/sbin/nologin systemd-resolve || true +useradd --system --no-create-home --shell /usr/sbin/nologin systemd-network || true + +echo "Creating directories" + +# Create the /run/dbus directory if it doesn't exist, set permissions, and ownership +mkdir -p /run/dbus +chmod 755 /run/dbus +chown root:root /run/dbus + +echo "Starting dbus" + +# Start the dbus daemon in the foreground +# dbus-daemon --system --nofork --nopidfile & + +# Check the status of the dbus service +service dbus start +service dbus status || true + +echo "Starting avahi-daemon" + +# Start the avahi-daemon in the background without dropping root privileges +avahi-daemon --daemonize --no-drop-root + +# Keep the script running to avoid container exit +tail -f /dev/null \ No newline at end of file diff --git a/scripts/start-server.sh b/scripts/start-server.sh new file mode 100644 index 0000000..50cc17f --- /dev/null +++ b/scripts/start-server.sh @@ -0,0 +1,12 @@ +#!/bin/sh +set -eux + +# Precheck: Ensure PORT is a number or undefined +if [ -n "${PORT:-}" ]; then + if ! echo "$PORT" | grep -Eq '^[0-9]+$'; then + echo "Error: PORT must be a valid number" >&2 + exit 1 + fi +fi + +gutenprint-printer-app -o log-file=/gutenprint-printer-app.log ${PORT:+-o server-port=$PORT} server diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 628cb40..fba8457 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -255,7 +255,7 @@ parts: # We only need libcups (with headers, ...) and the backends override-build: | set -eux - patch -p1 < $CRAFT_PROJECT_DIR/snap/local/cups-dnssd-backend-socket-only.patch + patch -p1 < $CRAFT_PROJECT_DIR/patches/cups-dnssd-backend-socket-only.patch # We use "--with-tls=gnutls" here, as current CUPS defaults to SSL here # and this is buggy, causing a segfault when serving out a HTTPS web # interface page.