accorder/cmd/upload.go

109 lines
3.2 KiB
Go

package cmd
import (
"fmt"
"os"
miniocmd "github.com/minio/mc/cmd"
"github.com/spf13/cobra"
// "github.com/spf13/pflag"
"github.com/spf13/viper"
)
// uploadCmd represents the upload command
var uploadCmd = &cobra.Command{
Use: "upload",
Short: "Upload local Calibre library to the MotW server.",
Long: `Upload local Calibre library to the Memory of the World server.
It will take care of the differences so files already at the server
will not be uploaded again.
Every time the directory path and/or librarian is provided it is saved in
configuration file for the future use (therefore: 'accorder upload SESSION'
should be enough for the next successful upload).`,
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
session := args[0]
server := ViperValue(session, "server_upload")
// username in upload context comes from library_uuid
username := ViperValue(session, "library_uuid")
// password in upload context comes from library_secret
password := ViperValue(session, "library_secret")
bucket := ViperValue(session, "bucket_upload")
localDirectory := ViperValue(session, "local_upload")
exit := false
for vipFlag, cliFlag := range map[string]string{
"server_upload": "server",
"library_uuid": "username",
"library_secret": "password",
"bucket_upload": "bucket",
"local_upload": "directory",
} {
if ViperValue(session, vipFlag) == "" {
fmt.Printf("ERROR: A flag --%s is missing for session `%s` to work.\n", cliFlag, session)
exit = true
}
}
if exit {
fmt.Println("~ ~ ~ ~")
cmd.Usage()
os.Exit(1)
}
if cmd.Flags().NFlag() > 0 {
viper.WriteConfig()
}
deleteResidue, _ := cmd.PersistentFlags().GetBool("delete-residue")
verbose, _ := cmd.PersistentFlags().GetBool("verbose")
os.Setenv(
fmt.Sprintf("MC_HOST_%s", server),
fmt.Sprintf("https://%s:%s@%s", username, password, server),
)
rgs := []string{"",
"-C", ConfigMinioDir(),
"mirror", "--overwrite",
}
if deleteResidue {
rgs = append(rgs, "--remove")
}
if verbose {
rgs = append(rgs, "--json")
}
rgs = append(rgs, localDirectory, fmt.Sprintf("%s/%s", server, bucket))
miniocmd.Main(rgs)
},
}
func init() {
rootCmd.AddCommand(uploadCmd)
uploadCmd.PersistentFlags().StringP("directory", "d", "", "A local directory to be uploaded.")
uploadCmd.PersistentFlags().StringP("username", "u", "", "Username.")
uploadCmd.PersistentFlags().StringP("password", "p", "", "Password.")
uploadCmd.PersistentFlags().StringP("bucket", "b", "", "A remote directory/bucket where to upload.")
uploadCmd.PersistentFlags().StringP("server", "s", "", "Server.")
uploadCmd.PersistentFlags().BoolP("delete-residue", "", false, "Delete any remote files not present locally anymore.")
uploadCmd.PersistentFlags().BoolP("verbose", "v", false, "Verbose log.")
CustomHelpOutput(uploadCmd)
session := os.Args[len(os.Args)-1]
for vipFlag, cliFlag := range map[string]string{
"server_upload": "server",
"library_uuid": "username",
"library_secret": "password",
"bucket_upload": "bucket",
"local_upload": "directory",
} {
viper.BindPFlag(fmt.Sprintf("%s.%s", session, vipFlag), uploadCmd.PersistentFlags().Lookup(cliFlag))
}
}