--- /dev/null
+#!/bin/bash
+
+#########################################################################
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the version 3 of the GNU General Public License #
+# as published by the Free Software Foundation. #
+# #
+# This program is distributed in the hope that it will be useful, but #
+# WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU #
+# General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <http://www.gnu.org/licenses/>. #
+# #
+# Written by and Copyright (C) Francois Fleuret #
+# Contact <francois@fleuret.org> for comments & bug reports #
+#########################################################################
+
+# (1) Check that all JPG are larger than 1M if there is no
+# corresponding MOV
+
+# (2) Change the modification time to match the EXIF info (use the
+# accompanying JPG for the MOV)
+
+# (3) Move the JPG and MOV to an archive directory of the form
+# ${GP_ARCHIVE_DIR}/year/month, create the directory when necessary.
+
+[[ ${archive_size_min} ]] || archive_size_min=1048576 # 1Mb
+
+set -e
+
+if [[ ! ${GP_ARCHIVE_DIR} ]]; then
+ echo "You have to set \$GP_ARCHIVE_DIR" >&2
+ exit 1
+fi
+
+# Checking the image sizes
+
+for i in "$@"; do
+
+ if [[ ! -f ${i/JPG/MOV} ]]; then
+
+ if [[ $(stat --printf=%s $i) -lt ${archive_size_min} ]]; then
+ echo "Image $i is too small."
+ exit 1
+ fi
+
+ fi
+
+done
+
+# Setting the file modification date according to the exif tag
+
+for i in "$@"; do
+
+ ref=${i/MOV/JPG}
+
+ if [[ -f ${ref} ]]; then
+
+ TAG=$(exif --ifd=EXIF -t "Date and Time (original)" ${ref} | grep Value)
+
+ if [[ ${TAG} ]]; then
+ TIMESTAMP=$(echo ${TAG} | sed -e \
+ "s/^ *Value: *\([0-9]*\):\([0-9]*\):\([0-9]*\) *\([0-9]*\):\([0-9]*\):\([0-9]*\).*$/\1\2\3\4\5.\6/")
+ touch -t $TIMESTAMP $i
+ else
+ echo "No exif tag in $i, can not set the date properly."
+ fi
+
+ else
+
+ echo "Can not find a reference picture file for $i, can not set the date properly."
+
+ fi
+
+done
+
+# Moving the file to the proper archive directory, which is created
+# first when needed
+
+for i in "$@"; do
+
+ ARCHIVING_PATH=$(ls -l --time-style=+%Y/%b --format=verbose $i | awk '{ print $6 }')
+
+ mkdir -p ${GP_ARCHIVE_DIR}/${ARCHIVING_PATH}
+
+ echo "Archiving ${GP_ARCHIVE_DIR}/${ARCHIVING_PATH}/$(basename $i)"
+
+ cp -p -i $i ${GP_ARCHIVE_DIR}/${ARCHIVING_PATH}
+
+done
--- /dev/null
+#!/bin/bash
+
+#########################################################################
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the version 3 of the GNU General Public License #
+# as published by the Free Software Foundation. #
+# #
+# This program is distributed in the hope that it will be useful, but #
+# WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU #
+# General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <http://www.gnu.org/licenses/>. #
+# #
+# Written by and Copyright (C) Francois Fleuret #
+# Contact <francois@fleuret.org> for comments & bug reports #
+#########################################################################
+
+TRASH=$(mktemp -d /tmp/trash.XXXXXX)
+
+# "pdf:fig" "pdf:png" "pdf:pgm"
+
+for i in "nav:tex" "snm:tex" "toc:tex" "blg:tex" \
+ "idx:tex" "ilg:tex" "ind:tex" "lof:tex" "lot:tex" "lou:tex" \
+ "dvi:tex" "log:tex" "aux:tex" "bbl:tex" \
+ "ps:tex" "pdf:tex" "out:tex" "tpt:tex" "brf:tex" \
+ "eps:fig" "eps:png" "eps:pgm" \
+ "o:cc" "o:c" ; do
+ PRODUCED=$(echo $i | cut -f 1 -d:)
+ SOURCE=$(echo $i | cut -f 2 -d :)
+ for f in *.$PRODUCED; do
+ ORIGINAL=${f/.$PRODUCED/.$SOURCE}
+ if [ -f "${ORIGINAL}" ]; then
+ echo "move $f to ${TRASH} ($ORIGINAL exists)"
+ mv $f ${TRASH}
+ fi
+ done
+done
+
+for i in "mozilla.ps" "a.out"; do
+ if [ -f "$i" ]; then
+ echo "move $i to ${TRASH}"
+ mv $i ${TRASH}
+ fi
+done
+
+for f in $(find -type f -executable); do
+ if [ -f ${f}.cc ] || [ -f ${f}.c ]; then
+ echo "move $f to ${TRASH} (source code exists)"
+ mv $f ${TRASH}
+ fi
+done
--- /dev/null
+#!/bin/bash
+
+#########################################################################
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the version 3 of the GNU General Public License #
+# as published by the Free Software Foundation. #
+# #
+# This program is distributed in the hope that it will be useful, but #
+# WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU #
+# General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <http://www.gnu.org/licenses/>. #
+# #
+# Written by and Copyright (C) Francois Fleuret #
+# Contact <francois@fleuret.org> for comments & bug reports #
+#########################################################################
+
+function error () {
+ echo $1 1>&2
+ exit 1
+}
+
+## Header ############################################################
+
+cat <<EOF
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title></title>
+</head>
+
+<body>
+
+EOF
+
+## Body ##############################################################
+
+echo "<h1>Directory content</h1>"
+
+echo
+
+echo "<pre>"
+
+for d in $(find . -maxdepth 1 -type d -name "[^.]?*" | \
+ awk '{print $1" "$1}' | \
+ sed -e "s/^[^0-9]*//" | \
+ sort -g | \
+ awk '{print $2}'); do
+
+ most_recent=$(find ${d} -type f -exec stat --printf="%y %n\n" '{}' \; | sort | tail -1 | awk '{print $4}')
+
+ if [[ ${most_recent} ]]; then
+ date=$(stat --printf="%y" ${most_recent})
+ else
+ date=$(stat --printf="%y" ${d})
+ fi
+
+ echo "${date} <a href=\"${d}\">${d}</a>"
+done
+
+echo "</pre>"
+
+echo
+
+## Footer ############################################################
+
+cat <<EOF
+</body>
+
+</html>
+EOF
+
+######################################################################
--- /dev/null
+#!/bin/bash
+
+#########################################################################
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the version 3 of the GNU General Public License #
+# as published by the Free Software Foundation. #
+# #
+# This program is distributed in the hope that it will be useful, but #
+# WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU #
+# General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <http://www.gnu.org/licenses/>. #
+# #
+# Written by and Copyright (C) Francois Fleuret #
+# Contact <francois@fleuret.org> for comments & bug reports #
+#########################################################################
+
+# A command-line tool to restart, shutdown or get the status of a
+# D-Link DNS323.
+
+set -e
+
+function rm_temp () {
+ if [[ ${TEMP} ]]; then
+ rm ${TEMP}
+ unset TEMP
+ fi
+}
+
+function authentify_on_dns323 () {
+ if [[ ! ${already_authentified} ]]; then
+ echo "Authentifying on ${DNS323_HOSTNAME}."
+ curl -s > /dev/null \
+ -L http://${DNS323_HOSTNAME}/goform/formLogin \
+ -d "f_LOGIN_NAME=admin&f_LOGIN_PASSWD=${DNS323_ADMIN_PASSWORD}&f_login_type=0" || (echo "Failed." >&2 && exit 1)
+ already_authentified=1
+ fi
+}
+
+function check_unmounted () {
+ if [[ ! ${force_operation} ]]; then
+ if [[ $(mount | grep ^//${DNS323_HOSTNAME}) ]]; then
+ echo "//${DNS323_HOSTNAME} appears to be mounted." >&2
+ exit 1
+ fi
+ fi
+}
+
+function show_help () {
+ cat >&2 <<EOF
+$(basename $0) [-f|--force] [-h|--help] <status|restart|shutdown> ...
+
+ -h, --help shows this help.
+ -f, --force forces shutdown or restart even if it looks like the samba
+ drive is mounted.
+ status gets temperature and RAID info.
+ shutdown shuts the unit down.
+ restart restarts the unit.
+
+EOF
+}
+
+######################################################################
+
+trap rm_temp SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM ERR
+
+if [[ ${DNS323_HOSTNAME} ]] && \
+ [[ ${DNS323_ADMIN_PASSWORD} ]]; then
+
+ while [[ $1 ]]; do
+
+ case $1 in
+
+ ################################################################
+
+ -f|--force)
+ force_operation=1
+ ;;
+
+ ################################################################
+
+ -h|--help)
+ show_help
+ ;;
+
+ ################################################################
+
+ status)
+
+ authentify_on_dns323
+
+ # If you think what follows is fugly, please have a
+ # look at the DNS323's web app HTML
+
+ TEMP=$(mktemp /tmp/status.XXXXXX)
+
+ curl -s \
+ -L http://${DNS323_HOSTNAME}/goform/adv_status \
+ -d "" > ${TEMP}
+
+ cat ${TEMP} | \
+ html2text | \
+ grep "\(Sync Time Remaining\|Volume Name\|Volume Type\|Total Hard Drive Capacity\|Used Space\|Unused Space\)": | \
+ sed -e "s/^[ \t]*//"
+
+ grep "var temper" ${TEMP} | sed -e "s/^.*\"\([0-9]*\):\([0-9]*\)\".*$/Temperature: \1F \/ \2C/"
+
+ rm_temp
+
+ ;;
+
+ ################################################################
+
+ shutdown)
+
+ authentify_on_dns323
+
+ check_unmounted
+
+ curl > /dev/null \
+ -s \
+ -L http://${DNS323_HOSTNAME}/goform/sysShutDown \
+ -d ""
+
+ echo "Shutdown initiated."
+
+ ;;
+
+ ################################################################
+
+ restart)
+
+ authentify_on_dns323
+
+ check_unmounted
+
+ curl -s > /dev/null \
+ -L http://${DNS323_HOSTNAME}/goform/System_restart \
+ -d ""
+
+ echo "Restart initiated."
+
+ ;;
+
+ ################################################################
+
+ *)
+ echo "Unknown operation $1" >&2
+ show_help
+ exit 1
+ ;;
+ esac
+
+ shift
+
+ done
+
+else
+
+ echo "Please set \$DNS323_HOSTNAME and \$DNS323_ADMIN_PASSWORD."
+
+fi
--- /dev/null
+#!/bin/bash
+
+#########################################################################
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the version 3 of the GNU General Public License #
+# as published by the Free Software Foundation. #
+# #
+# This program is distributed in the hope that it will be useful, but #
+# WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU #
+# General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <http://www.gnu.org/licenses/>. #
+# #
+# Written by and Copyright (C) Francois Fleuret #
+# Contact <francois.fleuret@idiap.ch> for comments & bug reports #
+#########################################################################
+
+# You need at least the Debian packages: gcc make cvs texinfo
+# libx11-dev libxft-dev libgif-dev libjpeg62-dev libpng12-dev
+# libtiff4-dev libxpm-dev
+
+set -e
+
+DIR=/usr/local/emacs-snapshot
+
+while [[ $1 ]]; do
+
+ case $1 in
+
+ ################################################################
+
+ download)
+
+ mkdir -p ${DIR}
+
+ cd ${DIR}
+
+ cvs -z3 \
+ -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs \
+ co emacs
+
+ ;;
+
+ ################################################################
+
+ compile)
+
+ cd ${DIR}/emacs/
+
+ # I do not like gtk and such, hence the very limited
+ # configuration options. Feel free to add your own.
+
+ ./configure --prefix=${DIR} \
+ --with-xpm --with-jpeg --with-tiff --with-png \
+ --with-x --with-xft
+
+ make -k bootstrap
+ make install
+
+ ;;
+
+ ################################################################
+
+ install)
+
+ if [[ -a /usr/share/emacs-snapshot ]]; then
+ echo "You have to remove /usr/share/emacs-snapshot." >&2
+ exit 1
+ fi
+
+ # We do not know the version you downloaded. This ugly
+ # command will figure it out for you
+
+ SHARE=$(find ${DIR}/share/emacs/ -maxdepth 1 -mindepth 1 -type d \
+ | \grep "/[0-9\.]*$")
+
+ if [[ ! -d "${SHARE}" ]]; then
+ echo "Can not find ${SHARE}, that's weird." >&2
+ exit 1
+ fi
+
+ ln -s ${SHARE}/ /usr/share/emacs-snapshot
+
+ for p in emacs ctags etags emacsclient ebrowse; do
+ # Install the binary as a link in /usr/bin
+ ln -s ${DIR}/bin/$p /usr/bin/$p-snapshot
+ # Tell the Debian system that the binary can be used
+ # as an alternative version
+ update-alternatives \
+ --install /usr/bin/$p $p /usr/bin/$p-snapshot 23
+ # Tell the Debian system that that new version should
+ # be used as default
+ update-alternatives \
+ --set $p /usr/bin/$p-snapshot
+ done
+
+ mkdir -p /etc/emacs-snapshot/site-start.d
+
+ # Compile and install for that version of emacs all the
+ # emacs packages installed as Debian packages (vm, bbdb,
+ # etc.)
+ /usr/lib/emacsen-common/emacs-install emacs-snapshot
+
+ ;;
+
+ ################################################################
+
+ deinstall)
+
+ # Remove that version of emacs from the list of versions
+ # for which Debian emacs-related packages should be
+ # compiled
+ /usr/lib/emacsen-common/emacs-remove emacs-snapshot
+
+ rm -rf /etc/emacs-snapshot
+
+ # Remove the alternatives
+ for p in emacs ctags etags emacsclient ebrowse; do
+ update-alternatives --remove $p /usr/bin/$p-snapshot
+ rm /usr/bin/$p-snapshot
+ done
+
+ rm /usr/share/emacs-snapshot
+ ;;
+
+ ################################################################
+
+ remove)
+
+ rm -rf ${DIR}
+
+ ;;
+
+ ################################################################
+
+ *)
+
+ echo "$0 <download | compile | install | deinstall | remove>" >&2
+ exit 1
+
+ ;;
+
+ esac
+
+ shift 1
+
+done
--- /dev/null
+#!/bin/bash
+
+#########################################################################
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the version 3 of the GNU General Public License #
+# as published by the Free Software Foundation. #
+# #
+# This program is distributed in the hope that it will be useful, but #
+# WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU #
+# General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <http://www.gnu.org/licenses/>. #
+# #
+# Written by and Copyright (C) Francois Fleuret #
+# Contact <francois@fleuret.org> for comments & bug reports #
+#########################################################################
+
+INTERFACE=wlan0
+MTU=512
+
+SCAN_OUTPUT=$(mktemp /tmp/scanresult.XXXXXX)
+SHOW_CLOSED=0
+
+######################################################################
+
+VT_CURSOR_OFF=$'\033[?25l'
+VT_CURSOR_ON=$'\033[?25h'
+
+VT_RESET=$'\033[0m'
+VT_BOLD=$'\033[1m'
+VT_UNDERLINE=$'\033[4m'
+VT_BLINK=$'\033[5m'
+
+VT_BLACK_FG=$'\033[30m'
+VT_RED_FG=$'\033[31m'
+VT_GREEN_FG=$'\033[32m'
+VT_YELLOW_FG=$'\033[33m'
+VT_BLUE_FG=$'\033[34m'
+VT_MAGENTA_FG=$'\033[35m'
+VT_CYAN_FG=$'\033[36m'
+VT_WHITE_FG=$'\033[37m'
+
+VT_BLACK_BG=$'\033[40m'
+VT_RED_BG=$'\033[41m'
+VT_GREEN_BG=$'\033[42m'
+VT_YELLOW_BG=$'\033[43m'
+VT_BLUE_BG=$'\033[44m'
+VT_MAGENTA_BG=$'\033[45m'
+VT_CYAN_BG=$'\033[46m'
+VT_WHITE_BG=$'\033[47m'
+
+######################################################################
+
+function cleanup-before-quit () {
+ echo ${VT_CURSOR_ON}
+ stty "$stty_state"
+ rm -f ${SCAN_OUTPUT}
+ if [[ "${interface_was_up}" == "" ]]; then
+ echo "The interface was down."
+ ifconfig ${INTERFACE} down
+ fi
+}
+
+function sigint-handler () {
+ cleanup-before-quit
+ echo "Interrupted"
+ exit 0
+}
+
+function scan () {
+ iwconfig ${INTERFACE} ap off essid ""
+ iwlist ${INTERFACE} scan | \
+ sed -e "s/^[\t ]*//" | grep ^"Cell\|ESSID\|Quality\|Encryption" | \
+ sed \
+ -e "s/Cell [0-9]* - Address: \([0-9]*\)/AP,\1/" \
+ -e "s/^ *ESSID:\\\"\([^\\\"]*\)\\\".*$/ESSID,\1/" \
+ -e "s/Quality=\([0-9]*\).*$/QUALITY,\1/" \
+ -e "s/Encryption key:/ENCRYPTION,/" | \
+ awk 'BEGIN { FS="," }
+ {
+ if($1 == "ESSID") { essid=$2 }
+ else if($1 == "AP") { ap=$2 }
+ else if($1 == "QUALITY") { quality=$2; }
+ else if($1 == "ENCRYPTION") {
+ if($2 == "off") {
+ open=" "
+ printf("%d,%s,%s,%s\n",quality,open,essid,ap);
+ } else {
+ if('${SHOW_CLOSED}') {
+ open="(closed)"
+ printf("%d,%s,%s,%s\n",quality,open,essid,ap);
+ }
+ }
+ }
+ }' | \
+ sort -rn > ${SCAN_OUTPUT}
+
+ number_of_aps=$(wc -l ${SCAN_OUTPUT} | awk '{print $1}')
+
+ chmod a+rw ${SCAN_OUTPUT}
+}
+
+function redisplay () {
+ clear
+
+ echo
+ echo -n " ${VT_UNDERLINE}Hotspot selection${VT_RESET}"
+ if [[ $SHOW_CLOSED == 0 ]]; then
+ echo " (show only open networks)"
+ else
+ echo
+ fi
+ echo
+ echo " [s,r] scan [m] switch the free-only view and scan [q] quit"
+ echo " [e] select essid + dhcp [a] selects essid/ap + dhcp [k] kill dhcp and quit"
+ echo
+
+ for i in $(ifconfig -s | grep -E -v ^lo\|Iface\|wmaster | awk '{print $1}'); do
+ echo " Warning: $i is up"
+ done
+ echo
+
+ if [[ ${number_of_aps} == "0" ]]; then
+ echo " ${VT_RED_FG}${VT_BOLD}No access point detected.${VT_RESET}"
+ else
+
+ awk < ${SCAN_OUTPUT} 'BEGIN { nb=1; FS="," }
+ {
+ if(nb == '$current_ap') {
+ printf(" =>");
+ } else {
+ printf(" ");
+ }
+ if($2 == "(closed)") {
+ printf("'${VT_RED_FG}'");
+ printf("% 3s %s \"%s\" %s'${VT_RESET}'\n", $1, $2, $3, $4);
+ } else {
+ printf("'${VT_GREEN_FG}'");
+ printf("% 3s %s \"%s\" %s'${VT_RESET}'\n", $1, $2, $3, $4);
+ }
+ nb=nb+1;
+ }'
+ fi
+}
+
+function get-selected-essid-ap () {
+ cat ${SCAN_OUTPUT} | \
+ awk 'BEGIN { nb=1; FS="," }
+ {
+ if(nb == '$current_ap') {
+ printf("%s,%s\n", $3, $4);
+ }
+ nb=nb+1;
+ }'
+}
+
+function kill-dhcp () {
+ PID=$(pidof dhclient)
+ if [[ ${PID} ]]; then
+ echo "Killing dhclient"
+ dhclient -x ${INTERFACE}
+ fi
+}
+
+######################################################################
+
+function process-key () {
+
+ case $1 in
+ e) # Selects essid + dhcp
+ SELECTED=$(get-selected-essid-ap)
+ ESSID=$(echo ${SELECTED} | cut -f 1 -d,)
+ echo "Running DHCP on ${INTERFACE} for ESSID ${ESSID}."
+ iwconfig ${INTERFACE} ap auto essid "${ESSID}"
+ kill-dhcp
+ echo
+ dhclient ${INTERFACE}
+ # if [[ $? == 0 ]]; then
+ # iwconfig ${INTERFACE} > ~/.hotspot-ap
+ # fi
+ ifconfig ${INTERFACE} mtu ${MTU}
+ interface_was_up=1
+ cont=0
+ ;;
+
+ "return"|a) # Selects essid/ap + dhcp
+ SELECTED=$(get-selected-essid-ap)
+ ESSID=$(echo ${SELECTED} | cut -f 1 -d,)
+ AP=$(echo ${SELECTED} | cut -f 2 -d,)
+ echo "Running DHCP on ${INTERFACE} for ESSID ${ESSID} and AP ${AP}."
+ iwconfig ${INTERFACE} ap ${AP} essid "${ESSID}"
+ kill-dhcp
+ echo
+ dhclient ${INTERFACE}
+ # if [[ $? == 0 ]]; then
+ # iwconfig ${INTERFACE} > ~/.hotspot-ap
+ # fi
+ ifconfig ${INTERFACE} mtu ${MTU}
+ interface_was_up=1
+ cont=0
+ ;;
+
+ k) # kill dhcp
+ echo "Killing DHCP and bringing down ${INTERFACE}."
+ kill-dhcp
+ ifconfig ${INTERFACE} down
+ cont=0
+ ;;
+
+ r|s) # re-scanning the access points
+ echo "Scanning ..."
+ scan
+ redisplay
+ ;;
+
+ m) # Switching the mode to show the protected spots
+ SHOW_CLOSED=$((1-SHOW_CLOSED))
+ echo "Scanning ..."
+ scan
+ redisplay
+ ;;
+
+ "down"|n)
+ current_ap=$((current_ap+1))
+ if [[ $current_ap -gt $number_of_aps ]]; then
+ current_ap=$number_of_aps
+ fi
+ redisplay
+ ;;
+
+ "up"|p)
+ current_ap=$((current_ap-1))
+ if [[ $current_ap -lt 1 ]]; then
+ current_ap=1
+ fi
+ redisplay
+ ;;
+
+ "esc-esc"|q)
+ echo "quit"
+ cont=0
+ ;;
+
+ *)
+ ;;
+ esac
+}
+
+######################################################################
+## The main
+
+if [[ $1 == "-k" ]]; then
+ echo "Killing DHCP and bringing down ${INTERFACE}."
+ kill-dhcp
+ ifconfig ${INTERFACE} down
+ exit 1
+fi
+
+stty_state=$(stty -g)
+
+trap sigint-handler SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
+
+stty -echo -icrnl -icanon -xcase min 1 time 0
+
+echo ${VT_CURSOR_OFF}
+
+current_ap=1
+cont=1
+current_keymap=default
+
+interface_was_up=$(ifconfig | grep ${INTERFACE})
+
+ifconfig ${INTERFACE} up
+
+scan
+
+redisplay
+
+while [[ ${cont} == 1 ]]; do
+
+ CHAR=$(dd bs=1 count=1 2>/dev/null)
+
+ case ${current_keymap} in
+ default) ##################################################
+ case ${CHAR} in
+
+ [a-z])
+ process-key ${CHAR}
+ ;;
+
+ "\r")
+ process-key "return"
+ ;;
+
+ "\ e")
+ process-key "down"
+ ;;
+
+ "\10")
+ process-key "up"
+ ;;
+
+ "\e") #$'\033'")
+ current_keymap=escape
+ ;;
+
+ *)
+ ;;
+ esac
+ ;;
+
+ escape) ##################################################
+ case ${CHAR} in
+ "$'\033'")
+ process-key "esc-esc"
+ ;;
+ "[")
+ current_keymap=cursor
+ ;;
+ *)
+ current_keymap=default
+ ;;
+ esac
+ ;;
+
+ cursor) ##################################################
+
+ current_keymap=default
+
+ case ${CHAR} in
+ A)
+ process-key "up"
+ ;;
+ B)
+ process-key "down"
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+
+ *)
+ echo "Unknown keymap. This is an internal and weird bug."
+ cont=0
+ ;;
+ esac
+
+ done
+
+ cleanup-before-quit
--- /dev/null
+#!/bin/bash
+
+#########################################################################
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the version 3 of the GNU General Public License #
+# as published by the Free Software Foundation. #
+# #
+# This program is distributed in the hope that it will be useful, but #
+# WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU #
+# General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <http://www.gnu.org/licenses/>. #
+# #
+# Written by and Copyright (C) Francois Fleuret #
+# Contact <francois@fleuret.org> for comments & bug reports #
+#########################################################################
+
+# Kills all xterms which are running bash with no sub-process
+
+set -e
+
+NB_KILLED=0
+NB_TOTAL=0
+SHELL_NAME=bash
+
+for ppid in $(ps h -C xterm -o pid); do
+ N=0
+ for pid in $(ps h --ppid $ppid -o pid,cmd | awk '{ if($2 == "'${SHELL_NAME}'") { print $1 }}'); do
+ K=$(ps h --ppid $pid -o cmd,pid | wc -l)
+ N=$((N+K+1))
+ done
+ if [[ $N == 1 ]]; then
+ kill -USR2 $ppid
+ NB_KILLED=$((NB_KILLED+1))
+ fi
+ NB_TOTAL=$((NB_TOTAL+1))
+done
+
+echo "Killed ${NB_KILLED} / ${NB_TOTAL} XTerm(s)"
--- /dev/null
+#!/bin/bash
+
+#########################################################################
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the version 3 of the GNU General Public License #
+# as published by the Free Software Foundation. #
+# #
+# This program is distributed in the hope that it will be useful, but #
+# WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU #
+# General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <http://www.gnu.org/licenses/>. #
+# #
+# Written by and Copyright (C) Francois Fleuret #
+# Contact <francois@fleuret.org> for comments & bug reports #
+#########################################################################
+
+function error () {
+ echo $1 1>&2
+ exit 1
+}
+
+######################################################################
+# Create the directories
+
+if [[ -z $1 ]] || [[ -z $2 ]]; then
+ echo "$0 <image directory> <result directory>"
+ exit 1
+fi
+
+if [[ ! -d $1 ]]; then
+ echo "Can not find directory $1"
+ exit 1
+fi
+
+mkdir $2 || error "Can not create $2."
+mkdir $2/pics || error "Can not create $2/pics"
+mkdir $2/thumbs || error "Can not create $2/thumbs"
+
+######################################################################
+# Generate the html header
+
+cat > $2/index.html <<EOF
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<title></title>
+</head>
+
+<body>
+
+EOF
+
+######################################################################
+# Generate the thumbnails, html content and copy the images
+
+for i in $(find $1 -type f | sort); do
+ FILENAME=$(basename $i)
+ convert 2> /dev/null -geometry 180x120 $i $2/thumbs/${FILENAME}.jpg
+
+ if [[ $? == 0 ]]; then
+ echo "Copying ${FILENAME}"
+ cp $i $2/pics/${FILENAME}
+ echo "<a href=\"./pics/${FILENAME}\"><img src=\"./thumbs/${FILENAME}.jpg\" /></a>" >> $2/index.html
+ else
+ echo "Ignoring $i (not an image?)"
+ fi
+
+done
+
+######################################################################
+# Generate the footer of the html file
+
+cat >> $2/index.html <<EOF
+</body>
+
+</html>
+EOF
+
+######################################################################
--- /dev/null
+#!/bin/bash
+
+#########################################################################
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the version 3 of the GNU General Public License #
+# as published by the Free Software Foundation. #
+# #
+# This program is distributed in the hope that it will be useful, but #
+# WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU #
+# General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <http://www.gnu.org/licenses/>. #
+# #
+# Written by and Copyright (C) Francois Fleuret #
+# Contact <francois@fleuret.org> for comments & bug reports #
+#########################################################################
+
+set -e
+
+# $Id: print.sh,v 1.19 2006-11-10 15:53:23 fleuret Exp $
+
+if [ ! "$*" ]; then
+ echo "Need filenames to print!"
+ exit 1
+fi
+
+tmp=$(mktemp /tmp/print.ps.XXXXXX)
+opts=""
+printing_cmd="lpr"
+
+for arg in $*; do
+
+ if [ "${arg}" == "-h" ] || [ "${arg}" == "--help" ]; then
+
+ # The help option
+
+ echo $(basename $0)" [<opt> ... <opt>] <file1> [[<opt> ... <opt>] <file2> ... ]"
+ echo
+ echo "A dumb printing utility. Options:"
+ echo
+ echo "-2pp two pages per page"
+ echo "-4pp four pages per page"
+ echo "-8pp eight pages per page"
+ echo "-gv displays the result with gv instead of printing"
+ echo "-stdout send the result to the standard output"
+ echo "-P<printer> uses <printer> instead of $PRINTER"
+ echo
+ echo "Contact <francois.fleuret@epfl.ch>"
+ echo "Version \$Id: print.sh,v 1.19 2006-11-10 15:53:23 fleuret Exp $"
+
+ \rm ${tmp}
+ exit 0
+
+ elif [[ ${arg} == "-"* ]]; then
+
+ # else, if it starts with '-' it is an option
+
+ opts="${opts} ${arg}"
+
+ else
+
+ # else, it is a filename to print
+
+ if [ -e ${arg} ]; then
+
+ TYPE=$(file -L ${arg})
+
+ noprint=""
+
+ case $TYPE in
+
+ *"image data"*)
+ convert ${arg} ps:${tmp}
+ ;;
+
+ *"TeX DVI"*)
+ dvips -o ${tmp} ${arg}
+ ;;
+
+ *"FIG image"*)
+ fig2dev -L ps ${arg} > ${tmp}
+ ;;
+
+ *"PostScript"*)
+ cp ${arg} ${tmp}
+ ;;
+
+ *"PDF"*)
+ pdf2ps ${arg} ${tmp}
+ ;;
+
+ *" text"*)
+ # a2ps -B -R --columns=1 -f 8 -o ${tmp} ${arg}
+ a2ps --user-option=lp -o ${tmp} ${arg}
+ ;;
+
+ *"gzip compressed"*)
+ echo "Unzipping "
+ zcat ${arg} > ${tmp}
+ noprint=1
+ $0 ${opts} ${tmp}
+ ;;
+
+ *)
+ echo "Unable to handle type \"$TYPE\""; noprint=1
+ ;;
+
+
+ esac
+
+ if [ ! "$noprint" ]; then
+
+ # We apply all the filters seen up to now
+
+ for f in ${opts}; do
+ case $f in
+ -2pp)
+ tmp2=$(mktemp /tmp/filter.ps.XXXXXX)
+ psnup -d0 -m5 -2 < ${tmp} > ${tmp2}
+ mv ${tmp2} ${tmp}
+ ;;
+ -4pp)
+ tmp2=$(mktemp /tmp/filter.ps.XXXXXX)
+ psnup -d0 -m5 -4 < ${tmp} > ${tmp2}
+ mv ${tmp2} ${tmp}
+ ;;
+ -8pp)
+ tmp2=$(mktemp /tmp/filter.ps.XXXXXX)
+ psnup -d0 -m5 -8 < ${tmp} > ${tmp2}
+ mv ${tmp2} ${tmp}
+ ;;
+ -gv)
+ printing_cmd="gv"
+ ;;
+
+ -stdout)
+ printing_cmd="cat"
+ ;;
+
+ -P*)
+ printing_cmd="lpr"
+ PRINTER=$(echo $f | sed -e s/^-P//)
+ if [[ -z "$PRINTER" ]]; then
+ echo "Error in the printer name. Use -P<printer> with no space."
+ lpstat -a
+ exit 1
+ else
+ echo "Using printer \"$PRINTER\""
+ fi
+ ;;
+ *)
+ echo "Unknown option $f"
+ \rm ${tmp}
+ exit 1;;
+ esac
+ done
+
+ if [[ "$printing_cmd" == "lpr" ]]; then
+ echo "Printing on printer '$PRINTER'"
+ show_queue=1
+ fi
+
+ ${printing_cmd} ${tmp}
+
+ fi
+
+ else
+
+ echo "Can not find file ${arg}"
+
+ fi
+
+ fi
+
+done
+
+\rm ${tmp}
+
+if [[ ${show_queue} ]]; then
+ lpq
+fi
+
+exit 0