Benutzer-Werkzeuge

Webseiten-Werkzeuge


Übersetzungen dieser Seite:
de:koarrl_alz_scripting

koarrl: Alzheim-Scripting

(last edit: 2015-12-24)

Stringsuche in Sourcefiles mit Ausgabe der Zeilennummer

grep -n USE_STRANGE_FEATURE *.c *.h

Vergleich von aktuellen Sourcefiles mit älterer Version

Nützlich bei PSoC-Basteleien …
(benötigt Cypress-IDE in VirtualBox und KDE mit dem Tool „kompare“!)

#! /bin/bash
# *****************************************************************************
#       DirComp: compare files of specified types in current directory ..
#       .. with those in directory of previous version
#       .. and invoke kompare for every different pair of files
#       Version: 0.04 by koarrl 2015-12-18
#       Changed tabs and spaces are not considered as differences!
#       Version number format is expected to be "x.yz"
# *****************************************************************************

DIRNEW=$PWD
FILETYPES="*.c *.h *.xml"
TMP="/tmp"

NEWVERSION=`echo $DIRNEW | rev | cut -d/ -f3 | cut -d- -f1 | rev`
OLDVMAJ=`echo $NEWVERSION | cut -d. -f1`
NEWVMIN=`echo $NEWVERSION | cut -d. -f2`
OLDVMIN=`printf '%02d' $(($NEWVMIN-1))`
OLDVERSION=$OLDVMAJ"."$OLDVMIN
DIROLD_1=`echo $PWD | rev | cut -d/ -f4- | rev`
DIROLD_2=`echo $PWD | rev | cut -d/ -f1-2 | rev`
DIROLD=$DIROLD_1"/"`basename $DIRNEW`"-"$OLDVERSION"/"$DIROLD_2

ls -1 $FILETYPES > $TMP/files

while read -r; do

    FILEOLD=$DIROLD/$REPLY
    FILENEW=$DIRNEW/$REPLY
    CMD=""
    [ -n "`diff -bBEq $FILEOLD $FILENEW`" ]  && CMD="kompare -c $FILEOLD $FILENEW"
    [ -n "$CMD" ] && $($CMD)&

done < $TMP/files

Eigenbau-Kernel-Installationsscript

#!/bin/bash
# *****************************************************************************
#
# instk: installs a homebrew kernel to /boot, according to grub2 conventions
#
# Last update: 2015-03-15 (can handle initramfs)
#
# NOTES:
# Before running this:
#  - make menuconfig; make (with plain user privileges)
# Please use:
#  - CONFIG_LOCALVERSION to differentiate between configs of thee same kernel version
# Please don't use:
#  - "_"-characters in CONFIG_LOCALVERSION (grub2 dislikes these!)
# Finally run:
#  - this script as root, set working directory to current kernel build root
# *****************************************************************************

KERNEL=`basename \`pwd\``
#if [ -z `echo $KERNEL | grep -E "linux-[0-9]\.[0-9]\.[0-9]+"` ]; then
# echo "Working directory must be root of some kernel tree!"
# exit 0
#fi

KVERSION=`echo $KERNEL | cut -d- -f2`
KAPP=`cat .config|grep CONFIG_LOCALVERSION=|cut -d'"' -f2`

if [ $USER != "root" ]; then
 echo "Only root may run this script!"
 exit 0
fi

make modules_install

# create initramfs, put new files into /boot dir

cp System.map /boot/System.map-$KVERSION$KAPP
cp arch/x86/boot/bzImage /boot/vmlinuz-$KVERSION$KAPP
update-initramfs -c -k $KVERSION$KAPP -b /boot

# create symlink/config folders only for reference (update-grub expects hardlinks or real files in /boot!)

mkdir /boot/$KVERSION$KAPP
cp .config /boot/$KVERSION$KAPP/config-$KVERSION$KAPP
ln -s /boot/System.map-$KVERSION$KAPP /boot/$KVERSION$KAPP/System.map-$KVERSION$KAPP
ln -s /boot/vmlinuz-$KVERSION$KAPP /boot/$KVERSION$KAPP/vmlinuz-$KVERSION$KAPP
ln -s /boot/initrd.img-$KVERSION$KAPP /boot/$KVERSION$KAPP/initrd.img-$KVERSION$KAPP

