mirror of
https://github.com/hak5/nano-tetra-modules.git
synced 2025-10-29 16:58:09 +00:00
240 lines
8.9 KiB
PHP
240 lines
8.9 KiB
PHP
<?php namespace pineapple;
|
|
|
|
/***
|
|
Modem Manager <api/module.php>
|
|
Written by Foxtrot <foxtrot@realloc.me>
|
|
Distributed under the MIT Licence <https://opensource.org/licenses/MIT>
|
|
***/
|
|
|
|
class ModemManager extends Module
|
|
{
|
|
public function route()
|
|
{
|
|
switch ($this->request->action) {
|
|
case 'checkDepends':
|
|
$this->checkDepends();
|
|
break;
|
|
|
|
case 'installDepends':
|
|
$this->installDepends();
|
|
break;
|
|
|
|
case 'removeDepends':
|
|
$this->removeDepends();
|
|
break;
|
|
|
|
case 'getUSB':
|
|
$this->getUSB();
|
|
break;
|
|
|
|
case 'getTTYs':
|
|
$this->getTTYs();
|
|
break;
|
|
|
|
case 'checkConnection':
|
|
$this->checkConnection();
|
|
break;
|
|
|
|
case 'setConnection':
|
|
$this->setConnection();
|
|
break;
|
|
|
|
case 'unsetConnection':
|
|
$this->unsetConnection();
|
|
break;
|
|
|
|
case 'loadConfiguration':
|
|
$this->loadConfiguration();
|
|
break;
|
|
|
|
case 'saveConfiguration':
|
|
$this->saveConfiguration();
|
|
break;
|
|
|
|
case 'resetConfiguration':
|
|
$this->resetConfiguration();
|
|
break;
|
|
}
|
|
}
|
|
|
|
private function checkDepends()
|
|
{
|
|
/* Check dependencies */
|
|
if(empty($this->checkDependency('comgt'))) {
|
|
$this->response = array('installed' => false);
|
|
} else {
|
|
$this->response = array('installed' => true);
|
|
}
|
|
}
|
|
|
|
private function installDepends()
|
|
{
|
|
/* Install dependencies */
|
|
$this->execBackground('opkg update && opkg install comgt wwan uqmi');
|
|
$this->response = array("installing" => true);
|
|
|
|
}
|
|
|
|
private function removeDepends()
|
|
{
|
|
/* Remove dependencies */
|
|
$this->execBackground('opkg remove comgt wwan uqmi');
|
|
$this->response = array('success' => true);
|
|
}
|
|
|
|
private function getUSB()
|
|
{
|
|
/* Execute 'lsusb' and capture its output in the $lsusb variable.
|
|
Then split the output by its newlines. */
|
|
exec('lsusb', $lsusb);
|
|
$lsusb = implode("\n", $lsusb);
|
|
|
|
$this->response = array('lsusb' => $lsusb);
|
|
}
|
|
|
|
private function getTTYs()
|
|
{
|
|
exec('ls /dev/ttyUSB* && ls /dev/cdc-wdm* && ls /dev/ttyACM*', $TTYs);
|
|
|
|
if (empty($TTYs)) {
|
|
$this->response = array('success' => false,
|
|
'availableTTYs' => false);
|
|
} else {
|
|
$TTYs = implode("\n", $TTYs);
|
|
$this->response = array('success' => true,
|
|
'availableTTYs' => $TTYs);
|
|
}
|
|
}
|
|
|
|
private function checkConnection()
|
|
{
|
|
/* Check the connection of the wan2 interface. */
|
|
if(file_exists('/sys/class/net/3g-wan2/carrier')) {
|
|
$this->response = array('status' => 'connected');
|
|
exec('iptables -t nat -A POSTROUTING -s 172.16.42.0/24 -o 3g-wan2 -j MASQUERADE');
|
|
exec('iptables -A FORWARD -s 172.16.42.0/24 -o 3g-wan2 -j ACCEPT');
|
|
exec('iptables -A FORWARD -d 172.16.42.0/24 -m state --state ESTABLISHED,RELATED -i 3g-wan2 -j ACCEPT');
|
|
} else {
|
|
$this->response = array('status' => 'disconnected');
|
|
}
|
|
|
|
}
|
|
|
|
private function setConnection()
|
|
{
|
|
/* Set the connection of the wan2 interface. */
|
|
$this->execBackground('ifup wan2');
|
|
$this->response = array('status' => 'connecting');
|
|
}
|
|
|
|
private function unsetConnection()
|
|
{
|
|
/* Unset the connection of the wan2 interface. */
|
|
$this->execBackground('ifdown wan2');
|
|
$this->response = array('status' => 'disconnected');
|
|
}
|
|
|
|
private function loadConfiguration()
|
|
{
|
|
/* For easier code reading, assign a variable for each bit of information we require from the system.
|
|
Read more about UCI at https://wiki.openwrt.org/doc/uci.
|
|
For more information about the WiFi Pineapple API, visit https://wiki.wifipineapple.com. */
|
|
$interface = $this->uciGet('network.wan2.ifname');
|
|
$protocol = $this->uciGet('network.wan2.proto');
|
|
$service = $this->uciGet('network.wan2.service');
|
|
$vendorid = $this->uciGet('network.wan2.currentVID');
|
|
$productid = $this->uciGet('network.wan2.currentPID');
|
|
$device = $this->uciGet('network.wan2.device');
|
|
$apn = $this->uciGet('network.wan2.apn');
|
|
$username = $this->uciGet('network.wan2.username');
|
|
$password = $this->uciGet('network.wan2.password');
|
|
$dns = $this->uciGet('network.wan2.dns');
|
|
$peerdns = $this->uciGet('network.wan2.peerdns');
|
|
$pppredial = $this->uciGet('network.wan2.ppp_redial');
|
|
$defaultroute = $this->uciGet('network.wan2.defaultroute');
|
|
$keepalive = $this->uciGet('network.wan2.keepalive');
|
|
$pppdoptions = $this->uciGet('network.wan2.pppd_options');
|
|
|
|
/* Now send a response inside of an array, with keys being 'interface', 'protocol' etc
|
|
and their values being those we obtained from uciGet(). */
|
|
$this->response = array('success' => true,
|
|
'interface' => $interface,
|
|
'protocol' => $protocol,
|
|
'service' => $service,
|
|
'vendorid' => $vendorid,
|
|
'productid' => $productid,
|
|
'device' => $device,
|
|
'apn' => $apn,
|
|
'username' => $username,
|
|
'password' => $password,
|
|
'dns' => $dns,
|
|
'peerdns' => $peerdns,
|
|
'pppredial' => $pppredial,
|
|
'defaultroute' => $defaultroute,
|
|
'keepalive' => $keepalive,
|
|
'pppdoptions' => $pppdoptions);
|
|
}
|
|
|
|
private function saveConfiguration()
|
|
{
|
|
/* In the same way as loadConfiguration(), get the desired information and assign it to a variable.
|
|
However this time get the data that was sent with the request from the JS. */
|
|
$interface = $this->request->interface;
|
|
$protocol = $this->request->protocol;
|
|
$service = $this->request->service;
|
|
$vendorid = $this->request->vendorid;
|
|
$productid = $this->request->productid;
|
|
$device = $this->request->device;
|
|
$apn = $this->request->apn;
|
|
$username = $this->request->username;
|
|
$password = $this->request->password;
|
|
$dns = $this->request->dns;
|
|
$peerdns = $this->request->peerdns;
|
|
$pppredial = $this->request->pppredial;
|
|
$defaultroute = $this->request->defaultroute;
|
|
$keepalive = $this->request->keepalive;
|
|
$pppdoptions = $this->request->pppdoptions;
|
|
|
|
/* Using the APIs uciSet() function, set the UCI properties to
|
|
what the JS request gave us. */
|
|
$this->uciSet('network.wan2', 'interface');
|
|
$this->uciSet('network.wan2.ifname', $interface);
|
|
$this->uciSet('network.wan2.proto', $protocol);
|
|
$this->uciSet('network.wan2.service', $service);
|
|
$this->uciSet('network.wan2.currentVID', $vendorid);
|
|
$this->uciSet('network.wan2.currentPID', $productid);
|
|
$this->uciSet('network.wan2.device', $device);
|
|
$this->uciSet('network.wan2.apn', $apn);
|
|
$this->uciSet('network.wan2.peerdns', $peerdns);
|
|
$this->uciSet('network.wan2.ppp_redial', $pppredial);
|
|
$this->uciSet('network.wan2.defaultroute', $defaultroute);
|
|
$this->uciSet('network.wan2.keepalive', $keepalive);
|
|
$this->uciSet('network.wan2.pppd_options', $pppdoptions);
|
|
|
|
if(!empty($username)) {
|
|
$this->uciSet('network.wan2.username', $username);
|
|
}
|
|
if (!empty($password)) {
|
|
$this->uciSet('network.wan2.password', $password);
|
|
}
|
|
if(!empty($dns)) {
|
|
$this->uciSet('network.wan2.dns', $dns);
|
|
}
|
|
|
|
unlink("/etc/modules.d/60-usb-serial");
|
|
exec("echo 'usbserial vendor=0x$vendorid product=0x$productid maxSize=4096' > /etc/modules.d/60-usb-serial");
|
|
|
|
$this->response = array('success' => true);
|
|
}
|
|
|
|
private function resetConfiguration()
|
|
{
|
|
/* Delete the network.wan2 section */
|
|
exec('uci del network.wan2');
|
|
exec('uci commit');
|
|
unlink('/etc/modules.d/60-usb-serial');
|
|
|
|
$this->response = array('success' => true);
|
|
}
|
|
}
|