From b3cfbc069e65cd1a7586e1a4bdf9233e83801b3e Mon Sep 17 00:00:00 2001 From: sbosse Date: Mon, 21 Jul 2025 22:47:46 +0200 Subject: [PATCH] Mon 21 Jul 22:43:21 CEST 2025 --- js/dos/appl/dns.js | 284 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100644 js/dos/appl/dns.js diff --git a/js/dos/appl/dns.js b/js/dos/appl/dns.js new file mode 100644 index 0000000..eb06213 --- /dev/null +++ b/js/dos/appl/dns.js @@ -0,0 +1,284 @@ +/** + ** ============================== + ** 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) 2006-2017 bLAB + ** $CREATED: 8-7-15 by sbosse. + ** $VERSION: 1.2.5 + ** + ** $INFO: + ** + ** DOS: DNS Top-level + ** + ** $ENDOFINFO + */ +"use strict"; + +var Io = Require('com/io'); +//Io.trace_open('/tmp/afs.trace'); + +var Net = Require('dos/network'); +var Status = Net.Status; +var Command = Net.Command; +var Rights = Net.Rights; +var Sch = Require('dos/scheduler'); +var Conn = Require('dos/connection'); +var Buf = Require('dos/buf'); +var Rpc = Require('dos/rpc'); +var Std = Require('dos/std'); +var Afs = Require('dos/afs'); +var DnsInt = Require('dos/dns'); +var Dns = Require('dos/dns_srv_common'); +var DnsSrv = Require('dos/dns_srv'); +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 div = Comp.div; +var Fs = Require('fs'); +var HostSrv = Require('dos/hostsrv'); +var Args = Comp.args; + +var trace = Io.tracing; + +var options = { + cols : DnsInt.DNS_DEFAULT_COLS, + colmasks : DnsInt.DNS_DEFAULT_RIGHTS, + create:false, + blocksize:512, + bip:'localhost', + bport:3001, + broker: true, + dcapf:'dns.cap', + dip:'localhost', + dir:'/tmp', + dports:[], + env:{}, + fcapf:'afs.cap', + fs_caps:[], + hostname:Io.hostname(), + hostport:undefined, + hostsrv:false, + http:false, + keepalive:true, + links:[], + monitor:0, + myip:'localhost', + ndirs:1024, + overwrite:false, + part:'dns.inode', + setdefault:false, + shunk:10000, + tcpnet:1, + verbose:0 +}; + + + +var help=false; +var todo = []; + +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 argv = Io.getargs(); +Args.parse(argv, [ + [['-h','-help'],0,function() {help=true}], + [['-v','-verbose'],0,function() {options.verbose++;}], + ['-monitor',0,function(val){options.monitor++;}], + ['-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]) + } + }], + [['-default','-d'],0,function() {options.setdefault=true;}], + ['-dip',1,function(val){options.dip=val}], + ['-overwrite',0,function() {options.overwrite=true;}], + ['-create',0,function() {options.create=true;}], + ['-ndirs',1,function(val) {options.ndirs=Perv.int_of_string(val);}], + ['-blocksize',1,function(val) {options.blocksize=Perv.int_of_string(val);}], + ['-dir',1,function(val){options.dir=val}], + ['-part',1,function(val) {options.part=val;}], + ['-fcap',1,function(val) { + var cp = Net.Parse.capability(val); + if (cp!=undefined) + options.fs_caps.push(cp.cap); + else { + /* + ** Path to capability file? + */ + var cap = Net.cap_of_file(options.dir+'/'+val); + if (cap!=undefined) { + Io.out('[DNS] Got AFS capability from file '+options.dir+'/'+val); + options.fs_caps.push(cap); + } + }}], + ['-dcap',1,function(val) {options.dcapf=val;}], + ['-nokeepalive',0,function(val){options.keepalive=false;}], + ['-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)])}], + ['-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;}] +]); + +options.part = options.dir+'/'+options.part; +options.dcapf = options.dir+'/'+options.dcapf; +options.fcapf = options.dir+'/'+options.fcapf; + + +if (help) { + Io.out('usage: ' + process.argv[0] + ' ' + process.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(' [-default -d] Set this server as default and notify broker server (Default: false).'); + Io.out(' [-help -h -v -verbose -monitor]'); + Io.out(' [-create -overwrite]'); + Io.out(' [-ndirs ' + options.ndirs + ' -blocksize ' + options.blocksize + ']'); + Io.out(' [-part ' + options.part + ' -dcap ' + options.dcapf + ']'); + Io.out(' [-fcap ' + '] (Default: '+options.fpcaf+')'); + return; +} + + + +if (Array.length(options.fs_caps)==0) { + /* + ** Try to get AFS capability from file system... + */ + var cap = Net.cap_of_file(options.fcapf); + if (cap!=undefined) { + options.fs_caps.push(cap); + Io.out('[DNS] Got AFS capability from file '+options.fcapf); + } +} +if (Array.length(options.fs_caps)==1) options.fs_caps.push(Net.nilcap); + + +options.privhostport = Net.uniqport(); +options.pubhostport = Net.prv2pub(options.privhostport); +var scheduler = Sch.TaskScheduler(); +scheduler.Init(); + +// Set-up the network environment .. +// typeof options : {http,tcpnet,dports,bip,bport,myip,verbose} +var network = Conn.setup(options); + + +var server = DnsSrv.Server(network.rpc,options); +var stat=Status.STD_OK; +server.init(); + +if (options.create) + todo.push([ + function () { + server.create_fs('mydirs',options.ndirs,options.blocksize,options.cols,options.colmasks, + options.part,options.fs_caps,true, function (_stat) { + stat=_stat; + }); + }, + function () { + if (stat!=Status.STD_OK) + Io.err('[DNS] Creation of DNS failed: '+Status.print(stat)); + else + Io.out('[DNS] Finished.') + } + ]); + +todo.push([ + function () { + server.open_fs(options.part,Dns.Dns_cache_parameter(2*div(options.ndirs*Dns.DEF_INODE_SIZE,Dns.DEF_BLOCK_SIZE),1,100,30), function (_stat) { + stat=_stat; + }); + }, + function () { + if (stat!=Status.STD_OK) + Io.err('[DNS] Opening of DNS failed: '+Status.print(stat)); + else + Io.out('[DNS] Finished.') + } +]); +var hostsrv; +if (options.hostsrv) + hostsrv = HostSrv.HostServer( + scheduler, + rpc,options, + 'DNS.'+options.hostname + ); + + + +//Io.out(server.afs_stat()); +todo.push([ + function () { + for(var i=0;i<4;i++) { + server.dns_start_server(i,scheduler); + } + options.env.dns_def= + Net.Capability(server.dns_super.dns_putport, + Net.prv_encode(server.rootdir.dd_objnum,Rights.PRV_ALL_RIGHTS,server.rootdir.dd_random)); + Io.out('[DNS] Super Capability '+Net.Print.capability(options.env.dns_def)); + Io.out('[DNS] Publishing Super Capability in file '+options.dcapf); + Net.cap_to_file(options.env.dns_def,options.dcapf); + if (options.setdefault) + network.notify('DNS',Net.Print.capability(options.env.dns_def)); + + }]); + + +todo=Array.flatten(todo); +Sch.ScheduleBlock(todo, function (e) { + Io.out('[DNS] Caught error: '+e+'. Exiting.'); + Io.exit(); +}); + +process.on('SIGINT', function () { + Io.out('Got SIGINT ..'); + server.exit(); + process.exit(2); +}); + +// Start up the network .. +network.init(network.start); +scheduler.Run();