aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/fil/libre/repwifiapp/helpers/Engine6p0.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/fil/libre/repwifiapp/helpers/Engine6p0.java')
-rw-r--r--app/src/fil/libre/repwifiapp/helpers/Engine6p0.java360
1 files changed, 360 insertions, 0 deletions
diff --git a/app/src/fil/libre/repwifiapp/helpers/Engine6p0.java b/app/src/fil/libre/repwifiapp/helpers/Engine6p0.java
new file mode 100644
index 0000000..24096d2
--- /dev/null
+++ b/app/src/fil/libre/repwifiapp/helpers/Engine6p0.java
@@ -0,0 +1,360 @@
+//
+// Copyright 2017 Filippo "Fil" Bergamo <fil.bergamo@riseup.net>
+//
+// This file is part of RepWifiApp.
+//
+// RepWifiApp is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// RepWifiApp is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with RepWifiApp. If not, see <http://www.gnu.org/licenses/>.
+//
+// ********************************************************************
+
+package fil.libre.repwifiapp.helpers;
+
+import fil.libre.repwifiapp.Commons;
+
+
+public class Engine6p0 extends Engine{
+
+ @Override
+ protected String getCmdWpaStart(){
+ return "wpa_supplicant -B -dd -i" + Commons.INTERFACE_NAME + " -C" + Commons.SOCKET_DIR + " -P" + Commons.PID_FILE + " -I" + Commons.OVERLAY_FILE + " -e" + Commons.ENTROPY_FILE;
+ }
+
+ @Override
+ public boolean connect(AccessPointInfo info){
+
+ killPreviousConnections();
+
+ if (info == null){
+ Utils.logDebug("Engine's connect() received a null AccessPointInfo");
+ return false;
+ }
+
+ //clear any previously set network
+ if (! destroyNetwork()){
+ Utils.logDebug("Unable to ndc destroy network");
+ return false;
+ }
+
+ //clear interface's ip
+ if (! clearAddrs()){
+ Utils.logDebug("Unable to ndc clearaddrs");
+ return false;
+ }
+
+ //bring up interface
+ if(! interfaceUp()){
+ Utils.logDebug("Unable to bring up interface.");
+ return false;
+ }
+
+ //launch wpa_supplicant specifying our custom configuration and the socket file
+ if (! executeRootCmd(getCmdWpaStart())){
+ Utils.logDebug("Unable to run wpa start");
+ return false;
+ }
+
+ //create new network and get network id
+ String netID = createNetworkGetId();
+ if (netID == null){
+ Utils.logDebug("Unable to fetch network id");
+ return false;
+ }
+
+ //set network SSID
+ if (! setNetworkSSID(info.getSSID(), netID)){
+ Utils.logDebug("Failed to set network ssid");
+ return false;
+ }
+
+ //set password (if any)
+ if(! setNetworkPSK(info, netID)){
+ Utils.logDebug("Failed to set network psk");
+ return false;
+ }
+
+ // select the network we just created
+ if (! selectNetwork(netID)){
+ Utils.logDebug("Unable to wpa_cli select network");
+ return false;
+ }
+
+ //enable the newtork
+ if (! enableNetwork(netID)){
+ Utils.logDebug("Unable to wpa_cli enable_newtork");
+ return false;
+ }
+
+ //try to reassociate to Access Point
+ if (! reassociate()){
+ Utils.logDebug("Unable to wpa_cli reassociate");
+ return false;
+ }
+
+ //get DHCP
+ Utils.logDebug("Attempt to run dhcpcd..");
+ if (!runDhcpcd()){
+ Utils.logDebug("Failed to run dhcpcd");
+ return false;
+ }
+
+ //try to fetch gateway
+ String gw = getGateway();
+ if (gw == null || gw.trim().length() < 7){
+ //failed to get gateway
+ Utils.logDebug("Failed to get gateway");
+ return false;
+ }
+
+ if (! executeRootCmd("ndc network create 1")){
+ Utils.logDebug("Failed to wpa_cli network create 1 ");
+ return false;
+ }
+
+ if (! executeRootCmd("ndc network interface add 1 " + Commons.INTERFACE_NAME)){
+ Utils.logDebug("Failed to add interface.");
+ return false;
+ }
+
+ // set route to gateway for all traffic
+ if (! executeRootCmd("ndc network route add 1 " + Commons.INTERFACE_NAME + " 0.0.0.0/0 " + gw)){
+ Utils.logDebug("Failed to add route to gateway");
+ return false;
+ }
+
+ //set DNS
+ if (! executeRootCmd("ndc resolver setnetdns 1 " + " " + DNS1 + " " + DNS2)){
+ Utils.logDebug("Failed to set DNS");
+ return false;
+ }
+
+ //use network
+ if (! executeRootCmd("ndc network default set 1")){
+ Utils.logDebug("Failed to set network as default");
+ return false;
+ }
+
+ //TODO
+ //implement wpa_cli query for status
+ //in order to be sure that connection is extablished
+
+ return true;
+
+
+
+ }
+
+ private String createNetworkGetId(){
+
+ try {
+
+ RootCommand su = new RootCommand(getCmdWpaCli() + " add_network");
+ if(su.execute() == 0){
+ String out = su.getOutput();
+ if (out == null || out.trim().equals("")){
+ return null;
+ }
+ else {
+ return out.replace("\n", "");
+ }
+ }
+ else {
+ return null;
+ }
+
+ } catch (Exception e) {
+ Utils.logError("Error while creating network", e);
+ return null;
+ }
+
+ }
+
+ private boolean destroyNetwork(){
+ return executeRootCmd("ndc network destroy 1");
+ }
+
+ private boolean setNetworkSSID(String ssid, String networkID){
+
+ try {
+
+ RootCommand su = new RootCommand(getCmdWpaCli() + " set_network " + networkID + " ssid '\"" + ssid + "\"'" );
+ if (su.execute() == 0){
+ String out = su.getOutput();
+ if (out != null && out.trim().replace("\n", "").equals("OK")){
+ return true;
+ }else {
+ return false;
+ }
+ }
+ else{
+ return false;
+ }
+
+ } catch (Exception e) {
+ Utils.logError("Error while setting network SSID", e);
+ return false;
+ }
+
+ }
+
+ private boolean setNetworkPSK(AccessPointInfo info, String networkID){
+
+ try {
+
+ String cmdSetPass = null;
+ if (info.needsPassword()){
+ cmdSetPass = getCmdWpaCli() + " set_network " + networkID + " psk '\"" + info.getPassword() + "\"'";
+ }
+ else{
+ cmdSetPass = getCmdWpaCli() + " set_network " + networkID + " key_mgmt NONE";
+ }
+
+ RootCommand su = new RootCommand(cmdSetPass);
+ if (su.execute() == 0){
+ String out = su.getOutput();
+ if (out != null && out.trim().replace("\n", "").equals("OK")){
+ return true;
+ }else {
+ return false;
+ }
+ }
+ else{
+ return false;
+ }
+
+ } catch (Exception e) {
+ Utils.logError("Error while setting network PSK", e);
+ return false;
+ }
+
+
+ }
+
+ private boolean selectNetwork(String networkID){
+
+ try {
+
+ RootCommand su = new RootCommand(getCmdWpaCli() + " select_network " + networkID);
+ if (su.execute() == 0){
+ String out = su.getOutput();
+ if (out != null && out.trim().replace("\n", "").equals("OK")){
+ return true;
+ }else {
+ return false;
+ }
+ }
+ else{
+ return false;
+ }
+
+ } catch (Exception e) {
+ Utils.logError("Error while selecting network", e);
+ return false;
+ }
+
+ }
+
+ private boolean enableNetwork(String networkID){
+
+ try {
+
+ RootCommand su = new RootCommand(getCmdWpaCli() + " enable_network " + networkID);
+ if (su.execute() == 0){
+ String out = su.getOutput();
+ if (out != null && out.trim().replace("\n", "").equals("OK")){
+ return true;
+ }else {
+ return false;
+ }
+ }
+ else{
+ return false;
+ }
+
+ } catch (Exception e) {
+ Utils.logError("Error while enabling network", e);
+ return false;
+ }
+
+ }
+
+ private boolean reassociate(){
+
+ try {
+
+ RootCommand su = new RootCommand(getCmdWpaCli() + " reassociate");
+ if (su.execute() == 0){
+ String out = su.getOutput();
+ if (out != null && out.trim().replace("\n", "").equals("OK")){
+ return true;
+ }else {
+ return false;
+ }
+ }
+ else{
+ return false;
+ }
+
+ } catch (Exception e) {
+ Utils.logError("Error while reassociating network", e);
+ return false;
+ }
+
+ }
+
+ private String getGateway(){
+
+ try {
+
+ RootCommand su = new RootCommand("ip route show dev " + Commons.INTERFACE_NAME);
+ if (su.execute() != 0){
+ Utils.logDebug("command failed show route");
+ return null;
+ }
+
+ //read command output
+ String out = su.getOutput();
+ if (out == null){
+ return null;
+ }
+
+ String[] lines = out.split("\n");
+
+ for (String l : lines){
+
+ if (l.contains("default via")){
+
+ String[] f = l.split(" ");
+ if (f.length > 2){
+
+ //found route's address:
+ return f[2];
+
+ }
+ }
+ }
+
+ return null;
+
+ } catch (Exception e) {
+ Utils.logError("Error while trying to fetch route",e);
+ return null;
+ }
+
+ }
+
+ private boolean clearAddrs(){
+ return executeRootCmd("ndc interface clearaddrs " + Commons.INTERFACE_NAME);
+ }
+
+} \ No newline at end of file