Skip to content
ZILLEALI edited this page May 20, 2026 · 2 revisions

v1.0.0 — Initial Release

Released: 2026-05-16
Tag: v1.0.0
Install: composer require zilleali/mikrotik-laravel:^1.0.0


Overview

First stable release of zilleali/mikrotik-laravel. A complete Laravel package for managing MikroTik routers via RouterOS API — built from real ISP engineering experience.


Core Architecture

RouterosClient

TCP socket client implementing RouterOS sentence protocol.

use ZillEAli\MikrotikLaravel\Connections\RouterosClient;

$client = new RouterosClient(
    host:     '192.168.88.1',
    port:     8728,
    username: 'admin',
    password: 'secret',
    timeout:  10,
);
$client->connect();

Features:

  • Variable-length word encoding (1–5 bytes)
  • RouterOS v6.43+ plain login
  • Legacy MD5 challenge-response support
  • Auto-disconnect via destructor

MikroTik Facade

use ZillEAli\MikrotikLaravel\Facades\MikroTik;

MikroTik::pppoe()->getActiveSessions();
MikroTik::system()->getCpuLoad();

CachingProxy

$cached = MikroTik::withCache(MikroTik::pppoe(), ttl: 30);
$sessions = $cached->getActiveSessions(); // cached 30 seconds

Retry Mechanism

// config/mikrotik.php
'retry_attempts' => 3,
'retry_delay'    => 1000, // milliseconds

12 Managers

PppoeManager — MikroTik::pppoe()

// Secrets
$secrets = MikroTik::pppoe()->getSecrets();
$secret  = MikroTik::pppoe()->getSecret('ali-home');
MikroTik::pppoe()->createSecret([
    'name'     => 'ali-home',
    'password' => 'pass123',
    'profile'  => '10mbps',
]);
MikroTik::pppoe()->deleteSecret('ali-home');

// Enable/disable
MikroTik::pppoe()->enableSecret('ali-home');
MikroTik::pppoe()->disableSecret('ali-home');
MikroTik::pppoe()->bulkEnable(['user1', 'user2', 'user3']);
MikroTik::pppoe()->bulkDisable(['user1', 'user2', 'user3']);

// Active sessions
$sessions = MikroTik::pppoe()->getActiveSessions();
$session  = MikroTik::pppoe()->getSessionByIp('10.0.0.1');
MikroTik::pppoe()->kickSession('ali-home');
MikroTik::pppoe()->bulkKick(['user1', 'user2']);

// Profiles
$profiles = MikroTik::pppoe()->getProfiles();

HotspotManager — MikroTik::hotspot()

// Users
$users = MikroTik::hotspot()->getUsers();
$user  = MikroTik::hotspot()->getUser('guest001');
MikroTik::hotspot()->createUser(['name' => 'guest001', 'password' => '1234']);
MikroTik::hotspot()->deleteUser('guest001');
MikroTik::hotspot()->enableUser('guest001');
MikroTik::hotspot()->disableUser('guest001');

// Active hosts
$hosts = MikroTik::hotspot()->getActiveHosts();
MikroTik::hotspot()->kickHost('guest001');

// Vouchers
$vouchers = MikroTik::hotspot()->generateVouchers(
    count:    10,
    profile:  '1hour',
    prefix:   'VCH'
);

// Profiles
$profiles = MikroTik::hotspot()->getProfiles();

QueueManager — MikroTik::queue()

// Simple queues
$queues = MikroTik::queue()->getSimpleQueues();
$queue  = MikroTik::queue()->getQueue('ali-home');
MikroTik::queue()->createQueue([
    'name'           => 'ali-home',
    'target'         => '10.0.0.1',
    'max-limit'      => '10M/10M',
]);
MikroTik::queue()->updateQueue('ali-home', ['max-limit' => '20M/20M']);
MikroTik::queue()->deleteQueue('ali-home');

// Bandwidth limits
MikroTik::queue()->setLimit('ali-home', '10M', '10M');
MikroTik::queue()->bulkSetLimit($users); // ['name' => 'user', 'upload' => '5M', 'download' => '10M']

