I want to check that my system is freshly synced on system startup to know that I’m not working with old files that haven’t been updated from the sync.
but even at .1 seconds, I tested by creating a 1G file on the remote machine and it never reported anything under 100%. On my local system (Linux), all I can see is no file, and then the 1G file in an instant. Even with inotify, I noticed there’s a delay from when I created the file to when it starts syncing.
Quick google search I see there’s also an event for completion but I’m not sure how this is useful for my purposes–it tracks syncs as they are happening but I guess not when “a successful sync was recently completed”.
At the moment, the only thing that seems straightforward is a last scan time which can at least indicate when a sync should have started but not necessarily when it was completed and without errors.
Your completion call sounds correct, though “are we in sync” is a tricky question to answer. The answer might be out of date by the time you get it, and we can only answer it based on what we know – if a device is disconnected, it might not know it’s missing files. If you want a snapshot answer for the time you ask the question I think it’s about as good as it gets.
To catch things as they happen you can listen for the StateChanged event (folders going from syncing to idle) and the FolderSummary event (to get completion percentage as it changes) – though this is also periodic rather than strictly realtime.
You put the file in your syncthing’s config folder.
It will yield output like below which you can then parse to see if everything is complete. So the “Needs” column will suit your use case I imagine. If everything equals ‘0 B’ your dealing with the latest files.
Device Status Sync Download Upload Needs
xxxxxxxx OK 100.0% 3.5 kB 4.2 kB 0 B
xxxxxxxx OK 100.0% 65 kB 62 kB 0 B
xxxxxxxx OK 100.0% 3.8 kB 3.9 kB 0 B
*xxxxxxxx Myself 100.0% 0 B 0 B 0 B
xxxxxxxx OK 100.0% 5.9 MB 48 GB 0 B
xxxxxxxx OK 100.0% 2.6 MB 10 GB 0 B
As a bash script, here’s a working if fairly clunky example:
#!/bin/bash
INSYNC_DATA=$(/home/youruser/.config/syncthing/stc-arm64-linux | sed -n '/Device/,//p' | awk '//{ printf "%-10s %-5s %s\n", $1, $8, $9, $10 }' | grep "0 B" | wc -l)
INSYNC_PERCENT=$(/home/youruser/.config/syncthing/stc-arm64-linux | sed -n '/Device/,//p' | awk '//{ printf "%-10s %-5s %s\n", $1, $3, $4 }' | grep "100.0%" | wc -l)
if [[ $INSYNC_DATA =~ "your total number of devices" && $INSYNC_PERCENT =~ "your total number of devices" ]]
then
## action for all in sync
else
## action for out of sync
fi