Files
dokku/plugins/logs/subcommands.go
Jose Diaz-Gonzalez 1c0bd39d42 feat: ensure referenced images get updated by dependabot
Dokku uses a few external images for various bits of functionality, but these must be manually updated every so often due to being referenced in code.

By moving the references to Dockerfiles, we can take advantage of dependabot to issue automatic PRs when they are out of date.
2024-02-25 00:54:11 -05:00

129 lines
3.5 KiB
Go

package logs
import (
"errors"
"fmt"
"path/filepath"
"strconv"
"time"
"github.com/dokku/dokku/plugins/common"
)
// CommandDefault displays recent log output
func CommandDefault(appName string, num int64, process string, tail, quiet bool) error {
if err := common.VerifyAppName(appName); err != nil {
return err
}
if !common.IsDeployed(appName) {
return fmt.Errorf("App %s has not been deployed", appName)
}
s := common.GetAppScheduler(appName)
t := strconv.FormatBool(tail)
q := strconv.FormatBool(quiet)
n := strconv.FormatInt(num, 10)
_, err := common.CallPlugnTrigger(common.PlugnTriggerInput{
Args: []string{s, appName, process, t, q, n},
StreamStdio: true,
Trigger: "scheduler-logs",
})
return err
}
// CommandFailed shows the last failed deploy logs
func CommandFailed(appName string, allApps bool) error {
if allApps {
return common.RunCommandAgainstAllAppsSerially(GetFailedLogs, "logs:failed")
}
if err := common.VerifyAppName(appName); err != nil {
return err
}
return GetFailedLogs(appName)
}
// CommandReport displays a logs report for one or more apps
func CommandReport(appName string, format string, infoFlag string) error {
if len(appName) == 0 {
apps, err := common.DokkuApps()
if err != nil {
return err
}
for _, appName := range apps {
if err := ReportSingleApp(appName, format, infoFlag); err != nil {
return err
}
}
return nil
}
return ReportSingleApp(appName, format, infoFlag)
}
// CommandSet sets or clears a logs property for an app
func CommandSet(appName string, property string, value string) error {
if err := validateSetValue(appName, property, value); err != nil {
return err
}
common.CommandPropertySet("logs", appName, property, value, DefaultProperties, GlobalProperties)
if property == "vector-sink" {
common.LogVerboseQuiet(fmt.Sprintf("Writing updated vector config to %s", filepath.Join(common.GetDataDirectory("logs"), "vector.json")))
return writeVectorConfig()
}
return nil
}
// CommandVectorLogs tails the log output for the vector container
func CommandVectorLogs(lines int, tail bool) error {
if !common.ContainerExists(vectorContainerName) {
return errors.New("Vector container does not exist")
}
if !common.ContainerIsRunning(vectorContainerName) {
common.LogWarn("Vector container is not running")
}
common.LogInfo1Quiet("Vector container logs")
common.LogVerboseQuietContainerLogsTail(vectorContainerName, lines, tail)
return nil
}
// CommandVectorStart starts a new vector container
// or starts an existing one if it already exists
func CommandVectorStart(vectorImage string) error {
common.LogInfo2("Starting vector container")
common.LogVerbose("Ensuring vector configuration exists")
if err := writeVectorConfig(); err != nil {
return err
}
if vectorImage == "" {
vectorImage = common.PropertyGetDefault("logs", "--global", "vector-image", getComputedVectorImage())
}
common.LogVerbose("Starting vector container")
if err := startVectorContainer(vectorImage); err != nil {
return err
}
common.LogVerbose("Waiting for 10 seconds")
if err := common.ContainerWaitTilReady(vectorContainerName, 10*time.Second); err != nil {
return errors.New("Vector container did not start properly, run logs:vector-logs for more details")
}
common.LogVerbose("Vector container is running")
return nil
}
// CommandVectorStop stops and removes an existing vector container
func CommandVectorStop() error {
common.LogInfo2Quiet("Stopping and removing vector container")
return stopVectorContainer()
}