Description of problem: When trying to install HP plugin for HP LaserJet P1006 it fails because it can not write into /usr/lib/ which is readonly. It should store the data and libraries somewhere in /var/ (maybe /var/opt/hplip/) and access them there. Version-Release number of selected component (if applicable): hplip-3.18.12-6 How reproducible: Always Steps to Reproduce: 1. hp-plugin -i on Silverblue Actual results: "error: Plugin installation failed" Expected results: The installation suceed Additional info: This was originally reported here: https://teams.fedoraproject.org/project/silverblue/us/45
Hi Marek! thank you for reporting the issue! Unfortunately, IMO it is not possible to solve it in hplip open-sourced code. What really happens during plugin installation is that hp-plugin just download .run file which is in fact python script + proprietary shared libraries, and runs the python script, which tries to put libraries in predefined places (predefined only in that outside script) - and if it fails, it cleans up after itself (so I cannot even try to put the libraries into different places - they are gone at the time when processing is back in open-sourced hplip) and returns only true/false into open sourced hplip... Is not there any way how to solve it on Silverblue side or in packaging? (like defining some %ghost files with libraries names where libraries should be...)
Hi Colin and Owen! I do not have any experience with Fedora Silverblue and I was told you are right people to ask - would you mind helping me with the issue? Is there a way how to add these proprietary shared libraries into dirs where hplip expects them, because open-sourced hplip does not have any power to influence where downloaded script wants to put shared libraries? hp-plugin does this: - downloads .run file - run 'sh .run file' Plugin itself is python script+config file with paths+shared libs, python script tries to put libraries into paths defined in config file.
It needs to drop content in `/opt` (which is really `/var/opt` on OSTree systems), or `/usr/local/` (`/var/usrlocal` on OSTree systems) etc. If it needs to enable systemd units, that still goes in `/etc.
(In reply to Colin Walters from comment #3) > It needs to drop content in `/opt` (which is really `/var/opt` on OSTree > systems), or `/usr/local/` (`/var/usrlocal` on OSTree systems) etc. > If it needs to enable systemd units, that still goes in `/etc. That's the problem, I cannot choose where to put content, because it is done in external (to which I do not have access) script with hard-coded paths. Is there a way how can I put those libraries where hplip expects them?
No. The system is read-only. hplip needs changes to look somewhere else
(In reply to Zdenek Dohnal from comment #4) > That's the problem, I cannot choose where to put content, because it is done > in external (to which I do not have access) script with hard-coded paths. Is > there a way how can I put those libraries where hplip expects them? Zdenek, is the script available somewhere (at least to look at)? (I expect that someone have to capture it).
I have the same problem with my printer (HP LaserJet P1005) and came here to open a bug. I'm glad somebody is looking at it In the meantime, this is the workaround that I do when I want to print something on Silverblue 29: # Open a terminal and unlock the / partition to make it writable su - rpm-ostree unlock # Install the printer drivers hp-plugin The driver plugin for HPLIP 3.18.12 appears to already be installed. Do you wish to download and re-install the plug-in? (y=yes*, n=no, q=quit) ? y Enter option (d=download*, p=specify path, q=quit) ? d Do you accept the license terms for the plug-in (y=yes*, n=no, q=quit) ? y # After that the printer works until next reboot
(In reply to Tomas Popela from comment #6) > (In reply to Zdenek Dohnal from comment #4) > > That's the problem, I cannot choose where to put content, because it is done > > in external (to which I do not have access) script with hard-coded paths. Is > > there a way how can I put those libraries where hplip expects them? > > Zdenek, is the script available somewhere (at least to look at)? (I expect > that someone have to capture it). Tomas, you can capture it during debugging hp-plugin - you set breakpoint into hp-plugin and go through the code until plugin is downloaded and opened - then you can see these scripts+libraries in directory under ~/.hplip/ .
Marek provided me the content of the script and I'm pasting it here - maybe someone will have an idea how to intercept it. I stripped the binary data from it. TMPROOT=${TMPDIR:=/tmp} label="HPLIP 3.18.12 Plugin Self Extracting Archive" script="./hplip-plugin-install" scriptargs="-v 3.18.12 -c 55" targetdir="plugin_tmp" filesizes="10477293" keep=n print_cmd_arg="" if type printf > /dev/null; then print_cmd="printf" elif test -x /usr/ucb/echo; then print_cmd="/usr/ucb/echo" else print_cmd="echo" fi unset CDPATH MS_Printf() { $print_cmd $print_cmd_arg "$1" } MS_Progress() { while read a; do MS_Printf . done } MS_diskspace() { ( if test -d /usr/xpg4/bin; then PATH=/usr/xpg4/bin:$PATH fi df -kP "$1" | tail -1 | awk '{print $4}' ) } MS_dd() { blocks=`expr $3 / 1024` bytes=`expr $3 % 1024` dd if="$1" ibs=$2 skip=1 obs=1024 conv=sync 2> /dev/null | \ { test $blocks -gt 0 && dd ibs=1024 obs=1024 count=$blocks ; \ test $bytes -gt 0 && dd ibs=1 obs=1024 count=$bytes ; } 2> /dev/null } MS_Help() { cat << EOH >&2 Makeself version 2.1.5 1) Getting help or info about $0 : $0 --help Print this message $0 --info Print embedded info : title, default target directory, embedded script ... $0 --lsm Print embedded lsm entry (or no LSM) $0 --list Print the list of files in the archive $0 --check Checks integrity of the archive 2) Running $0 : $0 [options] [--] [additional arguments to embedded script] with following options (in that order) --confirm Ask before running embedded script --noexec Do not run embedded script --keep Do not erase target directory after running the embedded script --nox11 Do not spawn an xterm --nochown Do not give the extracted files to the current user --target NewDirectory Extract in NewDirectory --tar arg1 [arg2 ...] Access the contents of the archive through the tar command -- Following arguments will be passed to the embedded script EOH } MS_Check() { OLD_PATH="$PATH" PATH=${GUESS_MD5_PATH:-"$OLD_PATH:/bin:/usr/bin:/sbin:/usr/local/ssl/bin:/usr/local/bin:/opt/openssl/bin"} MD5_ARG="" MD5_PATH=`exec <&- 2>&-; which md5sum || type md5sum` test -x "$MD5_PATH" || MD5_PATH=`exec <&- 2>&-; which md5 || type md5` test -x "$MD5_PATH" || MD5_PATH=`exec <&- 2>&-; which digest || type digest` PATH="$OLD_PATH" MS_Printf "Verifying archive integrity..." offset=`head -n 405 "$1" | wc -c | tr -d " "` verb=$2 i=1 for s in $filesizes do crc=`echo $CRCsum | cut -d" " -f$i` if test -x "$MD5_PATH"; then if test `basename $MD5_PATH` = digest; then MD5_ARG="-a md5" fi md5=`echo $MD5 | cut -d" " -f$i` if test $md5 = "00000000000000000000000000000000"; then test x$verb = xy && echo " $1 does not contain an embedded MD5 checksum." >&2 else md5sum=`MS_dd "$1" $offset $s | eval "$MD5_PATH $MD5_ARG" | cut -b-32`; if test "$md5sum" != "$md5"; then echo "Error in MD5 checksums: $md5sum is different from $md5" >&2 exit 2 else test x$verb = xy && MS_Printf " MD5 checksums are OK." >&2 fi crc="0000000000"; verb=n fi fi if test $crc = "0000000000"; then test x$verb = xy && echo " $1 does not contain a CRC checksum." >&2 else sum1=`MS_dd "$1" $offset $s | CMD_ENV=xpg4 cksum | awk '{print $1}'` if test "$sum1" = "$crc"; then test x$verb = xy && MS_Printf " CRC checksums are OK." >&2 else echo "Error in checksums: $sum1 is different from $crc" exit 2; fi fi i=`expr $i + 1` offset=`expr $offset + $s` done echo " All good." } UnTAR() { tar $1vf - 2>&1 || { echo Extraction failed. > /dev/tty; kill -15 $$; } } finish=true xterm_loop= nox11=n copy=none ownership=y verbose=n initargs="$@" while true do case "$1" in -h | --help) MS_Help exit 0 ;; --info) echo Identification: "$label" echo Target directory: "$targetdir" echo Uncompressed size: 29084 KB echo Compression: gzip echo Date of packaging: Mon Dec 3 12:47:53 IST 2018 echo Built with Makeself version 2.1.5 on echo Build command was: "/usr/bin/makeself \\ \"plugin_tmp\" \\ \"hplip-3.18.12-plugin.run\" \\ \"HPLIP 3.18.12 Plugin Self Extracting Archive\" \\ \"./hplip-plugin-install\" \\ \"-v\" \\ \"3.18.12\" \\ \"-c\" \\ \"55\"" if test x$script != x; then echo Script run after extraction: echo " " $script $scriptargs fi if test x"" = xcopy; then echo "Archive will copy itself to a temporary location" fi if test x"n" = xy; then echo "directory $targetdir is permanent" else echo "$targetdir will be removed after extraction" fi exit 0 ;; --dumpconf) echo LABEL=\"$label\" echo SCRIPT=\"$script\" echo SCRIPTARGS=\"$scriptargs\" echo archdirname=\"plugin_tmp\" echo KEEP=n echo COMPRESS=gzip echo filesizes=\"$filesizes\" echo CRCsum=\"$CRCsum\" echo MD5sum=\"$MD5\" echo OLDUSIZE=29084 echo OLDSKIP=406 exit 0 ;; --lsm) cat << EOLSM No LSM. EOLSM exit 0 ;; --list) echo Target directory: $targetdir offset=`head -n 405 "$0" | wc -c | tr -d " "` for s in $filesizes do MS_dd "$0" $offset $s | eval "gzip -cd" | UnTAR t offset=`expr $offset + $s` done exit 0 ;; --tar) offset=`head -n 405 "$0" | wc -c | tr -d " "` arg1="$2" shift 2 for s in $filesizes do MS_dd "$0" $offset $s | eval "gzip -cd" | tar "$arg1" - $* offset=`expr $offset + $s` done exit 0 ;; --check) MS_Check "$0" y exit 0 ;; --confirm) verbose=y shift ;; --noexec) script="" shift ;; --keep) keep=y shift ;; --target) keep=y targetdir=${2:-.} shift 2 ;; --nox11) nox11=y shift ;; --nochown) ownership=n shift ;; --xwin) finish="echo Press Return to close this window...; read junk" xterm_loop=1 shift ;; --phase2) copy=phase2 shift ;; --) shift break ;; -*) echo Unrecognized flag : "$1" >&2 MS_Help exit 1 ;; *) break ;; esac done case "$copy" in copy) tmpdir=$TMPROOT/makeself.$RANDOM.`date +"%y%m%d%H%M%S"`.$$ mkdir "$tmpdir" || { echo "Could not create temporary directory $tmpdir" >&2 exit 1 } SCRIPT_COPY="$tmpdir/makeself" echo "Copying to a temporary location..." >&2 cp "$0" "$SCRIPT_COPY" chmod +x "$SCRIPT_COPY" cd "$TMPROOT" exec "$SCRIPT_COPY" --phase2 -- $initargs ;; phase2) finish="$finish ; rm -rf `dirname $0`" ;; esac if test "$nox11" = "n"; then if tty -s; then # Do we have a terminal? : else if test x"$DISPLAY" != x -a x"$xterm_loop" = x; then # No, but do we have X? if xset q > /dev/null 2>&1; then # Check for valid DISPLAY variable GUESS_XTERMS="xterm rxvt dtterm eterm Eterm kvt konsole aterm" for a in $GUESS_XTERMS; do if type $a >/dev/null 2>&1; then XTERM=$a break fi done chmod a+x $0 || echo Please add execution rights on $0 if test `echo "$0" | cut -c1` = "/"; then # Spawn a terminal! exec $XTERM -title "$label" -e "$0" --xwin "$initargs" else exec $XTERM -title "$label" -e "./$0" --xwin "$initargs" fi fi fi fi fi if test "$targetdir" = "."; then tmpdir="." else if test "$keep" = y; then echo "Creating directory $targetdir" >&2 tmpdir="$targetdir" dashp="-p" else tmpdir="$TMPROOT/selfgz$$$RANDOM" dashp="" fi mkdir $dashp $tmpdir || { echo 'Cannot create target directory' $tmpdir >&2 echo 'You should try option --target OtherDirectory' >&2 eval $finish exit 1 } fi location="`pwd`" if test x$SETUP_NOCHECK != x1; then MS_Check "$0" fi offset=`head -n 405 "$0" | wc -c | tr -d " "` if test x"$verbose" = xy; then MS_Printf "About to extract 29084 KB in $tmpdir ... Proceed ? [Y/n] " read yn if test x"$yn" = xn; then eval $finish; exit 1 fi fi MS_Printf "Uncompressing $label" res=3 if test "$keep" = n; then trap 'echo Signal caught, cleaning up >&2; cd $TMPROOT; /bin/rm -rf $tmpdir; eval $finish; exit 15' 1 2 3 15 fi leftspace=`MS_diskspace $tmpdir` if test $leftspace -lt 29084; then echo echo "Not enough space left in "`dirname $tmpdir`" ($leftspace KB) to decompress $0 (29084 KB)" >&2 if test "$keep" = n; then echo "Consider setting TMPDIR to a directory with more free space." fi eval $finish; exit 1 fi for s in $filesizes do if MS_dd "$0" $offset $s | eval "gzip -cd" | ( cd "$tmpdir"; UnTAR x ) | MS_Progress; then if test x"$ownership" = xy; then (PATH=/usr/xpg4/bin:$PATH; cd "$tmpdir"; chown -R `id -u` .; chgrp -R `id -g` .) fi else echo echo "Unable to decompress $0" >&2 eval $finish; exit 1 fi offset=`expr $offset + $s` done echo cd "$tmpdir" res=0 if test x"$script" != x; then if test x"$verbose" = xy; then MS_Printf "OK to execute: $script $scriptargs $* ? [Y/n] " read yn if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then eval $script $scriptargs $*; res=$?; fi else eval $script $scriptargs $*; res=$? fi if test $res -ne 0; then test x"$verbose" = xy && echo "The program '$script' returned an error code ($res)" >&2 fi fi if test "$keep" = n; then cd $TMPROOT /bin/rm -rf $tmpdir fi eval $finish; exit $res !!! HERE WERE THE BINARY DATA !!!
Created attachment 1569447 [details] Plugin contents This is real plugin content after processing through shell script .run, situated in ~/.hplip/plugin_tmp dir. It would be possible (but IMO it is very horrible way how to hack it) to access it (if os is silverblue) through open-sourced hp-plugin, move the libraries to silverblue's correct places and all that before they got removed. Plus change the path where hp scripts want to search for libraries. I recall Rathann tried to package those plugins into hplip-plugin package in rpmfusion repo, but I'm not sure about current status. IMO it could be a solution.
An other connected problem: I'm not sure about write ability of /usr/share dir in Silverblue, but these libs, which go to /usr/lib(64), are libraries for sane-backends to use. So sane-backends would need to be change to look into /usr/local/lib too, plus hplip. I'm getting the feeling rpmfusion package is the best shot.
(In reply to Zdenek Dohnal from comment #11) > I'm not sure about write ability of /usr/share dir in Silverblue, but these > libs, which go to /usr/lib(64), are libraries for sane-backends to use. So > sane-backends would need to be change to look into /usr/local/lib too, plus > hplip. The whole /usr is readonly in Silverblue - apart of /usr/local that's a link to /var/usrlocal - as per https://ostree.readthedocs.io/en/latest/manual/adapting-existing/
Reported upstream https://bugs.launchpad.net/hplip/+bug/1831091 .
(In reply to Zdenek Dohnal from comment #10) > I recall Rathann tried to package those plugins into hplip-plugin package in > rpmfusion repo, but I'm not sure about current status. IMO it could be a > solution. Apparently rpmfusion packaging can't be done until they get permission to redistribute the (already freely available!) binaries...so maybe we can show support for this: https://bugs.launchpad.net/hplip/+bug/1214318
For now you can build your own RPM package using my spec file: https://gitlab.com/greysector/hplip-plugin . As Zdenek said, I'd love to maintain that package in RPM Fusion, but I can't do that until HP gives permission to redistribute.
This message is a reminder that Fedora 29 is nearing its end of life. Fedora will stop maintaining and issuing updates for Fedora 29 on 2019-11-26. It is Fedora's policy to close all bug reports from releases that are no longer maintained. At that time this bug will be closed as EOL if it remains open with a Fedora 'version' of '29'. Package Maintainer: If you wish for this bug to remain open because you plan to fix it in a currently maintained version, simply change the 'version' to a later Fedora version. Thank you for reporting this issue and we are sorry that we were not able to fix it before Fedora 29 is end of life. If you would still like to see this bug fixed and are able to reproduce it against a later version of Fedora, you are encouraged change the 'version' to a later Fedora version prior this bug is closed as described in the policy above. Although we aim to fix as many bugs as possible during every release's lifetime, sometimes those efforts are overtaken by events. Often a more recent Fedora release includes newer upstream software that fixes bugs or makes them obsolete.
Can someone update the bug? It definitely affects F31 & F32 still
This bug appears to have been reported against 'rawhide' during the Fedora 32 development cycle. Changing version to 32.
Moving to POST since the solution was presented to upstream in the past. Still without response.
Hi, hplip upstream still hasn't answered on several pings I have done at the ticket. Based on the following facts: - upstream is mostly unresponsive - the issue has a workaround - the queue can be reinstalled and works till the machine restart/ or the plugin can be installed via Dominik's project - the issue is OS type specific and device model specific - newer devices are capable of working by other means than hplip I mark the issue as not critical enough to have a downstream patch and I'm going to close it as UPSTREAM, since it was reported upstream as https://bugs.launchpad.net/hplip/+bug/1831091 . Newer devices don't need any HP plugin for printing (they support IPP Everywhere or IPP over USB) or scanning (support eSCL and/or WSD). The former is implemented by CUPS and ipp-usb, the latter via sane-airscan. All of them are shipped in Fedora 32+ (ipp-usb is going to be in Fedora 32 soon).
I'm deeply sorry for inconvenience with the issue :( .
*** Bug 2274365 has been marked as a duplicate of this bug. ***