[CONTACT]

[ABOUT]

[POLICY]

Log gph Files gph Refs gph

Found at: gopher.r-36.net:70/scm/conn/commit/bad1ea36c4290e95ffc647ee36b85df914fb9380.gph

Adding state and suspend support to conn. - conn - A script repository to manage connections in Linux.

Log

Files

Refs

LICENSE

---

commit bad1ea36c4290e95ffc647ee36b85df914fb9380

parent 9be91c42651017a27465185a7fb959d3027c4e26

Author: Christoph Lohmann <20h@r-36.net>

Date:   Wed, 23 Feb 2011 17:49:31 +0100
Adding state and suspend support to conn.
Diffstat:
  Makefile                            |       6 ++++++
  README.md                           |      14 +++++++++++++-
  etc/conn/common.sh                  |      73 +++++++++++++++++++++++++++++--
  etc/conn/run.sh                     |     182 +++++++++++++++++++++++++------
  etc/pm/sleep.d/10-conn.sh           |      13 +++++++++++++
5 files changed, 250 insertions(+), 38 deletions(-)
---

diff --git a/Makefile b/Makefile

@@ -12,6 +12,12 @@ dist:
         @gzip conn-${VERSION}.tar
         @rm -rf conn-${VERSION}
+pm:
+        @echo installing pm file to ${DESTDIR}/etc/pm/sleep.d
+        @mkdir -p ${DESTDIR}/etc/pm/sleep.d
+        @cp etc/pm/sleep.d/10-conn.sh ${DESTDIR}/etc/pm/sleep.d
+        @chmod 755 ${DESTDIR}/etc/pm/sleep.d/10-conn.sh
+
 install:
         @echo installing conn script to ${DESTDIR}${PREFIX}/bin
         @cp bin/conn ${DESTDIR}${PREFIX}/bin

diff --git a/README.md b/README.md

@@ -34,6 +34,9 @@ many different connections in a Unix like environment.
 /etc/conn/$conn/$files        These files depend solely on the connection, which
                         is served. Look at them for details.
+/etc/pm/sleep.d/10-conn.sh        The script for providing suspend and hib-
+                                ernate support.
+
 ### Calltree
 * conn
         * conn/run.sh
@@ -47,11 +50,20 @@ many different connections in a Unix like environment.
         eth
         wifi
         wwan
+        # Connecto to the wifi
         % conn -s wifi
+        # HUP wpa_supplicant
         % conn -u wifi
+        # Kill the wifi
         % conn -k wifi
+        # Start ethernet
         % conn -s eth
+        # Kill the ethernet
         % conn -k eth
+        # Start the wwan
         % conn -s wwan
-
+        # Suspend all connections
+        % conn -n
+        # Wakeup all previous connections
+        % conn -w

diff --git a/etc/conn/common.sh b/etc/conn/common.sh

@@ -16,15 +16,82 @@ ETCDIR="/etc/conn"
 WIFIDIR="${ETCDIR}/wifi"
 WWANDIR="${ETCDIR}/wwan"
 ETHDIR="${ETCDIR}/eth"
+STATEDIR="/var/state/conn"
 mkpaths() {
-        for i in $RUNDIR $ETCDIR $WIFIDIR $WWANDIR \
-                $ETHDIR;
+        for i in $RUNDIR $STATEDIR;
         do
                 [ ! -e $i ] && mkdir -p $i
         done
 }
-mkpaths
+
+## Locking in bash
+lock() {
+        LOCKF="$1.lock"
+        lock=0
+
+        [ -e $LOCKF ] && lock=1
+
+        while [ $lock -eq 1 ]
+        do
+                [ ! -e $LOCKF ] && lock=0
+                sleep 0.5;
+        done
+
+        touch $LOCKF
+}
+
+unlock() {
+        LOCKF="$1.lock"
+        rm $LOCKF
+}
+
+## Global conn lock, when there is database access.
+CONNLOCKF="$STATEDIR/conn"
+lockconn() {
+        lock $CONNLOCKF
+}
+
+unlockconn() {
+        unlock $CONNLOCKF
+}
+
+## State handling
+OPENCONNFILE="$STATEDIR/open"
+getopenconnections() {
+        [ ! -e $OPENCONNFILE ] && return 1
+        [ `stat -c%s $OPENCONNFILE` -eq 0 ] && return 1
+        cat $OPENCONNFILE
+        return 0
+}
+
+isopen() {
+        isin=`getopenconnections | grep "$1 $2"`
+        [ "$isin" == "" ] && return 1
+        return 0
+}
+
+addconnection() {
+        isopen $1 $2 && return 1
+        echo "$1 $2" >> $OPENCONNFILE
+}
+
+delconnection() {
+        [ ! -e $OPENCONNFILE ] && return 1
+
+        if ! isopen $1 $2;
+        then
+                return 1
+        else
+                cat $OPENCONNFILE | grep -v "$1 $2" \
+                        > $OPENCONNFILE.bak
+                mv $OPENCONNFILE.bak $OPENCONNFILE
+        fi
+}
+
+getdefaultconnection() {
+        echo "$DEFAULTCONNECTION $DEFAULTPROFILE"
+}
 ## WPA handling
 WPAPID="${RUNDIR}/wpa_supplicant.pid"

