1

When I try to install iscan-perfection-v370-bundle-2.30.4.x64.deb on Debian 10 (Buster), I can see the following messages:

expr: syntax error: missing argument after „-“
tail: invalid number of lines: „/lib/udev/rules.d/60-libsane.rules“

Note: The second message appears in a locale based translation; it has been translated back to English by me.

Executing /sbin/dpkg-reconfigure iscan-data leads to the exact same messages.

As a result, the scanner is only available for the superuser; the superuser can execute iscan flawlessly.

Output of dpkg --status iscan-data:

Package: iscan-data
Status: install ok installed
[...]

What is the problem? How can it be fixed?

1 Answer 1

1

/sbin/dpkg-reconfigure iscan-data executes /usr/lib/iscan-data/make-policy-file which, in the provided version 1.39.1, contains the following code:

get_footer () {
    case "$MODE" in
        udev)
            line_count=`cat $1 | wc -l`
            last=`sed -n '/{idProduct}/ =' $1 | tail -n 1`
            num_lines=`expr $line_count \- $last`
            tail -n $num_lines $1
            ;;
        *)
            mesg "internal error: inconsistent $MODE handling" >&2
            exit 3
            ;;
    esac
}

It determines that /lib/udev/rules.d/60-libsane.rules has 86 lines ($line-count) but fails to identify the last line containing {idProduct}. The reason is that /lib/udev/rules.d/60-libsane.rules does not contain any such line in Debian 10.

Unfortunately, get_header () and apparently also get_stanza () don't work with Debian 10, either. Hence, the resulting /lib/udev/rules.d/60-iscan.rules is useless.

Without a proper udev configuration, ordinary users will not be able to access the scanner.

My solution was to manually create /lib/udev/rules.d/60-iscan-manual.rules which will survive an update of the iscan-data package, at the risk of yielding a false match should the iscan bundle be uninstalled (or its update drops support for my scanner). It contains a single matching entry for my particular scanner model. I took the values for idVendor and idProduct from lsusb's output, so adapt those values for your particular model:

Bus 001 Device 026: ID 04b8:014a Seiko Epson Corp.

Here's my 60-iscan-manual.rules:

# rules apply to "add" action only
# ================================
ACTION!="add", GOTO="iscan_man_rules_end"


# distribute to respective rules
# ==============================
ENV{DEVTYPE}=="usb_device", GOTO="iscan_man_usb_rules"
SUBSYSTEM=="usb_device", GOTO="iscan_man_usb_rules"
GOTO="iscan_man_rules_end"


# USB rules
# =========
LABEL="iscan_man_usb_rules"

# rules for supported USB scanners
ATTRS{idVendor}=="04b8", ATTRS{idProduct}=="014a", ENV{libsane_matched}="yes"
# disable USB autosuspend, if the device was matched
ENV{libsane_matched}=="yes", TEST=="power/control", ATTR{power/control}="on"

GOTO="iscan_man_rules_end"


# END
# ===
LABEL="iscan_man_rules_end"
1
  • 1
    Thank you. Works perfectly for me.
    – Sileria
    Dec 9, 2020 at 20:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.