diff --git a/clip/copyArgument.go b/clip/copyArgument.go index 937a1a0..34c17ef 100644 --- a/clip/copyArgument.go +++ b/clip/copyArgument.go @@ -40,15 +40,16 @@ func CopyArgument(targetLocation string, field int) error { } if realField == 2 { // TOTP mode - if field != -1 { - fmt.Println("Clipboard refreshing with the current TOTP code until this process is closed") - } + fmt.Println(back.AnsiWarning + "[Starting]" + back.AnsiReset + " TOTP clipboard refresher") errorChan := make(chan error) go TOTPCopier(decSlice[2], field, errorChan, nil) // "done" is not needed because the process runs until the program is killed err = <-errorChan if err != nil { // handle error from first copy return errors.New("error encountered in TOTP refresh process: " + err.Error()) } + if field != -1 { + fmt.Println(back.AnsiGreen + "[Started]" + back.AnsiReset + " TOTP clipboard refresher\n\nService will run until the process is exited") + } select {} // block indefinitely } else { // other copySubject = decSlice[realField] diff --git a/go.mod b/go.mod index 7d20366..521e523 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.25.4 require ( github.com/pkg/sftp v1.13.10 github.com/pquerna/otp v1.5.0 - github.com/rwinkhart/go-boilerplate v0.1.0 + github.com/rwinkhart/go-boilerplate v0.1.1-0.20251110055016-10ee4f91fcb6 github.com/rwinkhart/rcw v0.2.3 golang.design/x/clipboard v0.7.1 // only for mobile builds golang.org/x/crypto v0.43.0 diff --git a/go.sum b/go.sum index b05434a..b3cc29a 100644 --- a/go.sum +++ b/go.sum @@ -14,6 +14,8 @@ github.com/pquerna/otp v1.5.0 h1:NMMR+WrmaqXU4EzdGJEE1aUUI0AMRzsp96fFFWNPwxs= github.com/pquerna/otp v1.5.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= github.com/rwinkhart/go-boilerplate v0.1.0 h1:EzlVj6R7Bxtl79Nl7R5zRcg6s+Cf2FAqGIzR4giWTQg= github.com/rwinkhart/go-boilerplate v0.1.0/go.mod h1:cnzIF45I0FCOvE4YIB+26pLCUx2kWyY2llKYZruNaRY= +github.com/rwinkhart/go-boilerplate v0.1.1-0.20251110055016-10ee4f91fcb6 h1:tGGtw5Wr4laDrU7Ooe95g4E+O6c+oY18atamcMPaMY8= +github.com/rwinkhart/go-boilerplate v0.1.1-0.20251110055016-10ee4f91fcb6/go.mod h1:cnzIF45I0FCOvE4YIB+26pLCUx2kWyY2llKYZruNaRY= github.com/rwinkhart/go-winio v0.1.0 h1:b72agLW+dETGmhR3VbcbwnStfgKfc5AfgJOXBJDkaHg= github.com/rwinkhart/go-winio v0.1.0/go.mod h1:ZWa7ssZJT30CCDGJ7fk/2SBTq9BIQrrVjrcss0UW2s0= github.com/rwinkhart/peercred-mini v0.1.2 h1:4cGWDbv0whvLeVvbUdx84V/9p+2fS+DEXgrA1KxlRFo= diff --git a/libmuttonserver.go b/libmuttonserver.go index aff269c..b65c816 100644 --- a/libmuttonserver.go +++ b/libmuttonserver.go @@ -14,8 +14,6 @@ import ( "github.com/rwinkhart/libmutton/syncserver" ) -const ansiBold = "\033[1m" - func main() { args := os.Args if len(args) < 2 { @@ -93,13 +91,13 @@ func main() { } func helpServer() { - fmt.Print(ansiBold + "\nlibmuttonserver | Copyright (c) 2024-2025 Randall Winkhart\n" + back.AnsiReset + ` + fmt.Print(back.AnsiBold + "\nlibmuttonserver | Copyright (c) 2024-2025 Randall Winkhart\n" + back.AnsiReset + ` This software exists under the MIT license; you may redistribute it under certain conditions. This program comes with absolutely no warranty; type "libmuttonserver version" for details. -` + ansiBold + "Usage:" + back.AnsiReset + ` libmuttonserver +` + back.AnsiBold + "Usage:" + back.AnsiReset + ` libmuttonserver -` + ansiBold + "Arguments (user):" + back.AnsiReset + ` +` + back.AnsiBold + "Arguments (user):" + back.AnsiReset + ` help Bring up this menu version Display version and license information init Create the necessary directories for libmuttonserver to function` + "\n\n") @@ -107,7 +105,7 @@ This program comes with absolutely no warranty; type "libmuttonserver version" f } func versionServer() { - fmt.Print(ansiBold + "\n MIT License" + back.AnsiReset + ` + fmt.Print(back.AnsiBold + "\n MIT License" + back.AnsiReset + ` Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -132,5 +130,5 @@ ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.` + "\n\n---------------------------------------------------------") - fmt.Print(ansiBold + "\n\n libmuttonserver" + back.AnsiReset + " Version " + global.LibmuttonVersion + "\n\n Copyright (c) 2024-2025: Randall Winkhart" + "\n\n") + fmt.Print(back.AnsiBold + "\n\n libmuttonserver" + back.AnsiReset + " Version " + global.LibmuttonVersion + "\n\n Copyright (c) 2024-2025: Randall Winkhart" + "\n\n") } diff --git a/syncclient/client.go b/syncclient/client.go index 52150ad..3a7f57a 100644 --- a/syncclient/client.go +++ b/syncclient/client.go @@ -225,7 +225,7 @@ func sftpSync(sshClient *ssh.Client, sshEntryRoot string, sshIsWindows bool, dow for _, entryName := range downloadList { filesTransferred = true // set a flag to indicate that files have been downloaded (used to determine whether to print a gap between download and upload messages) - fmt.Println("Downloading " + synccommon.AnsiDownload + entryName + back.AnsiReset) + fmt.Println("Downloading " + back.AnsiGreen + entryName + back.AnsiReset) // store path to remote entry remoteEntryFullPath := targetLocationFormatSFTP(entryName, sshEntryRoot, sshIsWindows) @@ -281,7 +281,7 @@ func sftpSync(sshClient *ssh.Client, sshEntryRoot string, sshIsWindows bool, dow for _, entryName := range uploadList { filesTransferred = true // set a flag to indicate that files have been uploaded (used to determine whether to print a gap between upload and sync complete messages) - fmt.Println("Uploading " + synccommon.AnsiUpload + entryName + back.AnsiReset) + fmt.Println("Uploading " + back.AnsiBlue + entryName + back.AnsiReset) // store path to local entry localEntryFullPath := global.TargetLocationFormat(entryName) @@ -353,23 +353,23 @@ func syncLists(sshClient *ssh.Client, sshEntryRoot string, sshIsWindows, timeSyn if remoteModTime, present := remoteEntryModMap[entry]; present { // entry exists on both client and server, compare mod times if remoteModTime > localModTime { - fmt.Println(synccommon.AnsiDownload+entry+back.AnsiReset, "is newer on server, adding to download list") + fmt.Println(back.AnsiGreen+entry+back.AnsiReset, "is newer on server, adding to download list") downloadList = append(downloadList, entry) } else if remoteModTime < localModTime { - fmt.Println(synccommon.AnsiUpload+entry+back.AnsiReset, "is newer on client, adding to upload list") + fmt.Println(back.AnsiBlue+entry+back.AnsiReset, "is newer on client, adding to upload list") uploadList = append(uploadList, entry) } // remove entry from remoteEntryModMap (process of elimination) delete(remoteEntryModMap, entry) } else { - fmt.Println(synccommon.AnsiUpload+entry+back.AnsiReset, "does not exist on server, adding to upload list") + fmt.Println(back.AnsiBlue+entry+back.AnsiReset, "does not exist on server, adding to upload list") uploadList = append(uploadList, entry) } } // iterate over remaining entries in remoteEntryModMap for entry := range remoteEntryModMap { - fmt.Println(synccommon.AnsiDownload+entry+back.AnsiReset, "does not exist on client, adding to download list") + fmt.Println(back.AnsiGreen+entry+back.AnsiReset, "does not exist on client, adding to download list") downloadList = append(downloadList, entry) } diff --git a/synccommon/common.go b/synccommon/common.go index 26498fb..2515149 100644 --- a/synccommon/common.go +++ b/synccommon/common.go @@ -12,9 +12,7 @@ import ( // ANSI color constants used only in this file const ( - AnsiDelete = "\033[38;5;1m" - AnsiDownload = "\033[38;5;2m" - AnsiUpload = "\033[38;5;4m" + AnsiDelete = "\033[38;5;1m" ) var RootLength = len(global.EntryRoot) // length of global.EntryRoot string @@ -119,7 +117,7 @@ func AddFolderLocal(targetLocationIncomplete string) error { err := os.Mkdir(targetLocationComplete, 0700) if err != nil { if os.IsExist(err) { - fmt.Println(AnsiUpload + "Directory already exists - libmutton will still ensure it exists on the server") + fmt.Println(back.AnsiBlue + "Directory already exists - libmutton will still ensure it exists on the server") } else { return errors.New("unable to create directory: " + err.Error()) }