feat: added cacerts and some tidying
This commit is contained in:
parent
2112e7eefd
commit
bdd85b01ff
8 changed files with 279 additions and 59 deletions
|
|
@ -24,17 +24,29 @@ var deleteCmd = &cobra.Command{
|
||||||
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
||||||
setenv(cmd, "host", "MAKESHIFT_HOST")
|
setenv(cmd, "host", "MAKESHIFT_HOST")
|
||||||
setenv(cmd, "path", "MAKESHIFT_PATH")
|
setenv(cmd, "path", "MAKESHIFT_PATH")
|
||||||
|
setenv(cmd, "cacert", "MAKESHIFT_CACERT")
|
||||||
},
|
},
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
var (
|
var (
|
||||||
host, _ = cmd.Flags().GetString("host")
|
host, _ = cmd.Flags().GetString("host")
|
||||||
paths, _ = cmd.Flags().GetStringSlice("path")
|
paths, _ = cmd.Flags().GetStringSlice("path")
|
||||||
|
cacertPath, _ = cmd.Flags().GetString("cacert")
|
||||||
|
|
||||||
c = client.New(host)
|
c = client.New(host)
|
||||||
res *http.Response
|
res *http.Response
|
||||||
query string
|
query string
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
|
log.Debug().
|
||||||
|
Str("host", host).
|
||||||
|
Str("cacert", cacertPath).
|
||||||
|
Send()
|
||||||
|
|
||||||
|
if cacertPath != "" {
|
||||||
|
c.LoadCertificateFromPath(cacertPath)
|
||||||
|
}
|
||||||
|
|
||||||
for _, path := range paths {
|
for _, path := range paths {
|
||||||
if path == "" {
|
if path == "" {
|
||||||
log.Warn().Msg("skipping empty path")
|
log.Warn().Msg("skipping empty path")
|
||||||
|
|
@ -61,7 +73,8 @@ var deleteProfilesCmd = &cobra.Command{
|
||||||
Short: "Delete profile(s)",
|
Short: "Delete profile(s)",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
var (
|
var (
|
||||||
host, _ = cmd.Flags().GetString("host")
|
host, _ = cmd.Flags().GetString("host")
|
||||||
|
cacertPath, _ = cmd.Flags().GetString("cacert")
|
||||||
|
|
||||||
c = client.New(host)
|
c = client.New(host)
|
||||||
res *http.Response
|
res *http.Response
|
||||||
|
|
@ -69,6 +82,14 @@ var deleteProfilesCmd = &cobra.Command{
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
|
log.Debug().
|
||||||
|
Str("host", host).
|
||||||
|
Str("cacert", cacertPath).
|
||||||
|
Send()
|
||||||
|
|
||||||
|
if cacertPath != "" {
|
||||||
|
c.LoadCertificateFromPath(cacertPath)
|
||||||
|
}
|
||||||
for _, profileID := range args {
|
for _, profileID := range args {
|
||||||
if profileID == "default" {
|
if profileID == "default" {
|
||||||
log.Warn().Msg("cannot delete the default profile")
|
log.Warn().Msg("cannot delete the default profile")
|
||||||
|
|
@ -95,7 +116,8 @@ var deletePluginsCmd = &cobra.Command{
|
||||||
Short: "Delete plugin(s)",
|
Short: "Delete plugin(s)",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
var (
|
var (
|
||||||
host, _ = cmd.Flags().GetString("host")
|
host, _ = cmd.Flags().GetString("host")
|
||||||
|
cacertPath, _ = cmd.Flags().GetString("cacert")
|
||||||
|
|
||||||
c = client.New(host)
|
c = client.New(host)
|
||||||
res *http.Response
|
res *http.Response
|
||||||
|
|
@ -103,6 +125,15 @@ var deletePluginsCmd = &cobra.Command{
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
|
log.Debug().
|
||||||
|
Str("host", host).
|
||||||
|
Str("cacert", cacertPath).
|
||||||
|
Send()
|
||||||
|
|
||||||
|
if cacertPath != "" {
|
||||||
|
c.LoadCertificateFromPath(cacertPath)
|
||||||
|
}
|
||||||
|
|
||||||
for _, pluginName := range args {
|
for _, pluginName := range args {
|
||||||
query = fmt.Sprintf("/plugins/%s", pluginName)
|
query = fmt.Sprintf("/plugins/%s", pluginName)
|
||||||
res, _, err = c.MakeRequest(client.HTTPEnvelope{
|
res, _, err = c.MakeRequest(client.HTTPEnvelope{
|
||||||
|
|
@ -116,6 +147,7 @@ var deletePluginsCmd = &cobra.Command{
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
deleteCmd.PersistentFlags().String("host", "http://localhost:5050", "Set the makeshift server host (can be set with MAKESHIFT_HOST)")
|
deleteCmd.PersistentFlags().String("host", "http://localhost:5050", "Set the makeshift server host (can be set with MAKESHIFT_HOST)")
|
||||||
|
deleteCmd.PersistentFlags().String("cacert", "", "Set the CA certificate path to load")
|
||||||
deleteCmd.Flags().StringSliceP("path", "p", []string{}, "Set the paths to delete files and directories")
|
deleteCmd.Flags().StringSliceP("path", "p", []string{}, "Set the paths to delete files and directories")
|
||||||
deleteCmd.AddCommand(deleteProfilesCmd, deletePluginsCmd)
|
deleteCmd.AddCommand(deleteProfilesCmd, deletePluginsCmd)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,12 +37,14 @@ var downloadCmd = cobra.Command{
|
||||||
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
||||||
setenv(cmd, "host", "MAKESHIFT_HOST")
|
setenv(cmd, "host", "MAKESHIFT_HOST")
|
||||||
setenv(cmd, "path", "MAKESHIFT_PATH")
|
setenv(cmd, "path", "MAKESHIFT_PATH")
|
||||||
|
setenv(cmd, "cacert", "MAKESHIFT_CACERT")
|
||||||
},
|
},
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
var (
|
var (
|
||||||
host, _ = cmd.Flags().GetString("host")
|
host, _ = cmd.Flags().GetString("host")
|
||||||
path, _ = cmd.Flags().GetString("path")
|
path, _ = cmd.Flags().GetString("path")
|
||||||
outputPath, _ = cmd.Flags().GetString("output")
|
outputPath, _ = cmd.Flags().GetString("output")
|
||||||
|
cacertPath, _ = cmd.Flags().GetString("cacert")
|
||||||
pluginNames, _ = cmd.Flags().GetStringSlice("plugins")
|
pluginNames, _ = cmd.Flags().GetStringSlice("plugins")
|
||||||
profileIDs, _ = cmd.Flags().GetStringSlice("profiles")
|
profileIDs, _ = cmd.Flags().GetStringSlice("profiles")
|
||||||
extract, _ = cmd.Flags().GetBool("extract")
|
extract, _ = cmd.Flags().GetBool("extract")
|
||||||
|
|
@ -72,6 +74,10 @@ var downloadCmd = cobra.Command{
|
||||||
Strs("plugins", pluginNames).
|
Strs("plugins", pluginNames).
|
||||||
Send()
|
Send()
|
||||||
|
|
||||||
|
if cacertPath != "" {
|
||||||
|
c.LoadCertificateFromPath(cacertPath)
|
||||||
|
}
|
||||||
|
|
||||||
res, body, err = c.MakeRequest(client.HTTPEnvelope{
|
res, body, err = c.MakeRequest(client.HTTPEnvelope{
|
||||||
Path: query,
|
Path: query,
|
||||||
Method: http.MethodGet,
|
Method: http.MethodGet,
|
||||||
|
|
@ -163,6 +169,7 @@ var downloadProfileCmd = &cobra.Command{
|
||||||
var (
|
var (
|
||||||
host, _ = cmd.Flags().GetString("host")
|
host, _ = cmd.Flags().GetString("host")
|
||||||
outputPath, _ = cmd.Flags().GetString("output")
|
outputPath, _ = cmd.Flags().GetString("output")
|
||||||
|
cacertPath, _ = cmd.Flags().GetString("cacert")
|
||||||
|
|
||||||
c = client.New(host)
|
c = client.New(host)
|
||||||
res *http.Response
|
res *http.Response
|
||||||
|
|
@ -176,6 +183,10 @@ var downloadProfileCmd = &cobra.Command{
|
||||||
Str("output", outputPath).
|
Str("output", outputPath).
|
||||||
Send()
|
Send()
|
||||||
|
|
||||||
|
if cacertPath != "" {
|
||||||
|
c.LoadCertificateFromPath(cacertPath)
|
||||||
|
}
|
||||||
|
|
||||||
for _, profileID := range args {
|
for _, profileID := range args {
|
||||||
query = fmt.Sprintf("/profiles/%s", profileID)
|
query = fmt.Sprintf("/profiles/%s", profileID)
|
||||||
res, body, err = c.MakeRequest(client.HTTPEnvelope{
|
res, body, err = c.MakeRequest(client.HTTPEnvelope{
|
||||||
|
|
@ -219,6 +230,7 @@ var downloadPluginCmd = &cobra.Command{
|
||||||
var (
|
var (
|
||||||
host, _ = cmd.Flags().GetString("host")
|
host, _ = cmd.Flags().GetString("host")
|
||||||
outputPath, _ = cmd.Flags().GetString("output")
|
outputPath, _ = cmd.Flags().GetString("output")
|
||||||
|
cacertPath, _ = cmd.Flags().GetString("cacert")
|
||||||
|
|
||||||
c = client.New(host)
|
c = client.New(host)
|
||||||
res *http.Response
|
res *http.Response
|
||||||
|
|
@ -232,6 +244,10 @@ var downloadPluginCmd = &cobra.Command{
|
||||||
Str("output", outputPath).
|
Str("output", outputPath).
|
||||||
Send()
|
Send()
|
||||||
|
|
||||||
|
if cacertPath != "" {
|
||||||
|
c.LoadCertificateFromPath(cacertPath)
|
||||||
|
}
|
||||||
|
|
||||||
for _, pluginName := range args {
|
for _, pluginName := range args {
|
||||||
query = fmt.Sprintf("/plugins/%s/raw", pluginName)
|
query = fmt.Sprintf("/plugins/%s/raw", pluginName)
|
||||||
res, body, err = c.MakeRequest(client.HTTPEnvelope{
|
res, body, err = c.MakeRequest(client.HTTPEnvelope{
|
||||||
|
|
@ -267,6 +283,7 @@ var downloadPluginCmd = &cobra.Command{
|
||||||
func init() {
|
func init() {
|
||||||
downloadCmd.PersistentFlags().String("host", "http://localhost:5050", "Set the makeshift remote host (can be set with MAKESHIFT_HOST)")
|
downloadCmd.PersistentFlags().String("host", "http://localhost:5050", "Set the makeshift remote host (can be set with MAKESHIFT_HOST)")
|
||||||
downloadCmd.PersistentFlags().StringP("output", "o", "", "Set the output path to write files")
|
downloadCmd.PersistentFlags().StringP("output", "o", "", "Set the output path to write files")
|
||||||
|
downloadCmd.PersistentFlags().String("cacert", "", "Set the CA certificate path to load")
|
||||||
downloadCmd.Flags().StringP("path", "p", ".", "Set the path to list files (can be set with MAKESHIFT_PATH)")
|
downloadCmd.Flags().StringP("path", "p", ".", "Set the path to list files (can be set with MAKESHIFT_PATH)")
|
||||||
downloadCmd.Flags().StringSlice("profiles", []string{}, "Set the profile(s) to use to populate data store")
|
downloadCmd.Flags().StringSlice("profiles", []string{}, "Set the profile(s) to use to populate data store")
|
||||||
downloadCmd.Flags().StringSlice("plugins", []string{}, "Set the plugin(s) to run before downloading files")
|
downloadCmd.Flags().StringSlice("plugins", []string{}, "Set the plugin(s) to run before downloading files")
|
||||||
|
|
|
||||||
49
cmd/list.go
49
cmd/list.go
|
|
@ -24,14 +24,16 @@ var listCmd = &cobra.Command{
|
||||||
`,
|
`,
|
||||||
Args: cobra.NoArgs,
|
Args: cobra.NoArgs,
|
||||||
Short: "List all files in a remote data directory",
|
Short: "List all files in a remote data directory",
|
||||||
PreRun: func(cmd *cobra.Command, args []string) {
|
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
||||||
setenv(cmd, "host", "MAKESHIFT_HOST")
|
setenv(cmd, "host", "MAKESHIFT_HOST")
|
||||||
setenv(cmd, "path", "MAKESHIFT_PATH")
|
setenv(cmd, "path", "MAKESHIFT_PATH")
|
||||||
|
setenv(cmd, "cacert", "MAKESHIFT_CACERT")
|
||||||
},
|
},
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
var (
|
var (
|
||||||
host, _ = cmd.Flags().GetString("host")
|
host, _ = cmd.Flags().GetString("host")
|
||||||
path, _ = cmd.Flags().GetString("path")
|
path, _ = cmd.Flags().GetString("path")
|
||||||
|
cacertPath, _ = cmd.Flags().GetString("cacert")
|
||||||
|
|
||||||
c = client.New(host)
|
c = client.New(host)
|
||||||
body []byte
|
body []byte
|
||||||
|
|
@ -42,8 +44,13 @@ var listCmd = &cobra.Command{
|
||||||
log.Debug().
|
log.Debug().
|
||||||
Str("host", host).
|
Str("host", host).
|
||||||
Str("path", path).
|
Str("path", path).
|
||||||
|
Str("cacert", cacertPath).
|
||||||
Send()
|
Send()
|
||||||
|
|
||||||
|
if cacertPath != "" {
|
||||||
|
c.LoadCertificateFromPath(cacertPath)
|
||||||
|
}
|
||||||
|
|
||||||
// make request to /list endpoint
|
// make request to /list endpoint
|
||||||
_, body, err = c.MakeRequest(client.HTTPEnvelope{
|
_, body, err = c.MakeRequest(client.HTTPEnvelope{
|
||||||
Path: fmt.Sprintf("/list/%s", path),
|
Path: fmt.Sprintf("/list/%s", path),
|
||||||
|
|
@ -80,7 +87,8 @@ var listPluginsCmd = &cobra.Command{
|
||||||
Short: "Show plugins information",
|
Short: "Show plugins information",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
var (
|
var (
|
||||||
host, _ = cmd.Flags().GetString("host")
|
host, _ = cmd.Flags().GetString("host")
|
||||||
|
cacertPath, _ = cmd.Flags().GetString("cacert")
|
||||||
|
|
||||||
c = client.New(host)
|
c = client.New(host)
|
||||||
res *http.Response
|
res *http.Response
|
||||||
|
|
@ -90,6 +98,15 @@ var listPluginsCmd = &cobra.Command{
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
|
log.Debug().
|
||||||
|
Str("host", host).
|
||||||
|
Str("cacert", cacertPath).
|
||||||
|
Send()
|
||||||
|
|
||||||
|
if cacertPath != "" {
|
||||||
|
c.LoadCertificateFromPath(cacertPath)
|
||||||
|
}
|
||||||
|
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
// make request to /list endpoint
|
// make request to /list endpoint
|
||||||
res, body, err = c.MakeRequest(client.HTTPEnvelope{
|
res, body, err = c.MakeRequest(client.HTTPEnvelope{
|
||||||
|
|
@ -121,11 +138,19 @@ var listPluginsCmd = &cobra.Command{
|
||||||
}
|
}
|
||||||
|
|
||||||
var listProfilesCmd = &cobra.Command{
|
var listProfilesCmd = &cobra.Command{
|
||||||
Use: "profiles",
|
Use: "profiles",
|
||||||
|
Example: `
|
||||||
|
# list all profiles
|
||||||
|
makeshift list profiles
|
||||||
|
|
||||||
|
# live individual profiles
|
||||||
|
makeshift list profiles default custom
|
||||||
|
`,
|
||||||
Short: "Show all available profiles",
|
Short: "Show all available profiles",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
var (
|
var (
|
||||||
host, _ = cmd.Flags().GetString("host")
|
host, _ = cmd.Flags().GetString("host")
|
||||||
|
cacertPath, _ = cmd.Flags().GetString("cacert")
|
||||||
|
|
||||||
c = client.New(host)
|
c = client.New(host)
|
||||||
res *http.Response
|
res *http.Response
|
||||||
|
|
@ -135,6 +160,15 @@ var listProfilesCmd = &cobra.Command{
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
|
log.Debug().
|
||||||
|
Str("host", host).
|
||||||
|
Str("cacert", cacertPath).
|
||||||
|
Send()
|
||||||
|
|
||||||
|
if cacertPath != "" {
|
||||||
|
c.LoadCertificateFromPath(cacertPath)
|
||||||
|
}
|
||||||
|
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
// make request to /list endpoint
|
// make request to /list endpoint
|
||||||
res, body, err = c.MakeRequest(client.HTTPEnvelope{
|
res, body, err = c.MakeRequest(client.HTTPEnvelope{
|
||||||
|
|
@ -154,7 +188,7 @@ var listProfilesCmd = &cobra.Command{
|
||||||
// make request to /list endpoint
|
// make request to /list endpoint
|
||||||
query = fmt.Sprintf("/profiles/%s", profileID)
|
query = fmt.Sprintf("/profiles/%s", profileID)
|
||||||
res, body, err = c.MakeRequest(client.HTTPEnvelope{
|
res, body, err = c.MakeRequest(client.HTTPEnvelope{
|
||||||
Path: fmt.Sprintf(query),
|
Path: query,
|
||||||
Method: http.MethodGet,
|
Method: http.MethodGet,
|
||||||
})
|
})
|
||||||
handleResponseError(res, host, query, err)
|
handleResponseError(res, host, query, err)
|
||||||
|
|
@ -174,6 +208,7 @@ var listProfilesCmd = &cobra.Command{
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
listCmd.PersistentFlags().String("host", "http://localhost:5050", "Set the configurator remote host (can be set with MAKESHIFT_HOST)")
|
listCmd.PersistentFlags().String("host", "http://localhost:5050", "Set the configurator remote host (can be set with MAKESHIFT_HOST)")
|
||||||
|
listCmd.PersistentFlags().String("cacert", "", "Set the CA certificate path to load")
|
||||||
listCmd.Flags().StringP("path", "p", ".", "Set the path to list files (can be set with MAKESHIFT_PATH)")
|
listCmd.Flags().StringP("path", "p", ".", "Set the path to list files (can be set with MAKESHIFT_PATH)")
|
||||||
|
|
||||||
listCmd.AddCommand(listPluginsCmd, listProfilesCmd)
|
listCmd.AddCommand(listPluginsCmd, listProfilesCmd)
|
||||||
|
|
|
||||||
18
cmd/serve.go
18
cmd/serve.go
|
|
@ -23,12 +23,16 @@ var serveCmd = &cobra.Command{
|
||||||
setenv(cmd, "host", "MAKESHIFT_HOST")
|
setenv(cmd, "host", "MAKESHIFT_HOST")
|
||||||
setenv(cmd, "root", "MAKESHIFT_ROOT")
|
setenv(cmd, "root", "MAKESHIFT_ROOT")
|
||||||
setenv(cmd, "timeout", "MAKESHIFT_TIMEOUT")
|
setenv(cmd, "timeout", "MAKESHIFT_TIMEOUT")
|
||||||
|
setenv(cmd, "cacert", "MAKESHIFT_CACERT")
|
||||||
|
setenv(cmd, "keyfile", "MAKESHIFT_KEYFILE")
|
||||||
},
|
},
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
var (
|
var (
|
||||||
host, _ = cmd.Flags().GetString("host")
|
host, _ = cmd.Flags().GetString("host")
|
||||||
rootPath, _ = cmd.Flags().GetString("root")
|
rootPath, _ = cmd.Flags().GetString("root")
|
||||||
timeout, _ = cmd.Flags().GetInt("timeout")
|
cacertPath, _ = cmd.Flags().GetString("cacert")
|
||||||
|
keyfile, _ = cmd.Flags().GetString("keyfile")
|
||||||
|
timeout, _ = cmd.Flags().GetInt("timeout")
|
||||||
|
|
||||||
parsed *url.URL
|
parsed *url.URL
|
||||||
server *service.Service
|
server *service.Service
|
||||||
|
|
@ -47,6 +51,8 @@ var serveCmd = &cobra.Command{
|
||||||
server = service.New()
|
server = service.New()
|
||||||
server.Addr = parsed.Host
|
server.Addr = parsed.Host
|
||||||
server.RootPath = rootPath
|
server.RootPath = rootPath
|
||||||
|
server.CACertFile = cacertPath
|
||||||
|
server.CACertKeyfile = keyfile
|
||||||
server.Timeout = time.Duration(timeout) * time.Second
|
server.Timeout = time.Duration(timeout) * time.Second
|
||||||
|
|
||||||
// show some debugging information
|
// show some debugging information
|
||||||
|
|
@ -54,6 +60,8 @@ var serveCmd = &cobra.Command{
|
||||||
Str("host", parsed.Host).
|
Str("host", parsed.Host).
|
||||||
Any("paths", map[string]string{
|
Any("paths", map[string]string{
|
||||||
"root": rootPath,
|
"root": rootPath,
|
||||||
|
"cacert": cacertPath,
|
||||||
|
"keyfile": keyfile,
|
||||||
"data": server.PathForData(),
|
"data": server.PathForData(),
|
||||||
"profiles": server.PathForProfiles(),
|
"profiles": server.PathForProfiles(),
|
||||||
"plugins": server.PathForPlugins(),
|
"plugins": server.PathForPlugins(),
|
||||||
|
|
@ -84,6 +92,10 @@ func init() {
|
||||||
serveCmd.Flags().String("host", "localhost:5050", "Set the configurator server host (can be set with MAKESHIFT_HOST)")
|
serveCmd.Flags().String("host", "localhost:5050", "Set the configurator server host (can be set with MAKESHIFT_HOST)")
|
||||||
serveCmd.Flags().String("root", "./", "Set the root path to serve files (can be set with MAKESHIFT_ROOT)")
|
serveCmd.Flags().String("root", "./", "Set the root path to serve files (can be set with MAKESHIFT_ROOT)")
|
||||||
serveCmd.Flags().IntP("timeout", "t", 60, "Set the timeout in seconds for requests (can be set with MAKESHIFT_TIMEOUT)")
|
serveCmd.Flags().IntP("timeout", "t", 60, "Set the timeout in seconds for requests (can be set with MAKESHIFT_TIMEOUT)")
|
||||||
|
serveCmd.Flags().String("cacert", "", "Set the CA certificate path to load (can be set with MAKESHIFT_CACERT)")
|
||||||
|
serveCmd.Flags().String("keyfile", "", "Set the CA key file to use (can be set with MAKESHIFT_KEYFILE)")
|
||||||
|
|
||||||
|
serveCmd.MarkFlagsRequiredTogether("cacert", "keyfile")
|
||||||
|
|
||||||
rootCmd.AddCommand(serveCmd)
|
rootCmd.AddCommand(serveCmd)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
176
cmd/upload.go
176
cmd/upload.go
|
|
@ -4,6 +4,8 @@ import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/fs"
|
||||||
|
"maps"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
@ -41,12 +43,14 @@ var uploadCmd = &cobra.Command{
|
||||||
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
||||||
setenv(cmd, "host", "MAKESHIFT_HOST")
|
setenv(cmd, "host", "MAKESHIFT_HOST")
|
||||||
setenv(cmd, "path", "MAKESHIFT_PATH")
|
setenv(cmd, "path", "MAKESHIFT_PATH")
|
||||||
|
setenv(cmd, "cacert", "MAKESHIFT_CACERT")
|
||||||
},
|
},
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
var (
|
var (
|
||||||
host, _ = cmd.Flags().GetString("host")
|
host, _ = cmd.Flags().GetString("host")
|
||||||
path, _ = cmd.Flags().GetString("path")
|
path, _ = cmd.Flags().GetString("path")
|
||||||
dataArgs, _ = cmd.Flags().GetStringArray("data")
|
cacertPath, _ = cmd.Flags().GetString("cacert")
|
||||||
|
dataArgs, _ = cmd.Flags().GetStringArray("data")
|
||||||
|
|
||||||
inputData = processFiles(dataArgs)
|
inputData = processFiles(dataArgs)
|
||||||
useDirectoryPath = len(inputData) > 1
|
useDirectoryPath = len(inputData) > 1
|
||||||
|
|
@ -55,8 +59,21 @@ var uploadCmd = &cobra.Command{
|
||||||
query string
|
query string
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
|
log.Debug().
|
||||||
|
Str("host", host).
|
||||||
|
Str("path", path).
|
||||||
|
Str("query", query).
|
||||||
|
Str("cacert", cacertPath).
|
||||||
|
Any("input", inputData).
|
||||||
|
Send()
|
||||||
|
|
||||||
|
if cacertPath != "" {
|
||||||
|
c.LoadCertificateFromPath(cacertPath)
|
||||||
|
}
|
||||||
|
|
||||||
for inputPath, contents := range inputData {
|
for inputPath, contents := range inputData {
|
||||||
log.Info().Str("path", path).Int("size", len(contents)).Send()
|
log.Debug().Str("path", path).Int("size", len(contents)).Send()
|
||||||
if useDirectoryPath {
|
if useDirectoryPath {
|
||||||
query = path + "/" + filepath.Clean(inputPath)
|
query = path + "/" + filepath.Clean(inputPath)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -92,9 +109,10 @@ var uploadProfilesCmd = &cobra.Command{
|
||||||
Short: "Upload a new profile",
|
Short: "Upload a new profile",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
var (
|
var (
|
||||||
host, _ = cmd.Flags().GetString("host")
|
host, _ = cmd.Flags().GetString("host")
|
||||||
dataArgs, _ = cmd.Flags().GetStringArray("data")
|
dataArgs, _ = cmd.Flags().GetStringArray("data")
|
||||||
profiles = processProfiles(dataArgs)
|
cacertPath, _ = cmd.Flags().GetString("cacert")
|
||||||
|
profiles = processProfiles(dataArgs)
|
||||||
|
|
||||||
c = client.New(host)
|
c = client.New(host)
|
||||||
res *http.Response
|
res *http.Response
|
||||||
|
|
@ -103,6 +121,16 @@ var uploadProfilesCmd = &cobra.Command{
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
|
log.Debug().
|
||||||
|
Str("host", host).
|
||||||
|
Str("query", query).
|
||||||
|
Str("cacert", cacertPath).
|
||||||
|
Send()
|
||||||
|
|
||||||
|
if cacertPath != "" {
|
||||||
|
c.LoadCertificateFromPath(cacertPath)
|
||||||
|
}
|
||||||
|
|
||||||
// load files from args
|
// load files from args
|
||||||
for i, path := range args {
|
for i, path := range args {
|
||||||
body, err = os.ReadFile(path)
|
body, err = os.ReadFile(path)
|
||||||
|
|
@ -160,8 +188,9 @@ var uploadPluginsCmd = &cobra.Command{
|
||||||
// make one request be host positional argument (restricted to 1 for now)
|
// make one request be host positional argument (restricted to 1 for now)
|
||||||
// temp := append(handleArgs(args), processDataArgs(dataArgs)...)
|
// temp := append(handleArgs(args), processDataArgs(dataArgs)...)
|
||||||
var (
|
var (
|
||||||
host, _ = cmd.Flags().GetString("host")
|
host, _ = cmd.Flags().GetString("host")
|
||||||
dataArgs, _ = cmd.Flags().GetStringArray("data")
|
dataArgs, _ = cmd.Flags().GetStringArray("data")
|
||||||
|
cacertPath, _ = cmd.Flags().GetString("cacert")
|
||||||
|
|
||||||
plugins = processFiles(dataArgs)
|
plugins = processFiles(dataArgs)
|
||||||
c = client.New(host)
|
c = client.New(host)
|
||||||
|
|
@ -172,6 +201,16 @@ var uploadPluginsCmd = &cobra.Command{
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
|
log.Debug().
|
||||||
|
Str("host", host).
|
||||||
|
Str("query", query).
|
||||||
|
Str("cacert", cacertPath).
|
||||||
|
Send()
|
||||||
|
|
||||||
|
if cacertPath != "" {
|
||||||
|
c.LoadCertificateFromPath(cacertPath)
|
||||||
|
}
|
||||||
|
|
||||||
// load files from args
|
// load files from args
|
||||||
for i, path := range args {
|
for i, path := range args {
|
||||||
body, err = os.ReadFile(path)
|
body, err = os.ReadFile(path)
|
||||||
|
|
@ -208,6 +247,8 @@ var uploadPluginsCmd = &cobra.Command{
|
||||||
func init() {
|
func init() {
|
||||||
uploadCmd.PersistentFlags().String("host", "http://localhost:5050", "Set the makeshift remote host (can be set with MAKESHIFT_HOST)")
|
uploadCmd.PersistentFlags().String("host", "http://localhost:5050", "Set the makeshift remote host (can be set with MAKESHIFT_HOST)")
|
||||||
uploadCmd.PersistentFlags().StringArrayP("data", "d", []string{}, "Set the data to send to specified host (prepend @ for files)")
|
uploadCmd.PersistentFlags().StringArrayP("data", "d", []string{}, "Set the data to send to specified host (prepend @ for files)")
|
||||||
|
uploadCmd.PersistentFlags().String("cacert", "", "Set the CA certificate path to load")
|
||||||
|
|
||||||
uploadCmd.Flags().StringP("path", "p", ".", "Set the path to list files (can be set with MAKESHIFT_PATH)")
|
uploadCmd.Flags().StringP("path", "p", ".", "Set the path to list files (can be set with MAKESHIFT_PATH)")
|
||||||
|
|
||||||
uploadProfilesCmd.Flags().VarP(&inputFormat, "format", "F", "Set the input format for profile")
|
uploadProfilesCmd.Flags().VarP(&inputFormat, "format", "F", "Set the input format for profile")
|
||||||
|
|
@ -220,31 +261,27 @@ func processFiles(args []string) map[string][]byte {
|
||||||
// load data either from file or directly from args
|
// load data either from file or directly from args
|
||||||
var collection = make(map[string][]byte, len(args))
|
var collection = make(map[string][]byte, len(args))
|
||||||
for _, arg := range args {
|
for _, arg := range args {
|
||||||
// if arg is empty string, then skip and continue
|
// skip empty string args
|
||||||
if len(arg) > 0 {
|
if len(arg) > 0 {
|
||||||
// determine if we're reading from file to load contents
|
// determine if we're reading from file to load contents
|
||||||
if strings.HasPrefix(arg, "@") {
|
if strings.HasPrefix(arg, "@") {
|
||||||
var (
|
var path string = strings.TrimLeft(arg, "@")
|
||||||
path string = strings.TrimLeft(arg, "@")
|
|
||||||
contents []byte
|
// process sub-directories recursively
|
||||||
err error
|
newCollection, err := processDir(path)
|
||||||
)
|
|
||||||
contents, err = os.ReadFile(path)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Str("path", path).Msg("failed to read file")
|
log.Warn().
|
||||||
continue
|
Err(err).
|
||||||
|
Str("path", path).
|
||||||
|
Msg("failed to process directory at path")
|
||||||
}
|
}
|
||||||
|
log.Trace().
|
||||||
|
Str("path", path).
|
||||||
|
Msg("new collection added at path")
|
||||||
|
maps.Copy(collection, newCollection)
|
||||||
|
|
||||||
// skip empty files
|
|
||||||
if len(contents) == 0 {
|
|
||||||
log.Warn().Str("path", path).Msg("file is empty")
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// add loaded data to collection of all data
|
|
||||||
collection[path] = contents
|
|
||||||
} else {
|
} else {
|
||||||
log.Warn().Msg("only files can be uploaded (add @ before the path)")
|
log.Warn().Msg("only files can be uploaded (add @ before the path with '--data' flag)")
|
||||||
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
@ -275,20 +312,28 @@ func processProfiles(args []string) []*makeshift.Profile {
|
||||||
)
|
)
|
||||||
contents, err = os.ReadFile(path)
|
contents, err = os.ReadFile(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Str("path", path).Msg("failed to read file")
|
log.Error().
|
||||||
|
Err(err).
|
||||||
|
Str("path", path).
|
||||||
|
Msg("failed to read file")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip empty files
|
// skip empty files
|
||||||
if len(contents) == 0 {
|
if len(contents) == 0 {
|
||||||
log.Warn().Str("path", path).Msg("file is empty")
|
log.Warn().
|
||||||
|
Str("path", path).
|
||||||
|
Msg("file is empty")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// convert/validate input data
|
// convert/validate input data
|
||||||
data, err = parseProfile(contents, format.DataFormatFromFileExt(path, inputFormat))
|
data, err = parseProfile(contents, format.DataFormatFromFileExt(path, inputFormat))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Str("path", path).Msg("failed to validate input from file")
|
log.Error().
|
||||||
|
Err(err).
|
||||||
|
Str("path", path).
|
||||||
|
Msg("failed to validate input from file")
|
||||||
}
|
}
|
||||||
|
|
||||||
// add loaded data to collection of all data
|
// add loaded data to collection of all data
|
||||||
|
|
@ -306,7 +351,9 @@ func processProfiles(args []string) []*makeshift.Profile {
|
||||||
}
|
}
|
||||||
err = json.Unmarshal(input, &data)
|
err = json.Unmarshal(input, &data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Msgf("failed to unmarshal input for argument %d", i)
|
log.Error().
|
||||||
|
Err(err).
|
||||||
|
Msgf("failed to unmarshal input for argument %d", i)
|
||||||
}
|
}
|
||||||
return []*makeshift.Profile{data}
|
return []*makeshift.Profile{data}
|
||||||
}
|
}
|
||||||
|
|
@ -315,6 +362,73 @@ func processProfiles(args []string) []*makeshift.Profile {
|
||||||
return collection
|
return collection
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func processDir(path string) (map[string][]byte, error) {
|
||||||
|
var (
|
||||||
|
collection = map[string][]byte{}
|
||||||
|
fileInfo os.FileInfo
|
||||||
|
contents []byte
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
// determine if path is directory
|
||||||
|
if fileInfo, err = os.Stat(path); err == nil {
|
||||||
|
if fileInfo.IsDir() {
|
||||||
|
filepath.WalkDir(path, func(path string, d fs.DirEntry, err error) error {
|
||||||
|
if !d.IsDir() {
|
||||||
|
contents, err = os.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Str("path", path).Msg("failed to read file")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip empty files
|
||||||
|
if len(contents) == 0 {
|
||||||
|
log.Warn().Str("path", path).Msg("file is empty")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debug().
|
||||||
|
Str("path", path).
|
||||||
|
Msg("file added to collection")
|
||||||
|
|
||||||
|
// add loaded data to collection of all data
|
||||||
|
collection[path] = contents
|
||||||
|
} else {
|
||||||
|
// process sub-directories recursively
|
||||||
|
newCollection, err := processDir(path)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to process directory at path '%s': %v", path, err)
|
||||||
|
}
|
||||||
|
log.Trace().
|
||||||
|
Str("path", path).
|
||||||
|
Msg("new collection added from nested directory")
|
||||||
|
maps.Copy(collection, newCollection)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
contents, err = os.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return collection, fmt.Errorf("failed to read file at path '%s': %v", path, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip empty files
|
||||||
|
if len(contents) == 0 {
|
||||||
|
return collection, fmt.Errorf("file is empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debug().
|
||||||
|
Str("path", path).
|
||||||
|
Msg("file added to collection")
|
||||||
|
|
||||||
|
// add loaded data to collection of all data
|
||||||
|
collection[path] = contents
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return nil, fmt.Errorf("failed to stat file: %v", err)
|
||||||
|
}
|
||||||
|
return collection, nil
|
||||||
|
}
|
||||||
|
|
||||||
func parseProfile(contents []byte, dataFormat format.DataFormat) (*makeshift.Profile, error) {
|
func parseProfile(contents []byte, dataFormat format.DataFormat) (*makeshift.Profile, error) {
|
||||||
var (
|
var (
|
||||||
data *makeshift.Profile
|
data *makeshift.Profile
|
||||||
|
|
|
||||||
|
|
@ -29,10 +29,18 @@ type Hook struct {
|
||||||
Plugin Plugin
|
Plugin Plugin
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Hook) Init() error {
|
||||||
|
return h.Plugin.Init()
|
||||||
|
}
|
||||||
|
|
||||||
func (h *Hook) Run() error {
|
func (h *Hook) Run() error {
|
||||||
return h.Plugin.Run(h.Data, h.Args)
|
return h.Plugin.Run(h.Data, h.Args)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Hook) Cleanup() error {
|
||||||
|
return h.Plugin.Cleanup()
|
||||||
|
}
|
||||||
|
|
||||||
func PluginToMap(p Plugin) map[string]any {
|
func PluginToMap(p Plugin) map[string]any {
|
||||||
return map[string]any{
|
return map[string]any{
|
||||||
"name": p.Name(),
|
"name": p.Name(),
|
||||||
|
|
|
||||||
|
|
@ -190,7 +190,9 @@ func (s *Service) Upload() http.HandlerFunc {
|
||||||
)
|
)
|
||||||
|
|
||||||
// show what we're uploading
|
// show what we're uploading
|
||||||
log.Debug().Str("path", path).Msg("Service.Upload()")
|
log.Debug().
|
||||||
|
Str("path", path).
|
||||||
|
Msg("Service.Upload()")
|
||||||
|
|
||||||
// take the provided path and store the file contents
|
// take the provided path and store the file contents
|
||||||
dirpath = filepath.Dir(path)
|
dirpath = filepath.Dir(path)
|
||||||
|
|
@ -296,7 +298,7 @@ func (s *Service) loadProfiles(profileIDs []string, store storage.KVStore, errs
|
||||||
profile *makeshift.Profile
|
profile *makeshift.Profile
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
if i > DEFAULT_PROFILES_MAX_COUNT {
|
if i > s.ProfilesMaxCount {
|
||||||
log.Warn().Msg("max profiles count reached...stopping")
|
log.Warn().Msg("max profiles count reached...stopping")
|
||||||
return errs
|
return errs
|
||||||
}
|
}
|
||||||
|
|
@ -329,7 +331,7 @@ func (s *Service) loadPlugins(pluginNames []string, store storage.KVStore, args
|
||||||
plugin makeshift.Plugin
|
plugin makeshift.Plugin
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
if i > DEFAULT_PLUGINS_MAX_COUNT {
|
if i > s.PluginsMaxCount {
|
||||||
log.Warn().Msg("max plugins count reached or exceeded...stopping")
|
log.Warn().Msg("max plugins count reached or exceeded...stopping")
|
||||||
return hooks, errs
|
return hooks, errs
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,10 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type Service struct {
|
type Service struct {
|
||||||
Addr string
|
Addr string
|
||||||
RootPath string `yaml:"root,omitempty"`
|
RootPath string `yaml:"root,omitempty"`
|
||||||
Environment map[string]string
|
CACertFile string `yaml:"cacert,omitempty"`
|
||||||
|
CACertKeyfile string `yaml:"keyfile,omitempty"`
|
||||||
|
|
||||||
// max counts
|
// max counts
|
||||||
PluginsMaxCount int
|
PluginsMaxCount int
|
||||||
|
|
@ -32,13 +33,8 @@ type Service struct {
|
||||||
// New creates a new Service instance with default values
|
// New creates a new Service instance with default values
|
||||||
func New() *Service {
|
func New() *Service {
|
||||||
return &Service{
|
return &Service{
|
||||||
Addr: ":5050",
|
Addr: ":5050",
|
||||||
RootPath: "./",
|
RootPath: "./",
|
||||||
Environment: map[string]string{
|
|
||||||
"MAKESHIFT_HOST": "",
|
|
||||||
"MAKESHIFT_ROOT": "",
|
|
||||||
"ACCESS_TOKEN": "",
|
|
||||||
},
|
|
||||||
PluginsMaxCount: DEFAULT_PLUGINS_MAX_COUNT,
|
PluginsMaxCount: DEFAULT_PLUGINS_MAX_COUNT,
|
||||||
ProfilesMaxCount: DEFAULT_PROFILES_MAX_COUNT,
|
ProfilesMaxCount: DEFAULT_PROFILES_MAX_COUNT,
|
||||||
Timeout: DEFAULT_TIMEOUT_IN_SECS,
|
Timeout: DEFAULT_TIMEOUT_IN_SECS,
|
||||||
|
|
@ -121,7 +117,11 @@ func (s *Service) Serve() error {
|
||||||
|
|
||||||
// always available public routes go here
|
// always available public routes go here
|
||||||
router.HandleFunc("/status", s.GetStatus)
|
router.HandleFunc("/status", s.GetStatus)
|
||||||
return http.ListenAndServe(s.Addr, router)
|
if s.CACertFile != "" && s.CACertKeyfile != "" {
|
||||||
|
return http.ListenAndServeTLS(s.Addr, s.CACertFile, s.CACertKeyfile, router)
|
||||||
|
} else {
|
||||||
|
return http.ListenAndServe(s.Addr, router)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) requireAuth() bool {
|
func (s *Service) requireAuth() bool {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue