diff --git a/js/dos/appl/afs.js b/js/dos/appl/afs.js new file mode 100644 index 0000000..a839169 --- /dev/null +++ b/js/dos/appl/afs.js @@ -0,0 +1,240 @@ +/** + ** ============================== + ** 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: 21-5-15 by sbosse. + ** $VERSION: 1.2.5 + ** + ** $INFO: + ** + ** DOS: AFS Top-level module + ** + ** $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 AfsSrv = Require('dos/afs_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 = { + create:false, + blocksize:512, + bip:'localhost', + bport:3001, + broker: true, + dip:'localhost', + dir:'/tmp', + dports:[], + env:{}, + fcapf:'afs.cap', + hostname:Io.hostname(), + hostport:undefined, + hostsrv:false, + http:false, + keepalive:true, + links:[], + monitor:0, + myip:'localhost', + nblocks:65536, + ninodes:1024, + overwrite:false, + partA:'afs.inode', + partB:'afs.data', + 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++;}], + ['-hostsrv',0,function(val){options.hostsrv=true;}], + ['-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;}], + ['-nblocks',1,function(val) {options.nblocks=Perv.int_of_string(val);}], + ['-ninodes',1,function(val) {options.ninodes=Perv.int_of_string(val);}], + ['-blocksize',1,function(val) {options.blocksize=Perv.int_of_string(val);}], + ['-dir',1,function(val){options.dir=val}], + ['-partA',1,function(val) {options.partA=val;}], + ['-partB',1,function(val) {options.partB=val;}], + ['-fcap',1,function(val) {options.fcapf=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;}], + ['-T2',0,function(val){options.tcpnet=2;}], + ['-H',0,function(val){options.http=true;}] +]); + + +options.partA = options.dir+'/'+options.partA; +options.partB = options.dir+'/'+options.partB; +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(' [-hostsrv] Start host server (Default: false).'); + Io.out(' [-dir ] Local storage directory (Default: '+options.dir+')'); + Io.out(' [-help -h -v -verbose -monitor]'); + Io.out(' [-create -overwrite]'); + Io.out(' [-nblocks ' + options.nblocks + ' -ninodes ' + options.ninodes + ' -blocksize ' + options.blocksize + ']'); + Io.out(' [-partA ' + options.partA + + ' -partB ' + options.partB + + ' -fcap ' + options.fcapf + ']'); + return; +} + + +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); + +/** + * @type afs_server + */ +var server = AfsSrv.Server(network.rpc,options); +var stat; +if (options.create) + stat=server.create_fs('myfiles',options.ninodes,options.blocksize,options.nblocks,options.partA,options.partB,true); + + +stat=server.open_fs(options.partA,options.partB, + AfsSrv.Afs_cache_parameter(2*div(options.ninodes*AfsSrv.DEF_INODE_SIZE,AfsSrv.DEF_BLOCK_SIZE),1,100,30)); + +if (stat!=Status.STD_OK) { + Io.out('[AFS] Fatal. Cannot open filesystem, exit.'); + process.exit(2); +} + +options.env.afs_def=Net.Capability(server.afs_super.afs_putport, + Net.prv_encode(0,Rights.PRV_ALL_RIGHTS,server.afs_super.afs_checkfield)); +if (options.setdefault) + network.notify('AFS',Net.Print.capability(options.env.afs_def)); + +Io.out('[AFS] Publishing AFS Super Capability in file '+options.fcapf); +Net.cap_to_file(Net.Capability(server.afs_super.afs_putport, + Net.prv_encode(0,Net.Rights.PRV_ALL_RIGHTS,server.afs_super.afs_checkfield)),options.fcapf); + +var hostsrv; +if (options.hostsrv) + hostsrv = HostSrv.HostServer(scheduler, + network.rpc, + options, + 'AFS.'+options.hostname, + options.env); + +todo=Array.flatten(todo); +Sch.ScheduleBlock(todo, function (e) { + Io.out('[AFS] Caught error: '+e+'. Exiting.'); + Io.exit(); +}); + +// Start up the network .. +network.init(network.start); + +scheduler.Run(); + +//Io.out(server.afs_stat()); +for(var i=0;i<4;i++) { + server.afs_start_server(i,scheduler); +} +Io.out('[AFS] Super Capability '+options.env.afs_def); +process.on('SIGINT', function () { + Io.out('Got SIGINT ..'); + server.afs_exit(); + process.exit(2); +}); + +