[CORD-1305] PPPoE Client
Change-Id: Id5ae5ba0ce0cbb89d434fb34d4c42796c61c059e
diff --git a/extensions/pppoe/scripts/apps/pppoeMgmt/httpServer.js b/extensions/pppoe/scripts/apps/pppoeMgmt/httpServer.js
new file mode 100755
index 0000000..d384268
--- /dev/null
+++ b/extensions/pppoe/scripts/apps/pppoeMgmt/httpServer.js
@@ -0,0 +1,162 @@
+/**
+ * httpServer - HTTP server for user's credential
+ */
+var express = require('express');
+var path = require('path');
+var http = require('http');
+var https = require('https');
+var radiusOper = require('./startClient');
+var body_parser = require('body-parser');
+var os=require('os');
+var ifaces = os.networkInterfaces();
+var app = express();
+var fs = require("fs");
+var Promise=require('bluebird');
+var execAsync=Promise.promisify(require('child_process').exec);
+app.use(express.static(path.join(__dirname,'authwebapp')));
+
+var config = {
+ key: fs.readFileSync('./certs/server.key'),
+ cert: fs.readFileSync('./certs/server.crt'),
+ ca: fs.readFileSync('./certs/ca.crt'),
+ requestCert: true,
+ rejectUnauthorized: false
+};
+
+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 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 rmDnsRoute(ipAddr) {
+ //delete blindly, minor side effect
+ var cmd = 'route del ' + ipAddr;
+ execAsync(cmd);
+ console.log(cmd);
+}
+
+function pppoeRmRedirectPkt(ipAddr) {
+ natRecoverPkt('eth1', ipAddr, '80');
+ natRecoverPkt('eth1', ipAddr, '443');
+ connDev('eth1');
+ rmDnsRoute('8.8.8.8');
+}
+
+app.use(body_parser.json());
+app.use(body_parser.urlencoded({ extended: true }));
+
+app.get('/', function (req, res) {
+
+ console.log("===Please login.===" );
+ execAsync('cat adminState.txt').then(function (result) {
+ if (result.indexOf("enable") > 0)
+ {
+ res.sendFile(__dirname+'/authwebapp/login.html');
+ }
+ else
+ {
+ console.log("PPPoE disabled.");
+ res.send('PPPoE disabled.');
+ }
+ }, function (err) {
+ console.error(err);
+ });
+})
+
+app.post('/',function(req,res){
+ console.log("===post request===");
+ var username = req.body.username;
+ var password = req.body.password;
+ console.log("===user:"+username+",pwd:"+password+"===");
+
+ var data = radiusOper.verifyFun(username,password);
+ data.then(function(result){
+ console.log("===verifyFun result:"+result+"===");
+ if(result)
+ {
+ setTimeout(function(){
+ console.log("enter timeout");
+ execAsync("ifconfig").then(function (result) {
+ console.log("result.indexOf :"+result.indexOf("ppp0"));
+ if(result.indexOf("ppp0") >= 0)
+ {
+ console.log("===PPPoE session has set up.===");
+ pppoeRmRedirectPkt(eh1ip);
+ res.setHeader("Access-Control-Allow-Origin", "*");
+ res.jsonp({'result':'Auth successfully!!'});
+ }
+ else
+ {
+ execAsync("poff -a");
+ console.log("===PPPoE session failed.===");
+ res.setHeader("Access-Control-Allow-Origin", "*");
+ res.jsonp({'result':'error!'});
+ }
+ });
+ },5000);
+ }
+ else
+ {
+ execAsync("poff -a");
+ console.log("===PPPoE session failed.===");
+ res.setHeader("Access-Control-Allow-Origin", "*");
+ res.jsonp({'result':'error!'});
+ }
+ });
+});
+
+var eh1ip='a';
+var i = false;
+ifaces['eth1'].forEach(function(details){
+ if (details.family=='IPv6' && i == false)
+ {
+ i = true;
+ eh1ip = details.address;
+ console.log('eh1ip:'+eh1ip);
+ }
+});
+
+var httpPort = "80";
+var httpsPort = "443";
+
+http.createServer(app).listen(httpPort, eh1ip);
+https.createServer(config, app).listen(httpsPort, eh1ip);
+
+console.log("PPPoE Web Server listens on ports " + httpPort + " and " + httpsPort);
+