Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
Synchronet
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Main
Synchronet
Commits
49aa20ec
Commit
49aa20ec
authored
15 years ago
by
mcmlxxix
Browse files
Options
Downloads
Patches
Plain Diff
converted to use JSON
CAUTION: will crash your bbs! :)
parent
35f864fe
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
exec/load/filesync.js
+203
-171
203 additions, 171 deletions
exec/load/filesync.js
with
203 additions
and
171 deletions
exec/load/filesync.js
+
203
−
171
View file @
49aa20ec
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
)
{
lo
g
(
"
module not found, aborting:
"
+
id
);
debu
g
(
"
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
{
lo
g
(
"
file(s) not found:
"
+
dir
+
filemask
);
debu
g
(
"
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
:
lo
g
(
"
unknown response:
"
+
response
);
debu
g
(
"
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
,
file
date
)
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
();
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment