:: Re: [DNG] vdev - scanner
Top Page
Delete this message
Reply to this message
Author: fsmithred
Date:  
To: Ralph Ronnquist, dng
Subject: Re: [DNG] vdev - scanner
On 08/16/2016 08:35 PM, fsmithred wrote:
> On 08/16/2016 07:54 PM, Ralph Ronnquist wrote:
>> fsmithred wrote on 17/08/16 09:34:
>>> On 08/16/2016 12:49 PM, shraptor wrote:
>>>> On 2016-08-16 18:19, shraptor wrote:
>>>>> On 2016-08-16 18:11, shraptor wrote:
>>>>>>> I got the scanner working.
>>>>>>>
>>>>>>> If I boot with udev, the scanner works, and the permissions on the
>>>>>>> device
>>>>>>> look like this:
>>>>>>>
>>>>>>> ls -l /dev/bus/usb/002/
>>>>>>> crw-rw-r--+ 1 root root 189, 137 Aug 16 10:30 010
>>>>>>>
>>>>>>> and with vdev, it looks like this:
>>>>>>> crw------- 1 root root 189, 131 Aug 16 10:39 004
>>>>>>>
>>>>>>> I changed the permissions and added myself to the scanner group (oops!)
>>>>>>> and now xsane finds the scanner when I'm running vdev. I hope someone
>>>>>>> knows what to do with this information, because I'm in new territory
>>>>>>> here.
>>>>>>> (and I don't know C.)
>>>>>>>
>>>>>>> If udevadm output for the scanner would help, I'll post it. The udev
>>>>>>> rules
>>>>>>> for scanners are in /lib/udev/rules.d/60-libsane.rules
>>>>>>
>>>>>>
>>>>>> Maybe you should write a vdev action for your scanner
>>>>>> on my system they actions are in /etc/vdev/actions
>>>>>>
>>>>>> for instance optical.act contains
>>>>>>
>>>>>> [vdev-action]
>>>>>> event=any
>>>>>> path=^sr[0-9]*$
>>>>>> VAR_OPTICAL_OWNER=root
>>>>>> VAR_OPTICAL_GROUP=optical
>>>>>> VAR_OPTICAL_MODE=0660
>>>>>> helper=optical.sh
>>>>>> daemonlet=true
>>>>>> if_exists=run
>>>>>>
>>>>>>
>>>>>>
>>>>>> No C is needed. Write something that matches path like for optical
>>>>>> path=^sr[0-9]*$
>>>>>> then set needed permissions and group and vdev will fix it for you
>>>>>>
>>>>>>
>>>>>> When you succeed you may contribute that .act file for others, yeah?
>>>>>
>>>>>
>>>>> Maybe you can use something like null.act
>>>>>
>>>>> [vdev-action]
>>>>> event=add
>>>>> path=^null$
>>>>> VAR_PERMISSIONS_MODE=0666
>>>>> helper=permissions.sh
>>>>> if_exists=run
>>>>>
>>>>>
>>>>>
>>>>> I mean the permissions.sh
>>>>>
>>>>>
>>>>> so something like
>>>>>
>>>>> scanner.act
>>>>>
>>>>> [vdev-action]
>>>>> event=add
>>>>> path=^null$
>>>>
>>>>> VAR_PERMISSIONS_MODE=0664
>>>>> helper=permissions.sh
>>>>> if_exists=run
>>>>>
>>>>> Dunnow wot path you should use but maybe you could figure it out?
>>>>
>>>>
>>>> perhaps?
>>>>
>>>> scanner.act
>>>>
>>>> [vdev-action]
>>>> event=add
>>>> path=^bus/usb/1$
>>>> VAR_OWNER=root
>>>> VAR_GROUP=scanner
>>>> VAR_PERMISSIONS_MODE=0664
>>>> helper=permissions.sh
>>>> if_exists=run
>>>>
>>>>
>>>> Does debian use something like /dev/usbscanner0 or /dev/usb/scanner0?
>>>> Then maybe a new helper scanner.sh is needed, like optical.sh?
>>>>
>>>> In the beginning of vdev creation we dreamt of a udev rules to vdev action
>>>> parser
>>>>
>>>>
>>>
>>> I now have a better idea of what such dreams would entail. Getting close...
>>>
>>>
>>> This mostly works. I can get the right permissions on the device, but when
>>> I add the setfacl command, vdev fails. Error is "Invalid action" and it
>>> lists /usr/etc/vdev/actions/scanner.act. If I run the command in the
>>> console, it works correctly. I tried it with the command before and after
>>> "if_exists=run".
>>>
>>>
>>> [vdev-action]
>>> event=add
>>> path=^bus/usb/*/[001-999]
>>> OS_SUBSYSTEM=usb
>>> OS_TYPE=255/255/255
>>> VAR_OWNER=root
>>> VAR_GROUP=scanner
>>> VAR_PERMISSIONS_MODE=0664
>>> helper=permissions.sh
>>> if_exists=run
>>> command:/usr/bin/setfacl -m g:scanner:rw $VDEV_MOUNTPOINT/$VDEV_PATH
>>>
>>> Any ideas on how to get setfacl to work are welcome. Thanks.
>>>
>>
>> devuan% which setfacl
>> /bin/setfacl
>>
>> maybe? Ralph.
>
> That's weird. When I run 'which setfacl' I'm told it's at
> /usr/bin/setfacl. On further examination, that's a symlink to
> /bin/setfacl. Changing it in the action file didn't make a difference.
>
> Assuming this will eventually work, would daemonlet=true need to be added
> to get vdev to deal with plugging and unplugging the scanner after boot?
>
> -fsr
>


I got it to work. Here's the action file and the helper script. The helper
script is a modified permissions.sh. I added a test for $VDEV_MAJOR and
$VDEV_MINOR to trigger setfacl. Scanner now works on my installation.

The scanner doesn't work when I'm running from a live usb. It seems that
aufs does not support acls. If I boot with udev, the scanner gets the acl
and works. I don't know how udev gets around the aufs problem. I also
don't know how it will work with newer versions of live-config and
live-boot that use overlayfs instead.

-fsr

/etc/vdev/actions/scanner.act

[vdev-action]
event=add
path=^bus/usb/*/[001-999]
OS_SUBSYSTEM=usb
OS_TYPE=255/255/255
VAR_OWNER=root
VAR_GROUP=scanner
VAR_PERMISSIONS_MODE=0664
helper=scanner.sh
if_exists=run


/lib/vdev/scanner.sh

#!/bin/dash

# vdevd helper to set permissions and ownership.
# takes the owner from the VDEV_VAR_PERMISSIONS_OWNER environment variable.
# takes the group from the VDEV_VAR_PERMISSIONS_GROUP environment variable.
# takes the mode from the VDEV_VAR_PERMISSIONS_MODE environment variable

# entry point
main() {

    if [ -n "$VDEV_VAR_PERMISSIONS_OWNER" ] && [ -n
"$VDEV_VAR_PERMISSIONS_GROUP" ]; then


        /bin/chown
"$VDEV_VAR_PERMISSIONS_OWNER":"$VDEV_VAR_PERMISSIONS_GROUP"
"$VDEV_MOUNTPOINT/$VDEV_PATH"
    elif [ -n "$VDEV_VAR_PERMISSIONS_OWNER" ]; then


        /bin/chown "$VDEV_VAR_PERMISSIONS_OWNER" "$VDEV_MOUNTPOINT/$VDEV_PATH"
    elif [ -n "$VDEV_VAR_PERMISSIONS_GROUP" ]; then


        /bin/chgrp "$VDEV_VAR_PERMISSIONS_GROUP" "$VDEV_MOUNTPOINT/$VDEV_PATH"
    fi


    if [ -n "$VDEV_VAR_PERMISSIONS_MODE" ]; then


        /bin/chmod "$VDEV_VAR_PERMISSIONS_MODE" "$VDEV_MOUNTPOINT/$VDEV_PATH"
    fi


"$VDEV_VAR_PERMISSIONS_GROUP" = "scanner" ] ; then
    if [ "$VDEV_MAJOR" = 189 ] && [ "$VDEV_MINOR" = 132 ] ; then
    /bin/setfacl -m g:scanner:rw "$VDEV_MOUNTPOINT/$VDEV_PATH"
    fi


    # reset for next time
    VDEV_VAR_PERMISSIONS_GROUP=
    VDEV_VAR_PERMISSIONS_OWNER=
    VDEV_VAR_PERMISSIONS_MODE=


    return 0
}


if [ $VDEV_DAEMONLET -eq 0 ]; then

set +u
main
exit $?
else

# initialize
set -u
VDEV_VAR_PERMISSIONS_GROUP=
VDEV_VAR_PERMISSIONS_OWNER=
VDEV_VAR_PERMISSIONS_MODE=
fi