Skip to content
Snippets Groups Projects
Commit 49aa20ec authored by mcmlxxix's avatar mcmlxxix
Browse files

converted to use JSON

CAUTION: will crash your bbs! :)
parent 35f864fe
No related branches found
No related tags found
No related merge requests found
const connection_timeout=10; //$Id$
const tries=5; //$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); if(hub_address && hub_port) {
var session_id=data[0].substr(1); sock.connect(hub_address,hub_port,connection_timeout);
var task=data[1]; } else if(descriptor) {
var filemask=data[2]; sock.descriptor=descriptor;
var filedate=data[3]; } else {
var module=get_module(session_id); debug("invalid arguments",LOG_WARNING);
return false;
}
if(!testSocket(sock)) {
return false;
}
var module=get_module(query.id);
if(!module) return false; if(!module) return false;
log("synchronizing files: " + filemask); debug("synchronizing files: " + query.filemask,LOG_DEBUG);
switch(task) try {
{ switch(query.command)
case "#send": {
sync_remote(session_id,module.working_directory,filemask); case "send":
break; sync_remote(query,module.working_directory);
case "#recv": break;
sync_local(session_id,module.working_directory,filemask); case "recv":
break; sync_local(query,module.working_directory);
case "#askrecv": break;
receive_file(session_id,module.working_directory,filemask,filedate); case "askrecv":
break; receive_file(module.working_directory+query.filemask,query.filedate);
case "#endquery": break;
break; default:
default: debug("unknown sync request: " + query.command,LOG_WARNING);
log("unknown sync request: " + task); break;
break; }
} catch(e) {
debug("FILESYNC ERROR: " + e,LOG_WARNING);
} }
sock.close(); if(sock.is_connected) sock.close();
return true; return true;
} }
function get_module(id) function get_module(id)
...@@ -39,7 +57,7 @@ function get_module(id) ...@@ -39,7 +57,7 @@ function get_module(id)
comminit.open('r'); comminit.open('r');
var match=comminit.iniGetSections(id); var match=comminit.iniGetSections(id);
if(!match.length) { if(!match.length) {
log("module not found, aborting: " + id); debug("module not found, aborting: " + id,LOG_WARNING);
sock.send("#abort\r\n"); sock.send("#abort\r\n");
return false; return false;
} }
...@@ -47,142 +65,186 @@ function get_module(id) ...@@ -47,142 +65,186 @@ function get_module(id)
comminit.close(); comminit.close();
return module; return module;
} }
function parse_query(q) function sync_remote(data,dir)
{ {
if(q) return q.split(""); var files=directory(dir + file_getname(data.filemask));
return false; if(files.length>0) debug("sending " + files.length + " files",LOG_DEBUG);
}
function sync_remote(session_id,dir,filemask)
{
var files=directory(dir + file_getname(filemask));
if(files.length>0) log("sending " + files.length + " files");
else { else {
log("file(s) not found: " + dir + filemask); debug("file(s) not found: " + dir + data.filemask,LOG_WARNING);
sock.send("@" + session_id + "#abort\r\n"); return false;
} }
for(var f=0;f<files.length;f++) for(var f=0;f<files.length;f++) {
{ if(!send_file(files[f],data)) break;
var filename=file_getname(files[f]); }
var filedate=file_date(files[f]); respond("endquery");
}
sock.send("@" + session_id + "#askrecv" + filename + "" + filedate + "\r\n"); function respond(response)
var data=sock.recvline(1024,connection_timeout); {
if(data!=null) 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); case "ok":
switch(response[1]) if(!socket_send(load_file(filename))) {
{ debug("file not sent: " + filename,LOG_WARNING);
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");
return false; return false;
} }
} else { debug("file sent: " + filename,LOG_DEBUG);
log("transfer timed out: " + files[f]); break;
return false; 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; 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(!testSocket(sock)) {
if(!sock.is_connected) log("connection interrupted"); debug("error reading from socket",LOG_WARNING);
sock.send("@" + session_id + "#send" + file_getname(filemask) + "\r\n"); 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) debug("retrieving files: " + dir + data.filemask,LOG_DEBUG);
{ while(!aborted) {
var data=sock.recvline(1024,connection_timeout); var response=get_response();
if(data!=null) if(response) {
{ switch(response.command)
data=parse_query(data);
var response=data[1];
var file=data[2];
var date=data[3];
switch(response)
{ {
case "#askrecv": case "askrecv":
receive_file(dir,file,date); 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; break;
case "#abort": case "endquery":
sock.close(); debug("query complete",LOG_DEBUG);
break; aborted=true;
case "#endquery":
sock.close();
break; break;
default: default:
log("unknown response: " + response); debug("unknown response: " + response.command,LOG_WARNING);
sock.close(); aborted=true;
break; break;
} }
} else { } else {
log("transfer timed out: " + filemask); aborted=true;
sock.close();
} }
} }
if(sock.is_connected) sock.close();
} }
function receive_file(session_id,dir,filename,filedate) function tell_mommy(ip,file,date)
{ {
fname=dir+filename; if(parent_queue) {
if(compare_dates(file_date(fname),filedate)) var data=new Object();
{ data.remote_ip_address=ip;
sock.send("@" + session_id + "#skip\r\n"); data.filename=file;
return false; data.filedate=date;
parent_queue.write(data);
} }
sock.send("@" + session_id + "#ok\r\n"); }
function receive_file(filename,filedate)
var file=new File(fname + ".tmp"); {
var file=new File(filename + ".tmp");
file.open('w',false); file.open('w',false);
log("receiving file: " + filename); if(!file.is_open) {
while(sock.is_writeable) debug("error opening file: " + filename,LOG_WARNING);
{ return false;
var data=sock.recvline(1024,connection_timeout); }
if(data!=null)
{ debug("receiving file: " + filename,LOG_DEBUG);
switch(data) var data=get_response();
{ if(data) {
case "#abort": file.writeAll(data.file);
log("transfer aborted"); log("received: " + data.filesize + " bytes");
file.close(); file.close();
file_remove(file.name); if(file_exists(filename+".bck")) file_remove(filename+".bck");
return false; file_rename(filename,filename+".bck");
case "#eof": file_rename(file.name,filename);
log("file received: " + filename); file_utime(filename,time(),filedate);
file.close(); tell_mommy(sock.remote_ip_address,filename,filedate);
if(file_exists(fname+".bck")) file_remove(fname+".bck"); return true;
file_rename(fname,fname+".bck"); } else {
file_rename(file.name,fname); debug("error transferring file:" + filename,LOG_WARNING);
file_utime(filename,time(),filedate); file.close();
parent_queue.write({'filename':filename,'session_id':session_id,'filedate':filedate,'remote_ip_address':sock.remote_ip_address}); file_remove(file.name);
return true; return false;
default:
file.writeln(data);
break;
}
} else {
log("transfer timed out: " + filename);
file.close();
file_remove(file.name);
return false;
}
} }
file.close();
file_remove(file.name);
return false;
} }
function compare_dates(local,remote) function compare_dates(local,remote)
{ {
...@@ -192,35 +254,5 @@ function compare_dates(local,remote) ...@@ -192,35 +254,5 @@ function compare_dates(local,remote)
if(local>remote) return true; if(local>remote) return true;
else return false; 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();
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment