diff options
Diffstat (limited to 'perl-install/install2.pm')
-rw-r--r-- | perl-install/install2.pm | 636 |
1 files changed, 0 insertions, 636 deletions
diff --git a/perl-install/install2.pm b/perl-install/install2.pm deleted file mode 100644 index b18895f3e..000000000 --- a/perl-install/install2.pm +++ /dev/null @@ -1,636 +0,0 @@ -package install2; - -use diagnostics; -use strict; -use Data::Dumper; - -use vars qw($o); - -#-###################################################################################### -#- misc imports -#-###################################################################################### -use common qw(:common :file :system :functional); -use install_any qw(:all); -use log; -use help; -use network; -use lang; -use keyboard; -use lilo; -use mouse; -use fs; -use timezone; -use fsedit; -use devices; -use partition_table qw(:types); -use pkgs; -use printer; -use modules; -use detect_devices; -use modparm; -use install_steps_graphical; -use run_program; - -#-###################################################################################### -#- Steps table -#-###################################################################################### -my @installStepsFields = qw(text redoable onError needs entered reachable toBeDone help next done); -my @installSteps = ( - selectLanguage => [ __("Choose your language"), 1, 1 ], - selectInstallClass => [ __("Select installation class"), 1, 1 ], - setupSCSI => [ __("Setup SCSI"), 1, 0 ], - selectPath => [ __("Choose install or upgrade"), 0, 0, "selectInstallClass" ], - selectMouse => [ __("Configure mouse"), 1, 1 ], - selectKeyboard => [ __("Choose your keyboard"), 1, 1 ], - partitionDisks => [ __("Setup filesystems"), 1, 0 ], - formatPartitions => [ __("Format partitions"), 1, -1, "partitionDisks" ], - choosePackages => [ __("Choose packages to install"), 1, 1, "selectInstallClass" ], - doInstallStep => [ __("Install system"), 1, -1, ["formatPartitions", "selectPath"] ], - configureNetwork => [ __("Configure networking"), 1, 1, "formatPartitions" ], - configureTimezone => [ __("Configure timezone"), 1, 1, "doInstallStep" ], -#- configureServices => [ __("Configure services"), 0, 0 ], - configurePrinter => [ __("Configure printer"), 1, 0, "doInstallStep" ], - setRootPassword => [ __("Set root password"), 1, 1, "formatPartitions" ], - addUser => [ __("Add a user"), 1, 1, "doInstallStep" ], - createBootdisk => [ __("Create bootdisk"), 1, 0, "doInstallStep" ], - setupBootloader => [ __("Install bootloader"), 1, 1, "doInstallStep" ], - configureX => [ __("Configure X"), 1, 0, "formatPartitions" ], - exitInstall => [ __("Exit install"), 0, 0 ], -); - -my (%installSteps, %upgradeSteps, @orderedInstallSteps, @orderedUpgradeSteps); - -for (my $i = 0; $i < @installSteps; $i += 2) { - my %h; @h{@installStepsFields} = @{ $installSteps[$i + 1] }; - $h{help} = $help::steps{$installSteps[$i]} || __("Help"); - $h{next} = $installSteps[$i + 2]; - $h{entered} = 0; - $h{onError} = $installSteps[$i + 2 * $h{onError}]; - $installSteps{ $installSteps[$i] } = \%h; - push @orderedInstallSteps, $installSteps[$i]; -} - -$installSteps{first} = $installSteps[0]; - -#-##################################################################################### -#-INTERN CONSTANT -#-##################################################################################### -my @install_classes = (__("beginner"), __("developer"), __("server"), __("expert")); - -#-##################################################################################### -#-Default value -#-##################################################################################### -#- partition layout -my %suggestedPartitions = ( - beginner => [ - { mntpoint => "/boot", size => 16 << 11, type => 0x83 }, - { mntpoint => "swap", size => 128 << 11, type => 0x82 }, - { mntpoint => "/", size => 700 << 11, type => 0x83 }, - { mntpoint => "/home", size => 300 << 11, type => 0x83 }, - ], - developer => [ - { mntpoint => "/boot", size => 16 << 11, type => 0x83 }, - { mntpoint => "swap", size => 128 << 11, type => 0x82 }, - { mntpoint => "/", size => 200 << 11, type => 0x83 }, - { mntpoint => "/usr", size => 600 << 11, type => 0x83 }, - { mntpoint => "/home", size => 500 << 11, type => 0x83 }, - ], - server => [ - { mntpoint => "/boot", size => 16 << 11, type => 0x83 }, - { mntpoint => "swap", size => 512 << 11, type => 0x82 }, - { mntpoint => "/", size => 200 << 11, type => 0x83 }, - { mntpoint => "/usr", size => 600 << 11, type => 0x83 }, - { mntpoint => "/var", size => 600 << 11, type => 0x83 }, - { mntpoint => "/home", size => 500 << 11, type => 0x83 }, - ], - expert => [ - { mntpoint => "/", size => 200 << 11, type => 0x83 }, - ], -); - -#-####################################################################################### -#-$O -#-the big struct which contain, well everything (globals + the interactive methods ...) -#-if you want to do a kickstart file, you just have to add all the required fields (see for example -#-the variable $default) -#-####################################################################################### -$o = $::o = { -# bootloader => { linear => 0, message => 1, keytable => 1, timeout => 5, restricted => 0 }, - autoSCSI => 0, - mkbootdisk => 1, #- no mkbootdisk if 0 or undef, find a floppy with 1 -#- packages => [ qw() ], - partitioning => { clearall => 0, eraseBadPartitions => 0, auto_allocate => 0, autoformat => 0 }, -#- partitions => [ -#- { mntpoint => "/boot", size => 16 << 11, type => 0x83 }, -#- { mntpoint => "/", size => 256 << 11, type => 0x83 }, -#- { mntpoint => "/usr", size => 512 << 11, type => 0x83, growable => 1 }, -#- { mntpoint => "/var", size => 256 << 11, type => 0x83 }, -#- { mntpoint => "/home", size => 512 << 11, type => 0x83, growable => 1 }, -#- { mntpoint => "swap", size => 64 << 11, type => 0x82 } -#- { mntpoint => "/boot", size => 16 << 11, type => 0x83 }, -#- { mntpoint => "/", size => 300 << 11, type => 0x83 }, -#- { mntpoint => "swap", size => 64 << 11, type => 0x82 }, -#- { mntpoint => "/usr", size => 400 << 11, type => 0x83, growable => 1 }, -#- ], - shells => [ map { "/bin/$_" } qw(bash tcsh zsh ash ksh) ], - lang => 'en', - isUpgrade => 0, - installClass => "beginner", - - timezone => { -#- timezone => "Europe/Paris", -#- GMT => 1, - }, - printer => { - want => 0, - complete => 0, - str_type => $printer::printer_type_default, - QUEUE => "lp", - SPOOLDIR => "/var/spool/lpd/lp", - DBENTRY => "DeskJet670", - PAPERSIZE => "legal", - CRLF => 0, - - DEVICE => "/dev/lp", - - REMOTEHOST => "", - REMOTEQUEUE => "", - - NCPHOST => "printerservername", - NCPQUEUE => "queuename", - NCPUSER => "user", - NCPPASSWD => "pass", - - SMBHOST => "hostname", - SMBHOSTIP => "1.2.3.4", - SMBSHARE => "printername", - SMBUSER => "user", - SMBPASSWD => "passowrd", - SMBWORKGROUP => "AS3", - }, -#- superuser => { password => 'a', shell => '/bin/bash', realname => 'God' }, -#- user => { name => 'foo', password => 'bar', home => '/home/foo', shell => '/bin/bash', realname => 'really, it is foo' }, - -#- keyboard => 'de', -#- display => "192.168.1.9:0", - steps => \%installSteps, - orderedSteps => \@orderedInstallSteps, - - base => [ qw(basesystem initscripts console-tools mkbootdisk anacron rhs-hwdiag utempter ldconfig chkconfig ntsysv mktemp setup filesystem SysVinit bdflush crontabs dev e2fsprogs etcskel fileutils findutils getty_ps grep groff gzip hdparm info initscripts isapnptools kbdconfig kernel less ldconfig lilo logrotate losetup man mkinitrd mingetty modutils mount net-tools passwd procmail procps psmisc mandrake-release rootfiles rpm sash sed setconsole setserial shadow-utils sh-utils slocate stat sysklogd tar termcap textutils time timeconfig tmpwatch util-linux vim-minimal vixie-cron which cpio perl) ], -#- for the list of fields available for user and superuser, see @etc_pass_fields in install_steps.pm -#- intf => [ { DEVICE => "eth0", IPADDR => '1.2.3.4', NETMASK => '255.255.255.128' } ], - -#-step : the current one -#-prefix -#-mouse -#-keyboard -#-netc -#-autoSCSI drives hds fstab -#-methods -#-packages compss -#-printer haveone entry(cf printer.pm) - -}; - -#-###################################################################################### -#- Steps Functions -#- each step function are called with two arguments : clicked(because if you are a -#- beginner you can force the the step) and the entered number -#-###################################################################################### - -#------------------------------------------------------------------------------ -sub selectLanguage { - $o->selectLanguage; - - addToBeDone { - lang::write($o->{prefix}); - keyboard::write($o->{prefix}, $o->{keyboard}); - } 'doInstallStep' unless $::g_auto_install; -} - -#------------------------------------------------------------------------------ -sub selectMouse { - my ($clicked) = $_[0]; - - $o->{mouse} or $o->{mouse} = {}; - add2hash($o->{mouse}, { mouse::read($o->{prefix}) }) if $o->{isUpgrade} && !$clicked; - - $o->selectMouse($clicked); - addToBeDone { mouse::write($o->{prefix}, $o->{mouse}); } 'formatPartitions'; -} - -#------------------------------------------------------------------------------ -sub selectKeyboard { - my ($clicked) = $_[0]; - - return unless $o->{isUpgrade} || !$::beginner || $clicked; - - $o->{keyboard} = (keyboard::read($o->{prefix}))[0] if $o->{isUpgrade} && !$clicked && !$o->{keyboard}; - $o->selectKeyboard if !$::beginner || $clicked; - - #- if we go back to the selectKeyboard, you must rewrite - addToBeDone { - keyboard::write($o->{prefix}, $o->{keyboard}); - } 'doInstallStep' unless $::g_auto_install; -} - -#------------------------------------------------------------------------------ -sub selectPath { - $o->selectPath; - - if ($o->{isUpgrade}) { - #- try to find the partition where the system is installed if beginner - #- else ask the user the right partition, and test it after. - unless ($o->{hds}) { - $o->{drives} = [ detect_devices::hds() ]; - $o->{hds} = catch_cdie { fsedit::hds($o->{drives}, $o->{partitioning}) } - sub { 1; }; - - unless (@{$o->{hds}} > 0) { - $o->setupSCSI if $o->{autoSCSI}; #- ask for an unautodetected scsi card - } - } - - my @normal_partitions = fsedit::get_fstab(@{$o->{hds}}); - - fs::check_mounted([@normal_partitions]); - - #- get all ext2 partition that may be root partition. - my %partitions_lookup; - my @partitions = map { - $partitions_lookup{$_->{device}} = $_; - type2fs($_->{type}) eq 'ext2' ? $_->{device} : (); } @normal_partitions; - - my $root; - my $root_partition; - my $selected_partition; - do { - if ($selected_partition->{mntpoint} && !$selected_partition->{currentMntpoint}) { - $o->ask_warn(_("Information"), "$selected_partition->{device}" . _(" : This is not a root partition, try again.")) - unless $::beginner; - log::l("umounting non root partition $selected_partition->{device}"); - eval { fs::umount_part($selected_partition); }; - $selected_partition->{mntpoint} = ''; - $selected_partition->{mntreadonly} = undef; - } - - $root_partition = $::beginner ? $partitions[0] : $o->selectRootPartition(@partitions); - $selected_partition = $partitions_lookup{$root_partition}; - - unless ($root = $selected_partition->{currentMntpoint}) { - $selected_partition->{mntpoint} = $root = $o->{prefix}; - $selected_partition->{mntreadonly} = 1; - log::l("trying to mount root partition $root_partition"); - eval { fs::mount_part($selected_partition); }; - } - - #- avoid testing twice a partition. - for my $i (0..$#partitions) { - splice @partitions, $i, 1 if $partitions[$i] eq $root_partition; - } - } until $root && -d "$root/etc/sysconfig" && -r "$root/etc/fstab" || !(scalar @partitions); - - - if ($root && -d "$root/etc/sysconfig" && -r "$root/etc/fstab") { - $o->ask_warn(_("Information"), _("Found root partition : ") . $root_partition); - $o->{prefix} = $root; - $o->{fstab} = \@normal_partitions; - - #- test if the partition has to be fschecked and remounted rw. - if ($selected_partition->{mntpoint} && !$selected_partition->{currentMntpoint}) { - my @fstab = fs::read_fstab("$root/etc/fstab"); - - eval { fs::umount_part($selected_partition); }; - $selected_partition->{mntpoint} = ''; - $selected_partition->{mntreadonly} = undef; - - foreach (@fstab) { - if ($selected_partition = $partitions_lookup{$_->{device}}) { - $selected_partition->{mntpoint} = $_->{mntpoint}; - } - } - #- TODO fsck, create check_mount_all ? - fs::mount_all([ grep { isExt2($_) || isSwap($_) } @{$o->{fstab}} ], $o->{prefix}); - } - } else { - $o->ask_warn(_("Error"), _("No root partition found")); - } - } -} - -#------------------------------------------------------------------------------ -sub selectInstallClass { - $o->selectInstallClass(@install_classes); - - $::expert = $o->{installClass} eq "expert"; - $::beginner = $o->{installClass} eq "beginner"; - $o->{partitions} ||= $suggestedPartitions{$o->{installClass}}; - $o->{partitioning}{auto_allocate} ||= -1 if $::beginner; - - $o->setPackages(\@install_classes) - if $o->{steps}{choosePackages}{entered} >= 1 && - !$o->{steps}{doInstallStep}{done}; -} - -#------------------------------------------------------------------------------ -sub setupSCSI { - my ($clicked) = $_[0]; - $o->{autoSCSI} ||= $::beginner; - - $o->setupSCSI($o->{autoSCSI} && !$clicked, $clicked); -} - -#------------------------------------------------------------------------------ -sub partitionDisks { - return if ($o->{isUpgrade}); - - unless ($o->{hds}) { - $o->{drives} = [ detect_devices::hds() ]; - $o->{hds} = catch_cdie { fsedit::hds($o->{drives}, $o->{partitioning}) } - sub { - $o->ask_warn(_("Error"), -_("I can't read your partition table, it's too corrupted for me :( -I'll try to go on blanking bad partitions")); - $o->{partitioning}{auto_allocate} = 0; - 1; - }; - - unless (@{$o->{hds}} > 0) { - $o->setupSCSI if $o->{autoSCSI}; #- ask for an unautodetected scsi card - } - } - if (@{$o->{hds}} == 0) { #- no way - die _("An error has occurred - no valid devices were found on which to create new filesystems. Please check your hardware for the cause of this problem"); - } - - $o->{partitioning}{auto_allocate} = 0 - if $o->{partitioning}{auto_allocate} == -1 && fsedit::get_fstab(@{$o->{hds}}) >= 4; - - eval { fsedit::auto_allocate($o->{hds}, $o->{partitions}) } if - $o->{partitioning}{auto_allocate} && ($o->{partitioning}{auto_allocate} != -1 || $::beginner); - - if ($o->{partitioning}{auto_allocated} = ($::beginner && fsedit::get_root_($o->{hds}) && $_[1] == 1)) { - install_steps::doPartitionDisks($o, $o->{hds}); - } else { - $o->doPartitionDisks($o->{hds}); - } - - unless ($::testing) { - $o->rebootNeeded foreach grep { $_->{rebootNeeded} } @{$o->{hds}}; - } - - $o->{fstab} = [ fsedit::get_fstab(@{$o->{hds}}) ]; - - fsedit::get_root($o->{fstab}) or die _("partitioning failed: no root filesystem"); -} - -sub formatPartitions { - return if ($o->{isUpgrade}); - - $o->choosePartitionsToFormat($o->{fstab}); - - unless ($::testing) { - $o->formatPartitions(@{$o->{fstab}}); - fs::mount_all([ grep { isExt2($_) || isSwap($_) } @{$o->{fstab}} ], $o->{prefix}); - } - mkdir "$o->{prefix}/$_", 0755 foreach - qw(dev etc etc/sysconfig etc/sysconfig/console etc/sysconfig/network-scripts - etc/sysconfig/network-scripts - home mnt root tmp var var/tmp var/lib var/lib/rpm); -} - -#------------------------------------------------------------------------------ -#-PADTODO -sub choosePackages { - $o->setPackages($o, \@install_classes) if $_[1] == 1; - $o->choosePackages($o->{packages}, $o->{compss}); - $o->{packages}{$_}{selected} = 1 foreach @{$o->{base}}; -} - -#------------------------------------------------------------------------------ -sub doInstallStep { - $o->beforeInstallPackages; - $o->installPackages($o->{packages}); - $o->afterInstallPackages; -} - -#------------------------------------------------------------------------------ -sub configureNetwork { - my ($clicked, $entered) = @_; - - if ($o->{isUpgrade} && !$clicked) { - $o->{netc} or $o->{netc} = {}; - add2hash($o->{netc}, { network::read_conf("$o->{prefix}/etc/sysconfig/network") }); - add2hash($o->{netc}, { network::read_resolv_conf("$o->{prefix}/etc/resolv.conf") }); - foreach (all("$o->{prefix}/etc/sysconfig/network-scripts")) { - if (/ifcfg-(\w*)/) { - push @{$o->{intf}}, { network::read_conf("$o->{prefix}/etc/sysconfig/network-scripts/$_") }; - } - } - } - - $o->configureNetwork($entered == 1 && !$clicked) -} -#------------------------------------------------------------------------------ -#-PADTODO -sub configureTimezone { - my ($clicked) = $_[0]; - my $f = "$o->{prefix}/etc/sysconfig/clock"; - return if ((-s $f) || 0) > 0 && $_[1] == 1 && !$clicked && !$::testing; - - add2hash($o->{timezone}, { timezone::read($f) }) if $o->{isUpgrade} && !$clicked; - $o->{timezone}{GMT} = 1 unless exists $o->{timezone}{GMT}; #- take GMT by default if nothing else. - - $o->timeConfig($f); -} -#------------------------------------------------------------------------------ -sub configureServices { $o->servicesConfig } -#------------------------------------------------------------------------------ -sub configurePrinter { $o->printerConfig } -#------------------------------------------------------------------------------ -sub setRootPassword { - return if ($o->{isUpgrade}); - - $o->setRootPassword; -} -#------------------------------------------------------------------------------ -sub addUser { - return if ($o->{isUpgrade}); - - $o->addUser; - - addToBeDone { - run_program::rooted($o->{prefix}, "pwconv") or log::l("pwconv failed"); #- use shadow passwords - } 'doInstallStep'; -} - -#------------------------------------------------------------------------------ -#-PADTODO -sub createBootdisk { - fs::write($o->{prefix}, $o->{fstab}); - modules::write_conf("$o->{prefix}/etc/conf.modules", 'append'); - $o->createBootdisk($_[1] == 1); -} - -#------------------------------------------------------------------------------ -sub setupBootloader { - $o->setupBootloaderBefore if $_[1] == 1; - $o->setupBootloader($_[1] > 1); -} -#------------------------------------------------------------------------------ -sub configureX { - my ($clicked) = $_[0]; - $o->setupXfree if $o->{packages}{XFree86}{installed} || $clicked; -} -#------------------------------------------------------------------------------ -sub exitInstall { $o->exitInstall(getNextStep() eq "exitInstall") } - - -#-###################################################################################### -#- MAIN -#-###################################################################################### -sub main { - $SIG{__DIE__} = sub { chomp $_[0]; log::l("ERROR: $_[0]") }; - - $::beginner = $::expert = $::g_auto_install = 0; - while (@_) { - local $_ = shift; - if (/--method/) { - $o->{method} = shift; - } elsif (/--step/) { - $o->{steps}{first} = shift; - } elsif (/--expert/) { - $::expert = 1; - } elsif (/--beginner/) { - $::beginner = 1; - #} elsif (/--ks/ || /--kickstart/) { - # $::auto_install = 1; - } elsif (/--g_auto_install/) { - $::testing = $::g_auto_install = 1; - $o->{partitioning}{auto_allocate} = 1; - } elsif (/--pcmcia/) { - $o->{pcmcia} = shift; - } - } - - #- if this fails, it's okay -- it might help with free space though - unlink "/sbin/install" unless $::testing; - unlink "/sbin/insmod" unless $::testing; - - print STDERR "in second stage install\n"; - log::openLog(($::testing || $o->{localInstall}) && 'debug.log'); - log::l("second stage install running"); - log::ld("extra log messages are enabled"); - - #-really needed ?? - #-spawnSync(); - eval { spawnShell() }; - - $o->{prefix} = $::testing ? "/tmp/test-perl-install" : "/mnt"; - $o->{root} = $::testing ? "/tmp/root-perl-install" : "/"; - mkdir $o->{prefix}, 0755; - mkdir $o->{root}, 0755; - - #- make sure we don't pick up any gunk from the outside world - $ENV{PATH} = "/usr/bin:/bin:/sbin:/usr/sbin:/usr/X11R6/bin:$o->{prefix}/sbin:$o->{prefix}/bin:$o->{prefix}/usr/sbin:$o->{prefix}/usr/bin:$o->{prefix}/usr/X11R6/bin" unless $::g_auto_install; - $ENV{LD_LIBRARY_PATH} = ""; - - if ($::auto_install) { - require 'install_steps.pm'; - fs::mount(devices::make("fd0"), "/mnt", "vfat", 0); - - my $O = $o; - my $f = "/mnt/auto_inst.cfg"; - { - local *F; - open F, $f or die _("Error reading file $f"); - - local $/ = "\0"; - eval <F>; - } - $@ and die _("Bad kickstart file %s (failed %s)", $f, $@); - fs::umount("/mnt"); - add2hash($o, $O); - } else { - require 'install_steps_graphical.pm'; - } - - $o->{prefix} = $::testing ? "/tmp/test-perl-install" : "/mnt"; - mkdir $o->{prefix}, 0755; - - #- make sure we don't pick up any gunk from the outside world - $ENV{PATH} = "/usr/bin:/bin:/sbin:/usr/sbin:/usr/X11R6/bin:$o->{prefix}/sbin:$o->{prefix}/bin:$o->{prefix}/usr/sbin:$o->{prefix}/usr/bin:$o->{prefix}/usr/X11R6/bin"; - $ENV{LD_LIBRARY_PATH} = ""; - - #- needed very early for install_steps_graphical - eval { $o->{mouse} ||= mouse::detect() }; - - $::o = $o = $::auto_install ? - install_steps->new($o) : - install_steps_graphical->new($o); - - $o->{netc} = network::read_conf("/tmp/network"); - if (my ($file) = glob_('/tmp/ifcfg-*')) { - log::l("found network config file $file"); - my $l = network::read_interface_conf($file); - add2hash(network::findIntf($o->{intf} ||= [], $l->{DEVICE}), $l); - } - - modules::load_deps("/modules/modules.dep"); - $o->{modules} = modules::get_stage1_conf($o->{modules}, "/tmp/conf.modules"); - modules::read_already_loaded(); - modparm::read_modparm_file(-e "modparm.lst" ? "modparm.lst" : "/usr/share/modparm.lst"); - - #-the main cycle - my $clicked = 0; - MAIN: for ($o->{step} = $o->{steps}{first};; $o->{step} = getNextStep()) { - $o->{steps}{$o->{step}}{entered}++; - $o->enteringStep($o->{step}); - eval { - &{$install2::{$o->{step}}}($clicked, $o->{steps}{$o->{step}}{entered}); - }; - $o->kill_action; - $clicked = 0; - while ($@) { - local $_ = $@; - $o->kill_action; - /^setstep (.*)/ and $o->{step} = $1, $clicked = 1, redo MAIN; - /^theme_changed$/ and redo MAIN; - eval { $o->errorInStep($_) } unless /^already displayed/; - $@ and next; - $o->{step} = $o->{steps}{$o->{step}}{onError}; - redo MAIN; - } - $o->leavingStep($o->{step}); - $o->{steps}{$o->{step}}{done} = 1; - - last if $o->{step} eq 'exitInstall'; - } - - fs::write($o->{prefix}, $o->{fstab}); - modules::write_conf("$o->{prefix}/etc/conf.modules", 'append'); - - killCardServices(); - - log::l("installation complete, leaving"); - - if ($::g_auto_install) { - my $h = $o; $o = {}; - $h->{$_} and $o->{$_} = $h->{$_} foreach qw(lang autoSCSI printer mouse netc timezone bootloader superuser intf keyboard mkbootdisk base user modules installClass partitions); - - delete $o->{user}{password2}; - delete $o->{superuser}{password2}; - - print Data::Dumper->Dump([$o], ['$o']), "\0"; - } -} - -sub killCardServices { - my $pid = chop_(cat_("/tmp/cardmgr.pid")); - $pid and kill(15, $pid); #- send SIGTERM -} - -#-###################################################################################### -#- Wonderful perl :( -#-###################################################################################### -1; |