feat: added cacerts and some tidying

This commit is contained in:
David Allen 2025-08-31 22:02:10 -06:00
parent 2112e7eefd
commit bdd85b01ff
Signed by: towk
GPG key ID: 0430CDBE22619155
8 changed files with 279 additions and 59 deletions

View file

@ -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)

View file

@ -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")

View file

@ -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)

View file

@ -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)
} }

View file

@ -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

View file

@ -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(),

View file

@ -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
} }

View file

@ -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 {