Grafisches halt/reboot mit gtk-perl

Linux Grafisches halt/reboot mit gtk-perl

Um den Rechner bequem direkt aus dem WindowMaker runterfahren zu können, habe ich mir mal ein kleines Frontend geschrieben, welches abfragt, ob man den Rechner runterfahren oder neu starten möchte. Da "shutdown" verwendet wird, solltest du erstmal prüfen, ob dein WindowManager mit dieser Form des "logout" zurecht kommt, oder ob er sich selbst erstmal runterfahren muss, um Fehler zu vermeiden. Ich habe dieses kleine Script schon einige Zeit mit WindowMaker im Einsatz und kann keine Folgeschäden bemerken. Für Ideen hierzu bin ich immer offen. Auch ist es nicht schwer in die Funktion "just_do_it" andere/weitere Kommandos einzubauen. Für die grafische Ausgabe wird [LINK:START:160]gtk-perl[LINK:END] verwendet, weshalb man die gtk-perl Bibliothek installieren sollte:

apt-get install libgtk-perl

Darüber hinaus sollte man prüfen, ob man als normaler User das Programm "shutdown" verwenden darf. Bei mir liegt es in /sbin und ist so gesichert, dass nur root als User akzeptiert wird. Ich habe dann mit

chmod u+s /sbin/shutdown

als root dafür gesorgt, dass auch normale User so behandelt werden, als wären sie bei diesem Programm root. Das vom Script erzeugte Fenster sollte in etwa so aussehen:

Zu guter letzt muss man dieses Script einfach nur noch in das Menü seines WindowManagers einfügen und dann steht es immer zur Verfügung.

#!/usr/bin/perl -w
# Funktion:  Script zur grafischen Abfrage für das
#            Runterfahren des Rechners aus X heraus.
# Lizenz:    Frei für nicht-kommerzielle Nutzung. Dieser Kommentarblock
#            muss erhalten bleiben und darf nicht verändert werden.
# Copyright: Jens-D. Neppe 
#            Inspiriert durch Fragen aus Debian user Mailingliste.
# Scriptname:wmshutdown.pl
# Aufruf:    wmshutdown.pl
# Datum:     2002-12-20
# Haftung:   Keine Haftung bei Schäden, die aus der direkten/indirekten
#            Nutzung dieses Shell-Scripts entstehen können.
##############################################################################

use Gtk;
use strict;

set_locale Gtk;
init Gtk;

my $false = 0;
my $true = 1;

# eventuell anpassen:
my $shutdownpath = "/sbin/shutdown";

my $window;
my $okbutton;
my $nobutton;
my $backvbox;
my $box;
my $radhalt;
my $radreboot;
my $frame;
my $radiovbox;
my $obacht;
my $action = $shutdownpath." -h now";


# Erzeuge ein Fenster:
$window = new Gtk::Window( "toplevel" );
$window->signal_connect( "delete_event", sub { Gtk->exit( 0 ); } );
$window->title( "Was soll ich machen?" );
$window->border_width( 20 );
$window->set_position( "center" ); 
$window->set_policy( 0, 0, 1 );

# VBox: Eine Box, in der die Widgets (grafischen Elemente)
# vertikal eingefügt werden.
$backvbox = new Gtk::VBox( 0, 5 );
$radiovbox = new Gtk::VBox( 0, 5 );

# Auf die erste vbox wird ein Rahmen (Frame)
# gelegt. 
$frame = new Gtk::Frame( "Bitte auswählen:" );
$frame->add($radiovbox);
$backvbox->add( $frame );
$window->add( $backvbox );

# Es wird ein Radiobutton erzeugt.
$radhalt = new Gtk::RadioButton( "System runterfahren" );
# Hier wird der Button mit einer Funktion
# verbunden, die den auszuführenden Befehl festlegt.
$radhalt->signal_connect( "clicked", \&SetAction, $radhalt );
# Parameter f. signal_connect:
# Signal, callback-Funktion, Parameter f. Callback
$radhalt->set_active( 1 );
$radiovbox->add( $radhalt );

$radhalt-> show();

# Wie beim Radiobutton davor, nur dass jetzt angegeben wird,
# zu welchem Radiobutton dieser hier gehört.
# So kann immer nur eine Option ausgewählt werden.
$radreboot = new Gtk::RadioButton( "System neu starten", $radhalt );
$radreboot->signal_connect( "clicked", \&SetAction, $radreboot );
$radiovbox->add( $radreboot );
$radreboot-> show();

# Eine weitere Box wird erzeugt, auf der
# die Buttons liegen.
$box = new Gtk::HBox( 1, 0 );
$backvbox->add( $box );

# Mache den "OK"-Button
$okbutton = new Gtk::Button( "OK" );
# Die Funktion "just_do_it" erledigt das Aufrufen
# von shutdown.
$okbutton->signal_connect( "clicked", \&just_do_it );
$box -> pack_start( $okbutton, 1, 0, 0 );
$okbutton->can_default( 1 );
$okbutton->grab_default();
$okbutton->show();

# Mache den "Nicht OK"-Button
$nobutton = new Gtk::Button( "Nicht OK" );
# Dieser Button soll das Progi beenden.
$nobutton->signal_connect( "clicked", sub { Gtk->exit( 0 ); } );
$box -> pack_start( $nobutton, 1, 0, 0 );
$nobutton->show();

# Alles anziegen:
$box -> show();
$backvbox->show();
$radiovbox->show();
$frame->show();
$window->show();

main Gtk;

# Wenn die Kontrolle hier ankommt, ist das
# Programm am Ende.
exit( 0 );


sub just_do_it
{ # Ruft das Programm "shutdown" mit entsprechendem
  # Parameter auf.
    system("$action&\n");
    Gtk->exit( 0 );
}


sub SetAction
{ # Diese Funktion kümmert sich darum herauszufinden,
  # welcher Radiobutton betätigt wurde. Des auszuführende
  # Kommando wird dann entsprechend engepasst.

    my $widget;

    # Diese Funktion bekommt den Radiobutton
    # als Parameter.
    $widget = $_[0];

    # Feststellen, ob man obacht geben muss.
    $obacht = $widget->get_active();

    if( $obacht == 1 )
    { # Es wurde ein Radiobutton ausgewählt.
	    if( $widget == $radhalt )
	    {
		$action = $shutdownpath." -h now";
		# Diese Ausgabe kann man auch auskommentieren:
		printf( "Sytsem beenden.\n" );    
	    }
	    elsif( $widget == $radreboot )
	    {
		$action = $shutdownpath." -r now";
		# Diese Ausgabe kann man auch auskommentieren:
		printf( "System neu starten.\n" );    
	    }
    }
    
    return 1;
}

Artikelbewertung: 
No votes yet
War dieser Artikel hilfreich?