diff options
Diffstat (limited to 'perl-install/services.pm')
-rw-r--r-- | perl-install/services.pm | 401 |
1 files changed, 41 insertions, 360 deletions
diff --git a/perl-install/services.pm b/perl-install/services.pm index 08afbd2c5..adb2587fe 100644 --- a/perl-install/services.pm +++ b/perl-install/services.pm @@ -1,380 +1,61 @@ -package services; # $Id$ - - - - -#-###################################################################################### -#- misc imports -#-###################################################################################### +package printer::services; use strict; -use common; +use services; use run_program; -use common; -use run_program; - -sub description { - my %services = ( -alsa => N_("Launch the ALSA (Advanced Linux Sound Architecture) sound system"), -anacron => N_("Anacron is a periodic command scheduler."), -apmd => N_("apmd is used for monitoring battery status and logging it via syslog. -It can also be used for shutting down the machine when the battery is low."), -atd => N_("Runs commands scheduled by the at command at the time specified when -at was run, and runs batch commands when the load average is low enough."), -crond => N_("cron is a standard UNIX program that runs user-specified programs -at periodic scheduled times. vixie cron adds a number of features to the basic -UNIX cron, including better security and more powerful configuration options."), -fam => N_("FAM is a file monitoring daemon. It is used to get reports when files change. -It is used by GNOME and KDE"), -gpm => N_("GPM adds mouse support to text-based Linux applications such the -Midnight Commander. It also allows mouse-based console cut-and-paste operations, -and includes support for pop-up menus on the console."), -harddrake => N_("HardDrake runs a hardware probe, and optionally configures -new/changed hardware."), -httpd => N_("Apache is a World Wide Web server. It is used to serve HTML files and CGI."), -inet => N_("The internet superserver daemon (commonly called inetd) starts a -variety of other internet services as needed. It is responsible for starting -many services, including telnet, ftp, rsh, and rlogin. Disabling inetd disables -all of the services it is responsible for."), -ipchains => N_("Launch packet filtering for Linux kernel 2.2 series, to set -up a firewall to protect your machine from network attacks."), -keytable => N_("This package loads the selected keyboard map as set in -/etc/sysconfig/keyboard. This can be selected using the kbdconfig utility. -You should leave this enabled for most machines."), -kheader => N_("Automatic regeneration of kernel header in /boot for -/usr/include/linux/{autoconf,version}.h"), -kudzu => N_("Automatic detection and configuration of hardware at boot."), -linuxconf => N_("Linuxconf will sometimes arrange to perform various tasks -at boot-time to maintain the system configuration."), -lpd => N_("lpd is the print daemon required for lpr to work properly. It is -basically a server that arbitrates print jobs to printer(s)."), -lvs => N_("Linux Virtual Server, used to build a high-performance and highly -available server."), -named => N_("named (BIND) is a Domain Name Server (DNS) that is used to resolve host names to IP addresses."), -netfs => N_("Mounts and unmounts all Network File System (NFS), SMB (Lan -Manager/Windows), and NCP (NetWare) mount points."), -network => N_("Activates/Deactivates all network interfaces configured to start -at boot time."), -nfs => N_("NFS is a popular protocol for file sharing across TCP/IP networks. -This service provides NFS server functionality, which is configured via the -/etc/exports file."), -nfslock => N_("NFS is a popular protocol for file sharing across TCP/IP -networks. This service provides NFS file locking functionality."), -numlock => N_("Automatically switch on numlock key locker under console -and Xorg at boot."), -oki4daemon => N_("Support the OKI 4w and compatible winprinters."), -pcmcia => N_("PCMCIA support is usually to support things like ethernet and -modems in laptops. It won't get started unless configured so it is safe to have -it installed on machines that don't need it."), -portmap => N_("The portmapper manages RPC connections, which are used by -protocols such as NFS and NIS. The portmap server must be running on machines -which act as servers for protocols which make use of the RPC mechanism."), -postfix => N_("Postfix is a Mail Transport Agent, which is the program that moves mail from one machine to another."), -random => N_("Saves and restores system entropy pool for higher quality random -number generation."), -rawdevices => N_("Assign raw devices to block devices (such as hard drive -partitions), for the use of applications such as Oracle or DVD players"), -routed => N_("The routed daemon allows for automatic IP router table updated via -the RIP protocol. While RIP is widely used on small networks, more complex -routing protocols are needed for complex networks."), -rstatd => N_("The rstat protocol allows users on a network to retrieve -performance metrics for any machine on that network."), -rusersd => N_("The rusers protocol allows users on a network to identify who is -logged in on other responding machines."), -rwhod => N_("The rwho protocol lets remote users get a list of all of the users -logged into a machine running the rwho daemon (similar to finger)."), -sound => N_("Launch the sound system on your machine"), -syslog => N_("Syslog is the facility by which many daemons use to log messages -to various system log files. It is a good idea to always run syslog."), -usb => N_("Load the drivers for your usb devices."), -xfs => N_("Starts the X Font Server (this is mandatory for Xorg to run)."), - ); - my ($name) = @_; - my $s = $services{$name}; - if ($s) { - $s = translate($s); - } else { - $s = -e "$::prefix/etc/rc.d/init.d/$name" && cat_("$::prefix/etc/rc.d/init.d/$name"); - $s ||= -e "$::prefix/etc/init.d/$name" && cat_("$::prefix/etc/init.d/$name"); - $s ||= -e "$::prefix/etc/xinetd.d/$name" && cat_("$::prefix/etc/xinetd.d/$name"); - $s =~ s/\\\s*\n#\s*//mg; - if ($s =~ /^# description:\s+\S/sm) { - ($s) = $s =~ /^# description:\s+(.*?)^(?:[^#]|# {0,2}\S)/sm; - } else { - ($s) = $s =~ /^#\s*(.*?)^[^#]/sm; - } - $s =~ s/#\s*//mg; - } - $s =~ s/\n/ /gm; $s =~ s/\s+$//; - $s; -} - -sub ask_install_simple { - my ($in) = @_; - my ($l, $on_services) = services(); - $in->ask_many_from_list("drakxservices", - N("Choose which services should be automatically started at boot time"), - { - list => $l, - help => sub { description($_[0]) }, - values => $on_services, - sort => 1, - }); -} - -sub ask_install { - my ($in) = @_; - my %root_services = ( - N("Printing") => [ qw(cups cupslpd lpr lpd oki4daemon hpoj cups-lpd) ], - N("Internet") => [ qw(httpd boa tux roxen ftp pftp tftp proftpd wu-ftpd pure-ftpdipsec proftpd-xinetd - ipchains iptables ipvsadm isdn4linux ibod jabber jabber-icq adsl squid - portsentry prelude nessusd junkbuster radvd cddbp ippl iptoip jail.init) ], - N("File sharing") => [ qw(nfs nfslock smb nettalk netfs mcserv autofs amd - venus.init auth2.init codasrv.init update.init swat) ], - N("System") => [ qw(usb usbd pcmcia irda xinetd inetd kudzu harddrake apmd sound network xfs - alsa functions halt kheader killall mandrake_everytime mandrake_firstime - random rawdevices single keytable syslog crond medusa-init portmap acon - anacron atd gpm psacct wine acpid numlock jserver sensors mosix bpowerd bpowerfail - fcron powertweak.init ups syslog-ng cvs apcupsd) ], - N("Remote Administration") => [ qw(sshd telnetd telnet rsh rlogin rexec webmin cfd heartbeat ldirectord - iplog mon vncserver netsaint olympusd drakxtools_http) ], -# N("Network Client") => [ qw(ypbind nscd arpwatch fetchmail dnrd_rc diald rsync) ], -# N("Network Server") => [ qw(named bootparamd ntpd xntpd chronyd postfix sendmail -# imap imaps ipop2 ipop3 pop3s routed yppasswdd ypserv ldap dhcpd dhcrelay -# hylafax innd identd rstatd rusersd rwalld rwhod gated -# kadmin kprop krb524 krb5kdc krb5server hldsld bayonne sockd dhsd gnu-pop3d -# gdips pptpd.conf vrrpd crossfire bnetd pvmd ircd sympa finger ntalk talk) ], - N("Database Server") => [ qw(mysql postgresql) ], - ); - my %services_root; - foreach my $root (keys %root_services) { - $services_root{$_} = $root foreach @{$root_services{$root}}; - } - my ($l, $on_services) = services(); - my %services; - $services{$_} = 0 foreach @{$l || []}; - $services{$_} = 1 foreach @{$on_services || []}; - - $in->ask_browse_tree_info('drakxservices', N("Choose which services should be automatically started at boot time"), - { - node_state => sub { $services{$_[0]} ? 'selected' : 'unselected' }, - build_tree => sub { - my ($add_node, $flat) = @_; - $add_node->($_, !$flat && ($services_root{$_} || N("Other"))) - foreach sort keys %services; - }, - grep_unselected => sub { grep { !$services{$_} } @_ }, - toggle_nodes => sub { - my ($set_state, @nodes) = @_; - my $new_state = !$services{$nodes[0]}; - foreach (@nodes) { - $set_state->($_, $new_state ? 'selected' : 'unselected'); - $services{$_} = $new_state; - } - }, - get_status => sub { - N("Services: %d activated for %d registered", - scalar(grep { $_ } values %services), - scalar(values %services)); - }, - get_info => sub { formatLines(description($_[0])) }, - interactive_help_id => 'configureServices', - }) or return $l, $on_services; #- no change on cancel. - [ grep { $services{$_} } @$l ]; -} - -sub ask_standalone_gtk { - my ($_in) = @_; - my ($l, $on_services) = services(); - my @xinetd_services = map { $_->[0] } @{(services_raw())[1]}; - - require ugtk2; - ugtk2->import(qw(:wrappers :create)); - - my $W = ugtk2->new(N("Services")); - my ($x, $y, $w_popup); - my $nopop = sub { $w_popup and $w_popup->destroy; undef $w_popup }; - my $display = sub { - my ($text) = @_; - $nopop->(); - gtkshow(gtkadd($w_popup = Gtk2::Window->new('popup'), - gtksignal_connect(gtkadd(Gtk2::EventBox->new, - gtkadd(gtkset_shadow_type(Gtk2::Frame->new, 'etched_out'), - gtkset_justify(Gtk2::Label->new($text), 'left'))), - button_press_event => sub { $nopop->() } - )))->move($x, $y) if $text; - }; - my $update_service = sub { - my ($service, $label) = @_; - my $started = -e "/var/lock/subsys/$service"; - $label->set_label($started ? N("running") : N("stopped")); - }; - my $b = Gtk2::EventBox->new; - $b->set_events('pointer_motion_mask'); - gtkadd($W->{window}, gtkadd($b, gtkpack_($W->create_box_with_title(N("Services and daemons")), - 1, gtkset_size_request(create_scrolled_window(create_packtable({ col_spacings => 10, row_spacings => 3 }, - map { - my $service = $_; - my $is_xinetd_service = member($service, @xinetd_services); - my $infos = warp_text(description($_), 40); - $infos ||= N("No additional information\nabout this service, sorry."); - my $label = gtkset_justify(Gtk2::Label->new, 'left'); - $update_service->($service, $label) if !$is_xinetd_service; - [ gtkpack__(Gtk2::HBox->new(0,0), $_), - gtkpack__(Gtk2::HBox->new(0,0), $label), - gtkpack__(Gtk2::HBox->new(0,0), gtksignal_connect(Gtk2::Button->new(N("Info")), clicked => sub { $display->($infos) })), - - gtkpack__(Gtk2::HBox->new(0,0), gtkset_active(gtksignal_connect( - Gtk2::CheckButton->new($is_xinetd_service ? N("Start when requested") : N("On boot")), - clicked => sub { if ($_[0]->get_active) { - push @$on_services, $service if !member($service, @$on_services); - } else { - @$on_services = grep { $_ ne $service } @$on_services; - } }), member($service, @$on_services))), - map { - my $a = $_; - gtkpack__(Gtk2::HBox->new(0,0), gtksignal_connect(Gtk2::Button->new(translate($a)), - clicked => sub { - my $action = $a eq "Start" ? 'restart' : 'stop'; - local $_ = `service $service $action 2>&1`; s/\033\[[^mG]*[mG]//g; - $update_service->($service, $label); - $display->($_); - })) if !$is_xinetd_service; - } (N_("Start"), N_("Stop")) - ] - } - @$l), [ $::isEmbedded ? 'automatic' : 'never', 'automatic' ]), -1, $::isEmbedded ? -1 : 400), - 0, gtkpack(gtkset_border_width(Gtk2::HBox->new(0,0),5), $W->create_okcancel) - )) - ); - $b->signal_connect(motion_notify_event => sub { my ($w, $e) = @_; - my ($ox, $oy) = $w->window->get_origin; - $x = $e->x+$ox; $y = $e->y+$oy }); - $b->signal_connect(button_press_event => sub { $nopop->() }); - $::isEmbedded and gtkflush(); - $W->main or return; - $on_services; -} - -sub ask { - my ($in) = @_; - !$::isInstall && $in->isa('interactive::gtk') ? &ask_standalone_gtk : &ask_install; -} - -sub doit { - my ($in, $on_services) = @_; - my ($l, $was_on_services) = services(); - - foreach (@$l) { - my $before = member($_, @$was_on_services); - my $after = member($_, @$on_services); - if ($before != $after) { - my $script = "/etc/rc.d/init.d/$_"; - run_program::rooted($::prefix, "chkconfig", $after ? "--add" : "--del", $_); - if ($after && cat_("$::prefix$script") =~ /^#\s+chkconfig:\s+-/m) { - run_program::rooted($::prefix, "chkconfig", "--level", "35", $_, "on"); - } - if (!$after && !$::isInstall && !$in->isa('interactive::gtk')) { - #- only done after install AND when not using the gtk frontend (since it allows one to start/stop services) - #- this allows to skip stopping service "dm" - run_program::rooted($::prefix, $script, "stop"); - } - } - } -} - -sub services_raw() { - local $ENV{LANGUAGE} = 'C'; - my (@services, @xinetd_services); - foreach (run_program::rooted_get_stdout($::prefix, '/sbin/chkconfig', '--list')) { - if (my ($xinetd_name, $on_off) = m!^\t(\S+):\s*(on|off)!) { - push @xinetd_services, [ $xinetd_name, $on_off eq 'on' ]; - } elsif (my ($name, $l) = m!^(\S+)\s+(0:(on|off).*)!) { - push @services, [ $name, [ $l =~ /(\d+):on/g ] ]; - } - } - \@services, \@xinetd_services; -} - -#- returns: -#--- the listref of installed services -#--- the listref of "on" services -sub services() { - my ($services, $xinetd_services) = services_raw(); - my @l = @$xinetd_services; - if ($::isInstall) { - push @l, map { [ $_->[0], @{$_->[1]} > 0 ] } @$services; - } else { - my $runlevel = (split " ", `/sbin/runlevel`)[1]; - push @l, map { [ $_->[0], member($runlevel, @{$_->[1]}) ] } @$services; - } - @l = sort { $a->[0] cmp $b->[0] } @l; - [ map { $_->[0] } @l ], [ map { $_->[0] } grep { $_->[1] } @l ]; -} - - - - - - -# the following functions are mostly by printer related modules - - sub restart ($) { my ($service) = @_; - # Exit silently if the service is not installed - return 1 if !(-x "$::prefix/etc/rc.d/init.d/$service"); - run_program::rooted($::prefix, "/etc/rc.d/init.d/$service", "restart"); + if (services::restart($service)) { + # CUPS needs some time to come up. + wait_for_cups() if $service eq "cups"; + return 1; + } else { return 0 } } sub start ($) { my ($service) = @_; - # Exit silently if the service is not installed - return 1 if !(-x "$::prefix/etc/rc.d/init.d/$service"); - run_program::rooted($::prefix, "/etc/rc.d/init.d/$service", "start"); - return (($? >> 8) != 0) ? 0 : 1; + if (services::start($service)) { + # CUPS needs some time to come up. + wait_for_cups() if $service eq "cups"; + return 1; + } else { return 0 } } sub start_not_running_service ($) { my ($service) = @_; - # Exit silently if the service is not installed - return 1 if !(-x "$::prefix/etc/rc.d/init.d/$service"); - run_program::rooted($::prefix, "/etc/rc.d/init.d/$service", "status"); - return (($? >> 8) != 0) ? 0 : 1; -} - -sub stop ($) { - my ($service) = @_; - # Exit silently if the service is not installed - return 1 if !(-x "$::prefix/etc/rc.d/init.d/$service"); - run_program::rooted($::prefix, "/etc/rc.d/init.d/$service", "stop"); - return (($? >> 8) != 0) ? 0 : 1; -} - -sub is_service_running ($) { - my ($service) = @_; - # Exit silently if the service is not installed - return 0 if !(-x "$::prefix/etc/rc.d/init.d/$service"); - run_program::rooted($::prefix, "/etc/rc.d/init.d/$service", "status"); # The exit status is not zero when the service is not running - return (($? >> 8) != 0) ? 0 : 1; -} - -sub starts_on_boot { - my ($service) = @_; - my (undef, $on_services) = services(); - member($service, @$on_services); -} - -sub start_service_on_boot ($) { - my ($service) = @_; - run_program::rooted($::prefix, "/sbin/chkconfig", "--add", $service) ? 1 : 0; + if (services::start_not_running_service($service)) { + return 0; + } else { + run_program::rooted($::prefix, "/etc/rc.d/init.d/$service", "start"); + if (($? >> 8) != 0) { + return 0; + } else { + # CUPS needs some time to come up. + wait_for_cups() if $service eq "cups"; + return 1; + } + } } -sub do_not_start_service_on_boot ($) { - my ($service) = @_; - run_program::rooted($::prefix, "/sbin/chkconfig", "--del", $service) ? 1 : 0; +sub wait_for_cups() { + # CUPS needs some time to come up. Wait up to 30 seconds, checking + # whether CUPS is ready. + my $cupsready = 0; + my $i; + for ($i = 0; $i < 30; $i++) { + run_program::rooted($::prefix, "/usr/bin/lpstat", "-r"); + if (($? >> 8) != 0) { + # CUPS is not ready, continue + sleep 1; + } else { + # CUPS is ready, quit + $cupsready = 1; + last; + } + } + return $cupsready; } 1; |