1+ <?php
2+
3+ /**
4+ * Monitor Active Sessions (PPPoE + DHCP)
5+ *
6+ * how to fetch active PPPoE sessions,
7+ * DHCP leases and monitor user login/logout activity from MikroTik RouterOS.
8+ */
9+
10+ require_once __DIR__ . '/../vendor/autoload.php ' ;
11+
12+ use RouterOS \Client ;
13+ use RouterOS \Query ;
14+
15+ // Connect to RouterOS
16+ $ client = new Client ([
17+ 'host ' => '192.168.10.1 ' , // router IP address
18+ 'user ' => 'test ' , // mikrotik username
19+ 'pass ' => 'test ' , // mikrotik password
20+ 'port ' => 8728 , // API port
21+ ]);
22+
23+ // ============================================================
24+ // PPPoE Active Sessions
25+ // ============================================================
26+ $ pppoeQuery = new Query ('/ppp/active/print ' );
27+ $ pppoeSessions = $ client ->query ($ pppoeQuery )->read ();
28+
29+ echo "Active PPPoE Sessions: \n" ;
30+ echo str_repeat ('- ' , 60 ) . "\n" ;
31+
32+ if (empty ($ pppoeSessions )) {
33+ echo "No active PPPoE sessions. \n" ;
34+ } else {
35+ foreach ($ pppoeSessions as $ session ) {
36+ echo sprintf (
37+ "User: %-20s IP: %-15s Uptime: %s \n" ,
38+ $ session ['name ' ] ?? 'N/A ' ,
39+ $ session ['address ' ] ?? 'N/A ' ,
40+ $ session ['uptime ' ] ?? 'N/A '
41+ );
42+ }
43+ }
44+
45+ echo "\nTotal PPPoE sessions: " . count ($ pppoeSessions ) . "\n" ;
46+
47+ // ============================================================
48+ // DHCP Active Leases
49+ // ============================================================
50+ $ dhcpQuery = new Query ('/ip/dhcp-server/lease/print ' );
51+ $ dhcpLeases = $ client ->query ($ dhcpQuery )->read ();
52+
53+ echo "\nActive DHCP Leases: \n" ;
54+ echo str_repeat ('- ' , 60 ) . "\n" ;
55+
56+ if (empty ($ dhcpLeases )) {
57+ echo "No active DHCP leases. \n" ;
58+ } else {
59+ foreach ($ dhcpLeases as $ lease ) {
60+ echo sprintf (
61+ "Host: %-20s IP: %-15s MAC: %-18s Status: %s \n" ,
62+ $ lease ['host-name ' ] ?? 'N/A ' ,
63+ $ lease ['address ' ] ?? 'N/A ' ,
64+ $ lease ['mac-address ' ] ?? 'N/A ' ,
65+ $ lease ['status ' ] ?? 'N/A '
66+ );
67+ }
68+ }
69+
70+ echo "\nTotal DHCP leases: " . count ($ dhcpLeases ) . "\n" ;
71+
72+ // ============================================================
73+ // Recent PPP Logs
74+ // ============================================================
75+ $ logQuery = (new Query ('/log/print ' ))
76+ ->where ('topics ' , 'ppp ' );
77+
78+ $ logs = $ client ->query ($ logQuery )->read ();
79+
80+ echo "\nRecent PPPoE Logs: \n" ;
81+ echo str_repeat ('- ' , 60 ) . "\n" ;
82+
83+ if (empty ($ logs )) {
84+ echo "No PPPoE logs found. \n" ;
85+ } else {
86+ foreach (array_slice ($ logs , -10 ) as $ log ) {
87+ echo sprintf (
88+ "[%s] %s \n" ,
89+ $ log ['time ' ] ?? 'N/A ' ,
90+ $ log ['message ' ] ?? 'N/A '
91+ );
92+ }
93+ }
0 commit comments