#!/usr/bin/perl # Copyright (C) 2003 Mandrakesoft # # Author: Florent Villard # A Ginies # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package MDK::Wizard::Wizcommon; use strict; use standalone; use common; use MDK::Common; use MDK::Wizard::IFCFG; our @ISA = qw(Exporter); our @EXPORT = qw(check_started run_command_and_log); my $net; sub check_dhcp { $net->is_dhcp and return 'dhcp_warning'; } sub new { my ($class) = @_; $net = new MDK::Wizard::IFCFG; bless { net => $net, }, $class; } sub check_started { my ($service) = @_; my ($isrunning) = chomp_(`pidof $service`) =~ /(\d+)/m; if (!$isrunning) { return 'error_end' } } my $timeout; sub gtktext_get_log { my ($command, $log_w, $log_scroll) = @_; my $buffer = $log_w->get_buffer; $buffer->delete($buffer->get_start_iter, $buffer->get_end_iter); my ($prev_scroll, $want_scroll_down) = (0, 1); my $pid = open(my $F, "$command 2>&1 |") or return sub { 1 }; fcntl($F, c::F_SETFL(), c::O_NONBLOCK()) or die "can't fcntl F_SETFL: $!"; Glib::Source->remove($timeout) if $timeout; $timeout = ''; $timeout = Glib::Timeout->add(100, sub { if ($buffer) { my $end = $buffer->get_end_iter; while (defined (my $s = <$F>)) { $buffer->insert_interactive($end, $s, -1); } my $new_scroll = $log_scroll->child->get_vadjustment->get_value; $want_scroll_down &&= $new_scroll >= $prev_scroll; $prev_scroll = $new_scroll; $log_w->scroll_to_iter($end, 0, 0, 0, 0) if $want_scroll_down; } if (waitpid($pid, c::WNOHANG()) > 0) { $buffer->insert_interactive($buffer->get_end_iter, "\n" . "#" x 20 . "\n" . " This script has terminated\ , you can close this window", -1) if $buffer; $pid = $timeout = ''; 0; } else { 1; } }); sub { if ($pid) { $::in->ask_yesorno('', N("The command is still running. Do you want to kill it and quit the Wizard ?")) or return; kill 9, $pid+1; 1; } $buffer = ''; 1; }; } sub run_command_and_log { use lib qw(/usr/lib/libDrakX); use ugtk2 qw(:ask :helpers :wrappers :create); my ($command, $descr, $when_command_is_over) = @_; my $w = ugtk2->new(''); gtkadd(gtkset_size_request($w->{window}, 800, 400), gtkpack_(gtkset_modal(Gtk2::VBox->new, 1), 0, $descr, 1, my $log_scroll = create_scrolled_window(my $log_w = gtkset_editable(Gtk2::TextView->new, 0)), 0, my $close_w = Gtk2::Button->new(N("Close"))), ); my $stop_running = gtktext_get_log($command, $log_w, $log_scroll); $close_w->signal_connect(clicked => sub { $stop_running->() and $w->destroy and return 0}); $close_w->grab_focus; $w->show; } 1