diff --git a/etc/conn/run.sh b/etc/conn/run.sh

@@ -2,40 +2,154 @@
 . ./common.sh
-profile=$3
-connection=$2
-t[ "$2" == "" ] && [ "$DEFAULTCONNECTION" != "" ] \
-        && connection="$DEFAULTCONNECTION" \
-        && profile="$DEFAULTPROFILE"
-
-case "$1" in
-        -s|-k|-u)
-                arg=$1
-                if [ $# -lt 3 ];
-                then
-                        shift $#
-                else
-                        shift 3
-                fi
-
-                runconnection $connection $arg $profile $*
-                exit $?
-                ;;
-        -l)
-                echo "Available network types:"
-                for i in `ls -d */ | sed 's~/~~g'`;
+mkpaths
+
+usage() {
+        echo "usage: $1 [-hfnwlo] [-[s|k|u|r] [connection [args ...]]"
+}
+
+dostart=0
+dokill=0
+dohup=0
+dorestart=0
+dolist=0
+dolistopen=0
+dosuspend=0
+dowakeup=0
+doforce=0
+
+cmdarg=""
+while getopts "fwnskurlo" opt;
+do
+        case $opt in
+                s)
+                        dostart=1
+                        cmdarg="-s"
+                        ;;
+                k)
+                        dokill=1
+                        cmdarg="-k"
+                        ;;
+                u)
+                        dohup=1
+                        cmdarg="-u"
+                        ;;
+                r)
+                        dorestart=1
+                        ;;
+                l)
+                        dolist=1
+                        ;;
+                o)
+                        dolistopen=1
+                        ;;
+                n)
+                        dosuspend=1
+                        ;;
+                w)
+                        dowakeup=1
+                        ;;
+                f)
+                        doforce=1
+                        ;;
+                *)
+                        usage
+                        exit 1
+                        ;;
+        esac
+done
+shift $(($OPTIND - 1))
+
+if [ $dolist -eq 1 ];
+tthen
+        echo "Available network types:"
+        for i in `ls -d */ | sed 's~/~~g'`;
+        do
+                echo $i
+        done
+
+        exit 0
+fi
+
+if [ $dolistopen -eq 1 ];
+tthen
+        conns=`getopenconnections`
+        if [ "$conns" == "" ];
+        then
+                echo "There are no connections open."
+                exit 1
+        else
+                echo "Open connections:"
+                for conn in $conns;
                 do
-                        echo $i
+                        echo $conn
                 done
-                ;;
-        -r)
-                shift 1
-                $0 -k $*
-                $0 -s $*
-                ;;
-        *)
-                echo "usage: $0 [-s|-k|-u|-r|-l] connection [args ...]"
-                exit 1
-                ;;
-esac
+        fi
+
+        exit 0
+fi
+
+t[ $dowakeup -eq 1 ] && cmdarg="-s"
+
+if [ $dosuspend -eq 1 ];
+tthen
+        $0 -f -k $*
+        exit 0
+fi
+
+if [ $dorestart -eq 1 ];
+tthen
+        $0 -k $*
+        $0 -s $*
+fi
+
+if [ "$cmdarg" == "" ];
+tthen
+        usage
+        exit 1
+fi
+
+connection=$1
+profile=$2
+if [ "$1" == "" ];
+tthen
+        if [ $dostart -eq 1 ] && [ ! $dowakeup -eq 1 ];
+        then
+                conns=`getdefaultconnection`
+        else
+                conns=`getopenconnections`
+        fi
+
+        [ "$conns" == "" ] && exit 0
+        [ $doforce -eq 1 ] && cmdarg="-f $cmdarg"
+
+        for conn in $conns;
+        do
+                args=(`echo $conn`)
+                [ ${#args[@]} -eq 0 ] && continue
+                [ ${#args[@]} -eq 1 ] && args[1]=""
+
+                $0 $cmdarg ${args[0]} ${args[1]}
+                exit 0
+        done
+
+        exit $?
+fi
+
+if [ ! $doforce -eq 1 ];
+tthen
+        [ $dostart -eq 1 ] && addconnection $connection $profile
+        [ $dokill -eq 1 ] && delconnection $connection $profile
+fi
+
+if [ $# -lt 2 ];
+tthen
+        shift $#
+else
+        shift 2
+fi
+
+runconnection $connection $cmdarg $profile $*
+
+exit $?

diff --git a/etc/pm/sleep.d/10-conn.sh b/etc/pm/sleep.d/10-conn.sh

@@ -0,0 +1,13 @@
+#!/bin/sh
+
+case $1 in
+        hibernate|suspend)
+                conn -n;
+                ;;
+        thaw|resume)
+                conn -w;
+                ;;
+        *)
+                ;;
+esac
+
.


AD: