I recently had a customer of my WISP ask if we could give her a way to log when her employees are working remotely. She doesn't have a huge infrastructure with sophisticated logging abilities. She felt that her employees were claiming to work when they really weren't even logged in.
This is a two part script. One part runs on the Mikrotik, the other as a PHP script running on their server in the office.
Part 1(a) "create a script called 'vpn-log' on the Mikrotik":
:local urlRoot "http://192.168.99.22:82/?users=";
:foreach i in=[/interface find where type="pptp-in"] do={
:local pptpName [/interface get $i name];
:local userName [:pick $pptpName ([:find $pptpName "-"]+1) [:find $pptpName ">"]];
set urlRoot ($urlRoot.$userName.",");
}
/tool fetch url="$urlRoot" keep-result=no
Part 1(b) "create the schedule":
/system scheduler add interval=1m name="Run vpn-log" on-event="/system script run vpn-log" \
policy=\
ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api \
start-time=startup
Part 2 "create the PHP file":
<?php
date_default_timezone_set('America/Chicago');
$string_data = file_get_contents("current_users_DONT_DELETE.txt");
$currentUsers = unserialize($string_data);
$userArr = explode(",", $_GET['users']);
file_put_contents("current_users_DONT_DELETE.txt", serialize($userArr));
foreach ($currentUsers as $currentUser) {
if ($currentUser !== "") {
if (!file_exists($currentUser)) {
mkdir($currentUser, 0777, true);
}
if (!in_array($currentUser, $userArr)) {
file_put_contents($currentUser."/".date("Y-m-d").".txt", $currentUser . " - Log Out ".date('h:i A')."\r\n", FILE_APPEND);
echo $currentUser . " - Log Out ".date('h:i A')."<BR>";
}
}
}
foreach ($userArr as $user) {
if ($user !== "") {
if (!file_exists($user)) {
mkdir($user, 0777, true);
}
if (!in_array($user, $currentUsers)) {
file_put_contents($user."/".date("Y-m-d").".txt", $user . " - Log In ".date('h:i A')."\r\n", FILE_APPEND);
echo $user . " - Log In ".date('h:i A')."\n";
}
}
}
?>
Note: This only shows when people log in/out of the VPN. It has no way to know if they actually worked. Additionally the PHP script needs write access to the directory it is in.