diff --git a/syncclient/oneOff.go b/syncclient/oneOff.go index 8391a18..f636e8f 100644 --- a/syncclient/oneOff.go +++ b/syncclient/oneOff.go @@ -9,40 +9,44 @@ import ( "github.com/rwinkhart/libmutton/synccommon" ) -// 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). +// 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) error { deviceID, isDir, err := synccommon.ShearLocal(targetLocationIncomplete, "") // remove the target from the local system and get the device ID of the client if err != nil { return errors.New("unable to shear target locally: " + err.Error()) } - if deviceID != "" { // ensure a device ID exists (online mode) - // create an SSH client - sshClient, offlineMode, _, _, err := GetSSHClient() - if offlineMode { - goto end - } - if err != nil { - return errors.New("unable to connect to SSH client: " + err.Error()) - } + sshClient, offlineMode, _, _, err := GetSSHClient() + if offlineMode { + goto end + } + if err != nil { + return errors.New("unable to connect to SSH client: " + err.Error()) + } + if deviceID == "" { + return errors.New("unable to shear target remotely: no device ID found") + } - // ensure targetLocationIncomplete ends with a slash if it is a directory (for clarity in shear message) - if isDir && !strings.HasSuffix(targetLocationIncomplete, "/") { - targetLocationIncomplete += "/" - } + // ensure targetLocationIncomplete ends with a slash if it is a directory (for clarity in shear message) + if isDir && !strings.HasSuffix(targetLocationIncomplete, "/") { + targetLocationIncomplete += "/" + } - // call the server to remotely shear the target and add it to the deletions list - _, err = GetSSHOutput(sshClient, "libmuttonserver shear", deviceID+"\n"+strings.ReplaceAll(targetLocationIncomplete, global.PathSeparator, global.FSPath)) - if err != nil { - return errors.New("unable to shear target remotely: " + err.Error()) - } + // call the server to remotely shear the target and add it to the deletions list + _, err = GetSSHOutput(sshClient, "libmuttonserver shear", deviceID+"\n"+strings.ReplaceAll(targetLocationIncomplete, global.PathSeparator, global.FSPath)) + if err != nil { + return errors.New("unable to shear target remotely: " + err.Error()) + } - // close the SSH client - err = sshClient.Close() - if err != nil { - return errors.New("unable to close SSH client: " + err.Error()) - } + // close the SSH client + err = sshClient.Close() + if err != nil { + return errors.New("unable to close SSH client: " + err.Error()) } end: @@ -50,8 +54,11 @@ end: return nil } -// 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). +// 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) error { err := synccommon.RenameLocal(oldLocationIncomplete, newLocationIncomplete, false) // move the target on the local system if err != nil { @@ -62,30 +69,31 @@ func RenameRemoteFromClient(oldLocationIncomplete, newLocationIncomplete string) if err != nil { return errors.New("unable to generate device ID list: " + err.Error()) } - if len(deviceIDList) > 0 { // ensure a device ID exists (online mode) - // create an SSH client - sshClient, offlineMode, _, _, err := GetSSHClient() - if offlineMode { - goto end - } - if err != nil { - return errors.New("unable to connect to SSH client: " + err.Error()) - } + // create an SSH client + sshClient, offlineMode, _, _, err := GetSSHClient() + if offlineMode { + goto end + } + if err != nil { + return errors.New("unable to connect to SSH client: " + err.Error()) + } + if deviceIDList[0].Name() == "" { + return errors.New("unable to rename target remotely: no device ID found") + } - // call the server to move the target on the remote system and add the old target to the deletions list - _, err = GetSSHOutput(sshClient, "libmuttonserver rename", - (deviceIDList)[0].Name()+"\n"+ - strings.ReplaceAll(oldLocationIncomplete, global.PathSeparator, global.FSPath)+"\n"+ - strings.ReplaceAll(newLocationIncomplete, global.PathSeparator, global.FSPath)) - if err != nil { - return errors.New("unable to rename target remotely: " + err.Error()) - } + // call the server to move the target on the remote system and add the old target to the deletions list + _, err = GetSSHOutput(sshClient, "libmuttonserver rename", + (deviceIDList)[0].Name()+"\n"+ + strings.ReplaceAll(oldLocationIncomplete, global.PathSeparator, global.FSPath)+"\n"+ + strings.ReplaceAll(newLocationIncomplete, global.PathSeparator, global.FSPath)) + if err != nil { + return errors.New("unable to rename target remotely: " + err.Error()) + } - // close the SSH client - err = sshClient.Close() - if err != nil { - return errors.New("unable to close SSH client: " + err.Error()) - } + // close the SSH client + err = sshClient.Close() + if err != nil { + return errors.New("unable to close SSH client: " + err.Error()) } end: @@ -93,39 +101,36 @@ end: return nil } -// 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). +// 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) error { err := synccommon.AddFolderLocal(targetLocationIncomplete) // add the folder on the local system if err != nil { return errors.New("unable to add folder locally: " + err.Error()) } - deviceIDList, err := global.GenDeviceIDList() + // create an SSH client + sshClient, offlineMode, _, _, err := GetSSHClient() + if offlineMode { + goto end + } if err != nil { - return errors.New("unable to generate device ID list: " + err.Error()) + return errors.New("unable to connect to SSH client: " + err.Error()) } - if len(deviceIDList) > 0 { // ensure a device ID exists (online mode) - // create an SSH client - sshClient, offlineMode, _, _, err := GetSSHClient() - if offlineMode { - goto end - } - if err != nil { - return errors.New("unable to connect to SSH client: " + err.Error()) - } - // call the server to create the folder remotely - _, err = GetSSHOutput(sshClient, "libmuttonserver addfolder", strings.ReplaceAll(targetLocationIncomplete, global.PathSeparator, global.FSPath)) // call the server to create the folder remotely - if err != nil { - return errors.New("unable to add folder remotely: " + err.Error()) - } + // call the server to create the folder remotely + _, err = GetSSHOutput(sshClient, "libmuttonserver addfolder", strings.ReplaceAll(targetLocationIncomplete, global.PathSeparator, global.FSPath)) // call the server to create the folder remotely + if err != nil { + return errors.New("unable to add folder remotely: " + err.Error()) + } - // close the SSH client - err = sshClient.Close() - if err != nil { - return errors.New("unable to close SSH client: " + err.Error()) - } + // close the SSH client + err = sshClient.Close() + if err != nil { + return errors.New("unable to close SSH client: " + err.Error()) } end: diff --git a/synccommon/common.go b/synccommon/common.go index 33fa410..9dc8875 100644 --- a/synccommon/common.go +++ b/synccommon/common.go @@ -62,7 +62,7 @@ func ShearLocal(targetLocationIncomplete, clientDeviceID string) (string, bool, } } - // get the full targetLocation path and remove the target + // remove the target locally targetLocationComplete := global.TargetLocationFormat(targetLocationIncomplete) var isFile bool if !onServer { // error if target does not exist on client, needed because os.RemoveAll does not return an error if target does not exist @@ -112,7 +112,7 @@ func RenameLocal(oldLocationIncomplete, newLocationIncomplete string, verifyOldL // AddFolderLocal creates a new entry-containing directory on the local system. // This function should only be used directly by the server binary. func AddFolderLocal(targetLocationIncomplete string) error { - // get the full targetLocation path and create the target + // create the target locally targetLocationComplete := global.TargetLocationFormat(targetLocationIncomplete) err := os.Mkdir(targetLocationComplete, 0700) if err != nil {