// Enable/disable
MikroTik::queue()->enableQueue('ali-home');
MikroTik::queue()->disableQueue('ali-home');

// Tree queues
$trees = MikroTik::queue()->getTreeQueues();

FirewallManager — MikroTik::firewall()

// Filter rules
$rules = MikroTik::firewall()->getFilterRules();
MikroTik::firewall()->addFilterRule([
    'chain'   => 'forward',
    'action'  => 'drop',
    'src-address' => '1.2.3.4',
]);

// NAT rules
$nat = MikroTik::firewall()->getNatRules();
MikroTik::firewall()->addNatRule([
    'chain'  => 'srcnat',
    'action' => 'masquerade',
    'out-interface' => 'ether1',
]);

// Mangle rules
$mangle = MikroTik::firewall()->getMangleRules();
MikroTik::firewall()->addMangleRule([...]);

// Address lists
$lists = MikroTik::firewall()->getAddressLists();
MikroTik::firewall()->addToAddressList('1.2.3.4', 'blocked', 'auto-blocked');
MikroTik::firewall()->removeFromAddressList('1.2.3.4', 'blocked');
$isBlocked = MikroTik::firewall()->isIpInList('1.2.3.4', 'blocked');

SystemManager — MikroTik::system()

// Resources
$resources = MikroTik::system()->getResources();
$cpu       = MikroTik::system()->getCpuLoad();
$uptime    = MikroTik::system()->getUptime();

// Health (temperature, voltage)
$health = MikroTik::system()->getHealth();

// Identity
$name = MikroTik::system()->getIdentity();

// Logs
$logs = MikroTik::system()->getLogs();
$logs = MikroTik::system()->getLogs(count: 50);

// Ping
$result = MikroTik::system()->ping('8.8.8.8');

// Reboot
MikroTik::system()->reboot();

InterfaceManager — MikroTik::interfaces()

// All interfaces
$interfaces = MikroTik::interfaces()->getInterfaces();
$iface      = MikroTik::interfaces()->getInterface('ether1');

// Filter
$running  = MikroTik::interfaces()->getRunningInterfaces();
$disabled = MikroTik::interfaces()->getDisabledInterfaces();
$vlans    = MikroTik::interfaces()->getVlanInterfaces();
$ethers   = MikroTik::interfaces()->getEthernetInterfaces();

// Enable/disable
MikroTik::interfaces()->enableInterface('ether2');
MikroTik::interfaces()->disableInterface('ether2');

// Traffic stats
$traffic = MikroTik::interfaces()->getTraffic('ether1');

DhcpManager — MikroTik::dhcp()

// Leases
$leases = MikroTik::dhcp()->getLeases();
$lease  = MikroTik::dhcp()->getLeaseByMac('AA:BB:CC:DD:EE:FF');
$lease  = MikroTik::dhcp()->getLeaseByIp('192.168.1.10');
MikroTik::dhcp()->makeStatic('AA:BB:CC:DD:EE:FF');
MikroTik::dhcp()->deleteLease('AA:BB:CC:DD:EE:FF');

// Servers
$servers = MikroTik::dhcp()->getServers();
$count   = MikroTik::dhcp()->getActiveLeaseCount();

WirelessManager — MikroTik::wireless()

// Interfaces
$interfaces = MikroTik::wireless()->getInterfaces();

// Connected clients
$clients = MikroTik::wireless()->getRegistrationTable();
$clients = MikroTik::wireless()->getClientsByInterface('wlan1');
$count   = MikroTik::wireless()->getClientCount();

// Access list
$acl = MikroTik::wireless()->getAccessList();
MikroTik::wireless()->addToAccessList('AA:BB:CC:DD:EE:FF');
MikroTik::wireless()->removeFromAccessList('AA:BB:CC:DD:EE:FF');

IpPoolManager — MikroTik::ipPool()

