[Netpass-devel] NetPass/bin appstarter.pl,1.4,1.5 npsvc.pl,1.2,1.3
Brought to you by:
jeffmurphy
From: jeff m. <jef...@us...> - 2005-08-10 19:52:24
|
Update of /cvsroot/netpass/NetPass/bin In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8611/bin Modified Files: appstarter.pl npsvc.pl Log Message: bug fixes Index: npsvc.pl =================================================================== RCS file: /cvsroot/netpass/NetPass/bin/npsvc.pl,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- npsvc.pl 4 Aug 2005 20:41:17 -0000 1.2 +++ npsvc.pl 10 Aug 2005 19:52:15 -0000 1.3 @@ -70,6 +70,14 @@ while (1) { print scalar(localtime), " wakeup\n" if $D; + + if (! -e "/var/lock/subsys/netpass") { + print scalar(localtime), " /var/lock/subsys/netpass doesnt exist. go to sleep.\n" + if $D; + sleep ($ST); + next; + } + foreach my $svc (keys %$proctowatch) { print scalar(localtime), " doing $svc\n" if $D; my $pid = RUNONCE::alreadyRunning($svc); @@ -90,7 +98,7 @@ } if ($action eq 'restart') { print scalar(localtime), " restarting $svc\n"; - system($proctowatch->{$svc}{'cmd'}); + runAs($proctowatch->{$svc}{'cmd'}); } } print scalar(localtime), " sleeping for $ST seconds\n" if $D; @@ -156,3 +164,38 @@ $fh->close(); return \%pw; } + +sub runAs { + my $cmd = shift; + my $as = shift; + $as ||= "netpass"; + my ($uid,$gid) = (getpwnam($as))[2,3]; + if (!defined($uid)) { + _log("ERROR", "no such user $as\n"); + return; + } + unless ($cmd) { + _log("ERROR", "cmd empty\n"); + return; + } + + _log("DEBUG", qq{exec'ing as $as cmd "$cmd"\n}) if $D; + my $child = fork; + return if ($child); # parent + + open STDIN, '/dev/null'; + open STDOUT, '>/dev/null'; + setsid; + + if (setgid($gid)) { + _log("ERROR", "child $$ failed to setgid($gid) $!\n"); + exit 0; + } + if (setuid($uid)) { + _log("ERROR", "child $$ failed to setuid($uid) $!\n"); + exit 0; + } + exec($cmd); + _log("ERROR", "child $$ failed to exec($cmd) $!\n"); + exit 0; +} Index: appstarter.pl =================================================================== RCS file: /cvsroot/netpass/NetPass/bin/appstarter.pl,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- appstarter.pl 3 Aug 2005 02:44:38 -0000 1.4 +++ appstarter.pl 10 Aug 2005 19:52:15 -0000 1.5 @@ -189,7 +189,7 @@ RUNONCE::handleConnection(); - my $x = $np->db->getAppAction(); + my $x = $np->db->getAppAction(1); if (ref($x) ne "ARRAY") { _log("ERROR", "getAppAction failed: $x\n"); } else { @@ -211,6 +211,7 @@ stop($row) unless !isRunning($row->[1]); } } + $np->db->ackAppAction($row->[0]); } } @@ -276,23 +277,31 @@ return; } - _log("DEBUG", qq{exec'ing as $as cmd "$cmd"\n}) if $D; + _log("DEBUG", qq{forking to exec as $as cmd "$cmd"\n}) if $D; my $child = fork; - return if ($child); # parent + return if (defined($child) && ($child > 0)); # parent - open STDIN, '/dev/null'; - open STDOUT, '>/dev/null'; - setsid; + #open STDIN, '/dev/null'; + #open STDOUT, '>/dev/null'; + setsid or _log("WARN", "$$ child failed to setsid $!\n"); - if (setgid($gid)) { - _log("ERROR", "child $$ failed to setgid($gid) $!\n"); + _log("DEBUG", "$$ inchild change to uid=$uid gid=$gid\n"); + + my $rv = setgid($gid); + + unless ($rv) { + _log("ERROR", "$$ child failed to setgid($gid) rv=$rv err=$!\n"); exit 0; } - if (setuid($uid)) { - _log("ERROR", "child $$ failed to setuid($uid) $!\n"); + $rv = setuid($uid); + unless ($rv) { + _log("ERROR", "$$ child failed to setuid($uid) rv=$rv err=$!\n"); exit 0; } - exec($cmd); + { + _log("DEBUG", qq{$$ in child. calling exec\n}) if $D; + exec($cmd); + } _log("ERROR", "child $$ failed to exec($cmd) $!\n"); exit 0; } |