Portál AbcLinuxu, 3. května 2025 05:33

Ultra{Connect,Nav,Bay} až do zblbnutí

7.6.2009 22:13 | Přečteno: 1166× | ThinkPad

Tak jsem zkoumal, kterak by šel občas taky vypnout TrackPoint, nakonec z toho vylezlo celkem dost skriptů :).

První skript slouží ke spuštění příkazu pod uživatelem v X serveru, a to buď na aktuálně zobrazeném X serveru, nebo na všech běžících.

#!/bin/bash
command="$2"

getXuser()
{
    user=$(who | grep -m1 "$DISPLAY " | awk '{print $1}')
    if [ $user = "" ]; then
        user=$(who | grep -m1 "$DISPLAY" | awk '{print $1}')
    fi
    if [ $user != "" ]; then
        userhome=$(getent passwd $user | cut -d: -f6)
        export XAUTHORITY=$userhome/.Xauthority
    else
	export XAUTHORITY=""
    fi
}

runXcommand()
{
    getXuser
    echo "Display:    $DISPLAY"
    echo "User:       $user"
    echo "XAuthority: $XAUTHORITY"
    if [ "$DISPLAY" != "" ] && [ "$user" != "" ]; then
	echo "RUN:        $command"
	su $user -c "$command"
    fi
}

Usage()
{
    echo "usage: ${0/*\/} {all|actual} <command>"
    exit 1
}

[ $# -gt 2 ] && Usage

case "$1" in
    "all")
        for display in $(who | awk '{print $2}' | grep -E ':[0-9]+'); do
	    export DISPLAY=$display
	    runXcommand
	done
    ;;
    "actual")
        displaynum=$(ps ax | grep -m1 -e '[X] .* vt'$(fgconsole) | sed -re 's|.*/X .*:([0-9]+).*|\1|')
        export DISPLAY=":$displaynum"
	runXcommand
    ;;
    *)
	Usage
    ;;
esac

Hodí se ke spouštění následujících dvou skriptů, například, při spouštění přes ACPI tlačítka.

Skript pro přepínání stavu UltraNav

#!/bin/bash
TRACKPOINT_NAME="trackpoint"
TRACKPOINT='TPPS/2 IBM TrackPoint'
TOUCHPAD_NAME="touchpad"
TOUCHPAD='SynPS/2 Synaptics TouchPad'

Usage()
{
    echo "usage: ${0/*\/} status [device]"
    echo "       ${0/*\/} enable [device]"
    echo "       ${0/*\/} disable [device]"
    echo "       ${0/*\/} toggle [device]"
    echo "device: $TRACKPOINT_NAME"
    echo "        $TOUCHPAD_NAME"
    echo "toggle order: 1) $TRACKPOINT_NAME enable"
    echo "                 $TOUCHPAD_NAME disable"
    echo "              2) $TRACKPOINT_NAME disable"
    echo "                 $TOUCHPAD_NAME enable"
    echo "              3) $TRACKPOINT_NAME disable"
    echo "                 $TOUCHPAD_NAME disable"
    echo "              4) $TRACKPOINT_NAME enable"
    echo "                 $TOUCHPAD_NAME enable"
    exit 1
}

GetState()
{
    echo $(/usr/bin/xinput list-props "$1" | grep "Device Enabled" | cut -f2 -d:)
}

Status()
{
    case "$1" in
	"$TRACKPOINT")
	    DEVICE="$TRACKPOINT_NAME"
	;;
	"$TOUCHPAD")
	    DEVICE="$TOUCHPAD_NAME"
	;;
    esac

    if [ $(GetState "$1") = "1" ]; then
	STATUS="enabled"
    else
	STATUS="disabled"
    fi
    
    echo -e "$DEVICE: $STATUS"
}

SetState()
{
    /usr/bin/xinput set-int-prop "$1" "Device Enabled" "8" "$2"
}

Enable()
{
    SetState "$1" 1
}

Disable()
{
    SetState "$1" 0
}

Toggle()
{
    if [ $(GetState "$1") = "1" ]; then
	STATE=0
    else
	STATE=1
    fi
    
    SetState "$1" "$STATE"
}