// Pools
$pools = MikroTik::ipPool()->getPools();
$pool  = MikroTik::ipPool()->getPool('pppoe-pool');
MikroTik::ipPool()->createPool([
    'name'   => 'pppoe-pool',
    'ranges' => '10.0.0.1-10.0.0.254',
]);
MikroTik::ipPool()->deletePool('pppoe-pool');

// Usage
$used  = MikroTik::ipPool()->getUsedAddresses('pppoe-pool');
$count = MikroTik::ipPool()->getUsedAddressCount('pppoe-pool');

RadiusManager — MikroTik::radius()

// Servers
$servers = MikroTik::radius()->getServers();
$server  = MikroTik::radius()->getServerByAddress('192.168.1.100');
MikroTik::radius()->addServer([
    'address' => '192.168.1.100',
    'secret'  => 'radiussecret',
    'service' => 'ppp',
]);
MikroTik::radius()->removeServer('192.168.1.100');
MikroTik::radius()->enableServer('192.168.1.100');
MikroTik::radius()->disableServer('192.168.1.100');

// Check
$active = MikroTik::radius()->isServerActive('192.168.1.100');

// Incoming CoA
$incoming = MikroTik::radius()->getIncomingConfig();

RouterUserManager — MikroTik::routerUsers()

// Users
$users = MikroTik::routerUsers()->getUsers();
$user  = MikroTik::routerUsers()->getUser('admin');
MikroTik::routerUsers()->addUser([
    'name'  => 'monitor',
    'group' => 'read',
]);
MikroTik::routerUsers()->deleteUser('monitor');
MikroTik::routerUsers()->changePassword('monitor', 'newpass');
MikroTik::routerUsers()->enableUser('monitor');
MikroTik::routerUsers()->disableUser('monitor');

// Groups
$groups = MikroTik::routerUsers()->getGroups();

// Active sessions
$sessions  = MikroTik::routerUsers()->getActiveSessions();
$isOnline  = MikroTik::routerUsers()->isUserActive('admin');

VpnManager — MikroTik::vpn()

// WireGuard
$interfaces = MikroTik::vpn()->getWireGuardInterfaces();
$peers      = MikroTik::vpn()->getWireGuardPeers();
$peers      = MikroTik::vpn()->getPeersByInterface('wireguard1');
MikroTik::vpn()->addWireGuardPeer([
    'interface'  => 'wireguard1',
    'public-key' => 'base64key==',
    'allowed-address' => '10.0.0.2/32',
]);
MikroTik::vpn()->removeWireGuardPeer('base64key==');

// L2TP
$sessions = MikroTik::vpn()->getL2tpSessions();
$secrets  = MikroTik::vpn()->getL2tpSecrets();

// PPTP
$sessions = MikroTik::vpn()->getPptpSessions();

// Count
$total = MikroTik::vpn()->getTotalActiveSessions();

Events

use ZillEAli\MikrotikLaravel\Events\SessionCreated;
use ZillEAli\MikrotikLaravel\Events\SessionDisconnected;
use ZillEAli\MikrotikLaravel\Events\RouterConnected;
use ZillEAli\MikrotikLaravel\Events\RouterUnreachable;

// In EventServiceProvider
protected $listen = [
    SessionCreated::class => [
        YourSessionCreatedListener::class,
    ],
    RouterUnreachable::class => [
        YourAlertListener::class,
    ],
];

// Dispatch manually
MikroTik::dispatchSessionCreated(
    username: 'ali-home',
    ip:       '10.0.0.1',
    service:  'pppoe',
    mac:      'AA:BB:CC:DD:EE:FF'
);

Artisan Commands

# Test router connectivity
php artisan mikrotik:ping
php artisan mikrotik:ping --router=branch

# Sync data to Laravel cache
php artisan mikrotik:sync

# Live terminal monitor
php artisan mikrotik:monitor

Tests

  • 70+ unit tests
  • Mock-based — no real router needed
  • CI: PHP 8.2/8.3 × Laravel 11/12


📝 Found an error or missing info?
Edit this page or open an issue to suggest improvements.

Versions | v1.1.0 →

Clone this wiki locally