Captive portal : showing user activity
-
When you use the captive portal, and you use the Freeradius package, there is a possibility to define a quota (of Mbytes used) per day, week or month.
Portal users defined in the pfSense users manager do not have quota related entries.
I'm playing a bit with the connected user database, and a couple of if statements later, I have :
I could add also the daily (weekly or monthly) max allowed quota.
-
hello
how will I be able to do this showing user activity with the Captive portal? -
Locate /usr/local/www/widgets/widgets/captive_portal_status.widget.php
Make a backup of this - original - file !!Replace the file (same name) with :
<?php /* * captive_portal_status.widget.php * * part of pfSense (https://www.pfsense.org) * Copyright (c) 2007 Sam Wenham * Copyright (c) 2004-2013 BSD Perimeter * Copyright (c) 2013-2016 Electric Sheep Fencing * Copyright (c) 2014-2022 Rubicon Communications, LLC (Netgate) * All rights reserved. * * originally part of m0n0wall (http://m0n0.ch/wall) * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>. * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ require_once("globals.inc"); require_once("guiconfig.inc"); require_once("pfsense-utils.inc"); require_once("functions.inc"); require_once("captiveportal.inc"); init_config_arr(array('captiveportal')); $a_cp = &$config['captiveportal']; global $g; $volume = array(); $cpzone = $_GET['zone']; if (isset($_POST['zone'])) { $cpzone = $_POST['zone']; } $cpzone = strtolower($cpzone); if (isset($cpzone) && !empty($cpzone) && isset($a_cp[$cpzone]['zoneid'])) { $cpzoneid = $a_cp[$cpzone]['zoneid']; } if (($_GET['act'] == "del") && !empty($cpzone) && isset($cpzoneid)) { captiveportal_disconnect_client($_GET['id'], 6); } unset($cpzone); flush(); if (!function_exists('clientcmp')) { function clientcmp($a, $b) { global $order; return strcmp($a[$order], $b[$order]); } } $cpdb_all = array(); foreach ($a_cp as $cpzone => $cp) { $cpdb = captiveportal_read_db(); foreach ($cpdb as $cpent) { $cpent[10] = $cpzone; // $cpent[11] = captiveportal_get_last_activity($cpent[2]); $cpdb_all[] = $cpent; } } ?> <div class="table-responsive"> <table class="table table-condensed sortable-theme-bootstrap" data-sortable> <thead> <tr> <th><?=gettext("IP address");?></th> <th><?=gettext("MAC address");?></th> <th><?=gettext("Username");?></th> <th><?=gettext("Session start");?></th> <th><?=gettext("Quota used");?></th> <th> </th> </tr> </thead> <tbody> <?php foreach ($cpdb_all as $cpent): ?> <tr> <td><?=$cpent[2];?></td> <td><?=$cpent[3];?></td> <td><?=$cpent[4];?></td> <td><?=date("m/d/Y H:i:s", $cpent[0]);?></td> <td> <?php // gettext("Last activity") if ($cpent[11] && ($cpent[11] > 0)): echo date("m/d/Y H:i:s", $cpent[11]); else: echo " "; endif; // $volume = getVolume($cpent[2]); $quota = $volume['input_bytes'] + $volume['output_bytes']; if ( intval($quota > 0) ) { echo intval(($quota)/1024/1024); echo ' Mb'; } // ?> </td> <td> <a href="?order=<?=htmlspecialchars($_GET['order']);?>&showact=<?=$showact;?>&act=del&zone=<?=$cpent[10];?>&id=<?=$cpent[5];?>"> <i class="fa fa-trash" title="<?=gettext("delete");?>"></i> </a> </td> </tr> <?php endforeach; ?> </tbody> </table> </div>
-
@gertjan Thank you very much
-
No sure if I can address my question here, want hijack a thread...
But I noticed that in dashboard neither the origin widget nor the modified from here are updated dynamically!?
I have checked this several times, using users in groups with CP login permissions, using users not in groups, using vouchers.
The CP widget is only updating when refreshing the browser window or recall the dashboard.
All other widgets are updating dynamically (i.e. interfaces, traffic graphs, Wireguard/IPsec, ...).Is there any issue known with the CP widget? Is that by design?
Regards
-
@fsc830 said in Captive portal : showing user activity:
But I noticed that in dashboard neither the origin widget nor the modified from here are updated dynamically!?
You're right.
This captive portal widget doesn't contain the needed web browser side java script that refreshes the content.
Feature request ?On the other hand : portal soft and hard timeout values are often set to multiple hours, so, if you have not huge portal networks, with hundreds or more clients, the info doesn't change much every minute or less.
Also, be aware, the data collection for every client needs some pretty extensive low level data collector function calls. In the new version of the captive portal, ipfw isn't sued anymore. The core pfSense firewall, called pf, has been extended by Netgate for FreeBSD, to get integrated into pfSense 22.05 (2.6.0 still uses the older "ipfw" solution), so pf is now also aware of L2 ( ? ) MAC addresses. There are still bugs, and one of them is : a pf control system call that should return "bytes handled" by a users returns no (a zero) answer.
All this to say : this widget could / would be to heavy to stay on the dashboard wit a dynamic refresh. The GUI dahsboard page is quiet resource intensive on the system. -
@gertjan
Thanks for explanation, so its by design.
Its not bad, was just wondering about the different behaviour compared to the other widgets.Regards