diff --git a/exec/load/filesync.js b/exec/load/filesync.js index fa490288aaf83bce73493ead9788bc2d9fee78a0..0b6108dede60c3cd37d1dfd3d48bddb9a4efe3ca 100644 --- a/exec/load/filesync.js +++ b/exec/load/filesync.js @@ -1,36 +1,54 @@ -const connection_timeout=10; -const tries=5; +//$Id$ +//$Revision$ +//FILE SYNCHRONIZATION SCRIPT +//USED BY "commservice.js" & "commclient.js" +load("funclib.js"); -function comm_sync() +const connection_timeout=5; +const max_buffer=10240; +var descriptor=argv[0]; +var query=js.eval(argv[1]); +var hub_address=argv[2]; +var hub_port=argv[3]; +var sock=new Socket(); + +function file_sync() { - var data=parse_query(query); - var session_id=data[0].substr(1); - var task=data[1]; - var filemask=data[2]; - var filedate=data[3]; - var module=get_module(session_id); - + if(hub_address && hub_port) { + sock.connect(hub_address,hub_port,connection_timeout); + } else if(descriptor) { + sock.descriptor=descriptor; + } else { + debug("invalid arguments",LOG_WARNING); + return false; + } + if(!testSocket(sock)) { + return false; + } + var module=get_module(query.id); if(!module) return false; - log("synchronizing files: " + filemask); - switch(task) - { - case "#send": - sync_remote(session_id,module.working_directory,filemask); - break; - case "#recv": - sync_local(session_id,module.working_directory,filemask); - break; - case "#askrecv": - receive_file(session_id,module.working_directory,filemask,filedate); - break; - case "#endquery": - break; - default: - log("unknown sync request: " + task); - break; + debug("synchronizing files: " + query.filemask,LOG_DEBUG); + try { + switch(query.command) + { + case "send": + sync_remote(query,module.working_directory); + break; + case "recv": + sync_local(query,module.working_directory); + break; + case "askrecv": + receive_file(module.working_directory+query.filemask,query.filedate); + break; + default: + debug("unknown sync request: " + query.command,LOG_WARNING); + break; + } + } catch(e) { + debug("FILESYNC ERROR: " + e,LOG_WARNING); } - sock.close(); + if(sock.is_connected) sock.close(); return true; } function get_module(id) @@ -39,7 +57,7 @@ function get_module(id) comminit.open('r'); var match=comminit.iniGetSections(id); if(!match.length) { - log("module not found, aborting: " + id); + debug("module not found, aborting: " + id,LOG_WARNING); sock.send("#abort\r\n"); return false; } @@ -47,142 +65,186 @@ function get_module(id) comminit.close(); return module; } -function parse_query(q) +function sync_remote(data,dir) { - if(q) return q.split(""); - return false; -} -function sync_remote(session_id,dir,filemask) -{ - var files=directory(dir + file_getname(filemask)); - if(files.length>0) log("sending " + files.length + " files"); + var files=directory(dir + file_getname(data.filemask)); + if(files.length>0) debug("sending " + files.length + " files",LOG_DEBUG); else { - log("file(s) not found: " + dir + filemask); - sock.send("@" + session_id + "#abort\r\n"); + debug("file(s) not found: " + dir + data.filemask,LOG_WARNING); + return false; } - for(var f=0;f<files.length;f++) - { - var filename=file_getname(files[f]); - var filedate=file_date(files[f]); - - sock.send("@" + session_id + "#askrecv" + filename + "" + filedate + "\r\n"); - var data=sock.recvline(1024,connection_timeout); - if(data!=null) + for(var f=0;f<files.length;f++) { + if(!send_file(files[f],data)) break; + } + respond("endquery"); +} +function respond(response) +{ + var data=new Object(); + data.command=response; + if(!socket_send(data)) return false; + return true; +} +function send_file(filename,data) +{ + /* + "data" object already contains the properties + needed by commservice to recognize the information + as a file request + */ + data.command="askrecv"; + data.filemask=file_getname(filename); + data.filedate=file_date(filename); + if(!socket_send(data)) return false; + var response=get_response(); + if(response) { + switch(response.command) { - var response=parse_query(data); - switch(response[1]) - { - case "#ok": - log("sending file: " + filename); - sock.sendfile(files[f]); - sock.send("#eof\r\n"); - log("file sent: " + filename); - break; - case "#skip": - log("skipping file: " + filename); - break; - case "#abort": - log("aborting query"); - return false; - default: - log("unknown response: " + response); - sock.send("#abort\r\n"); + case "ok": + if(!socket_send(load_file(filename))) { + debug("file not sent: " + filename,LOG_WARNING); return false; - } - } else { - log("transfer timed out: " + files[f]); - return false; + } + debug("file sent: " + filename,LOG_DEBUG); + break; + case "skip": + debug("skipping file: " + filename,LOG_DEBUG); + break; + case "abort": + debug("aborting query",LOG_DEBUG); + return false; + default: + debug("unknown response: " + response.command,LOG_WARNING); + return false; } + return true; + } else { + debug("transfer timed out: " + filename,LOG_WARNING); + return false; } - sock.send("@" + session_id + "#endquery\r\n"); +} +function socket_send(data) +{ + if(!testSocket(sock)) return false; + if(!sock.send(data.toSource() + "\r\n")) return false; return true; } -function sync_local(session_id,dir,filemask) +function load_file(filename) +{ + var d=new Object(); + var f=new File(filename); + f.open('r',true,max_buffer); + var contents=f.readAll(); + f.close(); + var filesize=file_size(filename); + d.file=contents; + d.filesize=filesize; + return d; +} +function get_response() { - log("retrieving files: " + filemask); - if(!sock.is_connected) log("connection interrupted"); - sock.send("@" + session_id + "#send" + file_getname(filemask) + "\r\n"); + if(!testSocket(sock)) { + debug("error reading from socket",LOG_WARNING); + return false; + } + response=sock.recvline(max_buffer,connection_timeout); + if(response != null) { + return js.eval(response); + } else { + if(sock.error) { + debug("SOCKET ERROR: " + sock.error,LOG_WARNING); + debug(sock,LOG_WARNING); + } + else { + debug("socket timed out",LOG_WARNING); + } + return false; + } +} +function sync_local(data,dir) +{ + var aborted=false; + data.command="send"; + if(!socket_send(data)) { + debug("error retrieving files",LOG_WARNING); + return false; + } - while(sock.is_writeable) - { - var data=sock.recvline(1024,connection_timeout); - if(data!=null) - { - data=parse_query(data); - var response=data[1]; - var file=data[2]; - var date=data[3]; - - switch(response) + debug("retrieving files: " + dir + data.filemask,LOG_DEBUG); + while(!aborted) { + var response=get_response(); + if(response) { + switch(response.command) { - case "#askrecv": - receive_file(dir,file,date); + case "askrecv": + if(compare_dates(file_date(response.filemask),response.filedate)) + { + debug("skipping file: " + response.filemask,LOG_DEBUG); + respond("skip"); + break; + } else { + respond("ok"); + if(!receive_file(dir+response.filemask,response.filedate)) { + aborted=true; + } + break; + } + case "abort": + debug("aborting query",LOG_DEBUG); + aborted=true; break; - case "#abort": - sock.close(); - break; - case "#endquery": - sock.close(); + case "endquery": + debug("query complete",LOG_DEBUG); + aborted=true; break; default: - log("unknown response: " + response); - sock.close(); + debug("unknown response: " + response.command,LOG_WARNING); + aborted=true; break; } } else { - log("transfer timed out: " + filemask); - sock.close(); + aborted=true; } } + if(sock.is_connected) sock.close(); } -function receive_file(session_id,dir,filename,filedate) +function tell_mommy(ip,file,date) { - fname=dir+filename; - if(compare_dates(file_date(fname),filedate)) - { - sock.send("@" + session_id + "#skip\r\n"); - return false; + if(parent_queue) { + var data=new Object(); + data.remote_ip_address=ip; + data.filename=file; + data.filedate=date; + parent_queue.write(data); } - sock.send("@" + session_id + "#ok\r\n"); - - var file=new File(fname + ".tmp"); +} +function receive_file(filename,filedate) +{ + var file=new File(filename + ".tmp"); file.open('w',false); - log("receiving file: " + filename); - while(sock.is_writeable) - { - var data=sock.recvline(1024,connection_timeout); - if(data!=null) - { - switch(data) - { - case "#abort": - log("transfer aborted"); - file.close(); - file_remove(file.name); - return false; - case "#eof": - log("file received: " + filename); - file.close(); - if(file_exists(fname+".bck")) file_remove(fname+".bck"); - file_rename(fname,fname+".bck"); - file_rename(file.name,fname); - file_utime(filename,time(),filedate); - parent_queue.write({'filename':filename,'session_id':session_id,'filedate':filedate,'remote_ip_address':sock.remote_ip_address}); - return true; - default: - file.writeln(data); - break; - } - } else { - log("transfer timed out: " + filename); - file.close(); - file_remove(file.name); - return false; - } + if(!file.is_open) { + debug("error opening file: " + filename,LOG_WARNING); + return false; + } + + debug("receiving file: " + filename,LOG_DEBUG); + var data=get_response(); + if(data) { + file.writeAll(data.file); + log("received: " + data.filesize + " bytes"); + file.close(); + if(file_exists(filename+".bck")) file_remove(filename+".bck"); + file_rename(filename,filename+".bck"); + file_rename(file.name,filename); + file_utime(filename,time(),filedate); + tell_mommy(sock.remote_ip_address,filename,filedate); + return true; + } else { + debug("error transferring file:" + filename,LOG_WARNING); + file.close(); + file_remove(file.name); + return false; } - file.close(); - file_remove(file.name); - return false; } function compare_dates(local,remote) { @@ -192,35 +254,5 @@ function compare_dates(local,remote) if(local>remote) return true; else return false; } -function hub_route(hub_address,hub_port) -{ - log("routing data to hub"); - var hub=new Socket(); - hub.connect(hub_address,hub_port,connection_timeout); - hub.send(query + "\r\n"); - log("sent query: " + query); - - while(hub.is_connected && sock.is_writeable) - { - if(hub.data_waiting) - { - sock.send(hub.recvline(1024,connection_timeout)+"\r\n"); - } - if(sock.data_waiting) - { - hub.send(sock.recvline(1024,connection_timeout)+"\r\n"); - } - } -} - -var descriptor=argv[0]; -var query=argv[1]; -var hub_address=argv[2]; -var hub_port=argv[3]; - -var sock=new Socket(); -sock.descriptor=descriptor; - -if(hub_address && hub_port) hub_route(hub_address,hub_port); -else comm_sync(); +file_sync();