[ $# -gt 2 ] && Usage

case "$1" in
    "status")
	COMMAND="Status"    
    ;;
    "enable")
	COMMAND="Enable"
    ;;
    "disable")
	COMMAND="Disable"
    ;;
    "toggle")
	COMMAND="Toggle"
	if [ -z "$2" ]; then
	    if [ $(GetState "$TRACKPOINT") = "1" -a $(GetState "$TOUCHPAD") = "1" ]; then
	        SetState "$TRACKPOINT" 1
	        SetState "$TOUCHPAD" 0
	    elif [ $(GetState "$TRACKPOINT") = "1" -a $(GetState "$TOUCHPAD") = "0" ]; then
	        SetState "$TRACKPOINT" 0
	        SetState "$TOUCHPAD" 1
	    elif [ $(GetState "$TRACKPOINT") = "0" -a $(GetState "$TOUCHPAD") = "1" ]; then
	        SetState "$TRACKPOINT" 0
	        SetState "$TOUCHPAD" 0
	    else
	        SetState "$TRACKPOINT" 1
	        SetState "$TOUCHPAD" 1
	    fi
	    exit
	fi
    ;;
    *)
	Usage
    ;;
esac

case "$2" in
    "$TRACKPOINT_NAME")
	$COMMAND "$TRACKPOINT"
    ;;
    "$TOUCHPAD_NAME")
	$COMMAND "$TOUCHPAD"
    ;;
    "")
	$COMMAND "$TRACKPOINT"
	$COMMAND "$TOUCHPAD"
    ;;
    *)
    Usage
esac    

Notně vylepšený skript pro přepínání interního-externího displeje

#!/bin/bash
INTERNAL_NAME='internal'
INTERNAL='LVDS'
EXTERNAL_NAME='external'
EXTERNAL='VGA'
EXTERNAL_EXPAND="left-of"

Usage()
{
    echo "usage: ${0/*\/} status [device]"
    echo "       ${0/*\/} enable [device]"
    echo "       ${0/*\/} disable [device]"
    echo "       ${0/*\/} toggle [device]"
    echo "device: $INTERNAL_NAME"
    echo "        $EXTERNAL_NAME"
    echo "toggle order: 1) $INTERNAL_NAME enable"
    echo "                 $EXTERNAL_NAME disable"
    echo "              2) $INTERNAL_NAME disable"
    echo "                 $EXTERNAL_NAME enable"
    echo "              3) $INTERNAL_NAME enable"
    echo "                 $EXTERNAL_NAME enable"
    exit 1
}

GetState()
{
    if /usr/bin/xrandr | grep -q -E '^'"$1"' connected .+\('; then
	echo 1
    else
	echo 0
    fi
}

Status()
{
    case "$1" in
	"$EXTERNAL")
	    DEVICE="$EXTERNAL_NAME"
	;;
	"$INTERNAL")
	    DEVICE="$INTERNAL_NAME"
	;;
    esac

    if [ $(GetState "$1") = "1" ]; then
	STATUS="enabled"
    else
	STATUS="disabled"
    fi
    
    echo -e "$DEVICE: $STATUS"
}

GetOther()
{
    case "$1" in
	"$EXTERNAL")
	    echo "$INTERNAL"
	;;
	"$INTERNAL")
	    echo "$EXTERNAL"
	;;
    esac
}

SetState()
{
    OTHER="$(GetOther "$1")"
    if [ "$2" = "0" -a $(GetState "$OTHER") = "0" ]; then
	/usr/bin/xrandr --output "$OTHER" --auto
	[ $(GetState "$OTHER") != "0" ] && /usr/bin/xrandr --output "$1" --off
    elif [ "$2" = "0" ]; then
	/usr/bin/xrandr --output "$1" --off
    else
	/usr/bin/xrandr --output "$1" --auto
	if [ $(GetState "$1") != "0" -a $(GetState $OTHER) != "0" ]; then
	    /usr/bin/xrandr --output "$INTERNAL" --"$EXTERNAL_EXPAND" "$EXTERNAL"
	 fi
    fi
    true
}

Enable()
{
    SetState "$1" 1
}

Disable()
{
    SetState "$1" 0
}

Toggle()
{
    if [ $(GetState "$1") = "1" ]; then
	STATE=0
    else
	STATE=1
    fi
    SetState "$1" "$STATE"
}

