commit e1474dc6940200e2c565dd6ab2d61bfe2346a978 Author: user Date: Sun Sep 20 22:20:45 2026 +0400 feat: add Arch packaging for Kyocera SANE driver diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 0000000..a0d5073 --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,147 @@ +# The download URL/ filename does not change with version update. Need to check filenames inside downloaded ZIP file, or front webpage, for version. + +_upstreamlistingurl='https://www.kyoceradocumentsolutions.eu/en/support/downloads.name-L2V1L2VuL21mcC9FQ09TWVNNNDEzMklETg==.html' +_upstreamsourcedownloadpath='https://www.kyoceradocumentsolutions.eu/content/dam/download-center-cf/eu/drivers/all' +_upstreamsourcefilename='SANE_Driver_zip.download.zip' +_get_pkgver() { + local _ver='' _chunk + + while IFS= read -r -d '' _chunk || [[ -n $_chunk ]]; do + if [[ $_chunk =~ SANE[[:space:]]Driver[[:space:]]\(([0-9.]+)\) ]]; then + _ver="${BASH_REMATCH[1]}" + fi + done < <(curl -fsSL "${_upstreamlistingurl}") + + if [[ -z $_ver ]]; then + printf '%s\n' 'Failed to determine upstream version.' >&2 + return 1 + fi + + printf '%s\n' "$_ver" +} + +pkgname=kyocera-sane +pkgver="$(_get_pkgver)" +pkgrel=2 +pkgdesc='Kyocera sane scanner support package for many Kyocera printers.' +arch=( + 'i386' + 'i486' + 'i586' + 'i686' + 'x86_64' +) +url='https://www.kyocera.com/' +license=('LicenseRef-proprietary') + +install="${pkgname}.install" + +options=('!debug') + +source=( + "${pkgname}-${pkgver}_SANE-Driver.zip::${_upstreamsourcedownloadpath}/${_upstreamsourcefilename}" + 'README.txt' +) +sha256sums=( + '3076b7ae5e48564568ab7c660da3c77d6059b3fe96056f4df2a38544b579f8ab' + '945f922065e8278d2ec6e0c1e8ce6851834359cd02ff85534fa3d7baccec6ffe' +) + +prepare() { + cd "${srcdir}" + install -d build + + local _debarch + + case "${CARCH}" in + i386 | i486 | i586 | i686) + _debarch='i386' + ;; + x86_64) + _debarch='amd64' + ;; + *) + printf 'Unsupported architecture: %s\n' "${CARCH}" >&2 + return 1 + ;; + esac + + bsdtar -xf "${pkgname}_${pkgver}_${_debarch}.deb" + bsdtar -xf "${srcdir}/data.tar.xz" -C "${srcdir}/build" +} + +build() { + cd "${srcdir}/build" + + # From .deb postinst + install -dvm755 "etc/sane.d/dll.d" + printf '%s\n' \ + 'kyocera' \ + 'kyocera_gdi_a3' \ + 'kyocera_wc3' \ + 'kyocera_wc3_usb' \ + >"etc/sane.d/dll.d/kyocera.conf" + + chmod 644 "etc/sane.d"/*.conf + chmod 644 "etc/sane.d/dll.d"/*.conf + + # Prevent usblp from claiming the USB printer interface. + install -dvm755 "usr/lib/modprobe.d" + printf '%s\n' \ + '# Kyocera SANE backend requires direct libusb access.' \ + 'blacklist usblp' \ + >"usr/lib/modprobe.d/${pkgname}.conf" + chmod 644 "usr/lib/modprobe.d/${pkgname}.conf" + + # Grant the active user access to Kyocera FS-1020MFP. + install -dvm755 "usr/lib/udev/rules.d" + printf '%s\n' \ + 'ACTION!="remove", SUBSYSTEM=="usb", ATTRS{idVendor}=="0482", ATTRS{idProduct}=="0495", MODE="0660", TAG+="uaccess"' \ + >"usr/lib/udev/rules.d/71-${pkgname}.rules" + chmod 644 "usr/lib/udev/rules.d/71-${pkgname}.rules" + + # The proprietary Kyocera backend creates temporary files directly + # in this hardcoded directory (e.g. scannerdata.bin, raster_1.bmp). + chmod 1777 "usr/local/kyocera/scanner" + + # Move the vendor UDEV rule to documentation because it grants + # overly permissive permissions (0666) to all USB devices. + mv -v \ + "etc/udev/rules.d/40-scanner-permissions.rules" \ + "usr/share/doc/${pkgname}/" + chmod 644 \ + "usr/share/doc/${pkgname}/40-scanner-permissions.rules" + rmdir -v "etc/udev/rules.d" + + # Move the license into place. + install -Dvm644 \ + "usr/share/doc/${pkgname}/copyright" \ + "usr/share/licenses/${pkgname}/COPYRIGHT" + rm "usr/share/doc/${pkgname}/copyright" + + # Clean unnecessary files. + case "${CARCH}" in + i386 | i486 | i586 | i686) + rm -r "usr/lib/i386-linux-gnu" + ;; + x86_64) + rm -r "usr/lib/x86_64-linux-gnu" + ;; + *) + printf 'Unsupported architecture: %s\n' "${CARCH}" >&2 + return 1 + ;; + esac +} + +package() { + cd "${srcdir}/build" + + # Move files into place. + cp -rv * "${pkgdir}"/ + + # Install documentation. + install -Dvm644 \ + "${srcdir}/README.txt" \ + "${pkgdir}/usr/share/doc/${pkgname}/README.txt" +} diff --git a/kyocera-sane.install b/kyocera-sane.install new file mode 100644 index 0000000..98768ca --- /dev/null +++ b/kyocera-sane.install @@ -0,0 +1,17 @@ +post_install() { + chmod 1777 /usr/local/kyocera/scanner 2>/dev/null || true + + udevadm control --reload-rules || true + udevadm trigger \ + --subsystem-match=usb \ + --attr-match=idVendor=0482 \ + --attr-match=idProduct=0495 || true +} + +post_upgrade() { + post_install +} + +post_remove() { + udevadm control --reload-rules || true +}