Compare commits

...

18 Commits

Author SHA1 Message Date
necro-nemesis 55100d78c1
Merge pull request #46 from necro-nemesis/master
bring backup up to master
2 years ago
necro-nemsis 417715f5d0 fix unmask comment 2 years ago
necro-nemsis 19729b7d4a Update crontab 2 years ago
necro-nemsis f4d9b15559 Set run level 5 2 years ago
necro-nemesis 2da27f3952
Update README.md 2 years ago
necro-nemesis ca18ad8a82
Update README.md 2 years ago
necro-nemesis 885aa1c040
Update README.md 2 years ago
necro-nemesis 8f94ec9b61
fix case formatting 2 years ago
necro-nemsis 97c3278542 Update index information 2 years ago
necro-nemsis 4c19366e5f update modal 2 years ago
necro-nemsis 38a594e3f3 Include About 2 years ago
necro-nemsis f4a389e364 Add exit node info and form clear 2 years ago
necro-nemsis c0bd858d3d Fix boostrap css error 2 years ago
necro-nemsis 467502d3b0 fix for vnstat v2.6 2 years ago
necro-nemsis fa6e2be125 Bump to 2.7. JSON exit support 2 years ago
necro-nemesis e3d6a21850
Update README.md 2 years ago
necro-nemsis 26198a513a Bump version to 2.6 2 years ago
necro-nemsis 2d3fada462 Update functions 2 years ago

@ -1,6 +1,6 @@
![](https://i.imgur.com/2ZrhaiH.png)
![](https://i.imgur.com/ODDRaNA.png)
# `LabyrinthAP / Lokinet Access Point` [![Release 2.5](https://img.shields.io/badge/Release-2.5-green.svg)](https://github.com/necro-nemesis/raspap-webgui/releases)
# `LabyrinthAP / Lokinet Access Point` [![Release 2.7](https://img.shields.io/badge/Release-2.7-green.svg)](https://github.com/necro-nemesis/raspap-webgui/releases)
LabyrinthAP interfaces with Lokinet daemon to facilitate connections to the Lokinet global privacy network. LabyrinthAP provides a simple, responsive web interface to control wifi, hostapd, Lokinet daemon and related services necessary to access Lokinet on the Raspberry Pi or Orange Pi.
@ -85,7 +85,7 @@ With the prerequisites done, you can now proceed with the Quick installer.
Install LabyrinthAP from shell prompt:
```sh
$ wget -q https://git.io/fjeSw -O /tmp/raspap && bash /tmp/raspap
wget -q https://git.io/fjeSw -O /tmp/raspap && bash /tmp/raspap
```
The installer will complete the installation steps for you. You will be occasionally prompted to answer `y` or `n`. Answering yes to all prompts will in almost all cases be the answer you want so if in doubt respond with `y` that you want the default set up and the AP will work.

@ -17,7 +17,7 @@ if (empty($interface)) {
} else {
exit('No network interfaces found.');
}
}
}
define('IFNAMSIZ', 16);
if (strlen($interface) > IFNAMSIZ) {
@ -38,10 +38,10 @@ $jsonobj = json_decode($jsonstdoutvnstat[0], true);
$timeunits = filter_input(INPUT_GET, 'tu');
if ($timeunits === 'm') {
// months
$jsonData = $jsonobj['interfaces'][0]['traffic']['months'];
$jsonData = $jsonobj['interfaces'][0]['traffic']['month'];
} else {
// default: days
$jsonData = $jsonobj['interfaces'][0]['traffic']['days'];
$jsonData = $jsonobj['interfaces'][0]['traffic']['day'];
}
$datasizeunits = filter_input(INPUT_GET, 'dsu');
@ -74,14 +74,12 @@ for ($i = count($jsonData) - 1; $i >= 0; --$i) {
}
if ($timeunits === 'm') {
echo '{ "date": "' , $dt->format('Y-m') , '", "rx": "' , $datareceived ,
echo '{ "date": "' , $dt->format('Y-m') , '", "rx": "' , $datareceived ,
'", "tx": "' , $datasend , '" }';
} else {
echo '{ "date": "' , $dt->format('Y-m-d') , '", "rx": "' , $datareceived ,
echo '{ "date": "' , $dt->format('Y-m-d') , '", "rx": "' , $datareceived ,
'", "tx": "' , $datasend , '" }';
}
}
echo ' ]';

