jam/js/dos/appl/node.js

170 lines
5.0 KiB
JavaScript

/**
** ==================================
** OOOO OOOO OOOO O O OOOO
** O O O O O O O O O
** O O O O O O O O O
** OOOO OOOO OOOO O OOO OOOO
** O O O O O O O O O
** O O O O O O O O O
** OOOO OOOO OOOO OOOO O O OOOO
** ==================================
** BSSLAB, Dr. Stefan Bosse http://www.bsslab.de
**
** COPYRIGHT: THIS SOFTWARE, EXECUTABLE AND SOURCE CODE IS OWNED
** BY THE AUTHOR.
** THIS SOURCE CODE MAY NOT BE COPIED, EXTRACTED,
** MODIFIED, OR OTHERWISE USED IN A CONTEXT
** OUTSIDE OF THE SOFTWARE SYSTEM.
**
** $AUTHORS: Stefan Bosse
** $INITIAL: (C) 2015-2016 BSSLAB
** $CREATED: 8/7/15
** $VERSION: 1.1.2
**
** $INFO:
**
** Generic Network Node
**
** $ENDOFINFO
*/
"use strict";
var log = 0;
var Io = Require('com/io');
//Io.trace_open('/tmp/shell.trace');
var Net = Require('dos/network');
var Buf = Require('dos/buf');
var Sch = Require('dos/scheduler');
var Conn = Require('dos/connection');
var Rpc = Require('dos/rpc');
var Std = Require('dos/std');
var Router = Require('dos/router');
var util = require('util');
var Comp = Require('com/compat');
var assert = Comp.assert;
var String = Comp.string;
var Array = Comp.array;
var Perv = Comp.pervasives;
var Printf = Comp.printf;
var Filename = Comp.filename;
var Obj = Comp.obj;
var Args = Comp.args;
var Status = Net.Status;
var Command = Net.Command;
var Fs = require('fs');
var Dns = Require('dos/dns');
var Cs = Require('dos/capset');
var Getenv = Require('com/getenv');
var Host = Require('dos/host');
var trace = Io.tracing;
var privhostport = Net.uniqport();
var pubhostport = Net.prv2pub(privhostport);
function getip(str) {
var tokens = String.split(':',str);
if (tokens.length==2) return tokens[0];
else if (tokens.length==1) return 'localhost';
else return '';
}
function getipport(str) {
var tokens = String.split(':', str);
if (tokens.length == 2) return Perv.int_of_string(tokens[1]);
else if (tokens.length == 1) return Perv.int_of_string(tokens[0]);
else return '';
}
var dports = [];
var dip = 'localhost';
var links = [];
var bport = 3001;
var bip = 'localhost';
var argv = Io.getargs();
var verbose=0;
var monitor=0;
var report=0;
var help=false;
var todos = [];
var scheduler = Sch.TaskScheduler();
scheduler.Init();
var router = Router.RpcRouter(pubhostport);
var rpc = Rpc.RpcInt(router);
var std = Std.StdInt(rpc);
Args.parse(argv, [
[['-help','-h'],0,function() {help=true;}],
['-bport',1,function(val) {bport=Perv.int_of_string(val);}],
['-bip',1,function(val) {bip=val;}],
['+dport',1,function(val){dports.push(Perv.int_of_string(val))}],
['-dip',1,function(val){dip=val}],
['-info',1,function(val){todos.push([
function () {
var port = Net.Parse.port(val);
var cap = Net.Capability(port.port,Net.Private());
std.std_info(cap,function (stat,msg){
Io.out(Status.print(stat)+': '+msg);
})
}
])}],
['+link',2,function(val1,val2){links.push([Perv.int_of_string(val1),getip(val2),getipport(val2)])}],
[['-v','-verbose'],0,function(val){verbose++;}],
['-monitor',0,function(val){monitor++;}],
['-report',0,function(val){report++;}]
]);
if (help) {
Io.out('usage: '+argv[0]+' '+argv[1]);
Io.out(' [-help -monitor -report]');
Io.out(' [-bport <HTTP Broker server port>] (Default : '+bport+')');
Io.out(' [-bip <HTTP Broker URI>] (Default : '+bip+')');
Io.out(' [+dport <VLC UDP server port>] ');
Io.out(' [-dip <VLC UDP server URI>] (Default : '+dip+')');
Io.out(' [+link <VLC src port>] <VLC dst [URI]:port]');
Io.exit();
}
for (var i in dports) {
var dport = dports[i];
var create = function (dport) {
var vlc = Conn.UdpConnection(Net.uniqport(), dip, dport, undefined, undefined, router);
vlc.init();
vlc.start(function (stat) {
if(stat==Status.STD_OK) {
// Something to connect to ?
var connectit = Array.find(links,function (link) {return link[0]==dport;});
if (connectit != undefined) {
vlc.link(connectit[1],connectit[2]);
vlc.watchdog(true);
}
}
});
vlc.verbose=verbose;
return vlc;
};
create(dport);
}
if (Array.empty(dports)) {
var conn = Conn.HttpConnection(Net.uniqport(), bip, bport);
conn.init();
router.connection_broker(conn);
}
router.monitor=monitor;
router.init();
var hostsrv=Host.HostServer(scheduler,rpc,pubhostport,privhostport);
router.start(100);
if (report) Sch.AddTimer(10000,'Router Status',function(){
Io.out(router.status())
});
if (!Array.empty(todos)) {
Sch.ScheduleBlock(Array.flatten(todos));
}