/** ** ============================== ** O O O OOOO ** O O O O O O ** O O O O O O ** OOOO OOOO O OOO OOOO ** O O O O O O O ** O O O O O O O ** OOOO OOOO O O OOOO ** ============================== ** Dr. Stefan Bosse http://www.bsslab.de ** ** COPYRIGHT: THIS SOFTWARE, EXECUTABLE AND SOURCE CODE IS OWNED ** BY THE AUTHOR(S). ** 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-2017 bLAB ** $CREATED: 23.9.2016 ** $VERSION: 1.1.17 ** ** $INFO: ** ** Standard Request Command Line Application ** ** $ENDOFINFO */ var log = 0; var Io = Require('com/io'); //Io.trace_open('/tmp/std.trace'); if (typeof Shell == 'object') Io.set_stdout(Shell.stdout); var Net = Require('dos/network'); var Sch = Require('dos/scheduler'); var Conn = Require('dos/connection'); var Std = Require('dos/std'); var Dns = Require('dos/dns'); var Cs = Require('dos/capset'); 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 Args = Comp.args; var Status = Net.Status; var Command = Net.Command; var trace = Io.tracing; var options = { afs : undefined, bip:'localhost', bport:3001, broker: true, caps:[], cmd:[Command.STD_TOUCH,Command.STD_AGE], default:false, delay:0, dip : 'localhost', dns : undefined, dports : [], echo:false, env:{}, hostname:Io.hostname(), hostport:undefined, hostsrv:false, http:false, interval:1000, keepalive:true, links:[], maxlive:8, monitor:0, myip:'localhost', print : false, root:'/', run:1, servmode:false, tcpnet:1, verbose:0 }; var help=false; var shift=''; var env={}; options.env=env; var argv = Io.getargs(); var out = function (s) {Io.out('[GC] '+s)}; function err(msg) { out('Error: gc '+Comp.array.tail(argv,2)+' => '+msg); Io.exit(); } if (typeof Shell == 'object') Io.set_args(Shell.args); Args.parse(argv, [ [['-h','-help'],0,function() {help=true}], [['-v','-verbose'],0,function() {options.verbose++;options.echo=true}], [['-d','-default'],0,function() {options.default=true;}], ['-monitor',0,function() {options.monitor++;}], ['-print',0,function() {options.print=true;}], ['-delay',1,function(val) {options.delay=Perv.int_of_string(val);}], ['-interval',1,function(val) {options.interval=Perv.int_of_string(val);}], ['-run',1,function(val) {options.run=Perv.int_of_string(val);}], ['-dns',1,function(val) {options.dns=val;}], ['-afs',1,function(val) {options.afs=val;}], ['-broker',1,function(val){ var tokens = Comp.string.split(':',val); if (tokens.length==1) options.bip=val; else { options.bip=tokens[0]; options.bport=Perv.int_of_string(tokens[1]) } }], ['-dip',1,function(val){options.dip=val}], ['-D',1,function(val){options.dports.push(Perv.int_of_string(val))}], ['-L',2,function(val1,val2){options.links.push([Perv.int_of_string(val1),getip(val2),getipport(val2)])}], ['-nokeepalive',0,function(val){options.keepalive=false;}], ['-T',0,function(val){options.tcpnet=1;options.http=false;}], ['-T2',0,function(val){options.tcpnet=2;options.http=false;}], ['-H',0,function(val){options.http=true;options.tcpnet=0;}], ['-fcap',1,function(val){options.fcap=val}], [function(val){ options.dns=val; }] ],2); if (help) { Io.out('usage: '+argv[0]+' []'+argv[1]); Io.out(' [-H -T -T2] Enable connection service'); Io.out(' T: TCPIP, 1-ch H:HTTP T2: TCPIP, 2-ch'); Io.out(' H: bport, T: bport+100'); Io.out(' (Default: -T)'); Io.out(' [-D ] UDP Server Port'); Io.out(' [-L ] Broker URL (Default: '+options.bip+': HTTP '+options.bport+' TCPNET '+(options.bport+100)+')'); Io.out(' [-dip ] (Default: '+options.dip+')'); Io.out(' [-help -h -v -verbose -monitor]'); Io.out(' [-delay ] Start-up delay'); Io.out(' [-interval ] Loop interval'); Io.out(' [-root ] DNS Root path (default '+options.root+')'); Io.out(' [-afs ] AFS server capability'); Io.out(' [-dns ] DNS server capability'); Io.out(' [-run ] 0:infinite loop'); Io.out(' [-default -d] Ask broker server for default DNS'); return; } options.privhostport = Net.uniqport(); options.pubhostport = Net.prv2pub(options.privhostport); if (options.echo) out('['+Net.Print.port(options.pubhostport)+'] '+argv[1]+' '+ (options.cmd[0]?Command.print(options.cmd[0]):'')+ (options.cmd[1]?' '+Command.print(options.cmd[1]):'')+ ' ' + options.caps); var scheduler = Sch.TaskScheduler(); scheduler.Init(); //scheduler.log(2); // Set-up the network environment .. // typeof options : {http,tcpnet,dports,bip,bport,myip,verbose} var network = Conn.setup(options); var StdInt = Std.StdInt(network.rpc); var DnsInt = Dns.DnsInt(network.rpc); var CsInt = Cs.CsInt(network.rpc); var cap; if (env.rootdir) { DnsInt.set_rootdir(env.rootdir); } var schedules=[]; var stat,data; function action () { var aged, cap, cs, csnew, capp, dir, error, failed0, path, remain, row, rowi, rows, stat=Status.STD_UNKNOWN, touched=0, trash=[], n; function statcb(_stat) {stat=_stat}; function resolve (name,cb) { var cap,cp; if (env.rootdir) { /* ** Look-up from DNS ... */ DnsInt.dns_lookup(env.rootdir,name,function (_stat,_cs) { if (_stat==Status.STD_OK) cb(_stat,CsInt.cs_to_cap(_cs)); else cb(_stat); }) } else if (Io.exists(name)) { /* ** It is a capability file */ cap = Net.cap_of_file(name); if (cap) { env.rootdir=options.dns=CsInt.cs_singleton(cap); cb(Status.STD_OK,cap); } else { err('Invalid capability file: '+name); } } else { /* ** Is it a capability string? */ cp=Net.Parse.capability(name,0); if (cp==undefined) { /* ** It is a port string? */ cp=Net.Parse.port(name,0); if (cp!=undefined) { cap=Net.Capability(cp.port); } } else { cap=cp.cap; } if (cp==undefined) { err('Invalid capability or port: '+name); } env.rootdir=options.dns=CsInt.cs_singleton(cap); cb(Status.STD_OK,cap); } } path=options.root; function scan (rootcs,path) { var stat=Status.STD_UNKNOWN, remain,dir,cs,msg,info, entry; function statcb(_stat,_msg) {stat=_stat;msg=_msg;}; function err(msg) {out(msg); failed++; error=Status.STD_NOTNOW;}; B([ function () { if (options.verbose) out('Scanning '+path+', root='+Cs.Print.capset(rootcs)); DnsInt.dns_list(rootcs,function (_stat,_dir) { stat=_stat; dir=_dir; }); }, function () { rowi=0; if (stat==Status.STD_OK) L( function (index) {rowi=index; return index1) process.exit(2); }); if (options.verbose) out('My host port: '+Net.Print.port(options.pubhostport)); // Start up the network .. network.init(network.start); scheduler.Run();