diff --git a/core/init.go b/core/init.go index cca4f5b..f445381 100644 --- a/core/init.go +++ b/core/init.go @@ -53,7 +53,7 @@ func GpgKeyGen() string { } // DirInit creates the libmutton directories. -// Returns: oldDeviceID (before from before the directory reset). +// Returns: oldDeviceID (from before the directory reset). func DirInit(preserveOldConfigDir bool) string { // create EntryRoot err := os.MkdirAll(EntryRoot, 0700) diff --git a/sync/client.go b/sync/client.go index 8d0411f..05b16aa 100644 --- a/sync/client.go +++ b/sync/client.go @@ -413,45 +413,6 @@ func deletionSync(deletions []string) { } } -// ShearRemoteFromClient removes the target file or directory from the local system and calls the server to remove it remotely and add it to the deletions list. -// It can safely be called in offline mode, as well, so this is the intended interface for shearing (ShearLocal should only be used directly by the server binary). -func ShearRemoteFromClient(sshClient *ssh.Client, targetLocationIncomplete string) { - deviceID := ShearLocal(targetLocationIncomplete, "") // remove the target from the local system and get the device ID of the client - - if deviceID != "" { // ensure a device ID exists (online mode) - // call the server to remotely shear the target and add it to the deletions list - GetSSHOutput(sshClient, "libmuttonserver shear", deviceID+"\n"+strings.ReplaceAll(targetLocationIncomplete, core.PathSeparator, FSPath)) - } - - core.Exit(0) // sync is not required after shearing since the target has already been removed from the local system -} - -// RenameRemoteFromClient renames oldLocationIncomplete to newLocationIncomplete on the local system and calls the server to perform the rename remotely and add the old target to the deletions list. -// It can safely be called in offline mode, as well, so this is the intended interface for renaming (RenameLocal should only be used directly by the server binary). -func RenameRemoteFromClient(sshClient *ssh.Client, oldLocationIncomplete, newLocationIncomplete string) { - RenameLocal(oldLocationIncomplete, newLocationIncomplete, false) // move the target on the local system - - deviceIDList := core.GenDeviceIDList(true) - if len(*deviceIDList) > 0 { // ensure a device ID exists (online mode) - // call the server to move the target on the remote system and add the old target to the deletions list - GetSSHOutput(sshClient, "libmuttonserver rename", - (*deviceIDList)[0].Name()+"\n"+ - strings.ReplaceAll(oldLocationIncomplete, core.PathSeparator, FSPath)+"\n"+ - strings.ReplaceAll(newLocationIncomplete, core.PathSeparator, FSPath)) - } - - core.Exit(0) -} - -// AddFolderRemoteFromClient creates a new entry-containing directory on the local system and calls the server to create the folder remotely. -// It can safely be called in offline mode, as well, so this is the intended interface for adding folders (AddFolderLocal should only be used directly by the server binary). -func AddFolderRemoteFromClient(sshClient *ssh.Client, targetLocationIncomplete string) { - AddFolderLocal(targetLocationIncomplete) // add the folder on the local system - GetSSHOutput(sshClient, "libmuttonserver addfolder", strings.ReplaceAll(targetLocationIncomplete, core.PathSeparator, FSPath)) // call the server to create the folder remotely - - core.Exit(0) -} - // folderSync creates folders on the client (from the given list of folder names). func folderSync(folders []string) { for _, folder := range folders { diff --git a/sync/oneOff.go b/sync/oneOff.go new file mode 100644 index 0000000..12e1b4f --- /dev/null +++ b/sync/oneOff.go @@ -0,0 +1,83 @@ +package sync + +import ( + "fmt" + "os" + "strings" + + "github.com/rwinkhart/libmutton/core" +) + +// ShearRemoteFromClient removes the target file or directory from the local system and calls the server to remove it remotely and add it to the deletions list. +// It can safely be called in offline mode, as well, so this is the intended interface for shearing (ShearLocal should only be used directly by the server binary). +func ShearRemoteFromClient(targetLocationIncomplete string) { + deviceID := ShearLocal(targetLocationIncomplete, "") // remove the target from the local system and get the device ID of the client + + if deviceID != "" { // ensure a device ID exists (online mode) + // create an SSH client; manualSync is false in case a device ID exists but SSH is not configured + sshClient, _, _ := GetSSHClient(false) + + // call the server to remotely shear the target and add it to the deletions list + GetSSHOutput(sshClient, "libmuttonserver shear", deviceID+"\n"+strings.ReplaceAll(targetLocationIncomplete, core.PathSeparator, FSPath)) + + // close the SSH client + err := sshClient.Close() + if err != nil { + fmt.Println(core.AnsiError+"Sync failed - Unable to close SSH client:", err.Error()+core.AnsiReset) + os.Exit(104) + } + } + + core.Exit(0) // sync is not required after shearing since the target has already been removed from the local system +} + +// RenameRemoteFromClient renames oldLocationIncomplete to newLocationIncomplete on the local system and calls the server to perform the rename remotely and add the old target to the deletions list. +// It can safely be called in offline mode, as well, so this is the intended interface for renaming (RenameLocal should only be used directly by the server binary). +func RenameRemoteFromClient(oldLocationIncomplete, newLocationIncomplete string) { + RenameLocal(oldLocationIncomplete, newLocationIncomplete, false) // move the target on the local system + + deviceIDList := core.GenDeviceIDList(true) + if len(*deviceIDList) > 0 { // ensure a device ID exists (online mode) + // create an SSH client; manualSync is false in case a device ID exists but SSH is not configured + sshClient, _, _ := GetSSHClient(false) + + // call the server to move the target on the remote system and add the old target to the deletions list + GetSSHOutput(sshClient, "libmuttonserver rename", + (*deviceIDList)[0].Name()+"\n"+ + strings.ReplaceAll(oldLocationIncomplete, core.PathSeparator, FSPath)+"\n"+ + strings.ReplaceAll(newLocationIncomplete, core.PathSeparator, FSPath)) + + // close the SSH client + err := sshClient.Close() + if err != nil { + fmt.Println(core.AnsiError+"Sync failed - Unable to close SSH client:", err.Error()+core.AnsiReset) + os.Exit(104) + } + } + + core.Exit(0) +} + +// AddFolderRemoteFromClient creates a new entry-containing directory on the local system and calls the server to create the folder remotely. +// It can safely be called in offline mode, as well, so this is the intended interface for adding folders (AddFolderLocal should only be used directly by the server binary). +func AddFolderRemoteFromClient(targetLocationIncomplete string) { + AddFolderLocal(targetLocationIncomplete) // add the folder on the local system + + deviceIDList := core.GenDeviceIDList(true) + if len(*deviceIDList) > 0 { // ensure a device ID exists (online mode) + // create an SSH client; manualSync is false in case a device ID exists but SSH is not configured + sshClient, _, _ := GetSSHClient(false) + + // call the server to create the folder remotely + GetSSHOutput(sshClient, "libmuttonserver addfolder", strings.ReplaceAll(targetLocationIncomplete, core.PathSeparator, FSPath)) // call the server to create the folder remotely + + // close the SSH client + err := sshClient.Close() + if err != nil { + fmt.Println(core.AnsiError+"Sync failed - Unable to close SSH client:", err.Error()+core.AnsiReset) + os.Exit(104) + } + } + + core.Exit(0) +}