update-grub

Debian-Paket-Installationsbaum-Auflister

Wie jedes Kind weiß, liegen heruntergeladene und installierte Pakete in /var/cache/apt/archives.
Leider löscht der geübte dselect-Anwender diesen Ordner beim Ausstieg.
Dieses Tool versucht, anhand der Inhalte eines neueren Paketes den alten Installationsbaum zu rekonstruieren.

#!/bin/bash
# ****************************************************************************
#
#               dpkg_instlist-0.03
#
#               Debian-Paket-Installations-Filetree-Lister
#
# ****************************************************************************

if [ -z "$1" ]; then
	echo "usage: dpkg-instlist {-h} {package.deb} {-c}"
	exit
fi

if [ "$1" = "-h" ]; then
	echo "output: (1) package.list (input to copy script)"
	echo "        (2) package.dir (ls -l style filelist)"
	echo "-c option creates package.CONTENTS.tgz (restored installation tree)"
	exit
fi

DEBUG=NO

DAHAAM=$PWD
PACKAGE=`echo $1|rev|cut -b5-|rev`
PEXT=`echo $1|rev|cut -b1-4|rev`

if [ "$PEXT" != ".deb" ]; then
	echo "Sorry, must be a *.deb file!"
	exit
fi


if [ "$DEBUG" != "YES" ]; then
	TMP="/tmp"
else
	TMP=$PWD
	rm -rf $TMP/UNPACK
	rm -rf $TMP/METAINFO
	rm -rf $TMP/CONTENTS
fi

mkdir $TMP/UNPACK
cp $PACKAGE.deb $TMP/UNPACK
cd $TMP/UNPACK
ar x $PACKAGE.deb
rm $PACKAGE.deb

mkdir $TMP/METAINFO
mkdir $TMP/CONTENTS
tar -xvf data.tar.gz -C $TMP/CONTENTS &>/dev/null
cd $TMP/CONTENTS
find -type f -ls | cut -b14- > $TMP/METAINFO/$PACKAGE.dir
find -type f -ls | cut -d. -f2- > $TMP/METAINFO/$PACKAGE.list

if [ "$2" = "-c" ]; then

# delete all new files but preserve the new installation tree structure

	cd $TMP/CONTENTS
	find -type f -delete

# copy all old files from current installation to CONTENTS tree

	cd $TMP/METAINFO
	cat $PACKAGE.list | \
	while read FILE; do
		echo Saving: $FILE
		cp $FILE $TMP/CONTENTS$FILE
	done
	cd $TMP
	tar -czf OLD_CONTENTS.tar.gz CONTENTS
fi

if [ "$DEBUG" != "YES" ]; then
	mv $TMP/METAINFO/$PACKAGE.list $DAHAAM
	mv $TMP/METAINFO/$PACKAGE.dir $DAHAAM
	mv $TMP/OLD_CONTENTS.tar.gz $DAHAAM
	rm -rf $TMP/UNPACK
	rm -rf $TMP/METAINFO
	rm -rf $TMP/CONTENTS
fi

cd $DAHAAM

Sehr informative Seite: http://radagast.ca/linux/anatomy_of_a_deb_file.html

FTDI-USB-Module spezifisch ansprechen

Auffindung der Schnittstelle eines bestimmten FTDI-Moduls:
Zuerst durch Anstecken das richtige Modul herausfinden und einen unique-String feststellen!

$ ls -l /dev/serial/by-id
insgesamt 0
lrwxrwxrwx 1 root root 13 Jun  6 13:35 usb-FTDI_FT232R_USB_UART_A6012VD1-if00-port0 -> ../../ttyUSB0
$
# DEVNAME=“A6012VD1”
# SERPORT="/dev/"`ls -l /dev/serial/by-id|grep "$DEVNAME"|rev|cut -d"/" -f1|rev`

Nun enthält $SERPORT den gewünschten String „/dev/ttyUSB0“ !