[ $# -gt 2 ] && Usage

case "$1" in
    "status")
	COMMAND="Status"    
    ;;
    "enable")
	COMMAND="Enable"
    ;;
    "disable")
	COMMAND="Disable"
    ;;
    "toggle")
	COMMAND="Toggle"
	if [ -z "$2" ]; then
	    if [ $(GetState "$INTERNAL") = "1" -a $(GetState "$EXTERNAL") = "1" ]; then
	        SetState "$INTERNAL" 1
	        SetState "$EXTERNAL" 0
	    elif [ $(GetState "$INTERNAL") = "1" -a $(GetState "$EXTERNAL") = "0" ]; then
	        SetState "$EXTERNAL" 1
	        SetState "$INTERNAL" 0
	    else
	        SetState "$INTERNAL" 1
	        SetState "$EXTERNAL" 1
	    fi
	    exit
	fi
    ;;
    *)
	Usage
    ;;
esac

case "$2" in
    "$INTERNAL_NAME")
	$COMMAND "$INTERNAL"
    ;;
    "$EXTERNAL_NAME")
	$COMMAND "$EXTERNAL"
    ;;
    "")
	$COMMAND "$INTERNAL"
	$COMMAND "$EXTERNAL"
    ;;
    *)
    Usage
esac    

Další skript je pro přepínání stavu UltraConnect, funguje jen pokud ho spustí root.

#!/bin/bash
WLAN_MODULE="iwlagn"
WLAN_IFACE="wlan0"
WLAN_NAME="wifi"
BT_CTRL_FILE="/sys/devices/platform/thinkpad_acpi/bluetooth_enable"
BT_NAME="bluetooth"

Usage()
{      
    echo "usage: ${0/*\/} status [device]"
    echo "       ${0/*\/} enable [device]"
    echo "       ${0/*\/} disable [device]"
    echo "       ${0/*\/} toggle <device>"             
    echo "device: $WLAN_NAME"
    echo "        $BT_NAME"  
    exit 1
}

WlanPowerSave()
{
	/usr/sbin/iwconfig "$WLAN_IFACE" power on
}

GetWlanState()
{
    if [ -d "/sys/module/$WLAN_MODULE" ]; then
	echo 1
    else
	echo 0
    fi
}

SetWlanState()
{
    if [ "$1" -eq 0 ]; then
	/sbin/modprobe -r "$WLAN_MODULE"
    else
	/sbin/modprobe "$WLAN_MODULE"
	WlanPowerSave
    fi
}

ToggleWlan()
{
    if [ $(GetWlanState) = "0" ]; then
	SetWlanState 1 
    else
	SetWlanState 0
    fi
}

GetBTState()
{
    cat $BT_CTRL_FILE
}

SetBTState()
{
    echo "$1" > "$BT_CTRL_FILE"
}

ToggleBT()
{
    if [ $(GetBTState) = "0" ]; then
	SetBTState 1
    else
	SetBTState 0
    fi
}

Status()
{
    case "$1" in
        "$WLAN_NAME")
            STATE=$(GetWlanState)
        ;;
        "$BT_NAME")
            STATE=$(GetBTState)
        ;;
    esac

    if [ $STATE = "1" ]; then
        STATUS="enabled"
    else
        STATUS="disabled"
    fi

    echo -e "$1: $STATUS"
}

[ $# -gt 2 ] && Usage 

case "$1" in
    "status")
	case "$2" in
	    "$WLAN_NAME"|"$BT_NAME")
		Status "$2"
	    ;;
	    "")
		Status "$WLAN_NAME"
		Status "$BT_NAME"
	    ;;
	    *)
		Usage
	    ;;
	esac
    ;;
    "enable"|"disable")
	case $1 in
	    "enable")
		STATE="1"
	    ;;
	    "disable")
		STATE="0"
	    ;;
	esac
	
	case "$2" in
	    "$WLAN_NAME")
		SetWlanState "$STATE"
	    ;;
	    "$BT_NAME")
		SetBTState "$STATE"
	    ;;
	    "")
		SetWlanState "$STATE"
		SetBTState "$STATE"
	    ;;
	    *)
		Usage
	    ;;
	esac
    ;;
    "toggle")
	case "$2" in
	    "$WLAN_NAME")
		ToggleWlan
	    ;;
	    "$BT_NAME")
		ToggleBT
	    ;;
	    *)
		Usage
	    ;;
	esac
    ;;
    *)
	Usage
    ;;
esac

Poslední je vylepšený skript pro UltraBay

