diff --git a/src/sync/client.go b/src/sync/client.go index e50f8d1..93941e8 100644 --- a/src/sync/client.go +++ b/src/sync/client.go @@ -260,7 +260,7 @@ func sftpSync(downloadList, uploadList []string, manualSync bool) { localFile.Close() // set the modification time of the local file to match the value saved from the remote file (from before the download) - err = os.Chtimes(remoteEntryFullPath, time.Now(), modTime) + err = os.Chtimes(localEntryFullPath, time.Now(), modTime) } if filesTransfered { diff --git a/src/sync/common.go b/src/sync/common.go index 022aacb..83c7c33 100644 --- a/src/sync/common.go +++ b/src/sync/common.go @@ -3,49 +3,10 @@ package sync import ( "fmt" "github.com/rwinkhart/MUTN/src/backend" - "io/fs" "os" - "path/filepath" "strings" ) -// WalkEntryDir walks the entry directory and returns lists of all files and directories found (two separate lists) -func WalkEntryDir() ([]string, []string) { - // define file/directory containing slices so that they may be accessed by the anonymous WalkDir function - var fileList []string - var dirList []string - - // walk entry directory - _ = filepath.WalkDir(backend.EntryRoot, - func(fullPath string, entry fs.DirEntry, err error) error { - - // check for errors encountered while walking directory - if err != nil { - if os.IsNotExist(err) { - fmt.Println(backend.AnsiError+"The entry directory does not exist - run \""+os.Args[0], "init"+"\" to create it"+backend.AnsiReset) // TODO implement init command for libmuttonserver - } else { - // otherwise, print the source of the error - fmt.Println(backend.AnsiError + "An unexpected error occurred while generating the entry list: " + err.Error() + backend.AnsiReset) - } - os.Exit(1) - } - - // trim root path from each path before storing - trimmedPath := fullPath[rootLength:] - - // create separate slices for entries and directories - if !entry.IsDir() { - fileList = append(fileList, trimmedPath) - } else { - dirList = append(dirList, trimmedPath) - } - - return nil - }) - - return fileList, dirList -} - func getModTimes(entryList []string) []int64 { // get a list of all entry modification times var modList []int64 diff --git a/src/sync/commonUNIX.go b/src/sync/commonUNIX.go new file mode 100644 index 0000000..bc62632 --- /dev/null +++ b/src/sync/commonUNIX.go @@ -0,0 +1,49 @@ +//go:build !windows + +package sync + +import ( + "fmt" + "github.com/rwinkhart/MUTN/src/backend" + "io/fs" + "os" + "path/filepath" +) + +// WalkEntryDir walks the entry directory and returns lists of all files and directories found (two separate lists) +// regardless of platform, all paths are stored with forward slashes (UNIX-style) +func WalkEntryDir() ([]string, []string) { + // define file/directory containing slices so that they may be accessed by the anonymous WalkDir function + var fileList []string + var dirList []string + + // walk entry directory + _ = filepath.WalkDir(backend.EntryRoot, + func(fullPath string, entry fs.DirEntry, err error) error { + + // check for errors encountered while walking directory + if err != nil { + if os.IsNotExist(err) { + fmt.Println(backend.AnsiError+"The entry directory does not exist - run \""+os.Args[0], "init"+"\" to create it"+backend.AnsiReset) // TODO implement init command for libmuttonserver + } else { + // otherwise, print the source of the error + fmt.Println(backend.AnsiError + "An unexpected error occurred while generating the entry list: " + err.Error() + backend.AnsiReset) + } + os.Exit(1) + } + + // trim root path from each path before storing + trimmedPath := fullPath[rootLength:] + + // append the path to the appropriate slice + if !entry.IsDir() { + fileList = append(fileList, trimmedPath) + } else { + dirList = append(dirList, trimmedPath) + } + + return nil + }) + + return fileList, dirList +} diff --git a/src/sync/commonWIN.go b/src/sync/commonWIN.go new file mode 100644 index 0000000..b289ac3 --- /dev/null +++ b/src/sync/commonWIN.go @@ -0,0 +1,50 @@ +//go:build windows + +package sync + +import ( + "fmt" + "github.com/rwinkhart/MUTN/src/backend" + "io/fs" + "os" + "path/filepath" + "strings" +) + +// WalkEntryDir walks the entry directory and returns lists of all files and directories found (two separate lists) +// regardless of platform, all paths are stored with forward slashes (UNIX-style) +func WalkEntryDir() ([]string, []string) { + // define file/directory containing slices so that they may be accessed by the anonymous WalkDir function + var fileList []string + var dirList []string + + // walk entry directory + _ = filepath.WalkDir(backend.EntryRoot, + func(fullPath string, entry fs.DirEntry, err error) error { + + // check for errors encountered while walking directory + if err != nil { + if os.IsNotExist(err) { + fmt.Println(backend.AnsiError+"The entry directory does not exist - run \""+os.Args[0], "init"+"\" to create it"+backend.AnsiReset) // TODO implement init command for libmuttonserver + } else { + // otherwise, print the source of the error + fmt.Println(backend.AnsiError + "An unexpected error occurred while generating the entry list: " + err.Error() + backend.AnsiReset) + } + os.Exit(1) + } + + // trim root path from each path before storing and replace backslashes with forward slashes + trimmedPath := strings.ReplaceAll(fullPath[rootLength:], "\\", "/") + + // append the path to the appropriate slice + if !entry.IsDir() { + fileList = append(fileList, trimmedPath) + } else { + dirList = append(dirList, trimmedPath) + } + + return nil + }) + + return fileList, dirList +} diff --git a/src/sync/init.go b/src/sync/init.go index 4b556fa..00fa02e 100644 --- a/src/sync/init.go +++ b/src/sync/init.go @@ -14,8 +14,8 @@ func DeviceIDGen() (string, string) { deviceIDPrefix, _ := os.Hostname() deviceIDSuffix := backend.StringGen(rand.Intn(48)+48, false, 0) // TODO consider using complex string generator and removing unsafe characters manually deviceID := deviceIDPrefix + "-" + deviceIDSuffix - os.Create(backend.ConfigDir + backend.PathSeparator + "devices" + backend.PathSeparator + deviceID) // TODO remove existing device ID file if it exists (from both client and server) - sshEntryRootSSHIsWindows := strings.Split(GetSSHOutput("libmuttonserver register "+deviceID, false), "\x1d") // register device ID with server and fetch remote EntryRoot and OS type + os.Create(backend.ConfigDir + backend.PathSeparator + "devices" + backend.PathSeparator + deviceID) // TODO remove existing device ID file if it exists (from both client and server) + sshEntryRootSSHIsWindows := strings.Split(GetSSHOutput("libmuttonserver register "+deviceID, true), "\x1d") // register device ID with server and fetch remote EntryRoot and OS type; manualSync is true so the user is alerted if device ID registration fails return sshEntryRootSSHIsWindows[0], sshEntryRootSSHIsWindows[1] } diff --git a/src/sync/server.go b/src/sync/server.go index 4b8c2a0..d71bd77 100644 --- a/src/sync/server.go +++ b/src/sync/server.go @@ -23,7 +23,7 @@ func GetRemoteDataFromServer(clientDeviceID string) { // entry list for _, entry := range entryList { - printToStdout(entry) + fmt.Print("\x1f" + entry) } // modification time list @@ -36,7 +36,7 @@ func GetRemoteDataFromServer(clientDeviceID string) { // directory/folder list fmt.Print("\x1d") for _, dir := range dirList { - printToStdout(dir) + fmt.Print("\x1f" + dir) } // deletions list @@ -45,7 +45,7 @@ func GetRemoteDataFromServer(clientDeviceID string) { // print deletion if it is relevant to the current client device affectedIDTargetLocationIncomplete := strings.Split(deletion.Name(), "\x1d") if affectedIDTargetLocationIncomplete[0] == clientDeviceID { - fmt.Print("\x1f" + strings.ReplaceAll(affectedIDTargetLocationIncomplete[1], "\x1e", "/")) // do not use printToStdout as separators are filling in for \x1e + fmt.Print("\x1f" + strings.ReplaceAll(affectedIDTargetLocationIncomplete[1], "\x1e", "/")) // assume successful client deletion and remove deletions file (if assumption is somehow false, worst case scenario is that the client will re-upload the deleted entry) os.Remove(backend.ConfigDir + backend.PathSeparator + "deletions" + backend.PathSeparator + deletion.Name()) diff --git a/src/sync/serverPrintToStdoutUNIX.go b/src/sync/serverPrintToStdoutUNIX.go deleted file mode 100644 index b1979c4..0000000 --- a/src/sync/serverPrintToStdoutUNIX.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build !windows - -package sync - -import ( - "fmt" -) - -// printToStdout prints a string to stdout with UNIX path separators -func printToStdout(targetLocationIncomplete string) { - fmt.Print("\x1f" + targetLocationIncomplete) -} diff --git a/src/sync/serverPrintToStdoutWIN.go b/src/sync/serverPrintToStdoutWIN.go deleted file mode 100644 index 2f8bd70..0000000 --- a/src/sync/serverPrintToStdoutWIN.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build windows - -package sync - -import ( - "fmt" - "strings" -) - -// printToStdout prints a string to stdout with UNIX path separators -func printToStdout(targetLocationIncomplete string) { - fmt.Print("\x1f" + strings.ReplaceAll(targetLocationIncomplete, "\\", "/")) -}