Perfekt geht das Verfahren mit den Amazon-Modulen („FTDI Lumel PD12“): http://www.amazon.de/gp/product/B00YMDN2Z6?psc=1&redirect=true&ref_=oh_aui_detailpage_o01_s00

Die haben einen 6poligen Stecker - wenn Bauteilseite oben und USB-Kabel rechts, Belegung wie folgt:

        +-----------------------------------+   
 DTR ---+  +-+                              +
 RXD ---+  |*| 3,3V                   +-----+-+
 TXD ---+  |*| Vout  Jumper           |       | USB
 VCC ---+  |*| 5,0V                   |       | mini
 CTS ---+  +-+                        +-----+-+
 GND ---+                                   |
        +-----------------------------------+

Zum Spaß nun ein Commandline-Einzeiler für einen minicom-Terminal-Aufruf:

xterm -geometry 118x82 -fg white -bg black -fn 7x13 +sb -T 'minicom Lumel_PD12_230400' -e minicom -c on AdFTDI_230400 -D "/dev/"`ls -l /dev/serial/by-id | grep "_A4U8YVYT"|rev|cut -d"/" -f1|rev`

Dazu braucht man natürlich ein minicom-setupfile, hier namens „/etc/minicom/minirc.AdFTDI_230400“ (die Angabe „port“ ist leer, wird per cmdline übergeben!):

pu port             
pu baudrate         230400
pu bits             8
pu parity           N
pu stopbits         1
pu scriptprog       runscript
pu minit            
pu mreset           
pu mdialpre         
pu mdialsuf         
pu mdialpre2        
pu mdialsuf2        
pu mdialpre3        
pu mdialsuf3        
pu mconnect         
pu mnocon1          
pu mnocon2          
pu mnocon3          
pu mnocon4          
pu mhangup          
pu mdialcan         
pu mdialtime        
pu mrdelay          
pu mretries         
pu mdropdtr         
pu mautobaud        No 
pu hasdcd           No 
pu rtscts           No 
pu macenab          No 
pu localecho        No

Dieses setupfile enthält die Voreinstellungen für den minicom-Aufruf.
Feature: Bei Abstecken des USB-Adapters regt sich minicom (zu Recht) auf, bei Wieder-Anstecken bekommt der Adapter (meistens) wieder den selben Linknamen zugewiesen. Geht weiter ohne Probleme.

Prolific-USB-Module spezifisch ansprechen

Diese Dinger haben keine unique number, sofern nur einer im System vorkommt, hilft dieses:

DEVNAME=`ls -1 /sys/bus/usb-serial/drivers/pl2303|grep ttyUSB`

Commandline zum Aufruf:

xterm -geometry 118x82 -fg white -bg black -fn 7x13 +sb -T 'minicom Prolific_19200' -e minicom -c on Prolific_19200 -D "/dev/`ls -1 /sys/bus/usb-serial/drivers/pl2303|grep ttyUSB`"

LibreOffice-Updater

Neueste LibreOffice-Debian-Pakete einfach herunterladen und dieses script starten, die alte Version wird damit ordentlich deinstalliert!

#!/bin/bash

##############################################################################
#
#       LibO_update V0.01
#
#       by koarrl 2015-04-29
#
#       Updates an extra-installed Libre Office package set for Debian
#
##############################################################################

if [ "$USER" != "root" ]; then
    echo "Only root may run this script!"
    exit
fi

OLDVERSION_2D=`/opt/libreoffice/program/soffice.bin --version | cut -d. -f1-2 | cut -d' ' -f2`
OLDVERSION_3D=`/opt/libreoffice/program/soffice.bin --version | cut -d. -f1-3 | cut -d' ' -f2`
NEWVERSION_2D=`ls -1 Libre* | tail -n1 | cut -d_ -f2 | cut -d. -f1-2`
NEWVERSION_3D=`ls -1 Libre* | tail -n1 | cut -d_ -f2 | cut -d. -f1-3`