@ -1,4 +1,4 @@
<?php
<?php
if (filter_input(INPUT_GET, 'tu') == 'h') {
header('X-Content-Type-Options: nosniff');
@ -40,10 +40,10 @@ if (filter_input(INPUT_GET, 'tu') == 'h') {
}
$jsonobj = json_decode($jsonstdoutvnstat[0], true)['interfaces'][0];
$jsonData = $jsonobj['traffic']['hours'];
$jsonData = $jsonobj['traffic']['hour'];
for ($i = count($jsonData) - 1; $i >= 0; --$i) {
$data_template[$jsonData[$i]['id']]['rx'] = round($jsonData[$i]['rx'] / 1024, 0);
$data_template[$jsonData[$i]['id']]['tx'] = round($jsonData[$i]['tx'] / 1024, 0);
$data_template[$jsonData[$i]['time']['hour']]['rx'] = round($jsonData[$i]['rx'] / 1024, 0);
$data_template[$jsonData[$i]['time']['hour']]['tx'] = round($jsonData[$i]['tx'] / 1024, 0);
}
$data = array();

@ -1,6 +1,6 @@
<?php
define('RASPI_VERSION', '2.5');
define('RASPI_VERSION', '2.7');
define('RASPI_CONFIG', '/etc/raspap');
define('RASPI_CONFIG_NETWORKING',RASPI_CONFIG.'/networking');
define('RASPI_ADMIN_DETAILS', RASPI_CONFIG.'/raspap.auth');

@ -4,23 +4,25 @@
function mask2cidr($mask)
{
$long = ip2long($mask);
$base = ip2long('255.255.255.255');
return 32-log(($long ^ $base)+1, 2);
$base = ip2long("255.255.255.255");
return 32 - log(($long ^ $base) + 1, 2);
}
/* Functions to write ini files */
function write_php_ini($array, $file)
{
$res = array();
$res = [];
foreach ($array as $key => $val) {
if (is_array($val)) {
$res[] = "[$key]";
foreach ($val as $skey => $sval) {
$res[] = "$skey = ".(is_numeric($sval) ? $sval : '"'.$sval.'"');
$res[] =
"$skey = " .
(is_numeric($sval) ? $sval : '"' . $sval . '"');
}
} else {
$res[] = "$key = ".(is_numeric($val) ? $val : '"'.$val.'"');
$res[] = "$key = " . (is_numeric($val) ? $val : '"' . $val . '"');
}
}
if (safefilerewrite($file, implode("\r\n", $res))) {
@ -32,15 +34,15 @@ function write_php_ini($array, $file)
function safefilerewrite($fileName, $dataToSave)
{
if ($fp = fopen($fileName, 'w')) {
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));
usleep(round(rand(0, 100) * 1000));
}
} while ((!$canWrite)and((microtime(true)-$startTime) < 5));
} while (!$canWrite and microtime(true) - $startTime < 5);
//file was locked so now we can store information
if ($canWrite) {
@ -56,153 +58,172 @@ function safefilerewrite($fileName, $dataToSave)
//Function to get string between used for Mobile.sh
function get_string_between($string, $start, $end){
$string = ' ' . $string;
function get_string_between($string, $start, $end)
{
$string = " " . $string;
$ini = strpos($string, $start);
if ($ini == 0) return '';
if ($ini == 0) {
return "";
}
$ini += strlen($start);
$len = strpos($string, $end, $ini) - $ini;
return substr($string, $ini, $len);
}
/**
*
* Add CSRF Token to form
*
*/
*
* Add CSRF Token to form
*
*/
function CSRFToken()
{
?>
<input id="csrf_token" type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($_SESSION['csrf_token'], ENT_QUOTES);
; ?>" />
<input id="csrf_token" type="hidden" name="csrf_token" value="<?php echo htmlspecialchars(
$_SESSION["csrf_token"],
ENT_QUOTES
); ?>" />
<?php
}
/**
*
* Validate CSRF Token
*
*/
*
* Validate CSRF Token
*
*/
function CSRFValidate()
{
if (hash_equals($_POST['csrf_token'], $_SESSION['csrf_token'])) {
if (hash_equals($_POST["csrf_token"], $_SESSION["csrf_token"])) {
return true;
} else {
error_log('CSRF violation');
error_log("CSRF violation");
return false;
}
}
/**
* Test whether array is associative
*/
* Test whether array is associative
*/
function isAssoc($arr)
{
return array_keys($arr) !== range(0, count($arr) - 1);
}
/**
*
* Display a selector field for a form. Arguments are:
* $name: Field name
* $options: Array of options
* $selected: Selected option (optional)
* If $options is an associative array this should be the key
*
*/
*
* Display a selector field for a form. Arguments are:
* $name: Field name
* $options: Array of options
* $selected: Selected option (optional)
* If $options is an associative array this should be the key
*
*/
function SelectorOptions($name, $options, $selected = null, $id = null)
{
echo '<select class="form-control" name="'.htmlspecialchars($name, ENT_QUOTES).'"';
echo '<select class="form-control" name="' .
htmlspecialchars($name, ENT_QUOTES) .
'"';
if (isset($id)) {
echo ' id="' . htmlspecialchars($id, ENT_QUOTES) .'"';
echo ' id="' . htmlspecialchars($id, ENT_QUOTES) . '"';
}
echo '>' , PHP_EOL;
echo ">", PHP_EOL;
foreach ($options as $opt => $label) {
$select = '';
$select = "";
$key = isAssoc($options) ? $opt : $label;
if ($key == $selected) {
$select = ' selected="selected"';
}
echo '<option value="'.htmlspecialchars($key, ENT_QUOTES).'"'.$select.'>'.
htmlspecialchars($label, ENT_QUOTES).'</option>' , PHP_EOL;
echo '<option value="' .
htmlspecialchars($key, ENT_QUOTES) .
'"' .
$select .
">" .
htmlspecialchars($label, ENT_QUOTES) .
"</option>",
PHP_EOL;
}
echo '</select>' , PHP_EOL;
echo "</select>", PHP_EOL;
}
/**
*
* @param string $input
* @param string $string
* @param int $offset
* @param string $separator
* @return $string
*/
*
* @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));
$string = substr(
$input,
strpos($input, $string) + $offset,
strpos(substr($input, strpos($input, $string) + $offset), $separator)
);
return $string;
}
/**
*
* @param array $arrConfig
* @return $config
*/
*
* @param array $arrConfig
* @return $config
*/
function ParseConfig($arrConfig)
{
$config = array();
$config = [];
foreach ($arrConfig as $line) {
$line = trim($line);
if ($line != "" && $line[0] != "#") {
$arrLine = explode("=", $line);
$config[$arrLine[0]] = (count($arrLine) > 1 ? $arrLine[1] : true);
$config[$arrLine[0]] = count($arrLine) > 1 ? $arrLine[1] : true;
}
}
return $config;
}
/**
*
* @param string $freq
* @return $channel
*/
*
* @param string $freq
* @return $channel
*/
function ConvertToChannel($freq)
{
if ($freq >= 2412 && $freq <= 2484) {
$channel = ($freq - 2407)/5;
$channel = ($freq - 2407) / 5;
} elseif ($freq >= 4915 && $freq <= 4980) {
$channel = ($freq - 4910)/5 + 182;
$channel = ($freq - 4910) / 5 + 182;
} elseif ($freq >= 5035 && $freq <= 5865) {
$channel = ($freq - 5030)/5 + 6;
$channel = ($freq - 5030) / 5 + 6;
} else {
$channel = -1;
}
if ($channel >= 1 && $channel <= 196) {
return $channel;
} else {
return 'Invalid Channel';
return "Invalid Channel";
}
}
/**
* Converts WPA security string to readable format
* @param string $security
* @return string
*/
* Converts WPA security string to readable format
* @param string $security
* @return string
*/
function ConvertToSecurity($security)
{
$options = array();
preg_match_all('/\[([^\]]+)\]/s', $security, $matches);
$options = [];
preg_match_all("/\[([^\]]+)\]/s", $security, $matches);
foreach ($matches[1] as $match) {
if (preg_match('/^(WPA\d?)/', $match, $protocol_match)) {
if (preg_match("/^(WPA\d?)/", $match, $protocol_match)) {
$protocol = $protocol_match[1];
$matchArr = explode('-', $match);
$matchArr = explode("-", $match);
if (count($matchArr) > 2) {
$options[] = htmlspecialchars($protocol . ' ('. $matchArr[2] .')', ENT_QUOTES);
$options[] = htmlspecialchars(
$protocol . " (" . $matchArr[2] . ")",
ENT_QUOTES
);
} else {
$options[] = htmlspecialchars($protocol, ENT_QUOTES);
}
@ -213,29 +234,32 @@ function ConvertToSecurity($security)
// 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';
return "Open";
} else {
return implode('<br />', $options);
return implode("<br />", $options);
}
}
/**
*
*
*/
*
*
*/
/*LOKINET FUNCTIONS ADDED HERE*/
function DisplayLokinetConfig()
{
exec('pidof lokinet | wc -l', $lokinetstatus);
exec("pidof lokinet | wc -l", $lokinetstatus);
if ($lokinetstatus[0] != 0) {
$exitstatus = exec("lokinet-vpn --status");
$exitstatus = exec("lokinet-vpn --status");
} else {
$exitstatus = "no exits";
$exitstatus = "no exits";
}
$rulestate = exec("ip rule show default | grep lokinet | awk {'print $5'}", $output);
$rulestate = exec(
"ip rule show default | grep lokinet | awk {'print $5'}",
$output
);
$lokiversion = exec("dpkg -s lokinet | grep '^Version:'", $output);
?>
?>
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
@ -246,8 +270,6 @@ function DisplayLokinetConfig()
<ul class="nav nav-tabs">
<li class="active"><a href="#basic" data-toggle="tab">Exit Node Settings</a>
</li>
<li><a href="#daemon" data-toggle="tab">Daemon Settings</a>
</li>
<li><a href="#Mobile" data-toggle="tab">Mobile APN</a>
</li>
<li><a href="#whois" data-toggle="tab">WHOIS</a>
@ -255,195 +277,208 @@ function DisplayLokinetConfig()
</ul>
<!-- Tab panes -->
<div class="tab-content">
<p><?php echo $status; ?></p>
<div class="tab-content">
<p><?php echo $status; ?></p>
<p><?php echo "Current Lokinet $lokiversion"; ?></p>
<div class="tab-pane fade in active" id="basic">
<div class="tab-pane fade in active" id="basic">
<form role="form" action="?page=save_hostapd_conf" method="POST">
<h5>Enter Exit Node Data to activate:</h5>
<label for="exitaddress">Exit Address:</label>
<input type="text" class="form-control" placeholder="enter exit address here" id="exitaddress" name="exitaddress">
<h5>Enter Exit Node Data to activate:</h5>
<label for="exitaddress">Exit:</label>
<input type="text" class="form-control" list="exitaddresses" placeholder="enter exit address here" id="exitaddress" name="exitaddress" onchange="OnSelectionChange()">
<?php $api_url = 'https://my-json-server.typicode.com/necro-nemesis/exits-api/exits';
// Read JSON file
$json_data = file_get_contents($api_url);
// Decode JSON data into PHP array
$response_data = json_decode($json_data,true);
?>
<datalist id="exitaddresses">
<?php foreach($response_data as $response){
$listedexits = '<option value=\''.$response['exit'].'\'>';
echo $listedexits;
}
?>
</datalist>
<script>
//JSON Authentication Token Handler
async function OnSelectionChange(){
var selection = document.getElementById("exitaddress").value;
const endpoint = 'https://my-json-server.typicode.com/necro-nemesis/exits-api/db';
const response = await fetch(endpoint);
const data = await response.json();
for (var i = 0; i < data['exits'].length; i++) {
if (data['exits'][i]['exit'] == selection) {
const { exit, auth, geo, rate } = data['exits'][i];
console.log('Exit name : ' + exit);
console.log('Exit token : '+ auth);
console.log('Exit location : ' + geo);
console.log('Exit rate : ' + rate);
console.log('Dropdown selection : ' + selection);
alert('EXIT NODE INFORMATION\r\rExit Address : ' + exit + '\rExit Location : ' + geo + '\rExit Autorization Key : ' + auth + '\rMonthly Rate : ' + rate);
document.getElementById("auth").value = auth;
break;
}
}
}
</script>
<label for="exitkey">Exit Key: (optional)</label>
<input type="text" class="form-control" placeholder="enter exit key here" id="exitkey" name="exitkey">
<br/>
<input type="text" class="form-control" id="auth" placeholder="optional exit authorization key" id="exitkey" name="exitkey">
<br/>
<input type="reset" class="btn btn-default" value="Clear">
<?php
if ($exitstatus != "no exits") {
echo '<input type="submit" class="btn btn-danger" name="StopExit" value="Stop Exit" />' , PHP_EOL;
} else {
echo '<input type="submit" class="btn btn-success" name="StartExit" value="Start Exit" />' , PHP_EOL;
}
if ($lokinetstatus[0] == 0) {
echo '<input type="submit" class="btn btn-success" name="StartDaemon" value="Start Daemon" />' , PHP_EOL;
} else {
echo '<input type="submit" class="btn btn-danger" name="StopDaemon" value="Stop Daemon" />' , PHP_EOL;
} ?><h5><?php echo _("Your development support is greatly appreciated | Loki Address:"); ?></h5>
<h5><pre><?php echo _("LA8VDcoJgiv2bSiVqyaT6hJ67LXbnQGpf9Uk3zh9ikUKPJUWeYbgsd9gxQ5ptM2hQNSsCaRETQ3GM9FLDe7BGqcm4ve69bh"); ?></pre></h5>
</div>
<div class="tab-pane fade" id="Mobile">
<form role="form" action="?page=save_hostapd_conf" method="POST">
<h5>Enter mobile provider apn:</h5>
<label for="apn">Mobile Provider APN:</label>
<input type="text" class="form-control" placeholder="enter apn address here" id="apn" name="apn">
<br/>
<?php
echo '<input type="submit" class="btn btn-success" name="apnaddress" value="Set APN" />' , PHP_EOL;
?><h5><?php echo _("Your development support is greatly appreciated | Loki Address:"); ?></h5>
<h5><pre><?php echo _("LA8VDcoJgiv2bSiVqyaT6hJ67LXbnQGpf9Uk3zh9ikUKPJUWeYbgsd9gxQ5ptM2hQNSsCaRETQ3GM9FLDe7BGqcm4ve69bh"); ?></pre></h5>
</div>
<div class="tab-pane fade" id="whois">
if ($exitstatus != "no exits") {
echo '<input type="submit" class="btn btn-danger" name="StopExit" value="Stop Exit" />', PHP_EOL;
} else {
echo '<input type="submit" class="btn btn-success" name="StartExit" value="Start Exit" />', PHP_EOL;
}
if ($lokinetstatus[0] == 0) {
echo '<input type="submit" class="btn btn-success" name="StartDaemon" value="Start Daemon" />', PHP_EOL;
} else {
echo '<input type="submit" class="btn btn-danger" name="StopDaemon" value="Stop Daemon" />', PHP_EOL;
}
?>
<!-- Trigger the modal with a button -->
<button type="button" class="btn btn-default" data-toggle="modal" data-target="#myModal">About</button>
<!-- Modal -->
<div id="myModal" class="modal fade" role="dialog">
<div class="modal-dialog">
<div class="modal-dialog modal-lg">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title">About</h4>
</div>
<div class="modal-body">
<p>LabyrinthAP is open source software offered under GNU General Public License v3.0.
Ongoing development is reliant on voluntary financial support through donations to the project.
I hope that you find using LabyrithAP beneficial and also hope there's sufficient widespread support for it
to financially support it's future. Seeing support for it will assist in continued improvements as well
as adapting it to future requirements.</p>
<p>LabyrinthAP was initially conceived to provide users with a platform agnostic way to connect
networked devices to Lokinet without the need to install and configure Lokinet applications on individual
systems. From initial research on compiling Lokinet for ARM, it was demonstrated that it could be
feasibile to use SBC's to create access points which could encrypt, decrypt,
route and onion route traffic over Lokinet while managing dns requirements. In addition it could provide a means
to select and connect to various exits located all around the globe. Through utilizing various robust packages
and coding custom networking configurations LabyrinthAP utilizing Lokinet is able to achieve all this.</p>
<p>This early research and further development led to the current version of LabyrithAP which provides
a solution which is able to connect virtually any networked device to Lokinet without the device
needing to have Lokinet installed, configured or running the application natively. The devices need only
to connect to LabyrinthAP and it will handle the rest of Lokinet's connection requirements.</p>
<p>If you wish to donate to this development the Oxen wallet for LabyrinthAP is:
LA8VDcoJgiv2bSiVqyaT6hJ67LXbnQGpf9Uk3zh9ikUKPJUWeYbgsd9gxQ5ptM2hQNSsCaRETQ3GM9FLDe7BGqcm4ve69bh</p><p>
Additional information can be found on the github repo located at: https://github.com/necro-nemesis/LabyrinthAP.
Further discussions and assistance with using Lokinet is provided on Session in the Lokinet open group.</p><p>
I hope that LabyrinthAP will continue to service your needs for gaining access to Lokinet.</p><p>Thank-you for using LabyrinthAP,</p>
<p>Technical Tumbleweed</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</div>
<h5><?php echo "Your development support is greatly appreciated <br>Independent LabyrinthAP developer TechnicalTumbleweed's OXEN wallet address:"; ?></h5>
<h5><pre><?php echo "LA8VDcoJgiv2bSiVqyaT6hJ67LXbnQGpf9Uk3zh9ikUKPJUWeYbgsd9gxQ5ptM2hQNSsCaRETQ3GM9FLDe7BGqcm4ve69bh"; ?></pre></h5>
</div>
<div class="tab-pane fade" id="Mobile">
<form role="form" action="?page=save_hostapd_conf" method="POST">
<h5>Enter mobile provider apn:</h5>
<label for="apn">Mobile Provider APN:</label>
<input type="text" class="form-control" placeholder="enter apn address here" id="apn" name="apn">
<br/>
<?php echo '<input type="submit" class="btn btn-success" name="apnaddress" value="Set APN" />',
PHP_EOL; ?><h5><?php echo "Your development support is greatly appreciated <br>Independent LabyrinthAP developer TechnicalTumbleweed's OXEN wallet address:"; ?></h5>
<h5><pre><?php echo "LA8VDcoJgiv2bSiVqyaT6hJ67LXbnQGpf9Uk3zh9ikUKPJUWeYbgsd9gxQ5ptM2hQNSsCaRETQ3GM9FLDe7BGqcm4ve69bh"; ?></pre></h5>
</div>
<div class="tab-pane fade" id="whois">
<form role="form" action="?page=save_hostapd_conf" method="POST">
<h5>Enter .loki Address:</h5>
<h5>Enter .loki Address:</h5>
<label for="lokiaddress">Loki Address:</label>
<input type="text" class="form-control" placeholder="enter lokinet address here" id="lokiaddress" name="lokiaddress">
<br/>
<?php
echo '<input type="submit" class="btn btn-success" name="checkaddress" value="Submit" />' , PHP_EOL;
?><h5><?php echo _("Your development support is greatly appreciated | Loki Address:"); ?></h5>
<h5><pre><?php echo _("LA8VDcoJgiv2bSiVqyaT6hJ67LXbnQGpf9Uk3zh9ikUKPJUWeYbgsd9gxQ5ptM2hQNSsCaRETQ3GM9FLDe7BGqcm4ve69bh"); ?></pre></h5>
</div>
<div class="tab-pane fade" id="daemon">
<h4>Lokient Daemon</h4>
<div class="row">
<div class="col-lg-12">
<button type="button" class="btn btn-info" data-toggle="collapse" data-target="#instruct">Instructions</button>
<div id="instruct" class="collapse">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.
</div>
<div class="row">
<div class="form-group col-lg-12">
<h5>Enter a valid bootstrap url below and apply to overwrite the current bootstrap:</h5>
<label for="lokinetbootstrap">Bootstrap url:</label>
<input type="url" class="form-control" placeholder="https://seed.lokinet.org/lokinet.signed" id="lokinetbootstrap" name="lokinetbootstrap">
<br/>
<?php
$filename = '/var/lib/lokinet/lokinet.ini';
if ($lokinetstatus[0] == 0) {
echo '<input type="submit" class="btn btn-success" name="StartDaemon" value="Start Daemon" />' , PHP_EOL;
} else {
echo '<input type="submit" class="btn btn-danger" name="StopDaemon" value="Stop Daemon" />' , PHP_EOL;
}
if (file_exists($filename)) {
echo '<input type="submit" class="btn btn-danger" name="ReGenerateLokinet" value="Regenerate .ini" />' , PHP_EOL;
} else {
echo '<input type="submit" class="btn btn-success" name="GenerateLokinet" value="Generate .ini" />' , PHP_EOL;
} ?>
<input type="submit" class="btn btn-danger" name="ApplyLokinetSettings" value="Re-Bootstrap" />
<h5><?php echo _("Your development support is greatly appreciated | Loki Address:"); ?></h5>
<h5><pre><?php echo _("LA8VDcoJgiv2bSiVqyaT6hJ67LXbnQGpf9Uk3zh9ikUKPJUWeYbgsd9gxQ5ptM2hQNSsCaRETQ3GM9FLDe7BGqcm4ve69bh"); ?></pre></h5>
</form>
</div>
</div>
</div>
</div>
</div>
</div><!-- /.tab-content -->
</div><!-- /.panel-body -->
<div class="panel-footer">Contact Loki user groups on Session to obtain Exit Access</div>
</div><!-- /.panel-primary -->
</div><!-- /.col-lg-12 -->
</div><!-- /.row -->
<?php
<?php echo '<input type="submit" class="btn btn-success" name="checkaddress" value="Submit" />',
PHP_EOL; ?><h5><?php echo "Your development support is greatly appreciated <br>Independent LabyrinthAP developer TechnicalTumbleweed's OXEN wallet address:"; ?></h5>
<h5><pre><?php echo "LA8VDcoJgiv2bSiVqyaT6hJ67LXbnQGpf9Uk3zh9ikUKPJUWeYbgsd9gxQ5ptM2hQNSsCaRETQ3GM9FLDe7BGqcm4ve69bh"; ?></pre></h5>
</div></div>
<?php
}
/**
*
*
*/
function ActivateLokinetConfig()
{
/* Lokinet script commands start HERE
/* Lokinet script commands start HERE
////
//// LOKINET
////
//*/
//START
if (isset($_POST['StartDaemon'])) {
exec('sudo /var/lib/lokinet/lokilaunch.sh start');
DisplayLokinetConfig();
//STOP
} elseif (isset($_POST['StopDaemon'])) {
exec ('sudo /var/lib/lokinet/lokilaunch.sh exitdown');
exec('sudo /var/lib/lokinet/lokilaunch.sh stop');
DisplayLokinetConfig();
//START EXIT
} elseif (isset($_POST['StartExit'])) {
$exit = $_POST['exitaddress'];
$token = $_POST['exitkey'];
$exit=str_replace("'", "", $exit);
$token=str_replace("'", "", $token);
$output = shell_exec("sudo /var/lib/lokinet/lokilaunch.sh exitup '".$exit."' '" .$token."'");
if (isset($_POST["StartDaemon"])) {
exec("sudo /var/lib/lokinet/lokilaunch.sh start");
DisplayLokinetConfig();
//STOP
} elseif (isset($_POST["StopDaemon"])) {
exec("sudo /var/lib/lokinet/lokilaunch.sh exitdown");
exec("sudo /var/lib/lokinet/lokilaunch.sh stop");
DisplayLokinetConfig();
//START EXIT
} elseif (isset($_POST["StartExit"])) {
$exit = $_POST["exitaddress"];
$token = $_POST["exitkey"];
$exit = str_replace("'", "", $exit);
$token = str_replace("'", "", $token);
$output = shell_exec(
"sudo /var/lib/lokinet/lokilaunch.sh exitup '" .
$exit .
"' '" .
$token .
"'"
);
$exitstatus = exec("lokinet-vpn --status");
if ($exitstatus != "no exits") {
?><div class="alert alert-info"><?php
echo "Exit Enabled";
?></div><?php
} else {
?><div class="alert alert-danger"><?php
echo "WARNING EXIT DID NOT CONNECT";
?></div><?php
}
echo "<pre><strong>$output</strong></pre>";
?><form method="post"><?php
echo '<input type="submit" class="btn btn-success" name="Return" value="Return" />' , PHP_EOL;
echo "\n";
?><form><br/><?php
//STOP EXIT
} elseif (isset($_POST['StopExit'])) {
exec ('sudo /var/lib/lokinet/lokilaunch.sh exitdown');
DisplayLokinetConfig();
//GENERATE LOKINET.INI
} elseif (isset($_POST['GenerateLokinet'])) {
?>
<div class="alert alert-success">
Generating Lokinet Configuration
</div>
<?php
$output = shell_exec('sudo /var/lib/lokinet/lokilaunch.sh gen');
echo '<input type="submit" class="btn btn-success" name="Return" value="Return" />', PHP_EOL;
echo "\n";
?><form><br/><?php
//STOP EXIT
} elseif (isset($_POST["StopExit"])) {
exec("sudo /var/lib/lokinet/lokilaunch.sh exitdown");
DisplayLokinetConfig();
//WHOIS
} elseif (isset($_POST["checkaddress"])) {
$address = $_POST["lokiaddress"];
$output = shell_exec("sudo /var/lib/lokinet/lokilaunch.sh whois " . $address . "");
echo "<pre><strong>$output</strong></pre>";
?><form method="post"><?php
echo '<input type="submit" class="btn btn-success" name="Return" value="Return" />' , PHP_EOL;
echo "\n";
?><form><br/><?php
//REGENERATE LOKINET.INI
} elseif (isset($_POST['ReGenerateLokinet'])) {
?>
<div class="alert alert-success">
Regenerating Lokinet Configuration
</div>
<?php
$output = shell_exec('sudo /var/lib/lokinet/lokilaunch.sh gen');
echo "<pre><strong>$output</strong></pre>";
?><form method="post"><?php
echo '<input type="submit" class="btn btn-success" name="Return" value="Return" />' , PHP_EOL;
echo "\n";
?><form><br/><?php
//APPLY LOKINET-BOOTSTRAP
} elseif (isset($_POST['ApplyLokinetSettings'])) {
$bootstrap = $_POST['lokinetbootstrap'];
$bootstrap=str_replace("'", "", $bootstrap);
$output = shell_exec('sudo /var/lib/lokinet/lokilaunch.sh bootstrap '.$bootstrap.'');
$output = preg_replace('#\\x1b[[][^A-Za-z]*[A-Za-z]#', '', $output);
echo "<pre><strong>$output</strong></pre>";
?><form method="post"><?php
echo '<input type="submit" class="btn btn-success" name="Return" value="Return" />' , PHP_EOL;
echo "\n";
?><form><br/><?php
//WHOIS
} elseif (isset($_POST['checkaddress'])) {
$address = $_POST['lokiaddress'];
$output = shell_exec('sudo /var/lib/lokinet/lokilaunch.sh whois '.$address.'');
echo "<pre><strong>$output</strong></pre>";
?><form method="post"><?php
echo '<input type="submit" class="btn btn-success" name="Return" value="Return" />' , PHP_EOL;
echo "\n";
?><form><br/><?php
echo '<input type="submit" class="btn btn-success" name="Return" value="Return" />', PHP_EOL;
echo "\n";
?><form><br/><?php
//Mobile
} elseif (isset($_POST['apnaddress'])) {
$apnvalue = $_POST['apn'];
//Mobile
} elseif (isset($_POST["apnaddress"])) {
$apnvalue = $_POST["apn"];
$file = "/var/lib/lokinet/mobile.sh";
$input = file_get_contents($file);
$parsed = get_string_between($input, "apn='", "',ip");
@ -451,20 +486,13 @@ function ActivateLokinetConfig()
file_put_contents($file, $output);
echo "<pre><strong>Reboot required to start mobile. Reboot now?</strong></pre>";
?><form method="post"><?php
echo '<input type="submit" class="btn btn-success" name="Return" value="Reboot Later" />' , PHP_EOL;
echo '<input type="submit" class="btn btn-success" name="Reboot" value="Activate Now" />' , PHP_EOL;
echo "\n";
?><form><br/><?php
} elseif (isset($_POST['Return'])) {
DisplayLokinetConfig();
} elseif (isset($_POST['Reboot'])) {
shell_exec('sudo reboot now');
}
echo '<input type="submit" class="btn btn-success" name="Return" value="Reboot Later" />', PHP_EOL;
echo '<input type="submit" class="btn btn-success" name="Reboot" value="Activate Now" />', PHP_EOL;
echo "\n";
?><form><br/><?php
} elseif (isset($_POST["Return"])) {
DisplayLokinetConfig();
} elseif (isset($_POST["Reboot"])) {
shell_exec("sudo reboot now");
}
}

@ -1,18 +1,41 @@
<?php
/**
* Raspbian WiFi Configuration Portal
* LabyrinthAP is open source software offered under GNU General Public License v3.0.
* Ongoing development is reliant on voluntary financial support through donations to the project.
* I hope that you find using LabyrithAP beneficial and also hope there's sufficient widespread
* support for it to financially support it's future. Seeing support for it will assist in continued
* improvements as well as adapting it to future requirements.
*
* LabyrinthAP was initially conceived to provide users with a platform agnostic way to connect networked
* devices to Lokinet without the need to install and configure Lokinet applications on individual systems.
* From initial research on compiling Lokinet for ARM, it was demonstrated that it could be feasibile to
* use SBC's to create access points which could encrypt, decrypt, route and onion route traffic over
* Lokinet while managing dns requirements. In addition it could provide a means to select and connect
* to various exits located all around the globe. Through utilizing various robust packages and coding
* custom networking configurations LabyrinthAP utilizing Lokinet is able to achieve all this.
*
* This early research and further development led to the current version of LabyrithAP which provides
* a solution which is able to connect virtually any networked device to Lokinet without the device
* needing to have Lokinet installed, configured or running the application natively. The devices need
* only to connect to LabyrinthAP and it will handle the rest of Lokinet's connection requirements.
*
* If you wish to donate to this development the Oxen wallet for LabyrinthAP is:
* LA8VDcoJgiv2bSiVqyaT6hJ67LXbnQGpf9Uk3zh9ikUKPJUWeYbgsd9gxQ5ptM2hQNSsCaRETQ3GM9FLDe7BGqcm4ve69bh
*
* Additional information can be found on the github repo located at:
* https://github.com/necro-nemesis/LabyrinthAP. Further discussions and assistance with using Lokinet is provided on Session in the Lokinet open group.
*
* I hope that LabyrinthAP will continue to service your needs for gaining access to Lokinet.
*
* Thank-you for using LabyrinthAP,
*
* Technical Tumbleweed
*
* Enables use of simple web interface rather than SSH to control wifi and hostapd on the Raspberry Pi.
* Recommended distribution is Raspbian Server Edition. Specific instructions to install the supported software are
* in the README and original post by @SirLagz. For a quick run through, the packages required for the WebGUI are:
* lighttpd (I have version 1.4.31-2 installed via apt)
* php5-cgi (I have version 5.4.4-12 installed via apt)
* along with their supporting packages, php5 will also need to be enabled.
*
* @author TechnicalTumbleweed (Oxen-> Session Lokinet/Telegram Oxen Community)
* @license GNU General Public License, version 3 (GPL-3.0)
* @version 2.5
* @version 2.7
* @link https://github.com/necro-nemesis/LabyrinthAP
*/
@ -196,7 +219,7 @@ $extraFooterScripts = array();
case "hostapd_conf":
DisplayHostAPDConfig();
break;
case "lokinet_conf":
case "lokinet_conf":
DisplayLokinetConfig();
break;
case "auth_conf":

@ -377,15 +377,16 @@ function patch_system_files() {
#crontab daily lokinet updates and log
cat > /var/spool/cron/crontabs/root <<-'EOF'
check daily for lokinet updates and update as required
logfile=/var/log/lokinet_cron_update.txt
0 1 * * 1-7 sudo apt-get update && sudo apt-get -y install lokinet >> "$logfile" 2>&1
0 1 * * 1-7 sudo apt-get -y autoremove >> "$logfile" 2>&1
0 1 * * 1-7 date >> "$logfile"
# check daily for lokinet updates and update as required
# logfile=/var/log/lokinet_cron_update
# 0 1 * * 1-7 sudo apt-get update && sudo apt-get -y install lokinet >> /var/log/lokinet_cron_update 2>&1
# 0 1 * * 1-7 sudo apt-get -y autoremove >> /var/log/lokinet_cron_update 2>&1
# 0 1 * * 1-7 date >> /var/log/lokinet_cron_update
# restart lokinet on boot
@reboot sleep 60 && /bin/systemctl restart lokinet >> /var/log/lokinet_startup 2>&1
EOF
}
# Optimize configuration of php-cgi.
function optimize_php() {
install_log "Optimize PHP configuration"
@ -440,6 +441,7 @@ function install_raspap() {
update_system_packages
install_dependencies
patch_lokinet_service
set_runlevel_five
create_raspap_directories
common_interfaces
check_for_networkmananger

@ -32,8 +32,17 @@ function patch_lokinet_service() {
install_log "Patching Lokinet Service"
sed -i '/^After=network-online.target/a Wants=dnsmasq.service \nAfter=dnsmasq.service' /lib/systemd/system/lokinet.service
sudo systemctl daemon-reload
}
}
#Avoid race condition between Hostapd and dnsmasq
function set_runlevel_five() {
install_log "Setting Hostapd after DNSMasq init sequence"
sudo mv /etc/rc5.d/S01dnsmasq /etc/rc5.d/S02dnsmasq
sudo mv /etc/rc5.d/S01hostapd /etc/rc5.d/S03hostapd
}
#Remove NetworkManager and install dhcpd if required Armbian.

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save