aboutsummaryrefslogtreecommitdiffhomepage
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/caddy/main.go5
-rw-r--r--cmd/commandfuncs.go9
-rw-r--r--cmd/commands.go8
-rw-r--r--cmd/packagesfuncs.go58
-rw-r--r--cmd/storagefuncs.go9
5 files changed, 70 insertions, 19 deletions
diff --git a/cmd/caddy/main.go b/cmd/caddy/main.go
index f1aeda0a4..48fa149aa 100644
--- a/cmd/caddy/main.go
+++ b/cmd/caddy/main.go
@@ -1,8 +1,3 @@
-// The below line is required to enable post-quantum key agreement in Go 1.23
-// by default without insisting on setting a minimum version of 1.23 in go.mod.
-// See https://github.com/caddyserver/caddy/issues/6540#issuecomment-2313094905
-//go:debug tlskyber=1
-
// Copyright 2015 Matthew Holt and The Caddy Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/cmd/commandfuncs.go b/cmd/commandfuncs.go
index a5c357cd7..2adf95bb3 100644
--- a/cmd/commandfuncs.go
+++ b/cmd/commandfuncs.go
@@ -560,10 +560,15 @@ func cmdValidateConfig(fl Flags) (int, error) {
func cmdFmt(fl Flags) (int, error) {
configFile := fl.Arg(0)
- if configFile == "" {
+ configFlag := fl.String("config")
+ if (len(fl.Args()) > 1) || (configFlag != "" && configFile != "") {
+ return caddy.ExitCodeFailedStartup, fmt.Errorf("fmt does not support multiple files %s %s", configFlag, strings.Join(fl.Args(), " "))
+ }
+ if configFile == "" && configFlag == "" {
configFile = "Caddyfile"
+ } else if configFile == "" {
+ configFile = configFlag
}
-
// as a special case, read from stdin if the file name is "-"
if configFile == "-" {
input, err := io.ReadAll(os.Stdin)
diff --git a/cmd/commands.go b/cmd/commands.go
index ab4b66d77..259dd358f 100644
--- a/cmd/commands.go
+++ b/cmd/commands.go
@@ -388,6 +388,7 @@ When reading from stdin, the --overwrite flag has no effect: the result
is always printed to stdout.
`,
CobraFunc: func(cmd *cobra.Command) {
+ cmd.Flags().StringP("config", "c", "", "Configuration file")
cmd.Flags().BoolP("overwrite", "w", false, "Overwrite the input file with the results")
cmd.Flags().BoolP("diff", "d", false, "Print the differences between the input file and the formatted output")
cmd.RunE = WrapCommandFuncForCobra(cmdFmt)
@@ -409,12 +410,13 @@ latest versions. EXPERIMENTAL: May be changed or removed.
RegisterCommand(Command{
Name: "add-package",
- Usage: "<packages...>",
+ Usage: "<package[@version]...>",
Short: "Adds Caddy packages (EXPERIMENTAL)",
Long: `
Downloads an updated Caddy binary with the specified packages (module/plugin)
-added. Retains existing packages. Returns an error if the any of packages are
-already included. EXPERIMENTAL: May be changed or removed.
+added, with an optional version specified (e.g., "package@version"). Retains
+existing packages. Returns an error if any of the specified packages are already
+included. EXPERIMENTAL: May be changed or removed.
`,
CobraFunc: func(cmd *cobra.Command) {
cmd.Flags().BoolP("keep-backup", "k", false, "Keep the backed up binary, instead of deleting it")
diff --git a/cmd/packagesfuncs.go b/cmd/packagesfuncs.go
index 0784f7ee6..695232001 100644
--- a/cmd/packagesfuncs.go
+++ b/cmd/packagesfuncs.go
@@ -46,6 +46,25 @@ func cmdUpgrade(fl Flags) (int, error) {
return upgradeBuild(pluginPkgs, fl)
}
+func splitModule(arg string) (module, version string, err error) {
+ const versionSplit = "@"
+
+ // accommodate module paths that have @ in them, but we can only tolerate that if there's also
+ // a version, otherwise we don't know if it's a version separator or part of the file path
+ lastVersionSplit := strings.LastIndex(arg, versionSplit)
+ if lastVersionSplit < 0 {
+ module = arg
+ } else {
+ module, version = arg[:lastVersionSplit], arg[lastVersionSplit+1:]
+ }
+
+ if module == "" {
+ err = fmt.Errorf("module name is required")
+ }
+
+ return
+}
+
func cmdAddPackage(fl Flags) (int, error) {
if len(fl.Args()) == 0 {
return caddy.ExitCodeFailedStartup, fmt.Errorf("at least one package name must be specified")
@@ -60,10 +79,15 @@ func cmdAddPackage(fl Flags) (int, error) {
}
for _, arg := range fl.Args() {
- if _, ok := pluginPkgs[arg]; ok {
+ module, version, err := splitModule(arg)
+ if err != nil {
+ return caddy.ExitCodeFailedStartup, fmt.Errorf("invalid module name: %v", err)
+ }
+ // only allow a version to be specified if it's different from the existing version
+ if _, ok := pluginPkgs[module]; ok && !(version != "" && pluginPkgs[module].Version != version) {
return caddy.ExitCodeFailedStartup, fmt.Errorf("package is already added")
}
- pluginPkgs[arg] = struct{}{}
+ pluginPkgs[module] = pluginPackage{Version: version, Path: module}
}
return upgradeBuild(pluginPkgs, fl)
@@ -83,7 +107,11 @@ func cmdRemovePackage(fl Flags) (int, error) {
}
for _, arg := range fl.Args() {
- if _, ok := pluginPkgs[arg]; !ok {
+ module, _, err := splitModule(arg)
+ if err != nil {
+ return caddy.ExitCodeFailedStartup, fmt.Errorf("invalid module name: %v", err)
+ }
+ if _, ok := pluginPkgs[module]; !ok {
// package does not exist
return caddy.ExitCodeFailedStartup, fmt.Errorf("package is not added")
}
@@ -93,7 +121,7 @@ func cmdRemovePackage(fl Flags) (int, error) {
return upgradeBuild(pluginPkgs, fl)
}
-func upgradeBuild(pluginPkgs map[string]struct{}, fl Flags) (int, error) {
+func upgradeBuild(pluginPkgs map[string]pluginPackage, fl Flags) (int, error) {
l := caddy.Log()
thisExecPath, err := os.Executable()
@@ -120,8 +148,8 @@ func upgradeBuild(pluginPkgs map[string]struct{}, fl Flags) (int, error) {
"os": {runtime.GOOS},
"arch": {runtime.GOARCH},
}
- for pkg := range pluginPkgs {
- qs.Add("p", pkg)
+ for _, pkgInfo := range pluginPkgs {
+ qs.Add("p", pkgInfo.String())
}
// initiate the build
@@ -276,14 +304,14 @@ func downloadBuild(qs url.Values) (*http.Response, error) {
return resp, nil
}
-func getPluginPackages(modules []moduleInfo) (map[string]struct{}, error) {
- pluginPkgs := make(map[string]struct{})
+func getPluginPackages(modules []moduleInfo) (map[string]pluginPackage, error) {
+ pluginPkgs := make(map[string]pluginPackage)
for _, mod := range modules {
if mod.goModule.Replace != nil {
return nil, fmt.Errorf("cannot auto-upgrade when Go module has been replaced: %s => %s",
mod.goModule.Path, mod.goModule.Replace.Path)
}
- pluginPkgs[mod.goModule.Path] = struct{}{}
+ pluginPkgs[mod.goModule.Path] = pluginPackage{Version: mod.goModule.Version, Path: mod.goModule.Path}
}
return pluginPkgs, nil
}
@@ -312,3 +340,15 @@ func writeCaddyBinary(path string, body *io.ReadCloser, fileInfo os.FileInfo) er
}
const downloadPath = "https://caddyserver.com/api/download"
+
+type pluginPackage struct {
+ Version string
+ Path string
+}
+
+func (p pluginPackage) String() string {
+ if p.Version == "" {
+ return p.Path
+ }
+ return p.Path + "@" + p.Version
+}
diff --git a/cmd/storagefuncs.go b/cmd/storagefuncs.go
index 60e25485d..3c4219719 100644
--- a/cmd/storagefuncs.go
+++ b/cmd/storagefuncs.go
@@ -21,6 +21,7 @@ import (
"errors"
"fmt"
"io"
+ "io/fs"
"os"
"github.com/caddyserver/certmagic"
@@ -190,12 +191,20 @@ func cmdExportStorage(fl Flags) (int, error) {
for _, k := range keys {
info, err := stor.Stat(ctx, k)
if err != nil {
+ if errors.Is(err, fs.ErrNotExist) {
+ caddy.Log().Warn(fmt.Sprintf("key: %s removed while export is in-progress", k))
+ continue
+ }
return caddy.ExitCodeFailedQuit, err
}
if info.IsTerminal {
v, err := stor.Load(ctx, k)
if err != nil {
+ if errors.Is(err, fs.ErrNotExist) {
+ caddy.Log().Warn(fmt.Sprintf("key: %s removed while export is in-progress", k))
+ continue
+ }
return caddy.ExitCodeFailedQuit, err
}