if [ -z "$NEWVERSION_2D" ]; then
    echo
    echo "These new Debian packages must reside in the current directory:"
    echo 'LibreOffice_$NEWVERSION_Linux_x86_deb.tar.gz'
    echo 'LibreOffice_$NEWVERSION_Linux_x86_deb_langpack_de.tar.gz'
    echo 'LibreOffice_$NEWVERSION_Linux_x86_deb_helppack_de.tar.gz'
    echo
    exit
fi

echo "Please check within 10 seconds if you REALLY want version $OLDVERSION_3D to be uninstalled (purged!) now ..."
echo "(Ctrl-C if you are unsure :-)"

t=10
while [ "$t" != "-1"  ] ; do
    echo $t
    sleep 1
    t=$((t-1))
done

dpkg --get-selections | grep -e "libobasis$OLDVERSION_2D\|libreoffice$OLDVERSION_2D" | sed s/install/purge/ > /tmp/LibO_to_be_purged.txt
dpkg --set-selections < /tmp/LibO_to_be_purged.txt
dpkg --purge --pending

# remove symlink to old installation
[ -L /opt/libreoffice ] && rm /opt/libreoffice

echo "Installing version $NEWVERSION_3D ..."

# un-tgz deb package folders
for ARCH in *.tar.gz; do
    tar -zxvf $ARCH
done

# install new packages from folders
cd LibreOffice_*_Linux_x86_deb/DEBS
dpkg -i *.deb
cd ../../LibreOffice_*_Linux_x86_deb_langpack_de/DEBS
dpkg -i *.deb
cd ../../LibreOffice_*_Linux_x86_deb_helppack_de/DEBS
dpkg -i *.deb
cd ../..

# create symlink to new installation
ln -s /opt/libreoffice$NEWVERSION_2D /opt/libreoffice

# remove expanded folders again
rm -rf LibreOffice_*_Linux_x86_deb
rm -rf LibreOffice_*_Linux_x86_deb_langpack_de
rm -rf LibreOffice_*_Linux_x86_deb_helppack_de

echo "Ready!"

Endlich! minicom-Configfiles, selbsteditiert

(gilt für minicom-2.6.1, wie bei Debian-wheezy)

Es gibt configfiles entweder per user:

/home/franz/.minirc.configfilename

oder systemweit in:

/etc/minicom/configfilename

Minicom-Aufruf sieht zweckmäßig so aus:

$ minicom -c on configfilename

