[CORD-1305] PPPoE Client

Change-Id: Id5ae5ba0ce0cbb89d434fb34d4c42796c61c059e
diff --git a/extensions/pppoe/scripts/apps/pppoeMgmt/checkPNI.js b/extensions/pppoe/scripts/apps/pppoeMgmt/checkPNI.js
new file mode 100755
index 0000000..516f2a8
--- /dev/null
+++ b/extensions/pppoe/scripts/apps/pppoeMgmt/checkPNI.js
@@ -0,0 +1,355 @@
+/**
+ * checkPNI - starts with the system manager input CLI command in ONOS console that enable/disable the PPPoE service.
+ */
+var Promise=require('bluebird');
+var execAsync=Promise.promisify(require('child_process').exec);
+var fs=require('fs');
+var os=require('os');
+var ifaces = os.networkInterfaces();
+var oriGw = '10.6.1.129';
+var dnsFwdr = '8.8.8.8';
+
+
+//ip6tables -I FORWARD 1 -i eth1 -j DROP
+function disconnDev(iface) {
+
+    var cmd = 'ip6tables -w -I FORWARD 1 -i ' + iface + ' -j DROP';
+    var checkCmd = 'ip6tables -w -v -L FORWARD 1';
+    var check = 'DROP       all      ' + iface;
+
+    console.log(checkCmd + ' to check ' + check);
+    execAsync(checkCmd).then(function (result) {
+        console.log("indexOf:" + result.indexOf(check));
+        if (result.indexOf(check) > 0) {
+            console.log("Forward rule exists.");
+        }
+        else {
+            execAsync(cmd);
+            console.log(cmd);
+        }
+    }, function (err) {console.error(err);});
+
+}
+
+//ip6tables -D FORWARD -i eth1 -j DROP
+function connDev(iface) {
+    var cmd = 'ip6tables -w -D FORWARD -i ' + iface + ' -j DROP';
+    var checkCmd = 'ip6tables -w -v -L FORWARD 1';
+    var check = 'DROP       all      ' + iface;
+
+    console.log(checkCmd + ' to check ' + check);
+    execAsync(checkCmd).then(function (result) {
+        console.log("indexOf:" + result.indexOf(check));
+        if (result.indexOf(check) > 0) {
+            execAsync(cmd);
+            console.log(cmd);
+        }
+        else {
+            console.log("Forward rule not exist.");
+        }
+    }, function (err) {console.error(err);});
+
+}
+
+function natRedirectPkt(iface, ipAddr, port) {
+
+    var cmd = 'ip6tables -w -t nat -A PREROUTING -i ' + iface +
+      ' -p tcp --dport ' + port + ' -j DNAT  --to-destination ['
+      + ipAddr + ']:' + port;
+    var checkCmd = 'ip6tables -w -t nat -v -L PREROUTING';
+    var check = 'to:[' + ipAddr + ']:' + port;
+
+    console.log(checkCmd + ' to check ' + check);
+    execAsync(checkCmd).then(function (result) {
+        console.log("indexOf:" + result.indexOf(check));
+        if (result.indexOf(check) > 0) {
+            console.log("nat rule exists.");
+        }
+        else {
+            execAsync(cmd);
+            console.log(cmd);
+        }
+    }, function (err) {console.error(err);});
+
+}
+
+function natRecoverPkt(iface, ipAddr, port) {
+
+    var cmd = 'ip6tables -w -t nat -D PREROUTING -i ' + iface +
+      ' -p tcp --dport ' + port + ' -j DNAT  --to-destination ['
+      + ipAddr + ']:' + port;
+    var checkCmd = 'ip6tables -w -t nat -v -L PREROUTING';
+    var check = 'to:[' + ipAddr + ']:' + port;
+
+    console.log(checkCmd + ' to check ' + check);
+    execAsync(checkCmd).then(function (result) {
+        console.log("indexOf:" + result.indexOf(check));
+        if (result.indexOf(check) > 0) {
+            execAsync(cmd);
+            console.log(cmd);
+        }
+        else {
+            console.log("nat rule not exist.");
+        }
+    }, function (err) {console.error(err);});
+
+}
+
+function natMasquerade(iface) {
+
+    var cmd = 'iptables -w -t nat -A POSTROUTING --out-interface '
+      + iface + ' -j MASQUERADE';
+    var checkCmd = 'iptables -w -t nat -v -L POSTROUTING';
+    var check = 'MASQUERADE  all  --  any    ' + iface;
+
+    console.log(checkCmd + ' to check ' + check);
+    execAsync(checkCmd).then(function (result) {
+        console.log("indexOf:" + result.indexOf(check));
+        if (result.indexOf(check) > 0) {
+            console.log("nat rule exists.");
+        }
+        else {
+            execAsync(cmd);
+            console.log(cmd);
+        }
+    }, function (err) {console.error(err);});
+
+}
+
+function natRmMasquerade(iface) {
+
+    var cmd = 'iptables -w -t nat -D POSTROUTING --out-interface '
+      + iface + ' -j MASQUERADE';
+    var checkCmd = 'iptables -w -t nat -v -L POSTROUTING';
+    var check = 'MASQUERADE  all  --  any    ' + iface;
+
+    console.log(checkCmd + ' to check ' + check);
+    execAsync(checkCmd).then(function (result) {
+        console.log("indexOf:" + result.indexOf(check));
+        if (result.indexOf(check) > 0) {
+            execAsync(cmd);
+            console.log(cmd);
+        }
+        else {
+            console.log("nat rule not exist.");
+        }
+    }, function (err) {console.error(err);});
+
+}
+
+function natRmDfltGw(ipAddr) {
+
+    var cmd = 'route del default gw ' + ipAddr;
+    var checkCmd = 'ip route';
+    var check = 'default via ' + ipAddr;
+
+    console.log(checkCmd + ' to check ' + check);
+
+    execAsync(checkCmd).then(function (result) {
+        console.log("indexOf:" + result.indexOf(check));
+        if (result.indexOf(check) >= 0) {
+            execAsync(cmd);
+            console.log(cmd);
+        }
+        else {
+            console.log("default gw " + ipAddr + " not exists.");
+        }
+    }, function (err) {console.error(err);});
+
+}
+
+function natAddDfltGw(ipAddr, dev) {
+
+    var cmd = 'route add default gw ' + ipAddr + ' dev ' + dev;
+    var checkCmd = 'ip route';
+    var check = 'default via ' + ipAddr;
+
+    console.log(checkCmd + ' to check ' + check);
+
+    execAsync(checkCmd).then(function (result) {
+        console.log("indexOf:" + result.indexOf(check));
+        if (result.indexOf(check) >= 0) {
+            console.log("default gw " + ipAddr + " exists.");
+        }
+        else {
+            execAsync(cmd);
+            console.log(cmd);
+        }
+    }, function (err) {console.error(err);});
+
+}
+
+function setDnsRoute(ipAddr, gw, dev) {
+
+    var cmd = 'route add ' + ipAddr + ' gw ' + gw + ' dev ' + dev;
+    var checkCmd = 'ip route';
+    var check = ipAddr + ' via ' + gw;
+
+    console.log(checkCmd + ' to check ' + check);
+
+    execAsync(checkCmd).then(function (result) {
+        console.log("indexOf:" + result.indexOf(check));
+        if (result.indexOf(check) >= 0) {
+            console.log("route " + ipAddr + " exists.");
+        }
+        else {
+            execAsync(cmd);
+            console.log(cmd);
+        }
+    }, function (err) {console.error(err);});
+
+}
+
+function rmDnsRoute(ipAddr) {
+
+    var cmd = 'route del ' + ipAddr;
+    var checkCmd = 'ip route';
+    var check = ipAddr + ' via';
+
+    console.log(checkCmd + ' to check ' + check);
+
+    execAsync(checkCmd).then(function (result) {
+        console.log("indexOf:" + result.indexOf(check));
+        if (result.indexOf(check) >= 0) {
+            execAsync(cmd);
+            console.log(cmd);
+        }
+        else {
+            console.log("route " + ipAddr + " not exists.");
+        }
+    }, function (err) {console.error(err);});
+
+}
+
+function pppoeMasquerade() {
+    natMasquerade('ppp0');
+}
+
+function pppoeRmMasquerade() {
+    natRmMasquerade('ppp0');
+}
+
+function pppoeRedirectPkt(ipAddr) {
+    natRedirectPkt('eth1', ipAddr, '80');
+    natRedirectPkt('eth1', ipAddr, '443');
+    disconnDev('eth1');
+}
+
+function pppoeRmRedirectPkt(ipAddr) {
+   natRecoverPkt('eth1', ipAddr, '80');
+   natRecoverPkt('eth1', ipAddr, '443');
+   connDev('eth1');
+}
+
+function pppoeSetRoute() {
+    natRmDfltGw(oriGw);
+    setDnsRoute(dnsFwdr, oriGw, 'eth0');
+}
+
+function pppoeRmRoute() {
+    natAddDfltGw(oriGw, 'eth0');
+    rmDnsRoute(dnsFwdr);
+}
+
+module.exports = {
+    check:function(adminState,endSession){
+        var adminEnable = "enable";
+        var adminDisable = "disable";
+        return execAsync("cat adminState.txt ").then(function (result) {
+            var i = false;
+            ifaces['eth1'].forEach(function(details){
+                if (details.family=='IPv6' && i == false) 
+                {
+                    i = true;
+                    eh1ip = details.address;
+                    console.log('eh1ip:'+eh1ip);
+                }
+
+            });
+            console.log("result:"+ result);
+            if(adminState == adminEnable)
+            {
+                if(result.indexOf(adminDisable) > 0  && endSession == false)
+                {
+                    pppoeRedirectPkt(eh1ip);
+                    pppoeMasquerade();
+                    pppoeSetRoute();
+                    var writeData = '"admin-state": "enable","end-session": "false"';
+                    console.log("writeData :"+writeData);
+                    fs.writeFile('adminState.txt',writeData, function(err){
+                        if(err) throw err;
+                        console.log("write success.");
+                    });
+                    return true;
+                }
+                else if (result.indexOf(adminEnable) > 0 && endSession == true)
+                {
+                    return execAsync('ps -ef|grep pppd').then(function (result) {
+                        console.log("indexOf:"+result.indexOf("call provider"));
+                        if (result.indexOf("call provider") > 0)
+                        {
+                            execAsync("poff -a");
+                            pppoeRedirectPkt(eh1ip);
+                            pppoeSetRoute();
+                            console.log("poff ok.");
+                            var writeData = '"admin-state": "enable","end-session": "true"';
+                            console.log("writeData :"+writeData);
+                            fs.writeFile('adminState.txt',writeData, function(err){
+                                if(err) throw err;
+                                console.log("write success.");
+                                
+                            });    
+                            return true;
+                        }
+                    }, function (err) {
+                        console.error(err);
+                        return false;
+                    });
+                   
+                }
+                else
+                {
+                    console.log("NO enable case");
+                    return false;
+                }
+            }
+            else if(adminState == adminDisable)
+            {
+                if (result.indexOf(adminEnable) > 0 && endSession == false)
+                {
+                    return execAsync('ps -ef|grep pppd').then(function (result) {
+                        console.log("indexOf:"+result.indexOf("call provider"));
+                        if (result.indexOf("call provider") > 0)
+                        {
+                            execAsync("poff -a");
+                            console.log("poff ok.");
+                        }
+
+                        pppoeRmRedirectPkt(eh1ip);
+                        pppoeRmMasquerade();
+                        pppoeRmRoute();
+
+                        var writeData = '"admin-state": "disable","end-session": "false"';
+                        console.log("writeData :"+writeData);
+                        fs.writeFile('adminState.txt',writeData, function(err){
+                            if(err) throw err;
+                            console.log("write success.");
+                        });
+                        return true;
+                    }, function (err) {
+                        console.error(err);
+                        return false;
+                    });
+                }
+                else
+                {
+                    console.log("NO disable case");
+                    return false;
+                }                    
+            }
+        }, function (err) {
+            console.log("cat adminState.txt fail");
+            return false;
+        });
+    }
+}