commit
fff4be4dae
4 changed files with 144 additions and 0 deletions
@ -0,0 +1,6 @@ |
|||
# DoubleSync |
|||
Your files are always in sync, just like the Party’s truth |
|||
|
|||
# Usage |
|||
go mod tidy |
|||
go run ./doublesync.go |
|||
@ -0,0 +1,126 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"log" |
|||
"os" |
|||
"path/filepath" |
|||
"github.com/fsnotify/fsnotify" |
|||
"regexp" |
|||
"slices" |
|||
"io/ioutil" |
|||
"strings" |
|||
) |
|||
|
|||
func main() { |
|||
// Create new watcher.
|
|||
watcher, err := fsnotify.NewWatcher() |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
defer watcher.Close() |
|||
|
|||
// Start listening for events.
|
|||
go func() { |
|||
for { |
|||
select { |
|||
case event, ok := <-watcher.Events: |
|||
if !ok { |
|||
return |
|||
} |
|||
|
|||
archive_basedir := "/tmp/newmails/" |
|||
var mailbox string |
|||
var dovecot_uidlist_src string |
|||
var dovecot_indexlog_src string |
|||
var dovecot_indexcache_src string |
|||
var dovecot_dest string |
|||
|
|||
if event.Has(fsnotify.Create) { |
|||
|
|||
re := regexp.MustCompile(`^.*\.archival\.Incoming\/new\/.*$`) |
|||
new_mail := re.FindString(event.Name) |
|||
last_mail := regexp.MustCompile(`/`).Split(new_mail, -1) |
|||
username_index := slices.Index(last_mail, "home") |
|||
username := last_mail[username_index+1] |
|||
archive_mailbox := archive_basedir + username + ".Incoming/new/" |
|||
archive_err := ensureDir(archive_mailbox) |
|||
new_loc := archive_mailbox + last_mail[len(last_mail)-1] |
|||
|
|||
// Get archive mailbox path
|
|||
mailbox_index := username_index+4 |
|||
if len(last_mail) > 1 { |
|||
mailbox = strings.Join(last_mail[0:mailbox_index], "/") |
|||
dovecot_uidlist_src = mailbox + "/dovecot-uidlist" |
|||
dovecot_indexlog_src = mailbox + "/dovecot.index.log" |
|||
dovecot_indexcache_src = mailbox + "/dovecot.index.cache" |
|||
dovecot_dest = archive_basedir + last_mail[mailbox_index] |
|||
log.Println(mailbox) |
|||
} |
|||
//log.Println(len(last_mail))
|
|||
log.Println("dovecot") |
|||
log.Println(dovecot_dest) |
|||
log.Println(dovecot_uidlist_src) |
|||
log.Println(dovecot_indexlog_src) |
|||
log.Println(dovecot_indexcache_src) |
|||
if archive_err != nil { |
|||
log.Fatal(archive_err) |
|||
} |
|||
if len(new_mail) > 0 { |
|||
log.Println("moving user ",username,"files to ", new_loc) |
|||
err := os.Rename(new_mail, new_loc) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
//uidlist_err := copyFiles(dovecot_uidlist_src, dovecot_dest)
|
|||
//log_err := copyFiles(dovecot_indexlog_src, dovecot_dest)
|
|||
//cache_err := copyFiles(dovecot_indexcache_src, dovecot_dest)
|
|||
//if uidlist_err != nil || log_err != nil || cache_err != nil {
|
|||
// panic(err)
|
|||
//}
|
|||
} |
|||
} |
|||
|
|||
|
|||
case err, ok := <-watcher.Errors: |
|||
if !ok { |
|||
return |
|||
} |
|||
log.Println("error:", err) |
|||
} |
|||
} |
|||
}() |
|||
|
|||
// Add a path.
|
|||
filepath.Walk("/home/", func(path string, info os.FileInfo, err error) error{ |
|||
if info.IsDir() { |
|||
watcher.Add(path) |
|||
} |
|||
return nil |
|||
}) |
|||
// Block main goroutine forever.
|
|||
<-make(chan struct{}) |
|||
} |
|||
|
|||
// Create archive directory
|
|||
func ensureDir(dirName string) error { |
|||
err := os.MkdirAll(dirName, 0755) |
|||
if err == nil || os.IsExist(err) { |
|||
return nil |
|||
} else { |
|||
return err |
|||
} |
|||
} |
|||
|
|||
// Copy dovecot index and cache
|
|||
func copyFiles(src string, dest string) error { |
|||
bytesRead, err := ioutil.ReadFile(src) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
err = ioutil.WriteFile(dest, bytesRead, 0644) |
|||
if err == nil { |
|||
return nil |
|||
} else { |
|||
return err |
|||
} |
|||
} |
|||
@ -0,0 +1,8 @@ |
|||
module deepOfix/letter_sync |
|||
|
|||
go 1.22.5 |
|||
|
|||
require ( |
|||
github.com/fsnotify/fsnotify v1.7.0 // indirect |
|||
golang.org/x/sys v0.4.0 // indirect |
|||
) |
|||
@ -0,0 +1,4 @@ |
|||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= |
|||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= |
|||
golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= |
|||
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= |
|||
Loading…
Reference in new issue