sane-backends/create_scanner_database

184 lines
6.6 KiB
Bash

#! /bin/bash
#
# Johannes Meixner <jsmeix@suse.de>, 2004, 2005, 2006
#set -x
export PATH="/sbin:/usr/sbin:/usr/bin:/bin"
export LC_ALL="POSIX"
export LANG="POSIX"
umask 022
MY_NAME=${0##*/}
OUTPUT_FORMAT="$1"
[ -z "$OUTPUT_FORMAT" ] && OUTPUT_FORMAT="ASCII"
[ "$OUTPUT_FORMAT" != "ASCII" -a "$OUTPUT_FORMAT" != "YCP" ] && { echo -en "\nUsage:\n$MY_NAME {ASCII|YCP}\n" 1>&2 ; exit 1 ; }
# Input:
# Create a temporary file:
TMP_DATA=$(mktemp -u /tmp/$MY_NAME.XXXXXX)
cat /dev/null >$TMP_DATA
# Function to extract entries from a description file with SANE syntax.
# Quoted quotation marks '\"' (happens in comments) are replaced by ' ':
Extract()
{ cat $1 | sed -e 's/\\"/ /g' | egrep -o '^[[:space:]]*:backend[[:space:]]*"[^"]*"|^[[:space:]]*:mfg[[:space:]]*"[^"]*"|^[[:space:]]*:model[[:space:]]*"[^"]*"|^[[:space:]]*:firmware[[:space:]]*"[^"]*"|^[[:space:]]*:interface[[:space:]]*"[^"]*"|^[[:space:]]*:usbid[[:space:]]*"0x[0-9A-Fa-f]*"[[:space:]]*"0x[0-9A-Fa-f]*"|^[[:space:]]*:status[[:space:]]*:[a-z]*|^[[:space:]]*:comment[[:space:]]*"[^"]*"'
}
# Process the SANE description files:
# At least the SANE description files must exist:
PACKAGE="sane-backends"
DESCRIPTION_FILES="/usr/share/sane/descriptions/*.desc"
ls $DESCRIPTION_FILES &>/dev/null || { echo "Error: Required SANE description files $DESCRIPTION_FILES not found." 1>&2 ; exit 3 ; }
# Write the package which is processed:
echo ":package \"$PACKAGE\"" >>$TMP_DATA
# Extract entries from SANE description files:
for DESCRIPTION_FILE in $DESCRIPTION_FILES
do Extract $DESCRIPTION_FILE
done >>$TMP_DATA
# Process the optional HPLIP external description file:
# The package hplip is installed by default.
PACKAGE="hplip"
DESCRIPTION_FILE="/usr/share/sane/descriptions-external/hpaio.desc"
if [ -r "$DESCRIPTION_FILE" ]
then echo ":package \"$PACKAGE\"" >>$TMP_DATA
Extract $DESCRIPTION_FILE >>$TMP_DATA
else echo "Info: Cannot read $DESCRIPTION_FILE" 1>&2
fi
# Process the optional EPSON AVASYS (formerly EPSON KOWA) Image Scan external description file:
# The proprietary binary-only i386-only package iscan cannot be installed by default.
# The package iscan-free is not installed by default.
PACKAGE="iscan"
DESCRIPTION_FILE="/usr/share/sane/descriptions-external/epkowa.desc"
if [ -r "$DESCRIPTION_FILE" ]
then echo ":package \"$PACKAGE\"" >>$TMP_DATA
Extract $DESCRIPTION_FILE >>$TMP_DATA
else echo "Info: Cannot read $DESCRIPTION_FILE" 1>&2
fi
# Process the collected data:
# Replace HTML tags:
sed -i -e 's/<[Bb][Rr]>/, /g' \
-e 's/<[Pp]>/, /g' \
-e 's/<[^>]*>/ /g' $TMP_DATA
# Condense multiple spaces and convert tabs to blanks:
sed -i -e 's/[[:space:]][[:space:]]*/ /g' $TMP_DATA
# Remove leading and trailing spaces:
sed -i -e 's/^[[:space:]]*//' \
-e 's/[[:space:]]*$//' \
-e 's/"[[:space:]]*/"/g' \
-e 's/[[:space:]]*"$/"/' $TMP_DATA
# Convert the usbid values from '"vendor-id""product-id"' to '"vendor-id:product-id"'
# (note that '" "' was changed to '""' in the step before):
sed -i -e '/^:usbid/s/""/:/' $TMP_DATA
# Convert the status value to the usual string format:
sed -i -e 's/^:status :\(.*\)/:status "\1"/' $TMP_DATA
# Equalize different spelling of same manufacturers:
sed -i -e 's/"AGFA"/"Agfa"/g' \
-e 's/"UMAX"/"Umax"/g' $TMP_DATA
# Change meaningless references to a meaningful reference:
sed -i -e 's/see link/see http:\/\/www.sane-project.org/g' \
-e 's/See link/See http:\/\/www.sane-project.org/g' $TMP_DATA
# Output:
# Output header:
if [ "$OUTPUT_FORMAT" = "YCP" ]
then echo "["
else echo "PACKAGE|BACKEND|MANUFACTURER|MODEL|FIRMWARE|INTERFACE|USBID|STATUS|COMMENT"
fi
# Function to output one scanner entry:
Output()
{ if [ -n "$PACKAGE" -a -n "$BACKEND" -a -n "$MANUFACTURER" -a -n "$MODEL" -a -n "$STATUS" ]
then [ -z "$FIRMWARE" ] && FIRMWARE='""'
[ -z "$INTERFACE" ] && INTERFACE='""'
[ -z "$USBID" ] && USBID='""'
[ -z "$COMMENT" ] && COMMENT='""'
if [ "$PACKAGE" = '"iscan"' -o "$PACKAGE" = '"iscan-free"' ]
then if echo "$COMMENT" | egrep -q 'requires a DFSG non-free module|requires DFSG non-free'
then PACKAGE='"iscan"'
else PACKAGE='"iscan-free"'
fi
fi
if [ "$OUTPUT_FORMAT" = "YCP" ]
then echo -e " \$[ \"package\":$PACKAGE,\n \"backend\":$BACKEND,\n \"manufacturer\":$MANUFACTURER,\n \"model\":$MODEL,\n \"firmware\":$FIRMWARE,\n \"interface\":$INTERFACE,\n \"usbid\":$USBID,\n \"status\":$STATUS,\n \"comment\":$COMMENT\n ],"
else echo "$PACKAGE|$BACKEND|$MANUFACTURER|$MODEL|$FIRMWARE|$INTERFACE|$USBID|$STATUS|$COMMENT" | tr -d '"'
fi
fi
}
# Make complete and seperated scanner entries:
# Package, backend, manufacturer and model should appear in this order.
# Interface, status and comment are optional and can appear in any order.
# There is no mandatory key which is always last.
# Therefore the values are collected until package or backend or manufacturer or model changes.
# When package or backend or manufacturer or model changes the values are output.
exec <$TMP_DATA
while read KEY VALUE
do expr "$VALUE" : '"[^"]*"$' &>/dev/null || { echo "Ignoring $VALUE because it has not the right syntax \"...\"." 1>&2 ; continue ; }
case "$KEY" in
:package) Output
PACKAGE="$VALUE"
BACKEND=""
MANUFACTURER=""
MODEL=""
FIRMWARE=""
INTERFACE=""
USBID=""
STATUS=""
COMMENT="" ;;
:backend) Output
BACKEND=$( echo "$VALUE" | tr '[:upper:]' '[:lower:]' )
MANUFACTURER=""
MODEL=""
FIRMWARE=""
INTERFACE=""
USBID=""
STATUS=""
COMMENT="" ;;
:mfg) Output
MANUFACTURER="$VALUE"
MODEL=""
FIRMWARE=""
INTERFACE=""
USBID=""
STATUS=""
COMMENT="" ;;
:model) Output
MODEL="$VALUE"
FIRMWARE=""
INTERFACE=""
USBID=""
STATUS=""
COMMENT="" ;;
:firmware) FIRMWARE="$VALUE" ;;
:interface) INTERFACE="$VALUE" ;;
:usbid) USBID=$( echo "$VALUE" | tr '[:upper:]' '[:lower:]' ) ;;
:status) STATUS="$VALUE" ;;
:comment) COMMENT="$VALUE" ;;
*) echo "Ignoring key $KEY" 1>&2 ;;
esac
done
# Output the last scanner entry and a footer for YCP
Output
if [ "$OUTPUT_FORMAT" = "YCP" ]
then echo -e " \$[]\n]"
fi
# Remove the temporary file
rm $TMP_DATA
exit 0