sprintf(&buffer[0], "/etc/openvpn/vpnserver%d --cd /etc/openvpn/server%d --config config.ovpn", serverNum, serverNum);
vpnlog(VPN_LOG_INFO,"Starting OpenVPN: %s",&buffer[0]);
for (argv[argc=0] = strtok(&buffer[0], " "); argv[argc] != NULL; argv[++argc] = strtok(NULL, " "));
if ( _eval(argv, NULL, 0, &pid) )
{
vpnlog(VPN_LOG_ERROR,"Starting VPN instance failed...");
stop_vpnserver(serverNum);
return;
}
sprintf(&buffer[0], "/etc/openvpn/fw/server%d-fw.sh", serverNum);
argv[0] = &buffer[0];
argv[1] = NULL;
_eval(argv, NULL, 0, NULL);
vpnlog(VPN_LOG_EXTRA,"Adding cron job");
argv[0] = "cru";
argv[1] = "a";
sprintf(&buffer[0], "CheckVPNServer%d", serverNum);
argv[2] = &buffer[0];
sprintf(&buffer[strlen(&buffer[0])+1], "*/%d * * * * service start_vpnserver%d", nvi, serverNum);
argv[3] = &buffer[strlen(&buffer[0])+1];
argv[4] = NULL;
_eval(argv, NULL, 0, NULL);
sprintf(&buffer[0], "/etc/openvpn/fw/server%d-fw.sh", serverNum);
argv[0] = "sed";
argv[1] = "-i";
argv[2] = "s/-A/-D/g;s/-I/-D/g";
argv[3] = &buffer[0];
argv[4] = NULL;
if (!_eval(argv, NULL, 0, NULL))
{
argv[0] = &buffer[0];
argv[1] = NULL;
_eval(argv, NULL, 0, NULL);
}
Delete process which create by _eval
void killall_tk(const char *name)
{
int n;
if (killall(name, SIGTERM) == 0) {
n = 10;
while ((killall(name, 0) == 0) && (n-- > 0)) {
_dprintf("%s: waiting name=%s n=%d\n", __FUNCTION__, name, n);
usleep(100 * 1000);
}
if (n < 0) {
n = 10;
while ((killall(name, SIGKILL) == 0) && (n-- > 0)) {
_dprintf("%s: SIGKILL name=%s n=%d\n", __FUNCTION__, name, n);
usleep(100 * 1000);
}
}
}
}
static int ovpn_waitfor(const char *name)
{
int pid, n = 5;
killall_tk(name);
while ( (pid = pidof(name)) >= 0 && (n-- > 0) )
{
// Reap the zombie if it has terminated
waitpid(pid, NULL, WNOHANG);
sleep(1);
}
return (pid >= 0);
}
Reference:
0 意見:
張貼留言