diff --git a/src/backend/init.go b/src/backend/init.go index 6394cba..0e048ce 100644 --- a/src/backend/init.go +++ b/src/backend/init.go @@ -10,12 +10,10 @@ import ( ) // TempInit ensures libmutton directories exist and writes the libmutton configuration file -func TempInit(configFileMap map[string]string) { +// TODO if run in append mode, extend old config file with new values, rather than creating from scratch +func TempInit(configFileMap map[string]string, append bool) { // create EntryRoot and ConfigDir - DirInit() - - // remove existing config file - removeFile(ConfigPath) + DirInit(append) if configFileMap["textEditor"] == "" { configFileMap["textEditor"] = textEditorFallback() @@ -68,7 +66,7 @@ func GpgKeyGen() string { } // DirInit creates the libmutton directories -func DirInit() { +func DirInit(preserveOldConfigDir bool) { // create EntryRoot err := os.MkdirAll(EntryRoot, 0700) if err != nil { @@ -76,14 +74,16 @@ func DirInit() { os.Exit(1) } - // remove existing config directory (if it exists) - _, isAccessible := TargetIsFile(ConfigDir, false, 1) - if isAccessible { - err = os.RemoveAll(ConfigDir) - if err != nil { - fmt.Println(AnsiError + "Failed to remove existing config directory: " + err.Error() + AnsiReset) - os.Exit(1) + // remove existing config directory (if it exists and not in append mode) + if !preserveOldConfigDir { + _, isAccessible := TargetIsFile(ConfigDir, false, 1) + if isAccessible { + err = os.RemoveAll(ConfigDir) + if err != nil { + fmt.Println(AnsiError + "Failed to remove existing config directory: " + err.Error() + AnsiReset) + os.Exit(1) + } } } diff --git a/src/cli/init.go b/src/cli/init.go index 0a3d189..dd4dd4b 100644 --- a/src/cli/init.go +++ b/src/cli/init.go @@ -40,16 +40,16 @@ func TempInitCli() { sshKeyProtected := inputBinary("Is the identity file password-protected?") // write config file - backend.TempInit(map[string]string{"textEditor": textEditor, "gpgID": gpgID, "sshUser": sshUser, "sshIP": sshIP, "sshPort": sshPort, "sshKey": sshKey, "sshKeyProtected": strconv.FormatBool(sshKeyProtected)}) + backend.TempInit(map[string]string{"textEditor": textEditor, "gpgID": gpgID, "sshUser": sshUser, "sshIP": sshIP, "sshPort": sshPort, "sshKey": sshKey, "sshKeyProtected": strconv.FormatBool(sshKeyProtected)}, false) // generate device ID sshEntryRoot, sshIsWindows := sync.DeviceIDGen() // update config file with sshEntryRoot and sshIsWindows TODO append to existing config file - backend.TempInit(map[string]string{"textEditor": textEditor, "gpgID": gpgID, "sshUser": sshUser, "sshIP": sshIP, "sshPort": sshPort, "sshKey": sshKey, "sshKeyProtected": strconv.FormatBool(sshKeyProtected), "sshEntryRoot": sshEntryRoot, "sshIsWindows": sshIsWindows}) + backend.TempInit(map[string]string{"textEditor": textEditor, "gpgID": gpgID, "sshUser": sshUser, "sshIP": sshIP, "sshPort": sshPort, "sshKey": sshKey, "sshKeyProtected": strconv.FormatBool(sshKeyProtected), "sshEntryRoot": sshEntryRoot, "sshIsWindows": sshIsWindows}, true) } else { // write config file - backend.TempInit(map[string]string{"textEditor": textEditor, "gpgID": gpgID}) + backend.TempInit(map[string]string{"textEditor": textEditor, "gpgID": gpgID}, false) } } diff --git a/src/sync/client.go b/src/sync/client.go index 90a6e72..e50f8d1 100644 --- a/src/sync/client.go +++ b/src/sync/client.go @@ -24,11 +24,13 @@ const ( func getSSHClient(manualSync bool) (*ssh.Client, string, bool) { // get SSH config info, exit if not configured (displaying an error if the sync job was called manually) var sshUserConfig []string + var missingValueError string if manualSync { - sshUserConfig = backend.ReadConfig([]string{"sshUser", "sshIP", "sshPort", "sshKey", "sshKeyProtected", "sshEntryRoot", "sshIsWindows"}, "SSH settings not configured - run \"mutn init\" to configure") + missingValueError = "SSH settings not configured - run \"mutn init\" to configure" } else { - sshUserConfig = backend.ReadConfig([]string{"sshUser", "sshIP", "sshPort", "sshKey", "sshKeyProtected"}, "0") + missingValueError = "0" } + sshUserConfig = backend.ReadConfig([]string{"sshUser", "sshIP", "sshPort", "sshKey", "sshKeyProtected", "sshEntryRoot", "sshIsWindows"}, missingValueError) var user, ip, port, keyFile, keyFileProtected, entryRoot string var isWindows bool @@ -299,7 +301,7 @@ func sftpSync(downloadList, uploadList []string, manualSync bool) { var remoteFile *sftp.File remoteFile, err = sftpClient.Create(remoteEntryFullPath) if err != nil { - fmt.Println(backend.AnsiError+"Sync failed - Unable to create remote file:", err.Error()+backend.AnsiReset) + fmt.Println(backend.AnsiError+"Sync failed - Unable to create remote file ("+remoteEntryFullPath+"):", err.Error()+backend.AnsiReset) os.Exit(1) }