summaryrefslogtreecommitdiffstats
path: root/usr/local/www/status_openvpn.php
diff options
context:
space:
mode:
authorjim-p <jim@pingle.org>2010-02-07 16:28:46 -0500
committerjim-p <jim@pingle.org>2010-02-07 16:28:46 -0500
commit0927fb8cd618af6f542cfa72d8b08cd83195d5a1 (patch)
treee36cf0c39579d92720e47cc3b59c2e3c6118ac67 /usr/local/www/status_openvpn.php
parent838fa668b965233eac4b780fc28451ac5aa1ad6d (diff)
downloadpfsense-0927fb8cd618af6f542cfa72d8b08cd83195d5a1.zip
pfsense-0927fb8cd618af6f542cfa72d8b08cd83195d5a1.tar.gz
Add capability to kill active OpenVPN clients from Status > OpenVPN.
Diffstat (limited to 'usr/local/www/status_openvpn.php')
-rw-r--r--usr/local/www/status_openvpn.php224
1 files changed, 157 insertions, 67 deletions
diff --git a/usr/local/www/status_openvpn.php b/usr/local/www/status_openvpn.php
index e9a538f..fdd03c0 100644
--- a/usr/local/www/status_openvpn.php
+++ b/usr/local/www/status_openvpn.php
@@ -1,20 +1,25 @@
-<?php
+<?php
/*
status_ovpenvpn.php
+ Copyright (C) 2010 Jim Pingle
Copyright (C) 2008 Shrew Soft Inc.
+
+ AJAX bits borrowed from diag_dump_states.php
+ Copyright (C) 2005 Scott Ullrich, Colin Smith
+
All rights reserved.
-
+
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
-
+
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
-
+
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
-
+
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
@@ -27,7 +32,7 @@
POSSIBILITY OF SUCH DAMAGE.
*/
/* DISABLE_PHP_LINT_CHECKING */
-/*
+/*
pfSense_MODULE: openvpn
*/
@@ -42,6 +47,47 @@ $pgtitle = array("Status", "OpenVPN");
require("guiconfig.inc");
require_once("vpn.inc");
+/* Handle AJAX */
+if($_GET['action']) {
+ if($_GET['action'] == "kill") {
+ $port = $_GET['port'];
+ $remipp = $_GET['remipp'];
+ if (!empty($port) and !empty($remipp)) {
+ $retval = kill_client($port, $remipp);
+ echo htmlentities("|{$port}|{$remipp}|{$retval}|");
+ } else {
+ echo "invalid input";
+ }
+ exit;
+ }
+}
+
+
+function kill_client($port, $remipp) {
+ $tcpsrv = "tcp://127.0.0.1:{$port}";
+ $errval;
+ $errstr;
+
+ /* open a tcp connection to the management port of each server */
+ $fp = @stream_socket_client($tcpsrv, $errval, $errstr, 1);
+ $killed = -1;
+ if ($fp) {
+ fputs($fp, "kill {$remipp}\n");
+ while (!feof($fp)) {
+ $line = fgets($fp, 1024);
+ /* parse header list line */
+ if (strpos($line, "INFO:"))
+ continue;
+ if (strpos($line, "UCCESS")) {
+ $killed = 0;
+ }
+ break;
+ }
+ fclose($fp);
+ }
+ return $killed;
+}
+
$servers = array();
if (is_array($config['openvpn']['openvpn-server'])) {
@@ -51,6 +97,7 @@ if (is_array($config['openvpn']['openvpn-server'])) {
$port = $settings['local_port'];
$server = array();
+ $server['port'] = $settings['local_port'];
if ($settings['description'])
$server['name'] = "{$settings['description']} {$prot}:{$port}";
else
@@ -62,14 +109,13 @@ if (is_array($config['openvpn']['openvpn-server'])) {
$errstr;
/* open a tcp connection to the management port of each server */
- $fp = stream_socket_client($tcpsrv, $errval, $errstr, 1);
+ $fp = @stream_socket_client($tcpsrv, $errval, $errstr, 1);
if ($fp) {
/* send our status request */
fputs($fp, "status 2\n");
/* recv all response lines */
- $buff = "";
while (!feof($fp)) {
/* read the next line */
@@ -99,70 +145,114 @@ if (is_array($config['openvpn']['openvpn-server'])) {
/* cleanup */
fclose($fp);
+ } else {
+ $conn = array();
+ $conn['common_name'] = "[error]";
+ $conn['remote_host'] = "No Management Daemon";
+ $conn['virtual_addr'] = "See Note Below";
+ $conn['bytes_recv'] = 0;
+ $conn['bytes_sent'] = 0;
+ $conn['connect_time'] = 0;
+ $server['conns'][] = $conn;
}
$servers[] = $server;
}
}
+include("head.inc"); ?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?=$jsevents["body"]["onload"];?>">
+<script src="/javascript/sorttable.js" type="text/javascript"></script>
+<?php include("fbegin.inc"); ?>
+<form action="status_openvpn.php" method="get" name="iform">
+<script type="text/javascript">
+ function killClient(mport, remipp) {
+ var busy = function(icon) {
+ icon.onclick = "";
+ icon.src = icon.src.replace("\.gif", "_d.gif");
+ icon.style.cursor = "wait";
+ }
+
+ $A(document.getElementsByName("i:" + mport + ":" + remipp)).each(busy);
+
+ new Ajax.Request(
+ "<?=$_SERVER['SCRIPT_NAME'];?>" +
+ "?action=kill&port=" + mport + "&remipp=" + remipp,
+ { method: "get", onComplete: killComplete }
+ );
+ }
+
+ function killComplete(req) {
+ var values = req.responseText.split("|");
+ if(values[3] != "0") {
+ alert('<?=gettext("An error occurred.");?>' + ' (' + values[3] + ')');
+ return;
+ }
+
+ $A(document.getElementsByName("r:" + values[1] + ":" + values[2])).each(
+ function(row) { Effect.Fade(row, { duration: 1.0 }); }
+ );
+ }
+</script>
+
+<?php foreach ($servers as $server): ?>
+
+<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td colspan="6" class="listtopic">
+ Client connections for <?=$server['name'];?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td class="listhdrr">Common Name</td>
+ <td class="listhdrr">Real Address</td>
+ <td class="listhdrr">Virtual Address</td>
+ <td class="listhdrr">Connected Since</td>
+ <td class="listhdrr">Bytes Sent</td>
+ <td class="listhdrr">Bytes Received</td>
+ </tr>
+
+ <?php foreach ($server['conns'] as $conn): ?>
+ <tr name='<?php echo "r:{$server['port']}:{$conn['remote_host']}"; ?>'>
+ <td class="listlr">
+ <?=$conn['common_name'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['remote_host'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['virtual_addr'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['connect_time'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['bytes_sent'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['bytes_recv'];?>
+ </td>
+ <td class='list'>
+ <img src='/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif' height='17' width='17' border='0'
+ onclick="killClient('<?php echo $server['port']; ?>', '<?php echo $conn['remote_host']; ?>');" style='cursor:pointer;'
+ name='<?php echo "i:{$server['port']}:{$conn['remote_host']}"; ?>'
+ title='Kill client connection from <?php echo $conn['remote_host']; ?>' alt='' />
+ </td>
+ </tr>
+
+ <?php endforeach; ?>
+ <tr>
+ <td colspan="6" class="list" height="12"></td>
+ </tr>
+
+ </table>
+ </td>
+ </tr>
+</table>
-include("head.inc");
-include("fbegin.inc");
-
-echo $buff;
-
-?>
- <?php foreach ($servers as $server): ?>
-
- <table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td colspan="6" class="listtopic">
- Client connections for <?=$server['name'];?>
- </td>
- </tr>
- <tr>
- <td>
- <table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td class="listhdrr">Common Name</td>
- <td class="listhdrr">Real Address</td>
- <td class="listhdrr">Virtual Address</td>
- <td class="listhdrr">Connected Since</td>
- <td class="listhdrr">Bytes Sent</td>
- <td class="listhdrr">Bytes Received</td>
- </tr>
-
- <?php foreach ($server['conns'] as $conn): ?>
- <tr>
- <td class="listlr">
- <?=$conn['common_name'];?>
- </td>
- <td class="listr">
- <?=$conn['remote_host'];?>
- </td>
- <td class="listr">
- <?=$conn['virtual_addr'];?>
- </td>
- <td class="listr">
- <?=$conn['connect_time'];?>
- </td>
- <td class="listr">
- <?=$conn['bytes_sent'];?>
- </td>
- <td class="listr">
- <?=$conn['bytes_recv'];?>
- </td>
- </tr>
-
- <?php endforeach; ?>
- <tr>
- <td colspan="6" class="list" height="12"></td>
- </tr>
-
- </table>
- </td>
- </tr>
- </table>
-
- <?php endforeach; ?>
+<?php endforeach; ?>
<?php include("fend.inc"); ?>
OpenPOWER on IntegriCloud