#!/bin/bash
DEFAULT_DEVICE="/sys/class/scsi_device/1:0:0:0/device"
FORCE_SLEEP="1"
QUIET="0"

Message()
{
    if [ $QUIET = "0" ]; then
	echo "${0/*\//}: $*"
    else
	true
    fi
}

Block2Device()
{
    /bin/readlink -e "/dev/block/$1"	
}

IsSwap()
{
    /sbin/swapon -s | grep -q -e "^$1\b"
}

IsMounted()
{
    mount | grep -q -e "^$DEVICE\b"
}

ReleaseDevice()
{
    if IsMounted "$1"; then
	if ! umount "$1" &> /dev/null; then
	    Message "cannot umount $DEVICE"
	    false
	fi
    elif IsSwap "$1"; then
	if ! /sbin/swapoff "$1" &> /dev/null; then
	    Message "cannot disable swapping on $DEVICE"
	    false
	fi
    fi
}

SleepDrive()
{
    if ! /sbin/hdparm -Y "$1" &> /dev/null; then
	Message "cannot put drive to sleep"
	if [ $FORCE_SLEEP = "0" ]; then
	    true
	else
	    false
	fi
    fi
}

DeleteScsiDevice()
{
    if ! { echo 1 > $SCSI_DEVICE/delete; } &> /dev/null; then
	Message "cannot delete device"
	false
    fi
}

GetDock()
{
    grep "$1" /sys/devices/platform/dock.*/type | sed -e s%/type:.*%%
}

IsDocked()
{
    [ $(cat $(GetDock "$1")/docked) -ne 0 ]
}

Undock()
{
    { echo 0 > $(GetDock "$1")/undock; } &> /dev/null
    ! IsDocked "$1"
}

SCSI_DEVICE="$DEFAULT_DEVICE"
for PARAM in $*; do
    if [ "$PARAM_DEVICE" ]; then
	SCSI_DEVICE="$PARAM"
    else
	case "$PARAM" in
    	    "--quiet"|"-q")
		QUIET="1"
	    ;;
	    "--no-force-sleep"|"-n")
	        FORCE-SLEEP="0"
	    ;;
	    "--device"|"-d")
	        PARAM_DEVICE="1"
	    ;;
	    *)
	        echo "usage: ${0/*\/} [options]"
	        echo "options:"
	        echo "    -q --quiet           No messages"
	        echo "    -n --no-force-sleep  Ignore fail when putting drive to sleep"
	        echo "    -d --device <path>   SCSI device, default: $DEFAULT_DEVICE"
	        exit 1
	    ;;
	esac
    fi
done

if [ -d $SCSI_DEVICE ] && IsDocked "ata_bay"; then
    sync
    for BLOCK in $(/bin/cat $SCSI_DEVICE/block/*/*/dev $SCSI_DEVICE/block/*/dev 2> /dev/null); do
	DEVICE=$(Block2Device "$BLOCK") && ReleaseDevice "$DEVICE" || FAIL="1"
    done
    if [ $FAIL ]; then
	exit 1
    fi

    sync
    BLOCK=$(cat $SCSI_DEVICE/block/*/dev 2> /dev/null) &&
    DEVICE=$(Block2Device "$BLOCK") && SleepDrive "$DEVICE" || exit 1 
    sleep 3
    DeleteScsiDevice "$SCSI_DEVICE" || exit 1
    sleep 1
fi

if [ ! -d $SCSI_DEVICE ] && $(IsDocked "ata_bay"); then
    if Undock "ata_bay"; then
	Message "AtaBay undocked"
	exit 0
    else
	Message "cannot undock AtaBay"
	exit 1
    fi
fi

if $(IsDocked "battery_bay"); then
    if Undock "battery_bay"; then
	Message "BatteryBay undocked"
	exit 0
    else
	Message "cannot undock BatteryBay"
	exit 1
    fi
fi

Message "UltraBay is already undock"
exit 1

No a nakonec, užijte si to :_).

       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

8.6.2009 00:37 Jan Grmela | skóre: 45 | blog: Kilo šťávy z lachtana | Brno
Rozbalit Rozbalit vše Re: Ultra{Connect,Nav,Bay} až do zblbnutí
Odpovědět | Sbalit | Link | Blokovat | Admin

A na ThinkWiki s nimi! :-)

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.