Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Captive portal : showing user activity

    Scheduled Pinned Locked Moved Captive Portal
    7 Posts 3 Posters 781 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • GertjanG
      Gertjan
      last edited by

      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 :

      e61c7def-bfe5-45a5-9822-98c373b4877e-image.png

      I could add also the daily (weekly or monthly) max allowed quota.

      No "help me" PM's please. Use the forum, the community will thank you.
      Edit : and where are the logs ??

      1 Reply Last reply Reply Quote 0
      • ?
        A Former User
        last edited by A Former User

        hello
        how will I be able to do this showing user activity with the Captive portal?

        GertjanG 1 Reply Last reply Reply Quote 0
        • GertjanG
          Gertjan @A Former User
          last edited by

          @notou

          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>&nbsp;</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 "&nbsp;";
          			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']);?>&amp;showact=<?=$showact;?>&amp;act=del&amp;zone=<?=$cpent[10];?>&amp;id=<?=$cpent[5];?>">
          					<i class="fa fa-trash" title="<?=gettext("delete");?>"></i>
          				</a>
          			</td>
          		</tr>
          	<?php
          	endforeach;
          	?>
          		</tbody>
          	</table>
          </div>
          

          No "help me" PM's please. Use the forum, the community will thank you.
          Edit : and where are the logs ??

          ? 1 Reply Last reply Reply Quote 1
          • ?
            A Former User @Gertjan
            last edited by

            @gertjan Thank you very much

            1 Reply Last reply Reply Quote 0
            • F
              FSC830
              last edited by FSC830

              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

              GertjanG 1 Reply Last reply Reply Quote 0
              • GertjanG
                Gertjan @FSC830
                last edited by

                @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.

                No "help me" PM's please. Use the forum, the community will thank you.
                Edit : and where are the logs ??

                F 1 Reply Last reply Reply Quote 1
                • F
                  FSC830 @Gertjan
                  last edited by

                  @gertjan
                  Thanks for explanation, so its by design.
                  Its not bad, was just wondering about the different behaviour compared to the other widgets.

                  Regards

                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post
                  Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.