Bug 1695713 - HP plugin does not install on Silverblue
Summary: HP plugin does not install on Silverblue
Keywords:
Status: CLOSED UPSTREAM
Alias: None
Product: Fedora
Classification: Fedora
Component: hplip
Version: 32
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: ---
Assignee: Zdenek Dohnal
QA Contact: Fedora Extras Quality Assurance
URL:
Whiteboard:
: 2274365 (view as bug list)
Depends On:
Blocks:
TreeView+ depends on / blocked
 
Reported: 2019-04-03 16:31 UTC by Marek Kašík
Modified: 2024-04-11 06:14 UTC (History)
15 users (show)

Fixed In Version:
Doc Type: If docs needed, set a value
Doc Text:
Clone Of:
Environment:
Last Closed: 2020-09-21 11:01:30 UTC
Type: Bug
Embargoed:


Attachments (Terms of Use)
Plugin contents (8.80 MB, application/x-bzip)
2019-05-16 08:48 UTC, Zdenek Dohnal
no flags Details

Description Marek Kašík 2019-04-03 16:31:21 UTC
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

Comment 1 Zdenek Dohnal 2019-04-04 07:45:40 UTC
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...)

Comment 2 Zdenek Dohnal 2019-04-05 08:36:37 UTC
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.

Comment 3 Colin Walters 2019-04-05 13:12:22 UTC
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.

Comment 4 Zdenek Dohnal 2019-04-08 08:21:16 UTC
(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?

Comment 5 Matthias Clasen 2019-04-30 17:41:26 UTC
No. The system is read-only. hplip needs changes to look somewhere else

Comment 6 Tomas Popela 2019-05-03 11:35:04 UTC
(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).

Comment 7 Jorge García Oncins 2019-05-09 10:41:37 UTC
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

Comment 8 Zdenek Dohnal 2019-05-13 12:45:24 UTC
(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/ .

Comment 9 Tomas Popela 2019-05-15 13:49:35 UTC
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 !!!

Comment 10 Zdenek Dohnal 2019-05-16 08:48:25 UTC
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.

Comment 11 Zdenek Dohnal 2019-05-16 12:48:11 UTC
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.

Comment 12 Tomas Popela 2019-05-16 12:58:48 UTC
(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/

Comment 13 Zdenek Dohnal 2019-05-30 13:47:24 UTC
Reported upstream https://bugs.launchpad.net/hplip/+bug/1831091 .

Comment 14 kxra 2019-06-12 21:52:13 UTC
(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

Comment 15 Dominik 'Rathann' Mierzejewski 2019-07-18 15:42:24 UTC
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.

Comment 16 Ben Cotton 2019-10-31 18:58:32 UTC
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.

Comment 17 kxra 2019-10-31 19:07:23 UTC
Can someone update the bug? It definitely affects F31 & F32 still

Comment 18 Ben Cotton 2020-02-11 15:46:14 UTC
This bug appears to have been reported against 'rawhide' during the Fedora 32 development cycle.
Changing version to 32.

Comment 19 Zdenek Dohnal 2020-05-18 12:19:47 UTC
Moving to POST since the solution was presented to upstream in the past. Still without response.

Comment 20 Zdenek Dohnal 2020-09-21 11:01:30 UTC
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).

Comment 21 Zdenek Dohnal 2020-09-21 11:02:14 UTC
I'm deeply sorry for inconvenience with the issue :( .

Comment 22 Zdenek Dohnal 2024-04-11 06:14:54 UTC
*** Bug 2274365 has been marked as a duplicate of this bug. ***


Note You need to log in before you can comment on or make changes to this bug.