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;
}
|