|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
+use std::ffi::{OsStr, OsString};
|
|
1
|
2
|
use std::fs::{self, create_dir_all, remove_file};
|
|
2
|
3
|
use std::sync::Arc;
|
|
3
|
|
-use std::ffi::{OsStr, OsString};
|
|
4
|
4
|
|
|
|
5
|
+use fslock::LockFile;
|
|
5
|
6
|
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
|
6
|
7
|
use tokio::net::{UnixListener, UnixStream};
|
|
7
|
8
|
use tokio::stream::StreamExt;
|
|
8
|
9
|
use tokio::sync::{mpsc, Mutex};
|
|
9
|
|
-use tokio::signal;
|
|
10
|
|
-use fslock::LockFile;
|
|
11
|
10
|
|
|
12
|
|
-use twfss::{Database, FileTree, ClientSideSync, FileSystemWatcher, Error, SynchronizationError, paths};
|
|
|
11
|
+use twfss::{
|
|
|
12
|
+ paths, ClientSideSync, Database, Error, FileSystemWatcher, FileTree, SynchronizationError,
|
|
|
13
|
+};
|
|
13
|
14
|
|
|
14
|
15
|
mod cli;
|
|
15
|
16
|
|
|
|
@@ -21,11 +22,15 @@ struct SynchronizedDirectory {
|
|
21
|
22
|
}
|
|
22
|
23
|
|
|
23
|
24
|
impl SynchronizedDirectory {
|
|
24
|
|
- async fn open(database: Arc<Mutex<Database>>, directory: &OsStr, errors: mpsc::Sender<SynchronizationError>) -> Result<SynchronizedDirectory, Error> {
|
|
|
25
|
+ async fn open(
|
|
|
26
|
+ database: Arc<Mutex<Database>>,
|
|
|
27
|
+ directory: &OsStr,
|
|
|
28
|
+ errors: mpsc::Sender<SynchronizationError>,
|
|
|
29
|
+ ) -> Result<SynchronizedDirectory, Error> {
|
|
25
|
30
|
let file_tree = Arc::new(Mutex::new(FileTree::open(database, directory)?));
|
|
26
|
31
|
let client_side_sync = ClientSideSync::new(file_tree.clone(), errors.clone()).await;
|
|
27
|
32
|
let file_system_watcher = FileSystemWatcher::new(file_tree, errors).await;
|
|
28
|
|
- Ok(SynchronizedDirectory{
|
|
|
33
|
+ Ok(SynchronizedDirectory {
|
|
29
|
34
|
path: directory.to_owned(),
|
|
30
|
35
|
client_side_sync,
|
|
31
|
36
|
file_system_watcher,
|
|
|
@@ -69,10 +74,14 @@ async fn main() {
|
|
69
|
74
|
|
|
70
|
75
|
// Initialize the existing synchronized directories.
|
|
71
|
76
|
let mut directories = Vec::new();
|
|
72
|
|
- let db = Arc::new(Mutex::new(Database::create_or_open(&paths::client_db()).unwrap()));
|
|
|
77
|
+ let db = Arc::new(Mutex::new(
|
|
|
78
|
+ Database::create_or_open(&paths::client_db()).unwrap(),
|
|
|
79
|
+ ));
|
|
73
|
80
|
for directory in db.lock().await.synchronized_directories() {
|
|
74
|
81
|
// The function cannot fail - we just fetched the directory from the database.
|
|
75
|
|
- let mut sync_dir = SynchronizedDirectory::open(db.clone(), &directory, errors_send.clone()).await.unwrap();
|
|
|
82
|
+ let mut sync_dir = SynchronizedDirectory::open(db.clone(), &directory, errors_send.clone())
|
|
|
83
|
+ .await
|
|
|
84
|
+ .unwrap();
|
|
76
|
85
|
sync_dir.unpause().await;
|
|
77
|
86
|
directories.push(sync_dir);
|
|
78
|
87
|
}
|
|
|
@@ -137,7 +146,11 @@ async fn main() {
|
|
137
|
146
|
}
|
|
138
|
147
|
}
|
|
139
|
148
|
|
|
140
|
|
-async fn handle_cli_client(stream: &mut UnixStream, directories: &mut Vec<SynchronizedDirectory>, _db: Arc<Mutex<Database>>) -> Result<(), Error> {
|
|
|
149
|
+async fn handle_cli_client(
|
|
|
150
|
+ stream: &mut UnixStream,
|
|
|
151
|
+ directories: &mut Vec<SynchronizedDirectory>,
|
|
|
152
|
+ _db: Arc<Mutex<Database>>,
|
|
|
153
|
+) -> Result<(), Error> {
|
|
141
|
154
|
let mut request = String::new();
|
|
142
|
155
|
stream.read_to_string(&mut request).await?;
|
|
143
|
156
|
|
|
|
@@ -154,22 +167,38 @@ async fn handle_cli_client(stream: &mut UnixStream, directories: &mut Vec<Synchr
|
|
154
|
167
|
// TODO
|
|
155
|
168
|
}
|
|
156
|
169
|
cli::Command::Pause => {
|
|
157
|
|
- for directory in directories.iter_mut() {
|
|
|
170
|
+ for directory in directories.iter_mut() {
|
|
158
|
171
|
directory.pause().await;
|
|
159
|
172
|
if verbose {
|
|
160
|
|
- stream.write_all(format!("Paused {}.\n", directory.path.to_string_lossy()).as_bytes()).await.ok();
|
|
|
173
|
+ stream
|
|
|
174
|
+ .write_all(
|
|
|
175
|
+ format!("Paused {}.\n", directory.path.to_string_lossy()).as_bytes(),
|
|
|
176
|
+ )
|
|
|
177
|
+ .await
|
|
|
178
|
+ .ok();
|
|
161
|
179
|
}
|
|
162
|
180
|
}
|
|
163
|
|
- stream.write_all("Synchronization paused.\n".as_bytes()).await.ok();
|
|
|
181
|
+ stream
|
|
|
182
|
+ .write_all("Synchronization paused.\n".as_bytes())
|
|
|
183
|
+ .await
|
|
|
184
|
+ .ok();
|
|
164
|
185
|
}
|
|
165
|
186
|
cli::Command::Resume => {
|
|
166
|
|
- for directory in directories.iter_mut() {
|
|
|
187
|
+ for directory in directories.iter_mut() {
|
|
167
|
188
|
directory.unpause().await;
|
|
168
|
189
|
if verbose {
|
|
169
|
|
- stream.write_all(format!("Resumed {}.\n", directory.path.to_string_lossy()).as_bytes()).await.ok();
|
|
|
190
|
+ stream
|
|
|
191
|
+ .write_all(
|
|
|
192
|
+ format!("Resumed {}.\n", directory.path.to_string_lossy()).as_bytes(),
|
|
|
193
|
+ )
|
|
|
194
|
+ .await
|
|
|
195
|
+ .ok();
|
|
170
|
196
|
}
|
|
171
|
197
|
}
|
|
172
|
|
- stream.write_all("Synchronization resumed.\n".as_bytes()).await.ok();
|
|
|
198
|
+ stream
|
|
|
199
|
+ .write_all("Synchronization resumed.\n".as_bytes())
|
|
|
200
|
+ .await
|
|
|
201
|
+ .ok();
|
|
173
|
202
|
}
|
|
174
|
203
|
}
|
|
175
|
204
|
|