bzw. (z.B. für USB-Devices, deren Name vorher ermittelt werden muß:

$ minicom -c on configfilename -d device

Entgegen der Warnung („.. machine generated .. do not edit .. bla..“ hilft Selberschreiben, zb. wie hier:

# /etc/minicom/minirc.example (made by franz)
pu baudrate         38400
pu bits             8
pu parity           N
pu stopbits         1
pu mautobaud        No 
pu hasdcd           No 
pu rtscts           No 
pu macenab          No 
pu localecho        No
pu addlinefeed      Yes

Local Echo und AddLinefeed waren in früheren Zeiten nur interaktiv nach Programmstart einstellbar.
Ohne „pu port“ muß natürlich ein Serialdevice auf der Commandline angegeben werden. Ist eh zweckmäßiger.
Diverse unnötige Modem-Init-Stringsettings einfach weglassen. Hurra!

Damit unter wheezy ein Scanner mit User-Rechten unter gimp betrieben werden kann,
braucht es möglicherweise folgendes:

1. User muß zur Gruppe „scanner“ gehören
2. Vor gimp-Start als root folgendes script laufen lassen:

# Scanner crook for Debian-Wheezy
# (invoke as root before GIMP is invoked)

[ -L /dev/scanner ] && rm -f /dev/scanner

DEVICE=`lsusb|grep "CanoScan LiDE 50"`
BUS=`echo $DEVICE | cut -d " " -f2`
DEV=`echo $DEVICE | cut -d " " -f4 | cut -d ":" -f1 `
SCANNER="/dev/bus/usb/$BUS/$DEV"
chgrp scanner $SCANNER
ln -s $SCANNER /dev/scanner

Eigentlich sollte das automatisiert bei Anstecken geschehen (daemon, der etwa obiges macht).
Demnächst in diesem Theater.

Der Scanner als DAU-Kopierer

(Funktion: Rechner & Drucker einschalten, Papier einlegen, Knopf drücken)

Folgende Pakete aus debian-stable (lenny) installieren:

  • scanbuttond (Schnittstelle Scannerbuttons - bash-script)
  • netpbm (commandline-Grafikkonverter)
  • Ghostscript (Postscript-Interpreter) - nützlich, hier aber nicht erforderlich!
  • cups-foomatic (Druckertreiber)

(1) Test, ob Scanner erkannt wird:

$ sane-find-scanner 

.. zeigt eine Zeile mit „..found USB scanner ..“ - OK!

(2) Test, ob Scannerknopf-Events erkannt werden

$ scanbuttond -f 

.. zeigt z.B. „button 1 has been pressed on epson:libusb:004:002“ (siehe script /etc/scanbuttond/buttonpressed.sh)

(3) Jetzt scanbuttond mit root-Rechten per initscript starten

#! /bin/sh
### BEGIN INIT INFO
# Provides:          scanbuttond
# Required-Start:    
# Required-Stop:     
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: initscript for scanner button event tracing
# Description:       This file should be placed in /etc/init.d
### END INIT INFO

# Author: koarrl <jawa.cz@tplus.at>
#
# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Scanner button event tracing"
NAME=scanbuttond
DAEMON=`which $NAME`
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present @@@@ TODO for my own peculiar scanner@@@
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh


# @@@@
VERBOSE=YES


# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started

        if [ -f "$PIDFILE" ]; then return 1; fi

        $DAEMON &
        PID=$(($!+1))
        if [ -z "$PID" ]; then return 2; fi
    
        echo $PID > $PIDFILE
        return 0;
}
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred

        if ! [ -f "$PIDFILE" ]; then return 1; fi

        kill -9 `cat $PIDFILE`
        rm -f $PIDFILE
        echo "$NAME stopped!"
        return 0
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
        #
        # If the daemon can reload its configuration without
        # restarting (for example, when it is sent a SIGHUP),
        # then implement that here.
        #
        start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
        return 0
}

case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  #reload|force-reload)
        #
        # If do_reload() is not implemented then leave this commented out
        # and leave 'force-reload' as an alias for 'restart'.
        #
        #log_daemon_msg "Reloading $DESC" "$NAME"
        #do_reload
        #log_end_msg $?
        #;;
 # restart|force-reload)
        #
        # If the "reload" option is implemented then remove the
        # 'force-reload' alias
        #
        #log_daemon_msg "Restarting $DESC" "$NAME"
        #do_stop
        #case "$?" in
        #  0|1)
        #       do_start
        #       case "$?" in
        #               0) log_end_msg 0 ;;
        #               1) log_end_msg 1 ;; # Old process is still running
        #               *) log_end_msg 1 ;; # Failed to start
        #       esac
        #       ;;
        #  *)
        #       # Failed to stop
        #       log_end_msg 1
        #       ;;
        #esac
        #;;
  *)
        #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
        #echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
        echo "Usage: $SCRIPTNAME {start|stop}" >&2
        exit 3
        ;;
esac

:

(4) Nützliche commandlines für Scannerbutton-scripts (Annahme: Drucker ist nicht postscript-fähig, sonst wäre es einfacher)

scanne A4 & erzeuge Graustufen-tif-Bild (oder was auch immer, man scanimage)

$ scanimage --format tiff --mode Gray --resolution 300 --brightness -3 -l 0 -t 0 -x 215mm -y 280mm > scan.tif

konvertiere *.tif zu *.ps

$ tiff2ps -2 -w 8.27 -h 11.69 scan.tif > scan.ps

konvertiere *.ps in entsprechendes Drucker-raw-Format

  $ foomatic-rip -P 'HP_Laserjet_CP1515n' scan.ps > scan.raw

schicke Rohdaten zum Drucker - fertig!

  $ lp -s -d 'HP_Laserjet_CP1515n' -oraw test.raw

de/koarrl_alz_scripting.txt · Zuletzt geändert: 2015/12/24 16:17 von koarrl