# Merlin [![Build Status](https://ci.csclub.uwaterloo.ca/api/badges/public/mirror/status.svg)](https://ci.csclub.uwaterloo.ca/public/mirror) This folder contains the code for merlin (which does the actual syncing) and arthur (which sends commands to merlin). Check out the the [mirror env](https://git.csclub.uwaterloo.ca/public/mirror-env) for a testing environment ### Usage ``` go build merlin.go ``` Then configure `merlin-config.ini` and run using `./merlin` ### Nice Features To Add - detect if an rsync process is stuck (watch the stdout/stderr of the rsync processes) - get the config or the rsync commond that a repo will sync with using a cli tool - improve conversion from exit status enum to string - sort `arthur status` by last time synced - last sync runtime, time until next sync - when sync fails, then make a copy of the rsync logs ### Completed - [x] add bwlimit option for each rsync process - [x] write process manager - [x] save state (last attempted time, last attempted status) for each repo, and restore state on startup (e.g. use JSON/INI file for each repo) - [x] calculate difference between the scheduled time of a job and the time at which it actually ran; log this - [x] add all repos to merlin-config.ini (\*) - [x] handle termination signals in merlin (SIGINT, SIGTERM); close stopChan for this - [x] listen on Unix socket in merlin - [x] implement arthur.go (commands: sync and status) - [x] allow dynamic reloading in merlin - [x] use separate log file for each child process (currently sharing stdout/stderr with parent) - [x] implement zfssync in merlin (just invoke the existing Python script)