$val) { if (is_array($val)) { $res[] = "[$key]"; foreach ($val as $skey => $sval) { $res[] = "$skey = ".(is_numeric($sval) ? $sval : '"'.$sval.'"'); } } else { $res[] = "$key = ".(is_numeric($val) ? $val : '"'.$val.'"'); } } if (safefilerewrite($file, implode("\r\n", $res))) { return true; } else { return false; } } function safefilerewrite($fileName, $dataToSave) { if ($fp = fopen($fileName, 'w')) { $startTime = microtime(true); do { $canWrite = flock($fp, LOCK_EX); // If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load if (!$canWrite) { usleep(round(rand(0, 100)*1000)); } } while ((!$canWrite)and((microtime(true)-$startTime) < 5)); //file was locked so now we can store information if ($canWrite) { fwrite($fp, $dataToSave); flock($fp, LOCK_UN); } fclose($fp); return true; } else { return false; } } //Function to get string between used for Mobile.sh function get_string_between($string, $start, $end){ $string = ' ' . $string; $ini = strpos($string, $start); if ($ini == 0) return ''; $ini += strlen($start); $len = strpos($string, $end, $ini) - $ini; return substr($string, $ini, $len); } /** * * Add CSRF Token to form * */ function CSRFToken() { ?> ' , PHP_EOL; foreach ($options as $opt => $label) { $select = ''; $key = isAssoc($options) ? $opt : $label; if ($key == $selected) { $select = ' selected="selected"'; } echo '' , PHP_EOL; } echo '' , PHP_EOL; } /** * * @param string $input * @param string $string * @param int $offset * @param string $separator * @return $string */ function GetDistString($input, $string, $offset, $separator) { $string = substr($input, strpos($input, $string)+$offset, strpos(substr($input, strpos($input, $string)+$offset), $separator)); return $string; } /** * * @param array $arrConfig * @return $config */ function ParseConfig($arrConfig) { $config = array(); foreach ($arrConfig as $line) { $line = trim($line); if ($line != "" && $line[0] != "#") { $arrLine = explode("=", $line); $config[$arrLine[0]] = (count($arrLine) > 1 ? $arrLine[1] : true); } } return $config; } /** * * @param string $freq * @return $channel */ function ConvertToChannel($freq) { if ($freq >= 2412 && $freq <= 2484) { $channel = ($freq - 2407)/5; } elseif ($freq >= 4915 && $freq <= 4980) { $channel = ($freq - 4910)/5 + 182; } elseif ($freq >= 5035 && $freq <= 5865) { $channel = ($freq - 5030)/5 + 6; } else { $channel = -1; } if ($channel >= 1 && $channel <= 196) { return $channel; } else { return 'Invalid Channel'; } } /** * Converts WPA security string to readable format * @param string $security * @return string */ function ConvertToSecurity($security) { $options = array(); preg_match_all('/\[([^\]]+)\]/s', $security, $matches); foreach ($matches[1] as $match) { if (preg_match('/^(WPA\d?)/', $match, $protocol_match)) { $protocol = $protocol_match[1]; $matchArr = explode('-', $match); if (count($matchArr) > 2) { $options[] = htmlspecialchars($protocol . ' ('. $matchArr[2] .')', ENT_QUOTES); } else { $options[] = htmlspecialchars($protocol, ENT_QUOTES); } } } if (count($options) === 0) { // This could also be WEP but wpa_supplicant doesn't have a way to determine // this. // And you shouldn't be using WEP these days anyway. return 'Open'; } else { return implode('
', $options); } } /** * * */ /*LOKINET FUNCTIONS ADDED HERE*/ function DisplayLokinetConfig() { exec('pidof lokinet | wc -l', $lokinetstatus); $exitstatus = exec("lokinet-vpn --status"); $rulestate = exec("ip rule show default | grep lokinet | awk {'print $5'}", $output); $lokiversion = exec("dpkg -s lokinet | grep '^Version:'", $output); ?>
Configure Lokinet

Enter Exit Node Data to activate:

' , PHP_EOL; } else { echo '' , PHP_EOL; } if ($lokinetstatus[0] == 0) { echo '' , PHP_EOL; } else { echo '' , PHP_EOL; } ?>
Enter mobile provider apn:

' , PHP_EOL; ?>
Enter .loki Address:

' , PHP_EOL; ?>

Lokient Daemon

The 3 buttons below must be armed (red) to connect to Lokinet. If there isn't a current lokinet.ini file found on the system the "Generate.ini" button will be green. The .ini file must be generated prior to connecting to Lokinet by pressing the button which will automatically write the required .ini file. Similarly the absense of a valid bootstrap will be indicated by a green "Bootstrap" button. Applying a bootstrap by pressing the apply button without submitting a valid URL in the textbox area will apply the original default bootstrap in place of one being provided. Stopping the daemon also exits Lokinet. To summarize, if necessary generate the .ini and bootstrap Lokinet then you are able to connect to Lokinet by starting the daemon and letting the network establish itself.
Enter a valid bootstrap url below and apply to overwrite the current bootstrap:

' , PHP_EOL; } else { echo '' , PHP_EOL; } if (file_exists($filename)) { echo '' , PHP_EOL; } else { echo '' , PHP_EOL; } ?>
$output"; ?>
' , PHP_EOL; echo "\n"; ?>
Generating Lokinet Configuration
$output"; ?>' , PHP_EOL; echo "\n"; ?>
Regenerating Lokinet Configuration
$output"; ?>' , PHP_EOL; echo "\n"; ?>
$output"; ?>' , PHP_EOL; echo "\n"; ?>
$output"; ?>' , PHP_EOL; echo "\n"; ?>
Reboot required to start mobile. Reboot now?"; ?>' , PHP_EOL; echo '' , PHP_EOL; echo "\n"; ?>