1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-07-24 15:59:41 +02:00

feat(logging): replace all the loggers with zerolog EE-4186 (#7663)

This commit is contained in:
andres-portainer 2022-09-16 13:18:44 -03:00 committed by GitHub
parent 53025178ef
commit 36e7981ab7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
109 changed files with 1101 additions and 662 deletions

View file

@ -2,7 +2,6 @@ package adminmonitor
import ( import (
"context" "context"
"log"
"net/http" "net/http"
"strings" "strings"
"sync" "sync"
@ -11,9 +10,9 @@ import (
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices" "github.com/portainer/portainer/api/dataservices"
)
var logFatalf = log.Fatalf "github.com/rs/zerolog/log"
)
const RedirectReasonAdminInitTimeout string = "AdminInitTimeout" const RedirectReasonAdminInitTimeout string = "AdminInitTimeout"
@ -49,24 +48,28 @@ func (m *Monitor) Start() {
m.cancellationFunc = cancellationFunc m.cancellationFunc = cancellationFunc
go func() { go func() {
log.Println("[DEBUG] [internal,init] [message: start initialization monitor ]") log.Debug().Msg("start initialization monitor")
select { select {
case <-time.After(m.timeout): case <-time.After(m.timeout):
initialized, err := m.WasInitialized() initialized, err := m.WasInitialized()
if err != nil { if err != nil {
logFatalf("%s", err) log.Fatal().Err(err).Msg("")
} }
if !initialized { if !initialized {
log.Println("[INFO] [internal,init] The Portainer instance timed out for security purposes. To re-enable your Portainer instance, you will need to restart Portainer") log.Info().Msg("the Portainer instance timed out for security purposes, to re-enable your Portainer instance, you will need to restart Portainer")
m.mu.Lock() m.mu.Lock()
defer m.mu.Unlock() defer m.mu.Unlock()
m.adminInitDisabled = true m.adminInitDisabled = true
return return
} }
case <-cancellationCtx.Done(): case <-cancellationCtx.Done():
log.Println("[DEBUG] [internal,init] [message: canceling initialization monitor]") log.Debug().Msg("canceling initialization monitor")
case <-m.shutdownCtx.Done(): case <-m.shutdownCtx.Done():
log.Println("[DEBUG] [internal,init] [message: shutting down initialization monitor]") log.Debug().Msg("shutting down initialization monitor")
} }
}() }()
} }

View file

@ -2,7 +2,6 @@ package apikey
import ( import (
"crypto/sha256" "crypto/sha256"
"log"
"strings" "strings"
"testing" "testing"
"time" "time"
@ -10,6 +9,8 @@ import (
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/datastore" "github.com/portainer/portainer/api/datastore"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/rs/zerolog/log"
) )
func Test_SatisfiesAPIKeyServiceInterface(t *testing.T) { func Test_SatisfiesAPIKeyServiceInterface(t *testing.T) {
@ -169,8 +170,8 @@ func Test_UpdateAPIKey(t *testing.T) {
_, apiKeyGot, err := service.GetDigestUserAndKey(apiKey.Digest) _, apiKeyGot, err := service.GetDigestUserAndKey(apiKey.Digest)
is.NoError(err) is.NoError(err)
log.Println(apiKey) log.Debug().Msgf("%+v", apiKey)
log.Println(apiKeyGot) log.Debug().Msgf("%+v", apiKeyGot)
is.Equal(apiKey.LastUsed, apiKeyGot.LastUsed) is.Equal(apiKey.LastUsed, apiKeyGot.LastUsed)

View file

@ -7,13 +7,14 @@ import (
"path/filepath" "path/filepath"
"time" "time"
"github.com/pkg/errors"
"github.com/portainer/portainer/api/archive" "github.com/portainer/portainer/api/archive"
"github.com/portainer/portainer/api/crypto" "github.com/portainer/portainer/api/crypto"
"github.com/portainer/portainer/api/dataservices" "github.com/portainer/portainer/api/dataservices"
"github.com/portainer/portainer/api/filesystem" "github.com/portainer/portainer/api/filesystem"
"github.com/portainer/portainer/api/http/offlinegate" "github.com/portainer/portainer/api/http/offlinegate"
"github.com/sirupsen/logrus"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
) )
const rwxr__r__ os.FileMode = 0744 const rwxr__r__ os.FileMode = 0744
@ -47,9 +48,9 @@ func CreateBackupArchive(password string, gate *offlinegate.OfflineGate, datasto
err := datastore.Export(exportFilename) err := datastore.Export(exportFilename)
if err != nil { if err != nil {
logrus.WithError(err).Debugf("failed to export to %s", exportFilename) log.Error().Err(err).Str("filename", exportFilename).Msg("failed to export")
} else { } else {
logrus.Debugf("exported to %s", exportFilename) log.Debug().Str("filename", exportFilename).Msg("file exported")
} }
} }

View file

@ -3,16 +3,17 @@ package chisel
import ( import (
"context" "context"
"fmt" "fmt"
"log"
"net/http" "net/http"
"sync" "sync"
"time" "time"
"github.com/dchest/uniuri"
chserver "github.com/jpillora/chisel/server"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices" "github.com/portainer/portainer/api/dataservices"
"github.com/portainer/portainer/api/http/proxy" "github.com/portainer/portainer/api/http/proxy"
"github.com/dchest/uniuri"
chserver "github.com/jpillora/chisel/server"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -64,7 +65,11 @@ func (service *Service) pingAgent(endpointID portainer.EndpointID) error {
// KeepTunnelAlive keeps the tunnel of the given environment for maxAlive duration, or until ctx is done // KeepTunnelAlive keeps the tunnel of the given environment for maxAlive duration, or until ctx is done
func (service *Service) KeepTunnelAlive(endpointID portainer.EndpointID, ctx context.Context, maxAlive time.Duration) { func (service *Service) KeepTunnelAlive(endpointID portainer.EndpointID, ctx context.Context, maxAlive time.Duration) {
go func() { go func() {
log.Printf("[DEBUG] [chisel,KeepTunnelAlive] [endpoint_id: %d] [message: start for %.0f minutes]\n", endpointID, maxAlive.Minutes()) log.Debug().
Int("endpoint_id", int(endpointID)).
Float64("max_alive_minutes", maxAlive.Minutes()).
Msg("start")
maxAliveTicker := time.NewTicker(maxAlive) maxAliveTicker := time.NewTicker(maxAlive)
defer maxAliveTicker.Stop() defer maxAliveTicker.Stop()
pingTicker := time.NewTicker(tunnelCleanupInterval) pingTicker := time.NewTicker(tunnelCleanupInterval)
@ -76,14 +81,25 @@ func (service *Service) KeepTunnelAlive(endpointID portainer.EndpointID, ctx con
service.SetTunnelStatusToActive(endpointID) service.SetTunnelStatusToActive(endpointID)
err := service.pingAgent(endpointID) err := service.pingAgent(endpointID)
if err != nil { if err != nil {
log.Printf("[DEBUG] [chisel,KeepTunnelAlive] [endpoint_id: %d] [warning: ping agent err=%s]\n", endpointID, err) log.Debug().
Int("endpoint_id", int(endpointID)).
Err(err).
Msg("ping agent")
} }
case <-maxAliveTicker.C: case <-maxAliveTicker.C:
log.Printf("[DEBUG] [chisel,KeepTunnelAlive] [endpoint_id: %d] [message: stop as %.0f minutes timeout]\n", endpointID, maxAlive.Minutes()) log.Debug().
Int("endpoint_id", int(endpointID)).
Float64("timeout_minutes", maxAlive.Minutes()).
Msg("tunnel keep alive timeout")
return return
case <-ctx.Done(): case <-ctx.Done():
err := ctx.Err() err := ctx.Err()
log.Printf("[DEBUG] [chisel,KeepTunnelAlive] [endpoint_id: %d] [message: stop as err=%s]\n", endpointID, err) log.Debug().
Int("endpoint_id", int(endpointID)).
Err(err).
Msg("tunnel stop")
return return
} }
} }
@ -162,7 +178,10 @@ func (service *Service) retrievePrivateKeySeed() (string, error) {
} }
func (service *Service) startTunnelVerificationLoop() { func (service *Service) startTunnelVerificationLoop() {
log.Printf("[DEBUG] [chisel, monitoring] [check_interval_seconds: %f] [message: starting tunnel management process]", tunnelCleanupInterval.Seconds()) log.Debug().
Float64("check_interval_seconds", tunnelCleanupInterval.Seconds()).
Msg("starting tunnel management process")
ticker := time.NewTicker(tunnelCleanupInterval) ticker := time.NewTicker(tunnelCleanupInterval)
for { for {
@ -170,10 +189,12 @@ func (service *Service) startTunnelVerificationLoop() {
case <-ticker.C: case <-ticker.C:
service.checkTunnels() service.checkTunnels()
case <-service.shutdownCtx.Done(): case <-service.shutdownCtx.Done():
log.Println("[DEBUG] Shutting down tunnel service") log.Debug().Msg("shutting down tunnel service")
if err := service.StopTunnelServer(); err != nil { if err := service.StopTunnelServer(); err != nil {
log.Printf("Stopped tunnel service: %s", err) log.Debug().Err(err).Msg("stopped tunnel service")
} }
ticker.Stop() ticker.Stop()
return return
} }
@ -195,22 +216,40 @@ func (service *Service) checkTunnels() {
} }
elapsed := time.Since(tunnel.LastActivity) elapsed := time.Since(tunnel.LastActivity)
log.Printf("[DEBUG] [chisel,monitoring] [endpoint_id: %d] [status: %s] [status_time_seconds: %f] [message: environment tunnel monitoring]", endpointID, tunnel.Status, elapsed.Seconds()) log.Debug().
Int("endpoint_id", int(endpointID)).
Str("status", tunnel.Status).
Float64("status_time_seconds", elapsed.Seconds()).
Msg("environment tunnel monitoring")
if tunnel.Status == portainer.EdgeAgentManagementRequired && elapsed.Seconds() < requiredTimeout.Seconds() { if tunnel.Status == portainer.EdgeAgentManagementRequired && elapsed.Seconds() < requiredTimeout.Seconds() {
continue continue
} else if tunnel.Status == portainer.EdgeAgentManagementRequired && elapsed.Seconds() > requiredTimeout.Seconds() { } else if tunnel.Status == portainer.EdgeAgentManagementRequired && elapsed.Seconds() > requiredTimeout.Seconds() {
log.Printf("[DEBUG] [chisel,monitoring] [endpoint_id: %d] [status: %s] [status_time_seconds: %f] [timeout_seconds: %f] [message: REQUIRED state timeout exceeded]", endpointID, tunnel.Status, elapsed.Seconds(), requiredTimeout.Seconds()) log.Debug().
Int("endpoint_id", int(endpointID)).
Str("status", tunnel.Status).
Float64("status_time_seconds", elapsed.Seconds()).
Float64("timeout_seconds", requiredTimeout.Seconds()).
Msg("REQUIRED state timeout exceeded")
} }
if tunnel.Status == portainer.EdgeAgentActive && elapsed.Seconds() < activeTimeout.Seconds() { if tunnel.Status == portainer.EdgeAgentActive && elapsed.Seconds() < activeTimeout.Seconds() {
continue continue
} else if tunnel.Status == portainer.EdgeAgentActive && elapsed.Seconds() > activeTimeout.Seconds() { } else if tunnel.Status == portainer.EdgeAgentActive && elapsed.Seconds() > activeTimeout.Seconds() {
log.Printf("[DEBUG] [chisel,monitoring] [endpoint_id: %d] [status: %s] [status_time_seconds: %f] [timeout_seconds: %f] [message: ACTIVE state timeout exceeded]", endpointID, tunnel.Status, elapsed.Seconds(), activeTimeout.Seconds()) log.Debug().
Int("endpoint_id", int(endpointID)).
Str("status", tunnel.Status).
Float64("status_time_seconds", elapsed.Seconds()).
Float64("timeout_seconds", activeTimeout.Seconds()).
Msg("ACTIVE state timeout exceeded")
err := service.snapshotEnvironment(endpointID, tunnel.Port) err := service.snapshotEnvironment(endpointID, tunnel.Port)
if err != nil { if err != nil {
log.Printf("[ERROR] [snapshot] Unable to snapshot Edge environment (id: %d): %s", endpointID, err) log.Error().
Int("endpoint_id", int(endpointID)).Err(
err).
Msg("unable to snapshot Edge environment")
} }
} }

View file

@ -2,15 +2,14 @@ package cli
import ( import (
"errors" "errors"
"log" "os"
"path/filepath"
"strings"
"time" "time"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"os" "github.com/rs/zerolog/log"
"path/filepath"
"strings"
"gopkg.in/alecthomas/kingpin.v2" "gopkg.in/alecthomas/kingpin.v2"
) )
@ -62,6 +61,7 @@ func (*Service) ParseFlags(version string) (*portainer.CLIFlags, error) {
MaxBatchSize: kingpin.Flag("max-batch-size", "Maximum size of a batch").Int(), MaxBatchSize: kingpin.Flag("max-batch-size", "Maximum size of a batch").Int(),
MaxBatchDelay: kingpin.Flag("max-batch-delay", "Maximum delay before a batch starts").Duration(), MaxBatchDelay: kingpin.Flag("max-batch-delay", "Maximum delay before a batch starts").Duration(),
SecretKeyName: kingpin.Flag("secret-key-name", "Secret key name for encryption and will be used as /run/secrets/<secret-key-name>.").Default(defaultSecretKeyName).String(), SecretKeyName: kingpin.Flag("secret-key-name", "Secret key name for encryption and will be used as /run/secrets/<secret-key-name>.").Default(defaultSecretKeyName).String(),
LogLevel: kingpin.Flag("log-level", "Set the minimum logging level to show").Default("INFO").Enum("DEBUG", "INFO", "WARN", "ERROR"),
} }
kingpin.Parse() kingpin.Parse()
@ -101,11 +101,11 @@ func (*Service) ValidateFlags(flags *portainer.CLIFlags) error {
func displayDeprecationWarnings(flags *portainer.CLIFlags) { func displayDeprecationWarnings(flags *portainer.CLIFlags) {
if *flags.NoAnalytics { if *flags.NoAnalytics {
log.Println("Warning: The --no-analytics flag has been kept to allow migration of instances running a previous version of Portainer with this flag enabled, to version 2.0 where enabling this flag will have no effect.") log.Warn().Msg("the --no-analytics flag has been kept to allow migration of instances running a previous version of Portainer with this flag enabled, to version 2.0 where enabling this flag will have no effect")
} }
if *flags.SSL { if *flags.SSL {
log.Println("Warning: SSL is enabled by default and there is no need for the --ssl flag. It has been kept to allow migration of instances running a previous version of Portainer with this flag enabled") log.Warn().Msg("SSL is enabled by default and there is no need for the --ssl flag, it has been kept to allow migration of instances running a previous version of Portainer with this flag enabled")
} }
} }

View file

@ -1,11 +1,10 @@
package main package main
import ( import (
"log"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/datastore" "github.com/portainer/portainer/api/datastore"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
func importFromJson(fileService portainer.FileService, store *datastore.Store) { func importFromJson(fileService portainer.FileService, store *datastore.Store) {
@ -13,17 +12,17 @@ func importFromJson(fileService portainer.FileService, store *datastore.Store) {
importFile := "/data/import.json" importFile := "/data/import.json"
if exists, _ := fileService.FileExists(importFile); exists { if exists, _ := fileService.FileExists(importFile); exists {
if err := store.Import(importFile); err != nil { if err := store.Import(importFile); err != nil {
logrus.WithError(err).Debugf("Import %s failed", importFile) log.Error().Str("filename", importFile).Err(err).Msg("import failed")
// TODO: should really rollback on failure, but then we have nothing. // TODO: should really rollback on failure, but then we have nothing.
} else { } else {
logrus.Printf("Successfully imported %s to new portainer database", importFile) log.Info().Str("filename", importFile).Msg("successfully imported the file to a new portainer database")
} }
// TODO: this is bad - its to ensure that any defaults that were broken in import, or migrations get set back to what we want // TODO: this is bad - its to ensure that any defaults that were broken in import, or migrations get set back to what we want
// I also suspect that everything from "Init to Init" is potentially a migration // I also suspect that everything from "Init to Init" is potentially a migration
err := store.Init() err := store.Init()
if err != nil { if err != nil {
log.Fatalf("Failed initializing data store: %v", err) log.Fatal().Err(err).Msg("failed initializing data store")
} }
} }
} }

View file

@ -1,20 +1,28 @@
package main package main
import ( import (
"log" "github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/sirupsen/logrus" "github.com/rs/zerolog/pkgerrors"
) )
func configureLogger() { func configureLogger() {
logger := logrus.New() // logger is to implicitly substitute stdlib's log zerolog.ErrorStackFieldName = "stack_trace"
log.SetOutput(logger.Writer()) zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
formatter := &logrus.TextFormatter{DisableTimestamp: false, DisableLevelTruncation: true} log.Logger = log.Logger.With().Caller().Stack().Logger()
}
logger.SetFormatter(formatter)
logrus.SetFormatter(formatter) func setLoggingLevel(level string) {
switch level {
logger.SetLevel(logrus.DebugLevel) case "ERROR":
logrus.SetLevel(logrus.DebugLevel) zerolog.SetGlobalLevel(zerolog.ErrorLevel)
case "WARN":
zerolog.SetGlobalLevel(zerolog.WarnLevel)
case "INFO":
zerolog.SetGlobalLevel(zerolog.InfoLevel)
case "DEBUG":
zerolog.SetGlobalLevel(zerolog.DebugLevel)
}
} }

View file

@ -4,15 +4,12 @@ import (
"context" "context"
"crypto/sha256" "crypto/sha256"
"fmt" "fmt"
"log"
"os" "os"
"path" "path"
"strconv" "strconv"
"strings" "strings"
"time" "time"
"github.com/sirupsen/logrus"
"github.com/portainer/libhelm" "github.com/portainer/libhelm"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/apikey" "github.com/portainer/portainer/api/apikey"
@ -45,34 +42,38 @@ import (
"github.com/portainer/portainer/api/oauth" "github.com/portainer/portainer/api/oauth"
"github.com/portainer/portainer/api/scheduler" "github.com/portainer/portainer/api/scheduler"
"github.com/portainer/portainer/api/stacks" "github.com/portainer/portainer/api/stacks"
"github.com/rs/zerolog/log"
) )
func initCLI() *portainer.CLIFlags { func initCLI() *portainer.CLIFlags {
var cliService portainer.CLIService = &cli.Service{} var cliService portainer.CLIService = &cli.Service{}
flags, err := cliService.ParseFlags(portainer.APIVersion) flags, err := cliService.ParseFlags(portainer.APIVersion)
if err != nil { if err != nil {
logrus.Fatalf("Failed parsing flags: %v", err) log.Fatal().Err(err).Msg("failed parsing flags")
} }
err = cliService.ValidateFlags(flags) err = cliService.ValidateFlags(flags)
if err != nil { if err != nil {
logrus.Fatalf("Failed validating flags:%v", err) log.Fatal().Err(err).Msg("failed validating flags")
} }
return flags return flags
} }
func initFileService(dataStorePath string) portainer.FileService { func initFileService(dataStorePath string) portainer.FileService {
fileService, err := filesystem.NewService(dataStorePath, "") fileService, err := filesystem.NewService(dataStorePath, "")
if err != nil { if err != nil {
logrus.Fatalf("Failed creating file service: %v", err) log.Fatal().Err(err).Msg("failed creating file service")
} }
return fileService return fileService
} }
func initDataStore(flags *portainer.CLIFlags, secretKey []byte, fileService portainer.FileService, shutdownCtx context.Context) dataservices.DataStore { func initDataStore(flags *portainer.CLIFlags, secretKey []byte, fileService portainer.FileService, shutdownCtx context.Context) dataservices.DataStore {
connection, err := database.NewDatabase("boltdb", *flags.Data, secretKey) connection, err := database.NewDatabase("boltdb", *flags.Data, secretKey)
if err != nil { if err != nil {
logrus.Fatalf("failed creating database connection: %s", err) log.Fatal().Err(err).Msg("failed creating database connection")
} }
if bconn, ok := connection.(*boltdb.DbConnection); ok { if bconn, ok := connection.(*boltdb.DbConnection); ok {
@ -80,30 +81,31 @@ func initDataStore(flags *portainer.CLIFlags, secretKey []byte, fileService port
bconn.MaxBatchDelay = *flags.MaxBatchDelay bconn.MaxBatchDelay = *flags.MaxBatchDelay
bconn.InitialMmapSize = *flags.InitialMmapSize bconn.InitialMmapSize = *flags.InitialMmapSize
} else { } else {
logrus.Fatalf("failed creating database connection: expecting a boltdb database type but a different one was received") log.Fatal().Msg("failed creating database connection: expecting a boltdb database type but a different one was received")
} }
store := datastore.NewStore(*flags.Data, fileService, connection) store := datastore.NewStore(*flags.Data, fileService, connection)
isNew, err := store.Open() isNew, err := store.Open()
if err != nil { if err != nil {
logrus.Fatalf("Failed opening store: %v", err) log.Fatal().Err(err).Msg("failed opening store")
} }
if *flags.Rollback { if *flags.Rollback {
err := store.Rollback(false) err := store.Rollback(false)
if err != nil { if err != nil {
logrus.Fatalf("Failed rolling back: %v", err) log.Fatal().Err(err).Msg("failed rolling back")
} }
logrus.Println("Exiting rollback") log.Info().Msg("exiting rollback")
os.Exit(0) os.Exit(0)
return nil return nil
} }
// Init sets some defaults - it's basically a migration // Init sets some defaults - it's basically a migration
err = store.Init() err = store.Init()
if err != nil { if err != nil {
logrus.Fatalf("Failed initializing data store: %v", err) log.Fatal().Err(err).Msg("failed initializing data store")
} }
if isNew { if isNew {
@ -112,24 +114,25 @@ func initDataStore(flags *portainer.CLIFlags, secretKey []byte, fileService port
err := updateSettingsFromFlags(store, flags) err := updateSettingsFromFlags(store, flags)
if err != nil { if err != nil {
logrus.Fatalf("Failed updating settings from flags: %v", err) log.Fatal().Err(err).Msg("failed updating settings from flags")
} }
} else { } else {
storedVersion, err := store.VersionService.DBVersion() storedVersion, err := store.VersionService.DBVersion()
if err != nil { if err != nil {
logrus.Fatalf("Something Failed during creation of new database: %v", err) log.Fatal().Err(err).Msg("failure during creation of new database")
} }
if storedVersion != portainer.DBVersion { if storedVersion != portainer.DBVersion {
err = store.MigrateData() err = store.MigrateData()
if err != nil { if err != nil {
logrus.Fatalf("Failed migration: %v", err) log.Fatal().Err(err).Msg("failed migration")
} }
} }
} }
err = updateSettingsFromFlags(store, flags) err = updateSettingsFromFlags(store, flags)
if err != nil { if err != nil {
log.Fatalf("Failed updating settings from flags: %v", err) log.Fatal().Err(err).Msg("failed updating settings from flags")
} }
// this is for the db restore functionality - needs more tests. // this is for the db restore functionality - needs more tests.
@ -141,19 +144,19 @@ func initDataStore(flags *portainer.CLIFlags, secretKey []byte, fileService port
err := store.Export(exportFilename) err := store.Export(exportFilename)
if err != nil { if err != nil {
logrus.WithError(err).Debugf("Failed to export to %s", exportFilename) log.Error().Str("filename", exportFilename).Err(err).Msg("failed to export")
} else { } else {
logrus.Debugf("exported to %s", exportFilename) log.Debug().Str("filename", exportFilename).Msg("exported")
} }
connection.Close()
}() }()
return store return store
} }
func initComposeStackManager(assetsPath string, configPath string, reverseTunnelService portainer.ReverseTunnelService, proxyManager *proxy.Manager) portainer.ComposeStackManager { func initComposeStackManager(assetsPath string, configPath string, reverseTunnelService portainer.ReverseTunnelService, proxyManager *proxy.Manager) portainer.ComposeStackManager {
composeWrapper, err := exec.NewComposeStackManager(assetsPath, configPath, proxyManager) composeWrapper, err := exec.NewComposeStackManager(assetsPath, configPath, proxyManager)
if err != nil { if err != nil {
logrus.Fatalf("Failed creating compose manager: %v", err) log.Fatal().Err(err).Msg("failed creating compose manager")
} }
return composeWrapper return composeWrapper
@ -187,6 +190,7 @@ func initJWTService(userSessionTimeout string, dataStore dataservices.DataStore)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return jwtService, nil return jwtService, nil
} }
@ -341,11 +345,7 @@ func enableFeaturesFromFlags(dataStore dataservices.DataStore, flags *portainer.
return fmt.Errorf("feature flag's '%s' value should be true or false", feat.Name) return fmt.Errorf("feature flag's '%s' value should be true or false", feat.Name)
} }
if featureState { log.Info().Str("feature", string(*correspondingFeature)).Bool("state", featureState).Msg("")
logrus.Printf("Feature %v : on", *correspondingFeature)
} else {
logrus.Printf("Feature %v : off", *correspondingFeature)
}
settings.FeatureFlagSettings[*correspondingFeature] = featureState settings.FeatureFlagSettings[*correspondingFeature] = featureState
} }
@ -373,7 +373,7 @@ func generateAndStoreKeyPair(fileService portainer.FileService, signatureService
func initKeyPair(fileService portainer.FileService, signatureService portainer.DigitalSignatureService) error { func initKeyPair(fileService portainer.FileService, signatureService portainer.DigitalSignatureService) error {
existingKeyPair, err := fileService.KeyPairFilesExist() existingKeyPair, err := fileService.KeyPairFilesExist()
if err != nil { if err != nil {
logrus.Fatalf("Failed checking for existing key pair: %v", err) log.Fatal().Err(err).Msg("failed checking for existing key pair")
} }
if existingKeyPair { if existingKeyPair {
@ -443,7 +443,11 @@ func createTLSSecuredEndpoint(flags *portainer.CLIFlags, dataStore dataservices.
err := snapshotService.SnapshotEndpoint(endpoint) err := snapshotService.SnapshotEndpoint(endpoint)
if err != nil { if err != nil {
logrus.Printf("http error: environment snapshot error (environment=%s, URL=%s) (err=%s)\n", endpoint.Name, endpoint.URL, err) log.Error().
Str("endpoint", endpoint.Name).
Str("URL", endpoint.URL).
Err(err).
Msg("environment snapshot error")
} }
return dataStore.Endpoint().Create(endpoint) return dataStore.Endpoint().Create(endpoint)
@ -488,7 +492,10 @@ func createUnsecuredEndpoint(endpointURL string, dataStore dataservices.DataStor
err := snapshotService.SnapshotEndpoint(endpoint) err := snapshotService.SnapshotEndpoint(endpoint)
if err != nil { if err != nil {
logrus.Printf("http error: environment snapshot error (environment=%s, URL=%s) (err=%s)\n", endpoint.Name, endpoint.URL, err) log.Error().
Str("endpoint", endpoint.Name).
Str("URL", endpoint.URL).Err(err).
Msg("environment snapshot error")
} }
return dataStore.Endpoint().Create(endpoint) return dataStore.Endpoint().Create(endpoint)
@ -505,7 +512,8 @@ func initEndpoint(flags *portainer.CLIFlags, dataStore dataservices.DataStore, s
} }
if len(endpoints) > 0 { if len(endpoints) > 0 {
logrus.Println("Instance already has defined environments. Skipping the environment defined via CLI.") log.Info().Msg("instance already has defined environments, skipping the environment defined via CLI")
return nil return nil
} }
@ -519,9 +527,9 @@ func loadEncryptionSecretKey(keyfilename string) []byte {
content, err := os.ReadFile(path.Join("/run/secrets", keyfilename)) content, err := os.ReadFile(path.Join("/run/secrets", keyfilename))
if err != nil { if err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {
logrus.Printf("Encryption key file `%s` not present", keyfilename) log.Info().Str("filename", keyfilename).Msg("encryption key file not present")
} else { } else {
logrus.Printf("Error reading encryption key file: %v", err) log.Info().Err(err).Msg("error reading encryption key file")
} }
return nil return nil
@ -538,37 +546,41 @@ func buildServer(flags *portainer.CLIFlags) portainer.Server {
fileService := initFileService(*flags.Data) fileService := initFileService(*flags.Data)
encryptionKey := loadEncryptionSecretKey(*flags.SecretKeyName) encryptionKey := loadEncryptionSecretKey(*flags.SecretKeyName)
if encryptionKey == nil { if encryptionKey == nil {
logrus.Println("Proceeding without encryption key") log.Info().Msg("proceeding without encryption key")
} }
dataStore := initDataStore(flags, encryptionKey, fileService, shutdownCtx) dataStore := initDataStore(flags, encryptionKey, fileService, shutdownCtx)
if err := dataStore.CheckCurrentEdition(); err != nil { if err := dataStore.CheckCurrentEdition(); err != nil {
logrus.Fatal(err) log.Fatal().Err(err).Msg("")
} }
instanceID, err := dataStore.Version().InstanceID() instanceID, err := dataStore.Version().InstanceID()
if err != nil { if err != nil {
logrus.Fatalf("Failed getting instance id: %v", err) log.Fatal().Err(err).Msg("failed getting instance id")
} }
apiKeyService := initAPIKeyService(dataStore) apiKeyService := initAPIKeyService(dataStore)
settings, err := dataStore.Settings().Settings() settings, err := dataStore.Settings().Settings()
if err != nil { if err != nil {
logrus.Fatal(err) log.Fatal().Err(err).Msg("")
} }
jwtService, err := initJWTService(settings.UserSessionTimeout, dataStore) jwtService, err := initJWTService(settings.UserSessionTimeout, dataStore)
if err != nil { if err != nil {
logrus.Fatalf("Failed initializing JWT service: %v", err) log.Fatal().Err(err).Msg("failed initializing JWT service")
} }
err = enableFeaturesFromFlags(dataStore, flags) err = enableFeaturesFromFlags(dataStore, flags)
if err != nil { if err != nil {
logrus.Fatalf("Failed enabling feature flag: %v", err) log.Fatal().Err(err).Msg("failed enabling feature flag")
} }
ldapService := initLDAPService() ldapService := initLDAPService()
oauthService := initOAuthService() oauthService := initOAuthService()
gitService := initGitService() gitService := initGitService()
openAMTService := openamt.NewService() openAMTService := openamt.NewService()
@ -579,17 +591,17 @@ func buildServer(flags *portainer.CLIFlags) portainer.Server {
sslService, err := initSSLService(*flags.AddrHTTPS, *flags.SSLCert, *flags.SSLKey, fileService, dataStore, shutdownTrigger) sslService, err := initSSLService(*flags.AddrHTTPS, *flags.SSLCert, *flags.SSLKey, fileService, dataStore, shutdownTrigger)
if err != nil { if err != nil {
logrus.Fatal(err) log.Fatal().Err(err).Msg("")
} }
sslSettings, err := sslService.GetSSLSettings() sslSettings, err := sslService.GetSSLSettings()
if err != nil { if err != nil {
logrus.Fatalf("Failed to get ssl settings: %s", err) log.Fatal().Err(err).Msg("failed to get SSL settings")
} }
err = initKeyPair(fileService, digitalSignatureService) err = initKeyPair(fileService, digitalSignatureService)
if err != nil { if err != nil {
logrus.Fatalf("Failed initializing key pair: %v", err) log.Fatal().Err(err).Msg("failed initializing key pair")
} }
reverseTunnelService := chisel.NewService(dataStore, shutdownCtx) reverseTunnelService := chisel.NewService(dataStore, shutdownCtx)
@ -599,7 +611,7 @@ func buildServer(flags *portainer.CLIFlags) portainer.Server {
snapshotService, err := initSnapshotService(*flags.SnapshotInterval, dataStore, dockerClientFactory, kubernetesClientFactory, shutdownCtx) snapshotService, err := initSnapshotService(*flags.SnapshotInterval, dataStore, dockerClientFactory, kubernetesClientFactory, shutdownCtx)
if err != nil { if err != nil {
logrus.Fatalf("Failed initializing snapshot service: %v", err) log.Fatal().Err(err).Msg("failed initializing snapshot service")
} }
snapshotService.Start() snapshotService.Start()
@ -620,19 +632,19 @@ func buildServer(flags *portainer.CLIFlags) portainer.Server {
swarmStackManager, err := initSwarmStackManager(*flags.Assets, dockerConfigPath, digitalSignatureService, fileService, reverseTunnelService, dataStore) swarmStackManager, err := initSwarmStackManager(*flags.Assets, dockerConfigPath, digitalSignatureService, fileService, reverseTunnelService, dataStore)
if err != nil { if err != nil {
logrus.Fatalf("Failed initializing swarm stack manager: %v", err) log.Fatal().Err(err).Msg("failed initializing swarm stack manager")
} }
kubernetesDeployer := initKubernetesDeployer(kubernetesTokenCacheManager, kubernetesClientFactory, dataStore, reverseTunnelService, digitalSignatureService, proxyManager, *flags.Assets) kubernetesDeployer := initKubernetesDeployer(kubernetesTokenCacheManager, kubernetesClientFactory, dataStore, reverseTunnelService, digitalSignatureService, proxyManager, *flags.Assets)
helmPackageManager, err := initHelmPackageManager(*flags.Assets) helmPackageManager, err := initHelmPackageManager(*flags.Assets)
if err != nil { if err != nil {
logrus.Fatalf("Failed initializing helm package manager: %v", err) log.Fatal().Err(err).Msg("failed initializing helm package manager")
} }
err = edge.LoadEdgeJobs(dataStore, reverseTunnelService) err = edge.LoadEdgeJobs(dataStore, reverseTunnelService)
if err != nil { if err != nil {
logrus.Fatalf("Failed loading edge jobs from database: %v", err) log.Fatal().Err(err).Msg("failed loading edge jobs from database")
} }
applicationStatus := initStatus(instanceID) applicationStatus := initStatus(instanceID)
@ -641,24 +653,25 @@ func buildServer(flags *portainer.CLIFlags) portainer.Server {
if *flags.DemoEnvironment { if *flags.DemoEnvironment {
err := demoService.Init(dataStore, cryptoService) err := demoService.Init(dataStore, cryptoService)
if err != nil { if err != nil {
log.Fatalf("failed initializing demo environment: %v", err) log.Fatal().Err(err).Msg("failed initializing demo environment")
} }
} }
err = initEndpoint(flags, dataStore, snapshotService) err = initEndpoint(flags, dataStore, snapshotService)
if err != nil { if err != nil {
logrus.Fatalf("Failed initializing environment: %v", err) log.Fatal().Err(err).Msg("failed initializing environment")
} }
adminPasswordHash := "" adminPasswordHash := ""
if *flags.AdminPasswordFile != "" { if *flags.AdminPasswordFile != "" {
content, err := fileService.GetFileContent(*flags.AdminPasswordFile, "") content, err := fileService.GetFileContent(*flags.AdminPasswordFile, "")
if err != nil { if err != nil {
logrus.Fatalf("Failed getting admin password file: %v", err) log.Fatal().Err(err).Msg("failed getting admin password file")
} }
adminPasswordHash, err = cryptoService.Hash(strings.TrimSuffix(string(content), "\n")) adminPasswordHash, err = cryptoService.Hash(strings.TrimSuffix(string(content), "\n"))
if err != nil { if err != nil {
logrus.Fatalf("Failed hashing admin password: %v", err) log.Fatal().Err(err).Msg("failed hashing admin password")
} }
} else if *flags.AdminPassword != "" { } else if *flags.AdminPassword != "" {
adminPasswordHash = *flags.AdminPassword adminPasswordHash = *flags.AdminPassword
@ -667,33 +680,34 @@ func buildServer(flags *portainer.CLIFlags) portainer.Server {
if adminPasswordHash != "" { if adminPasswordHash != "" {
users, err := dataStore.User().UsersByRole(portainer.AdministratorRole) users, err := dataStore.User().UsersByRole(portainer.AdministratorRole)
if err != nil { if err != nil {
logrus.Fatalf("Failed getting admin user: %v", err) log.Fatal().Err(err).Msg("failed getting admin user")
} }
if len(users) == 0 { if len(users) == 0 {
logrus.Println("Created admin user with the given password.") log.Info().Msg("created admin user with the given password.")
user := &portainer.User{ user := &portainer.User{
Username: "admin", Username: "admin",
Role: portainer.AdministratorRole, Role: portainer.AdministratorRole,
Password: adminPasswordHash, Password: adminPasswordHash,
} }
err := dataStore.User().Create(user) err := dataStore.User().Create(user)
if err != nil { if err != nil {
logrus.Fatalf("Failed creating admin user: %v", err) log.Fatal().Err(err).Msg("failed creating admin user")
} }
} else { } else {
logrus.Println("Instance already has an administrator user defined. Skipping admin password related flags.") log.Info().Msg("instance already has an administrator user defined, skipping admin password related flags.")
} }
} }
err = reverseTunnelService.StartTunnelServer(*flags.TunnelAddr, *flags.TunnelPort, snapshotService) err = reverseTunnelService.StartTunnelServer(*flags.TunnelAddr, *flags.TunnelPort, snapshotService)
if err != nil { if err != nil {
logrus.Fatalf("Failed starting tunnel server: %v", err) log.Fatal().Err(err).Msg("failed starting tunnel server")
} }
sslDBSettings, err := dataStore.SSLSettings().Settings() sslDBSettings, err := dataStore.SSLSettings().Settings()
if err != nil { if err != nil {
logrus.Fatalf("Failed to fetch ssl settings from DB") log.Fatal().Msg("failed to fetch SSL settings from DB")
} }
scheduler := scheduler.NewScheduler(shutdownCtx) scheduler := scheduler.NewScheduler(shutdownCtx)
@ -738,22 +752,25 @@ func buildServer(flags *portainer.CLIFlags) portainer.Server {
} }
func main() { func main() {
configureLogger()
flags := initCLI() flags := initCLI()
configureLogger() setLoggingLevel(*flags.LogLevel)
for { for {
server := buildServer(flags) server := buildServer(flags)
logrus.WithFields(logrus.Fields{ log.Info().
"Version": portainer.APIVersion, Str("version", portainer.APIVersion).
"BuildNumber": build.BuildNumber, Str("build_number", build.BuildNumber).
"ImageTag": build.ImageTag, Str("image_tag", build.ImageTag).
"NodejsVersion": build.NodejsVersion, Str("nodejs_version", build.NodejsVersion).
"YarnVersion": build.YarnVersion, Str("yarn_version", build.YarnVersion).
"WebpackVersion": build.WebpackVersion, Str("webpack_version", build.WebpackVersion).
"GoVersion": build.GoVersion}, Str("go_version", build.GoVersion).
).Print("[INFO] [cmd,main] Starting Portainer") Msg("starting Portainer")
err := server.Start() err := server.Start()
logrus.Printf("[INFO] [cmd,main] Http server exited: %v\n", err) log.Info().Err(err).Msg("HTTP server exited")
} }
} }

View file

@ -11,7 +11,8 @@ import (
"time" "time"
dserrors "github.com/portainer/portainer/api/dataservices/errors" dserrors "github.com/portainer/portainer/api/dataservices/errors"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
bolt "go.etcd.io/bbolt" bolt "go.etcd.io/bbolt"
) )
@ -120,7 +121,7 @@ func (connection *DbConnection) NeedsEncryptionMigration() (bool, error) {
// Open opens and initializes the BoltDB database. // Open opens and initializes the BoltDB database.
func (connection *DbConnection) Open() error { func (connection *DbConnection) Open() error {
logrus.Infof("Loading PortainerDB: %s", connection.GetDatabaseFileName()) log.Info().Str("filename", connection.GetDatabaseFileName()).Msg("loading PortainerDB")
// Now we open the db // Now we open the db
databasePath := connection.GetDatabaseFilePath() databasePath := connection.GetDatabaseFilePath()
@ -348,6 +349,7 @@ func (connection *DbConnection) CreateObjectWithSetSequence(bucketName string, i
func (connection *DbConnection) GetAll(bucketName string, obj interface{}, append func(o interface{}) (interface{}, error)) error { func (connection *DbConnection) GetAll(bucketName string, obj interface{}, append func(o interface{}) (interface{}, error)) error {
err := connection.View(func(tx *bolt.Tx) error { err := connection.View(func(tx *bolt.Tx) error {
bucket := tx.Bucket([]byte(bucketName)) bucket := tx.Bucket([]byte(bucketName))
cursor := bucket.Cursor() cursor := bucket.Cursor()
for k, v := cursor.First(); k != nil; k, v = cursor.Next() { for k, v := cursor.First(); k != nil; k, v = cursor.Next() {
err := connection.UnmarshalObject(v, obj) err := connection.UnmarshalObject(v, obj)
@ -362,6 +364,7 @@ func (connection *DbConnection) GetAll(bucketName string, obj interface{}, appen
return nil return nil
}) })
return err return err
} }
@ -411,7 +414,7 @@ func (connection *DbConnection) RestoreMetadata(s map[string]interface{}) error
for bucketName, v := range s { for bucketName, v := range s {
id, ok := v.(float64) // JSON ints are unmarshalled to interface as float64. See: https://pkg.go.dev/encoding/json#Decoder.Decode id, ok := v.(float64) // JSON ints are unmarshalled to interface as float64. See: https://pkg.go.dev/encoding/json#Decoder.Decode
if !ok { if !ok {
logrus.Errorf("Failed to restore metadata to bucket %s, skipped", bucketName) log.Error().Str("bucket", bucketName).Msg("failed to restore metadata to bucket, skipped")
continue continue
} }
@ -420,6 +423,7 @@ func (connection *DbConnection) RestoreMetadata(s map[string]interface{}) error
if err != nil { if err != nil {
return err return err
} }
return bucket.SetSequence(uint64(id)) return bucket.SetSequence(uint64(id))
}) })
} }

View file

@ -4,7 +4,7 @@ import (
"encoding/json" "encoding/json"
"time" "time"
"github.com/sirupsen/logrus" "github.com/rs/zerolog/log"
bolt "go.etcd.io/bbolt" bolt "go.etcd.io/bbolt"
) )
@ -28,11 +28,11 @@ func backupMetadata(connection *bolt.DB) (map[string]interface{}, error) {
// ExportJSON creates a JSON representation from a DbConnection. You can include // ExportJSON creates a JSON representation from a DbConnection. You can include
// the database's metadata or ignore it. Ensure the database is closed before // the database's metadata or ignore it. Ensure the database is closed before
// using this function // using this function.
// inspired by github.com/konoui/boltdb-exporter (which has no license) // inspired by github.com/konoui/boltdb-exporter (which has no license)
// but very much simplified, based on how we use boltdb // but very much simplified, based on how we use boltdb
func (c *DbConnection) ExportJson(databasePath string, metadata bool) ([]byte, error) { func (c *DbConnection) ExportJson(databasePath string, metadata bool) ([]byte, error) {
logrus.WithField("databasePath", databasePath).Infof("exportJson") log.Debug().Str("databasePath", databasePath).Msg("exportJson")
connection, err := bolt.Open(databasePath, 0600, &bolt.Options{Timeout: 1 * time.Second, ReadOnly: true}) connection, err := bolt.Open(databasePath, 0600, &bolt.Options{Timeout: 1 * time.Second, ReadOnly: true})
if err != nil { if err != nil {
@ -44,8 +44,9 @@ func (c *DbConnection) ExportJson(databasePath string, metadata bool) ([]byte, e
if metadata { if metadata {
meta, err := backupMetadata(connection) meta, err := backupMetadata(connection)
if err != nil { if err != nil {
logrus.WithError(err).Errorf("Failed exporting metadata: %v", err) log.Error().Err(err).Msg("failed exporting metadata")
} }
backup["__metadata"] = meta backup["__metadata"] = meta
} }
@ -59,22 +60,31 @@ func (c *DbConnection) ExportJson(databasePath string, metadata bool) ([]byte, e
if v == nil { if v == nil {
continue continue
} }
var obj interface{} var obj interface{}
err := c.UnmarshalObject(v, &obj) err := c.UnmarshalObject(v, &obj)
if err != nil { if err != nil {
logrus.WithError(err).Errorf("Failed to unmarshal (bucket %s): %v", bucketName, string(v)) log.Error().
Str("bucket", bucketName).
Str("object", string(v)).
Err(err).
Msg("failed to unmarshal")
obj = v obj = v
} }
if bucketName == "version" { if bucketName == "version" {
version[string(k)] = string(v) version[string(k)] = string(v)
} else { } else {
list = append(list, obj) list = append(list, obj)
} }
} }
if bucketName == "version" { if bucketName == "version" {
backup[bucketName] = version backup[bucketName] = version
return nil return nil
} }
if len(list) > 0 { if len(list) > 0 {
if bucketName == "ssl" || if bucketName == "ssl" ||
bucketName == "settings" || bucketName == "settings" ||
@ -91,8 +101,10 @@ func (c *DbConnection) ExportJson(databasePath string, metadata bool) ([]byte, e
return nil return nil
}) })
return err return err
}) })
if err != nil { if err != nil {
return []byte("{}"), err return []byte("{}"), err
} }

View file

@ -6,7 +6,8 @@ import (
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices/errors" "github.com/portainer/portainer/api/dataservices/errors"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -41,12 +42,14 @@ func (service *Service) GetAPIKeysByUserID(userID portainer.UserID) ([]portainer
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
record, ok := obj.(*portainer.APIKey) record, ok := obj.(*portainer.APIKey)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to APIKey object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to APIKey object")
return nil, fmt.Errorf("Failed to convert to APIKey object: %s", obj) return nil, fmt.Errorf("Failed to convert to APIKey object: %s", obj)
} }
if record.UserID == userID { if record.UserID == userID {
result = append(result, *record) result = append(result, *record)
} }
return &portainer.APIKey{}, nil return &portainer.APIKey{}, nil
}) })
@ -64,18 +67,21 @@ func (service *Service) GetAPIKeyByDigest(digest []byte) (*portainer.APIKey, err
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
key, ok := obj.(*portainer.APIKey) key, ok := obj.(*portainer.APIKey)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to APIKey object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to APIKey object")
return nil, fmt.Errorf("Failed to convert to APIKey object: %s", obj) return nil, fmt.Errorf("Failed to convert to APIKey object: %s", obj)
} }
if bytes.Equal(key.Digest, digest) { if bytes.Equal(key.Digest, digest) {
k = key k = key
return nil, stop return nil, stop
} }
return &portainer.APIKey{}, nil return &portainer.APIKey{}, nil
}) })
if err == stop { if err == stop {
return k, nil return k, nil
} }
if err == nil { if err == nil {
return nil, errors.ErrObjectNotFound return nil, errors.ErrObjectNotFound
} }

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -44,10 +45,11 @@ func (service *Service) CustomTemplates() ([]portainer.CustomTemplate, error) {
//var tag portainer.Tag //var tag portainer.Tag
customTemplate, ok := obj.(*portainer.CustomTemplate) customTemplate, ok := obj.(*portainer.CustomTemplate)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to CustomTemplate object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to CustomTemplate object")
return nil, fmt.Errorf("Failed to convert to CustomTemplate object: %s", obj) return nil, fmt.Errorf("Failed to convert to CustomTemplate object: %s", obj)
} }
customTemplates = append(customTemplates, *customTemplate) customTemplates = append(customTemplates, *customTemplate)
return &portainer.CustomTemplate{}, nil return &portainer.CustomTemplate{}, nil
}) })

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -43,10 +44,11 @@ func (service *Service) EdgeGroups() ([]portainer.EdgeGroup, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
group, ok := obj.(*portainer.EdgeGroup) group, ok := obj.(*portainer.EdgeGroup)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to EdgeGroup object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to EdgeGroup object")
return nil, fmt.Errorf("Failed to convert to EdgeGroup object: %s", obj) return nil, fmt.Errorf("Failed to convert to EdgeGroup object: %s", obj)
} }
groups = append(groups, *group) groups = append(groups, *group)
return &portainer.EdgeGroup{}, nil return &portainer.EdgeGroup{}, nil
}) })

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -41,13 +42,14 @@ func (service *Service) EdgeJobs() ([]portainer.EdgeJob, error) {
BucketName, BucketName,
&portainer.EdgeJob{}, &portainer.EdgeJob{},
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
//var tag portainer.Tag
job, ok := obj.(*portainer.EdgeJob) job, ok := obj.(*portainer.EdgeJob)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to EdgeJob object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to EdgeJob object")
return nil, fmt.Errorf("Failed to convert to EdgeJob object: %s", obj) return nil, fmt.Errorf("Failed to convert to EdgeJob object: %s", obj)
} }
edgeJobs = append(edgeJobs, *job) edgeJobs = append(edgeJobs, *job)
return &portainer.EdgeJob{}, nil return &portainer.EdgeJob{}, nil
}) })

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -44,10 +45,12 @@ func (service *Service) EdgeStacks() ([]portainer.EdgeStack, error) {
//var tag portainer.Tag //var tag portainer.Tag
stack, ok := obj.(*portainer.EdgeStack) stack, ok := obj.(*portainer.EdgeStack)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to EdgeStack object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to EdgeStack object")
return nil, fmt.Errorf("Failed to convert to EdgeStack object: %s", obj) return nil, fmt.Errorf("Failed to convert to EdgeStack object: %s", obj)
} }
stacks = append(stacks, *stack) stacks = append(stacks, *stack)
return &portainer.EdgeStack{}, nil return &portainer.EdgeStack{}, nil
}) })

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -68,10 +69,12 @@ func (service *Service) Endpoints() ([]portainer.Endpoint, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
endpoint, ok := obj.(*portainer.Endpoint) endpoint, ok := obj.(*portainer.Endpoint)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Endpoint object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Endpoint object")
return nil, fmt.Errorf("failed to convert to Endpoint object: %s", obj) return nil, fmt.Errorf("failed to convert to Endpoint object: %s", obj)
} }
endpoints = append(endpoints, *endpoint) endpoints = append(endpoints, *endpoint)
return &portainer.Endpoint{}, nil return &portainer.Endpoint{}, nil
}) })

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -66,13 +67,14 @@ func (service *Service) EndpointGroups() ([]portainer.EndpointGroup, error) {
BucketName, BucketName,
&portainer.EndpointGroup{}, &portainer.EndpointGroup{},
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
//var tag portainer.Tag
endpointGroup, ok := obj.(*portainer.EndpointGroup) endpointGroup, ok := obj.(*portainer.EndpointGroup)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to EndpointGroup object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to EndpointGroup object")
return nil, fmt.Errorf("Failed to convert to EndpointGroup object: %s", obj) return nil, fmt.Errorf("Failed to convert to EndpointGroup object: %s", obj)
} }
endpointGroups = append(endpointGroups, *endpointGroup) endpointGroups = append(endpointGroups, *endpointGroup)
return &portainer.EndpointGroup{}, nil return &portainer.EndpointGroup{}, nil
}) })

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -33,7 +34,7 @@ func NewService(connection portainer.Connection) (*Service, error) {
}, nil }, nil
} }
//EndpointRelations returns an array of all EndpointRelations // EndpointRelations returns an array of all EndpointRelations
func (service *Service) EndpointRelations() ([]portainer.EndpointRelation, error) { func (service *Service) EndpointRelations() ([]portainer.EndpointRelation, error) {
var all = make([]portainer.EndpointRelation, 0) var all = make([]portainer.EndpointRelation, 0)
@ -43,10 +44,12 @@ func (service *Service) EndpointRelations() ([]portainer.EndpointRelation, error
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
r, ok := obj.(*portainer.EndpointRelation) r, ok := obj.(*portainer.EndpointRelation)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to EndpointRelation object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to EndpointRelation object")
return nil, fmt.Errorf("Failed to convert to EndpointRelation object: %s", obj) return nil, fmt.Errorf("Failed to convert to EndpointRelation object: %s", obj)
} }
all = append(all, *r) all = append(all, *r)
return &portainer.EndpointRelation{}, nil return &portainer.EndpointRelation{}, nil
}) })

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -56,10 +57,12 @@ func (service *Service) Extensions() ([]portainer.Extension, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
extension, ok := obj.(*portainer.Extension) extension, ok := obj.(*portainer.Extension)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Extension object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Extension object")
return nil, fmt.Errorf("Failed to convert to Extension object: %s", obj) return nil, fmt.Errorf("Failed to convert to Extension object: %s", obj)
} }
extensions = append(extensions, *extension) extensions = append(extensions, *extension)
return &portainer.Extension{}, nil return &portainer.Extension{}, nil
}) })

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -43,8 +44,9 @@ func (service *Service) FDOProfiles() ([]portainer.FDOProfile, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
fdoProfile, ok := obj.(*portainer.FDOProfile) fdoProfile, ok := obj.(*portainer.FDOProfile)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to FDOProfile object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to FDOProfile object")
return nil, fmt.Errorf("failed to convert to FDOProfile object: %s", obj)
return nil, fmt.Errorf("Failed to convert to FDOProfile object: %s", obj)
} }
fdoProfiles = append(fdoProfiles, *fdoProfile) fdoProfiles = append(fdoProfiles, *fdoProfile)
return &portainer.FDOProfile{}, nil return &portainer.FDOProfile{}, nil

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -33,7 +34,7 @@ func NewService(connection portainer.Connection) (*Service, error) {
}, nil }, nil
} }
//HelmUserRepository returns an array of all HelmUserRepository // HelmUserRepository returns an array of all HelmUserRepository
func (service *Service) HelmUserRepositories() ([]portainer.HelmUserRepository, error) { func (service *Service) HelmUserRepositories() ([]portainer.HelmUserRepository, error) {
var repos = make([]portainer.HelmUserRepository, 0) var repos = make([]portainer.HelmUserRepository, 0)
@ -43,10 +44,12 @@ func (service *Service) HelmUserRepositories() ([]portainer.HelmUserRepository,
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
r, ok := obj.(*portainer.HelmUserRepository) r, ok := obj.(*portainer.HelmUserRepository)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to HelmUserRepository object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to HelmUserRepository object")
return nil, fmt.Errorf("Failed to convert to HelmUserRepository object: %s", obj) return nil, fmt.Errorf("Failed to convert to HelmUserRepository object: %s", obj)
} }
repos = append(repos, *r) repos = append(repos, *r)
return &portainer.HelmUserRepository{}, nil return &portainer.HelmUserRepository{}, nil
}) })
@ -63,12 +66,14 @@ func (service *Service) HelmUserRepositoryByUserID(userID portainer.UserID) ([]p
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
record, ok := obj.(*portainer.HelmUserRepository) record, ok := obj.(*portainer.HelmUserRepository)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to HelmUserRepository object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to HelmUserRepository object")
return nil, fmt.Errorf("Failed to convert to HelmUserRepository object: %s", obj) return nil, fmt.Errorf("Failed to convert to HelmUserRepository object: %s", obj)
} }
if record.UserID == userID { if record.UserID == userID {
result = append(result, *record) result = append(result, *record)
} }
return &portainer.HelmUserRepository{}, nil return &portainer.HelmUserRepository{}, nil
}) })

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -56,10 +57,12 @@ func (service *Service) Registries() ([]portainer.Registry, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
registry, ok := obj.(*portainer.Registry) registry, ok := obj.(*portainer.Registry)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Registry object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Registry object")
return nil, fmt.Errorf("Failed to convert to Registry object: %s", obj) return nil, fmt.Errorf("Failed to convert to Registry object: %s", obj)
} }
registries = append(registries, *registry) registries = append(registries, *registry)
return &portainer.Registry{}, nil return &portainer.Registry{}, nil
}) })

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -58,7 +59,7 @@ func (service *Service) ResourceControlByResourceIDAndType(resourceID string, re
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
rc, ok := obj.(*portainer.ResourceControl) rc, ok := obj.(*portainer.ResourceControl)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to ResourceControl object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to ResourceControl object")
return nil, fmt.Errorf("Failed to convert to ResourceControl object: %s", obj) return nil, fmt.Errorf("Failed to convert to ResourceControl object: %s", obj)
} }
@ -73,6 +74,7 @@ func (service *Service) ResourceControlByResourceIDAndType(resourceID string, re
return nil, stop return nil, stop
} }
} }
return &portainer.ResourceControl{}, nil return &portainer.ResourceControl{}, nil
}) })
if err == stop { if err == stop {
@ -92,10 +94,12 @@ func (service *Service) ResourceControls() ([]portainer.ResourceControl, error)
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
rc, ok := obj.(*portainer.ResourceControl) rc, ok := obj.(*portainer.ResourceControl)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to ResourceControl object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to ResourceControl object")
return nil, fmt.Errorf("Failed to convert to ResourceControl object: %s", obj) return nil, fmt.Errorf("Failed to convert to ResourceControl object: %s", obj)
} }
rcs = append(rcs, *rc) rcs = append(rcs, *rc)
return &portainer.ResourceControl{}, nil return &portainer.ResourceControl{}, nil
}) })

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -56,10 +57,12 @@ func (service *Service) Roles() ([]portainer.Role, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
set, ok := obj.(*portainer.Role) set, ok := obj.(*portainer.Role)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Role object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Role object")
return nil, fmt.Errorf("Failed to convert to Role object: %s", obj) return nil, fmt.Errorf("Failed to convert to Role object: %s", obj)
} }
sets = append(sets, *set) sets = append(sets, *set)
return &portainer.Role{}, nil return &portainer.Role{}, nil
}) })

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -68,10 +69,12 @@ func (service *Service) Schedules() ([]portainer.Schedule, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
schedule, ok := obj.(*portainer.Schedule) schedule, ok := obj.(*portainer.Schedule)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Schedule object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Schedule object")
return nil, fmt.Errorf("Failed to convert to Schedule object: %s", obj) return nil, fmt.Errorf("Failed to convert to Schedule object: %s", obj)
} }
schedules = append(schedules, *schedule) schedules = append(schedules, *schedule)
return &portainer.Schedule{}, nil return &portainer.Schedule{}, nil
}) })
@ -89,12 +92,14 @@ func (service *Service) SchedulesByJobType(jobType portainer.JobType) ([]portain
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
schedule, ok := obj.(*portainer.Schedule) schedule, ok := obj.(*portainer.Schedule)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Schedule object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Schedule object")
return nil, fmt.Errorf("Failed to convert to Schedule object: %s", obj) return nil, fmt.Errorf("Failed to convert to Schedule object: %s", obj)
} }
if schedule.JobType == jobType { if schedule.JobType == jobType {
schedules = append(schedules, *schedule) schedules = append(schedules, *schedule)
} }
return &portainer.Schedule{}, nil return &portainer.Schedule{}, nil
}) })

View file

@ -4,10 +4,10 @@ import (
"fmt" "fmt"
"strings" "strings"
"github.com/sirupsen/logrus"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices/errors" "github.com/portainer/portainer/api/dataservices/errors"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -60,13 +60,15 @@ func (service *Service) StackByName(name string) (*portainer.Stack, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
stack, ok := obj.(*portainer.Stack) stack, ok := obj.(*portainer.Stack)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Stack object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Stack object")
return nil, fmt.Errorf("Failed to convert to Stack object: %s", obj) return nil, fmt.Errorf("Failed to convert to Stack object: %s", obj)
} }
if stack.Name == name { if stack.Name == name {
s = stack s = stack
return nil, stop return nil, stop
} }
return &portainer.Stack{}, nil return &portainer.Stack{}, nil
}) })
if err == stop { if err == stop {
@ -89,12 +91,14 @@ func (service *Service) StacksByName(name string) ([]portainer.Stack, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
stack, ok := obj.(portainer.Stack) stack, ok := obj.(portainer.Stack)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Stack object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Stack object")
return nil, fmt.Errorf("Failed to convert to Stack object: %s", obj) return nil, fmt.Errorf("Failed to convert to Stack object: %s", obj)
} }
if stack.Name == name { if stack.Name == name {
stacks = append(stacks, stack) stacks = append(stacks, stack)
} }
return &portainer.Stack{}, nil return &portainer.Stack{}, nil
}) })
@ -111,10 +115,12 @@ func (service *Service) Stacks() ([]portainer.Stack, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
stack, ok := obj.(*portainer.Stack) stack, ok := obj.(*portainer.Stack)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Stack object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Stack object")
return nil, fmt.Errorf("Failed to convert to Stack object: %s", obj) return nil, fmt.Errorf("Failed to convert to Stack object: %s", obj)
} }
stacks = append(stacks, *stack) stacks = append(stacks, *stack)
return &portainer.Stack{}, nil return &portainer.Stack{}, nil
}) })
@ -156,13 +162,15 @@ func (service *Service) StackByWebhookID(id string) (*portainer.Stack, error) {
s, ok = obj.(*portainer.Stack) s, ok = obj.(*portainer.Stack)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Stack object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Stack object")
return &portainer.Stack{}, nil return &portainer.Stack{}, nil
} }
if s.AutoUpdate != nil && strings.EqualFold(s.AutoUpdate.Webhook, id) { if s.AutoUpdate != nil && strings.EqualFold(s.AutoUpdate.Webhook, id) {
return nil, stop return nil, stop
} }
return &portainer.Stack{}, nil return &portainer.Stack{}, nil
}) })
if err == stop { if err == stop {
@ -186,12 +194,14 @@ func (service *Service) RefreshableStacks() ([]portainer.Stack, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
stack, ok := obj.(*portainer.Stack) stack, ok := obj.(*portainer.Stack)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Stack object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Stack object")
return nil, fmt.Errorf("Failed to convert to Stack object: %s", obj) return nil, fmt.Errorf("Failed to convert to Stack object: %s", obj)
} }
if stack.AutoUpdate != nil && stack.AutoUpdate.Interval != "" { if stack.AutoUpdate != nil && stack.AutoUpdate.Interval != "" {
stacks = append(stacks, *stack) stacks = append(stacks, *stack)
} }
return &portainer.Stack{}, nil return &portainer.Stack{}, nil
}) })

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -43,10 +44,12 @@ func (service *Service) Tags() ([]portainer.Tag, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
tag, ok := obj.(*portainer.Tag) tag, ok := obj.(*portainer.Tag)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Tag object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Tag object")
return nil, fmt.Errorf("Failed to convert to Tag object: %s", obj) return nil, fmt.Errorf("Failed to convert to Tag object: %s", obj)
} }
tags = append(tags, *tag) tags = append(tags, *tag)
return &portainer.Tag{}, nil return &portainer.Tag{}, nil
}) })

View file

@ -4,10 +4,10 @@ import (
"fmt" "fmt"
"strings" "strings"
"github.com/portainer/portainer/api/dataservices/errors"
"github.com/sirupsen/logrus"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices/errors"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -60,13 +60,15 @@ func (service *Service) TeamByName(name string) (*portainer.Team, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
team, ok := obj.(*portainer.Team) team, ok := obj.(*portainer.Team)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Team object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Team object")
return nil, fmt.Errorf("Failed to convert to Team object: %s", obj) return nil, fmt.Errorf("Failed to convert to Team object: %s", obj)
} }
if strings.EqualFold(team.Name, name) { if strings.EqualFold(team.Name, name) {
t = team t = team
return nil, stop return nil, stop
} }
return &portainer.Team{}, nil return &portainer.Team{}, nil
}) })
if err == stop { if err == stop {
@ -89,10 +91,12 @@ func (service *Service) Teams() ([]portainer.Team, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
team, ok := obj.(*portainer.Team) team, ok := obj.(*portainer.Team)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Team object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Team object")
return nil, fmt.Errorf("Failed to convert to Team object: %s", obj) return nil, fmt.Errorf("Failed to convert to Team object: %s", obj)
} }
teams = append(teams, *team) teams = append(teams, *team)
return &portainer.Team{}, nil return &portainer.Team{}, nil
}) })

View file

@ -4,7 +4,8 @@ import (
"fmt" "fmt"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -56,10 +57,12 @@ func (service *Service) TeamMemberships() ([]portainer.TeamMembership, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
membership, ok := obj.(*portainer.TeamMembership) membership, ok := obj.(*portainer.TeamMembership)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to TeamMembership object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to TeamMembership object")
return nil, fmt.Errorf("Failed to convert to TeamMembership object: %s", obj) return nil, fmt.Errorf("Failed to convert to TeamMembership object: %s", obj)
} }
memberships = append(memberships, *membership) memberships = append(memberships, *membership)
return &portainer.TeamMembership{}, nil return &portainer.TeamMembership{}, nil
}) })
@ -76,12 +79,14 @@ func (service *Service) TeamMembershipsByUserID(userID portainer.UserID) ([]port
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
membership, ok := obj.(*portainer.TeamMembership) membership, ok := obj.(*portainer.TeamMembership)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to TeamMembership object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to TeamMembership object")
return nil, fmt.Errorf("Failed to convert to TeamMembership object: %s", obj) return nil, fmt.Errorf("Failed to convert to TeamMembership object: %s", obj)
} }
if membership.UserID == userID { if membership.UserID == userID {
memberships = append(memberships, *membership) memberships = append(memberships, *membership)
} }
return &portainer.TeamMembership{}, nil return &portainer.TeamMembership{}, nil
}) })
@ -98,12 +103,14 @@ func (service *Service) TeamMembershipsByTeamID(teamID portainer.TeamID) ([]port
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
membership, ok := obj.(*portainer.TeamMembership) membership, ok := obj.(*portainer.TeamMembership)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to TeamMembership object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to TeamMembership object")
return nil, fmt.Errorf("Failed to convert to TeamMembership object: %s", obj) return nil, fmt.Errorf("Failed to convert to TeamMembership object: %s", obj)
} }
if membership.TeamID == teamID { if membership.TeamID == teamID {
memberships = append(memberships, *membership) memberships = append(memberships, *membership)
} }
return &portainer.TeamMembership{}, nil return &portainer.TeamMembership{}, nil
}) })
@ -140,13 +147,15 @@ func (service *Service) DeleteTeamMembershipByUserID(userID portainer.UserID) er
func(obj interface{}) (id int, ok bool) { func(obj interface{}) (id int, ok bool) {
membership, ok := obj.(portainer.TeamMembership) membership, ok := obj.(portainer.TeamMembership)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to TeamMembership object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to TeamMembership object")
//return fmt.Errorf("Failed to convert to TeamMembership object: %s", obj) //return fmt.Errorf("Failed to convert to TeamMembership object: %s", obj)
return -1, false return -1, false
} }
if membership.UserID == userID { if membership.UserID == userID {
return int(membership.ID), true return int(membership.ID), true
} }
return -1, false return -1, false
}) })
} }
@ -158,13 +167,15 @@ func (service *Service) DeleteTeamMembershipByTeamID(teamID portainer.TeamID) er
func(obj interface{}) (id int, ok bool) { func(obj interface{}) (id int, ok bool) {
membership, ok := obj.(portainer.TeamMembership) membership, ok := obj.(portainer.TeamMembership)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to TeamMembership object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to TeamMembership object")
//return fmt.Errorf("Failed to convert to TeamMembership object: %s", obj) //return fmt.Errorf("Failed to convert to TeamMembership object: %s", obj)
return -1, false return -1, false
} }
if membership.TeamID == teamID { if membership.TeamID == teamID {
return int(membership.ID), true return int(membership.ID), true
} }
return -1, false return -1, false
}) })
} }

View file

@ -4,10 +4,10 @@ import (
"fmt" "fmt"
"strings" "strings"
"github.com/portainer/portainer/api/dataservices/errors"
"github.com/sirupsen/logrus"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices/errors"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -59,18 +59,23 @@ func (service *Service) UserByUsername(username string) (*portainer.User, error)
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
user, ok := obj.(*portainer.User) user, ok := obj.(*portainer.User)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to User object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to User object")
return nil, fmt.Errorf("Failed to convert to User object: %s", obj) return nil, fmt.Errorf("Failed to convert to User object: %s", obj)
} }
if strings.EqualFold(user.Username, username) { if strings.EqualFold(user.Username, username) {
u = user u = user
return nil, stop return nil, stop
} }
return &portainer.User{}, nil return &portainer.User{}, nil
}) })
if err == stop { if err == stop {
return u, nil return u, nil
} }
if err == nil { if err == nil {
return nil, errors.ErrObjectNotFound return nil, errors.ErrObjectNotFound
} }
@ -88,10 +93,13 @@ func (service *Service) Users() ([]portainer.User, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
user, ok := obj.(*portainer.User) user, ok := obj.(*portainer.User)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to User object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to User object")
return nil, fmt.Errorf("Failed to convert to User object: %s", obj) return nil, fmt.Errorf("Failed to convert to User object: %s", obj)
} }
users = append(users, *user) users = append(users, *user)
return &portainer.User{}, nil return &portainer.User{}, nil
}) })
@ -108,12 +116,15 @@ func (service *Service) UsersByRole(role portainer.UserRole) ([]portainer.User,
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
user, ok := obj.(*portainer.User) user, ok := obj.(*portainer.User)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to User object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to User object")
return nil, fmt.Errorf("Failed to convert to User object: %s", obj) return nil, fmt.Errorf("Failed to convert to User object: %s", obj)
} }
if user.Role == role { if user.Role == role {
users = append(users, *user) users = append(users, *user)
} }
return &portainer.User{}, nil return &portainer.User{}, nil
}) })

View file

@ -5,7 +5,8 @@ import (
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices/errors" "github.com/portainer/portainer/api/dataservices/errors"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -34,7 +35,7 @@ func NewService(connection portainer.Connection) (*Service, error) {
}, nil }, nil
} }
//Webhooks returns an array of all webhooks // Webhooks returns an array of all webhooks
func (service *Service) Webhooks() ([]portainer.Webhook, error) { func (service *Service) Webhooks() ([]portainer.Webhook, error) {
var webhooks = make([]portainer.Webhook, 0) var webhooks = make([]portainer.Webhook, 0)
@ -44,10 +45,12 @@ func (service *Service) Webhooks() ([]portainer.Webhook, error) {
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
webhook, ok := obj.(*portainer.Webhook) webhook, ok := obj.(*portainer.Webhook)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Webhook object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Webhook object")
return nil, fmt.Errorf("Failed to convert to Webhook object: %s", obj) return nil, fmt.Errorf("Failed to convert to Webhook object: %s", obj)
} }
webhooks = append(webhooks, *webhook) webhooks = append(webhooks, *webhook)
return &portainer.Webhook{}, nil return &portainer.Webhook{}, nil
}) })
@ -77,18 +80,23 @@ func (service *Service) WebhookByResourceID(ID string) (*portainer.Webhook, erro
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
webhook, ok := obj.(*portainer.Webhook) webhook, ok := obj.(*portainer.Webhook)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Webhook object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Webhook object")
return nil, fmt.Errorf("Failed to convert to Webhook object: %s", obj) return nil, fmt.Errorf("Failed to convert to Webhook object: %s", obj)
} }
if webhook.ResourceID == ID { if webhook.ResourceID == ID {
w = webhook w = webhook
return nil, stop return nil, stop
} }
return &portainer.Webhook{}, nil return &portainer.Webhook{}, nil
}) })
if err == stop { if err == stop {
return w, nil return w, nil
} }
if err == nil { if err == nil {
return nil, errors.ErrObjectNotFound return nil, errors.ErrObjectNotFound
} }
@ -106,18 +114,23 @@ func (service *Service) WebhookByToken(token string) (*portainer.Webhook, error)
func(obj interface{}) (interface{}, error) { func(obj interface{}) (interface{}, error) {
webhook, ok := obj.(*portainer.Webhook) webhook, ok := obj.(*portainer.Webhook)
if !ok { if !ok {
logrus.WithField("obj", obj).Errorf("Failed to convert to Webhook object") log.Debug().Str("obj", fmt.Sprintf("%#v", obj)).Msg("failed to convert to Webhook object")
return nil, fmt.Errorf("Failed to convert to Webhook object: %s", obj) return nil, fmt.Errorf("Failed to convert to Webhook object: %s", obj)
} }
if webhook.Token == token { if webhook.Token == token {
w = webhook w = webhook
return nil, stop return nil, stop
} }
return &portainer.Webhook{}, nil return &portainer.Webhook{}, nil
}) })
if err == stop { if err == stop {
return w, nil return w, nil
} }
if err == nil { if err == nil {
return nil, errors.ErrObjectNotFound return nil, errors.ErrObjectNotFound
} }

View file

@ -6,7 +6,7 @@ import (
"path" "path"
"time" "time"
plog "github.com/portainer/portainer/api/datastore/log" "github.com/rs/zerolog/log"
) )
var backupDefaults = struct { var backupDefaults = struct {
@ -17,8 +17,6 @@ var backupDefaults = struct {
"common", "common",
} }
var backupLog = plog.NewScopedLog("database, backup")
// //
// Backup Helpers // Backup Helpers
// //
@ -29,7 +27,7 @@ func (store *Store) createBackupFolders() {
commonDir := store.commonBackupDir() commonDir := store.commonBackupDir()
if exists, _ := store.fileService.FileExists(commonDir); !exists { if exists, _ := store.fileService.FileExists(commonDir); !exists {
if err := os.MkdirAll(commonDir, 0700); err != nil { if err := os.MkdirAll(commonDir, 0700); err != nil {
backupLog.Error("Error while creating common backup folder", err) log.Error().Err(err).Msg("error while creating common backup folder")
} }
} }
} }
@ -43,11 +41,13 @@ func (store *Store) commonBackupDir() string {
} }
func (store *Store) copyDBFile(from string, to string) error { func (store *Store) copyDBFile(from string, to string) error {
backupLog.Info(fmt.Sprintf("Copying db file from %s to %s", from, to)) log.Info().Str("from", from).Str("to", to).Msg("copying DB file")
err := store.fileService.Copy(from, to, true) err := store.fileService.Copy(from, to, true)
if err != nil { if err != nil {
backupLog.Error("Failed", err) log.Error().Err(err).Msg("failed")
} }
return err return err
} }
@ -99,7 +99,8 @@ func (store *Store) setupOptions(options *BackupOptions) *BackupOptions {
// BackupWithOptions backup current database with options // BackupWithOptions backup current database with options
func (store *Store) backupWithOptions(options *BackupOptions) (string, error) { func (store *Store) backupWithOptions(options *BackupOptions) (string, error) {
backupLog.Info("creating db backup") log.Info().Msg("creating DB backup")
store.createBackupFolders() store.createBackupFolders()
options = store.setupOptions(options) options = store.setupOptions(options)
@ -122,6 +123,7 @@ func (store *Store) backupWithOptions(options *BackupOptions) (string, error) {
err, err,
) )
} }
return options.BackupPath, nil return options.BackupPath, nil
} }
@ -135,17 +137,19 @@ func (store *Store) restoreWithOptions(options *BackupOptions) error {
// Check if backup file exist before restoring // Check if backup file exist before restoring
_, err := os.Stat(options.BackupPath) _, err := os.Stat(options.BackupPath)
if os.IsNotExist(err) { if os.IsNotExist(err) {
backupLog.Error(fmt.Sprintf("Backup file to restore does not exist %s", options.BackupPath), err) log.Error().Str("path", options.BackupPath).Err(err).Msg("backup file to restore does not exist %s")
return err return err
} }
err = store.Close() err = store.Close()
if err != nil { if err != nil {
backupLog.Error("Error while closing store before restore", err) log.Error().Err(err).Msg("error while closing store before restore")
return err return err
} }
backupLog.Info("Restoring db backup") log.Info().Msg("restoring DB backup")
err = store.copyDBFile(options.BackupPath, store.databasePath()) err = store.copyDBFile(options.BackupPath, store.databasePath())
if err != nil { if err != nil {
return err return err
@ -157,20 +161,22 @@ func (store *Store) restoreWithOptions(options *BackupOptions) error {
// RemoveWithOptions removes backup database based on supplied options // RemoveWithOptions removes backup database based on supplied options
func (store *Store) removeWithOptions(options *BackupOptions) error { func (store *Store) removeWithOptions(options *BackupOptions) error {
backupLog.Info("Removing db backup") log.Info().Msg("removing DB backup")
options = store.setupOptions(options) options = store.setupOptions(options)
_, err := os.Stat(options.BackupPath) _, err := os.Stat(options.BackupPath)
if os.IsNotExist(err) { if os.IsNotExist(err) {
backupLog.Error(fmt.Sprintf("Backup file to remove does not exist %s", options.BackupPath), err) log.Error().Str("path", options.BackupPath).Err(err).Msg("backup file to remove does not exist")
return err return err
} }
backupLog.Info(fmt.Sprintf("Removing db file at %s", options.BackupPath)) log.Info().Str("path", options.BackupPath).Msg("removing DB file")
err = os.Remove(options.BackupPath) err = os.Remove(options.BackupPath)
if err != nil { if err != nil {
backupLog.Error("Failed", err) log.Error().Err(err).Msg("failed")
return err return err
} }

View file

@ -9,7 +9,8 @@ import (
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
portainerErrors "github.com/portainer/portainer/api/dataservices/errors" portainerErrors "github.com/portainer/portainer/api/dataservices/errors"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
func (store *Store) version() (int, error) { func (store *Store) version() (int, error) {
@ -73,7 +74,8 @@ func (store *Store) Open() (newStore bool, err error) {
} }
if version > 0 { if version > 0 {
logrus.WithField("version", version).Infof("Opened existing store") log.Debug().Int("version", version).Msg("opened existing store")
return false, nil return false, nil
} }
@ -121,19 +123,21 @@ func (store *Store) encryptDB() error {
// The DB is not currently encrypted. First save the encrypted db filename // The DB is not currently encrypted. First save the encrypted db filename
oldFilename := store.connection.GetDatabaseFilePath() oldFilename := store.connection.GetDatabaseFilePath()
logrus.Infof("Encrypting database") log.Info().Msg("encrypting database")
// export file path for backup // export file path for backup
exportFilename := path.Join(store.databasePath() + "." + fmt.Sprintf("backup-%d.json", time.Now().Unix())) exportFilename := path.Join(store.databasePath() + "." + fmt.Sprintf("backup-%d.json", time.Now().Unix()))
logrus.Infof("Exporting database backup to %s", exportFilename) log.Info().Str("filename", exportFilename).Msg("exporting database backup")
err = store.Export(exportFilename) err = store.Export(exportFilename)
if err != nil { if err != nil {
logrus.WithError(err).Debugf("Failed to export to %s", exportFilename) log.Error().Str("filename", exportFilename).Err(err).Msg("failed to export")
return err return err
} }
logrus.Infof("Database backup exported") log.Info().Msg("database backup exported")
// Close existing un-encrypted db so that we can delete the file later // Close existing un-encrypted db so that we can delete the file later
store.connection.Close() store.connection.Close()
@ -152,22 +156,23 @@ func (store *Store) encryptDB() error {
if err != nil { if err != nil {
// Remove the new encrypted file that we failed to import // Remove the new encrypted file that we failed to import
os.Remove(store.connection.GetDatabaseFilePath()) os.Remove(store.connection.GetDatabaseFilePath())
logrus.Fatal(portainerErrors.ErrDBImportFailed.Error()) log.Fatal().Err(portainerErrors.ErrDBImportFailed).Msg("")
} }
err = os.Remove(oldFilename) err = os.Remove(oldFilename)
if err != nil { if err != nil {
logrus.Errorf("Failed to remove the un-encrypted db file") log.Error().Msg("failed to remove the un-encrypted db file")
} }
err = os.Remove(exportFilename) err = os.Remove(exportFilename)
if err != nil { if err != nil {
logrus.Errorf("Failed to remove the json backup file") log.Error().Msg("failed to remove the json backup file")
} }
// Close db connection // Close db connection
store.connection.Close() store.connection.Close()
logrus.Info("Database successfully encrypted") log.Info().Msg("database successfully encrypted")
return nil return nil
} }

View file

@ -1,51 +0,0 @@
package log
import (
"fmt"
"log"
)
const (
INFO = "INFO"
ERROR = "ERROR"
DEBUG = "DEBUG"
FATAL = "FATAL"
)
type ScopedLog struct {
scope string
}
func NewScopedLog(scope string) *ScopedLog {
return &ScopedLog{scope: scope}
}
func (slog *ScopedLog) print(kind string, message string) {
log.Printf("[%s] [%s] %s", kind, slog.scope, message)
}
func (slog *ScopedLog) Debug(message string) {
slog.print(DEBUG, fmt.Sprintf("[message: %s]", message))
}
func (slog *ScopedLog) Debugf(message string, vars ...interface{}) {
message = fmt.Sprintf(message, vars...)
slog.print(DEBUG, fmt.Sprintf("[message: %s]", message))
}
func (slog *ScopedLog) Info(message string) {
slog.print(INFO, fmt.Sprintf("[message: %s]", message))
}
func (slog *ScopedLog) Infof(message string, vars ...interface{}) {
message = fmt.Sprintf(message, vars...)
slog.print(INFO, fmt.Sprintf("[message: %s]", message))
}
func (slog *ScopedLog) Error(message string, err error) {
slog.print(ERROR, fmt.Sprintf("[message: %s] [error: %s]", message, err))
}
func (slog *ScopedLog) NotImplemented(method string) {
log.Fatalf("[%s] [%s] [%s]", FATAL, slog.scope, fmt.Sprintf("%s is not yet implemented", method))
}

View file

@ -4,21 +4,18 @@ import (
"fmt" "fmt"
"runtime/debug" "runtime/debug"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/cli" "github.com/portainer/portainer/api/cli"
"github.com/portainer/portainer/api/dataservices/errors" "github.com/portainer/portainer/api/dataservices/errors"
plog "github.com/portainer/portainer/api/datastore/log"
"github.com/portainer/portainer/api/datastore/migrator" "github.com/portainer/portainer/api/datastore/migrator"
"github.com/portainer/portainer/api/internal/authorization" "github.com/portainer/portainer/api/internal/authorization"
"github.com/sirupsen/logrus"
werrors "github.com/pkg/errors" werrors "github.com/pkg/errors"
portainer "github.com/portainer/portainer/api" "github.com/rs/zerolog/log"
) )
const beforePortainerVersionUpgradeBackup = "portainer.db.bak" const beforePortainerVersionUpgradeBackup = "portainer.db.bak"
var migrateLog = plog.NewScopedLog("database, migrate")
func (store *Store) MigrateData() error { func (store *Store) MigrateData() error {
version, err := store.version() version, err := store.version()
if err != nil { if err != nil {
@ -56,20 +53,19 @@ func (store *Store) MigrateData() error {
// restore on error // restore on error
err = store.connectionMigrateData(migratorParams) err = store.connectionMigrateData(migratorParams)
if err != nil { if err != nil {
logrus.Errorf("While DB migration %v. Restoring DB", err) log.Error().Err(err).Msg("while DB migration, restoring DB")
// Restore options // Restore options
options := BackupOptions{ options := BackupOptions{
BackupPath: backupPath, BackupPath: backupPath,
} }
err := store.restoreWithOptions(&options) err := store.restoreWithOptions(&options)
if err != nil { if err != nil {
logrus.Fatalf( log.Fatal().
"Failed restoring the backup. portainer database file needs to restored manually by "+ Str("database_file", store.databasePath()).
"replacing %s database file with recent backup %s. Error %v", Str("backup", options.BackupPath).Err(err).
store.databasePath(), Msg("failed restoring the backup, Portainer database file needs to restored manually by replacing the database file with a recent backup")
options.BackupPath,
err,
)
} }
} }
@ -111,10 +107,15 @@ func (store *Store) connectionMigrateData(migratorParams *migrator.MigratorParam
} }
if migrator.Version() < portainer.DBVersion { if migrator.Version() < portainer.DBVersion {
migrateLog.Info(fmt.Sprintf("Migrating database from version %v to %v.\n", migrator.Version(), portainer.DBVersion)) log.Info().
Int("migrator_version", migrator.Version()).
Int("db_version", portainer.DBVersion).
Msg("migrating database")
err = store.FailSafeMigrate(migrator) err = store.FailSafeMigrate(migrator)
if err != nil { if err != nil {
migrateLog.Error("An error occurred during database migration", err) log.Error().Err(err).Msg("an error occurred during database migration")
return err return err
} }
} }
@ -124,17 +125,19 @@ func (store *Store) connectionMigrateData(migratorParams *migrator.MigratorParam
// backupVersion will backup the database or panic if any errors occur // backupVersion will backup the database or panic if any errors occur
func (store *Store) backupVersion(migrator *migrator.Migrator) error { func (store *Store) backupVersion(migrator *migrator.Migrator) error {
migrateLog.Info("Backing up database prior to version upgrade...") log.Info().Msg("backing up database prior to version upgrade")
options := getBackupRestoreOptions(store.commonBackupDir()) options := getBackupRestoreOptions(store.commonBackupDir())
_, err := store.backupWithOptions(options) _, err := store.backupWithOptions(options)
if err != nil { if err != nil {
migrateLog.Error("An error occurred during database backup", err) log.Error().Err(err).Msg("an error occurred during database backup")
removalErr := store.removeWithOptions(options) removalErr := store.removeWithOptions(options)
if removalErr != nil { if removalErr != nil {
migrateLog.Error("An error occurred during store removal prior to backup", err) log.Error().Err(err).Msg("an error occurred during store removal prior to backup")
} }
return err return err
} }

View file

@ -5,15 +5,16 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "io"
"log"
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
"testing" "testing"
"github.com/google/go-cmp/cmp"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database/boltdb" "github.com/portainer/portainer/api/database/boltdb"
"github.com/google/go-cmp/cmp"
"github.com/rs/zerolog/log"
) )
// testVersion is a helper which tests current store version against wanted version // testVersion is a helper which tests current store version against wanted version
@ -157,7 +158,6 @@ func TestMigrateData(t *testing.T) {
t.Errorf("Backup file should not exist for dirty database; file=%s", options.BackupPath) t.Errorf("Backup file should not exist for dirty database; file=%s", options.BackupPath)
} }
}) })
} }
func Test_getBackupRestoreOptions(t *testing.T) { func Test_getBackupRestoreOptions(t *testing.T) {
@ -168,12 +168,12 @@ func Test_getBackupRestoreOptions(t *testing.T) {
wantDir := store.commonBackupDir() wantDir := store.commonBackupDir()
if !strings.HasSuffix(options.BackupDir, wantDir) { if !strings.HasSuffix(options.BackupDir, wantDir) {
log.Fatalf("incorrect backup dir; got=%s, want=%s", options.BackupDir, wantDir) log.Fatal().Str("got", options.BackupDir).Str("want", wantDir).Msg("incorrect backup dir")
} }
wantFilename := "portainer.db.bak" wantFilename := "portainer.db.bak"
if options.BackupFileName != wantFilename { if options.BackupFileName != wantFilename {
log.Fatalf("incorrect backup file; got=%s, want=%s", options.BackupFileName, wantFilename) log.Fatal().Str("got", options.BackupFileName).Str("want", wantFilename).Msg("incorrect backup file")
} }
} }
@ -186,19 +186,20 @@ func TestRollback(t *testing.T) {
_, err := store.backupWithOptions(getBackupRestoreOptions(store.commonBackupDir())) _, err := store.backupWithOptions(getBackupRestoreOptions(store.commonBackupDir()))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal().Err(err).Msg("")
} }
// Change the current edition // Change the current edition
err = store.VersionService.StoreDBVersion(version + 10) err = store.VersionService.StoreDBVersion(version + 10)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal().Err(err).Msg("")
} }
err = store.Rollback(true) err = store.Rollback(true)
if err != nil { if err != nil {
t.Logf("Rollback failed: %s", err) t.Logf("Rollback failed: %s", err)
t.Fail() t.Fail()
return return
} }

View file

@ -5,8 +5,10 @@ import (
"reflect" "reflect"
"runtime" "runtime"
werrors "github.com/pkg/errors"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
werrors "github.com/pkg/errors"
"github.com/rs/zerolog/log"
) )
type migration struct { type migration struct {
@ -114,7 +116,7 @@ func (m *Migrator) Migrate() error {
// Print the next line only when the version changes // Print the next line only when the version changes
if migration.dbversion > lastDbVersion { if migration.dbversion > lastDbVersion {
migrateLog.Infof("Migrating DB to version %d", migration.dbversion) log.Info().Int("to_version", migration.dbversion).Msg("migrating DB")
} }
err := migration.migrate() err := migration.migrate()
@ -125,12 +127,14 @@ func (m *Migrator) Migrate() error {
lastDbVersion = migration.dbversion lastDbVersion = migration.dbversion
} }
migrateLog.Infof("Setting DB version to %d", portainer.DBVersion) log.Info().Int("version", portainer.DBVersion).Msg("setting DB version")
err = m.versionService.StoreDBVersion(portainer.DBVersion) err = m.versionService.StoreDBVersion(portainer.DBVersion)
if err != nil { if err != nil {
return migrationError(err, "StoreDBVersion") return migrationError(err, "StoreDBVersion")
} }
migrateLog.Infof("Updated DB version to %d", portainer.DBVersion)
log.Info().Int("version", portainer.DBVersion).Msg("updated DB version")
// reset DB updating status // reset DB updating status
return m.versionService.StoreIsUpdating(false) return m.versionService.StoreIsUpdating(false)

View file

@ -2,10 +2,13 @@ package migrator
import ( import (
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/rs/zerolog/log"
) )
func (m *Migrator) updateUsersToDBVersion18() error { func (m *Migrator) updateUsersToDBVersion18() error {
migrateLog.Info("- updating users") log.Info().Msg("updating users")
legacyUsers, err := m.userService.Users() legacyUsers, err := m.userService.Users()
if err != nil { if err != nil {
return err return err
@ -40,7 +43,8 @@ func (m *Migrator) updateUsersToDBVersion18() error {
} }
func (m *Migrator) updateEndpointsToDBVersion18() error { func (m *Migrator) updateEndpointsToDBVersion18() error {
migrateLog.Info("- updating endpoints") log.Info().Msg("updating endpoints")
legacyEndpoints, err := m.endpointService.Endpoints() legacyEndpoints, err := m.endpointService.Endpoints()
if err != nil { if err != nil {
return err return err
@ -71,7 +75,8 @@ func (m *Migrator) updateEndpointsToDBVersion18() error {
} }
func (m *Migrator) updateEndpointGroupsToDBVersion18() error { func (m *Migrator) updateEndpointGroupsToDBVersion18() error {
migrateLog.Info("- updating endpoint groups") log.Info().Msg("updating endpoint groups")
legacyEndpointGroups, err := m.endpointGroupService.EndpointGroups() legacyEndpointGroups, err := m.endpointGroupService.EndpointGroups()
if err != nil { if err != nil {
return err return err
@ -102,7 +107,8 @@ func (m *Migrator) updateEndpointGroupsToDBVersion18() error {
} }
func (m *Migrator) updateRegistriesToDBVersion18() error { func (m *Migrator) updateRegistriesToDBVersion18() error {
migrateLog.Info("- updating registries") log.Info().Msg("updating registries")
legacyRegistries, err := m.registryService.Registries() legacyRegistries, err := m.registryService.Registries()
if err != nil { if err != nil {
return err return err

View file

@ -1,9 +1,14 @@
package migrator package migrator
import portainer "github.com/portainer/portainer/api" import (
portainer "github.com/portainer/portainer/api"
"github.com/rs/zerolog/log"
)
func (m *Migrator) updateSettingsToDBVersion19() error { func (m *Migrator) updateSettingsToDBVersion19() error {
migrateLog.Info("- updating settings") log.Info().Msg("updating settings")
legacySettings, err := m.settingsService.Settings() legacySettings, err := m.settingsService.Settings()
if err != nil { if err != nil {
return err return err

View file

@ -2,12 +2,15 @@ package migrator
import ( import (
"strings" "strings"
"github.com/rs/zerolog/log"
) )
const scheduleScriptExecutionJobType = 1 const scheduleScriptExecutionJobType = 1
func (m *Migrator) updateUsersToDBVersion20() error { func (m *Migrator) updateUsersToDBVersion20() error {
migrateLog.Info("- updating user authentication") log.Info().Msg("updating user authentication")
return m.authorizationService.UpdateUsersAuthorizations() return m.authorizationService.UpdateUsersAuthorizations()
} }
@ -23,7 +26,8 @@ func (m *Migrator) updateSettingsToDBVersion20() error {
} }
func (m *Migrator) updateSchedulesToDBVersion20() error { func (m *Migrator) updateSchedulesToDBVersion20() error {
migrateLog.Info("- updating schedules") log.Info().Msg("updating schedules")
legacySchedules, err := m.scheduleService.Schedules() legacySchedules, err := m.scheduleService.Schedules()
if err != nil { if err != nil {
return err return err

View file

@ -3,10 +3,13 @@ package migrator
import ( import (
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/internal/authorization" "github.com/portainer/portainer/api/internal/authorization"
"github.com/rs/zerolog/log"
) )
func (m *Migrator) updateResourceControlsToDBVersion22() error { func (m *Migrator) updateResourceControlsToDBVersion22() error {
migrateLog.Info("- updating resource controls") log.Info().Msg("updating resource controls")
legacyResourceControls, err := m.resourceControlService.ResourceControls() legacyResourceControls, err := m.resourceControlService.ResourceControls()
if err != nil { if err != nil {
return err return err
@ -25,7 +28,8 @@ func (m *Migrator) updateResourceControlsToDBVersion22() error {
} }
func (m *Migrator) updateUsersAndRolesToDBVersion22() error { func (m *Migrator) updateUsersAndRolesToDBVersion22() error {
migrateLog.Info("- updating users and roles") log.Info().Msg("updating users and roles")
legacyUsers, err := m.userService.Users() legacyUsers, err := m.userService.Users()
if err != nil { if err != nil {
return err return err

View file

@ -1,9 +1,14 @@
package migrator package migrator
import portainer "github.com/portainer/portainer/api" import (
portainer "github.com/portainer/portainer/api"
"github.com/rs/zerolog/log"
)
func (m *Migrator) updateTagsToDBVersion23() error { func (m *Migrator) updateTagsToDBVersion23() error {
migrateLog.Info("- Updating tags") log.Info().Msg("updating tags")
tags, err := m.tagService.Tags() tags, err := m.tagService.Tags()
if err != nil { if err != nil {
return err return err
@ -21,7 +26,8 @@ func (m *Migrator) updateTagsToDBVersion23() error {
} }
func (m *Migrator) updateEndpointsAndEndpointGroupsToDBVersion23() error { func (m *Migrator) updateEndpointsAndEndpointGroupsToDBVersion23() error {
migrateLog.Info("- updating endpoints and endpoint groups") log.Info().Msg("updating endpoints and endpoint groups")
tags, err := m.tagService.Tags() tags, err := m.tagService.Tags()
if err != nil { if err != nil {
return err return err
@ -90,5 +96,6 @@ func (m *Migrator) updateEndpointsAndEndpointGroupsToDBVersion23() error {
return err return err
} }
} }
return nil return nil
} }

View file

@ -1,9 +1,13 @@
package migrator package migrator
import portainer "github.com/portainer/portainer/api" import (
portainer "github.com/portainer/portainer/api"
"github.com/rs/zerolog/log"
)
func (m *Migrator) updateSettingsToDB24() error { func (m *Migrator) updateSettingsToDB24() error {
migrateLog.Info("- updating Settings") log.Info().Msg("updating Settings")
legacySettings, err := m.settingsService.Settings() legacySettings, err := m.settingsService.Settings()
if err != nil { if err != nil {
@ -18,7 +22,8 @@ func (m *Migrator) updateSettingsToDB24() error {
} }
func (m *Migrator) updateStacksToDB24() error { func (m *Migrator) updateStacksToDB24() error {
migrateLog.Info("- updating stacks") log.Info().Msg("updating stacks")
stacks, err := m.stackService.Stacks() stacks, err := m.stackService.Stacks()
if err != nil { if err != nil {
return err return err

View file

@ -2,10 +2,12 @@ package migrator
import ( import (
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/rs/zerolog/log"
) )
func (m *Migrator) updateSettingsToDB25() error { func (m *Migrator) updateSettingsToDB25() error {
migrateLog.Info("- updating settings") log.Info().Msg("updating settings")
legacySettings, err := m.settingsService.Settings() legacySettings, err := m.settingsService.Settings()
if err != nil { if err != nil {

View file

@ -2,10 +2,13 @@ package migrator
import ( import (
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/rs/zerolog/log"
) )
func (m *Migrator) updateEndpointSettingsToDB25() error { func (m *Migrator) updateEndpointSettingsToDB25() error {
migrateLog.Info("- updating endpoint settings") log.Info().Msg("updating endpoint settings")
settings, err := m.settingsService.Settings() settings, err := m.settingsService.Settings()
if err != nil { if err != nil {
return err return err

View file

@ -4,10 +4,13 @@ import (
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices/errors" "github.com/portainer/portainer/api/dataservices/errors"
"github.com/portainer/portainer/api/internal/stackutils" "github.com/portainer/portainer/api/internal/stackutils"
"github.com/rs/zerolog/log"
) )
func (m *Migrator) updateStackResourceControlToDB27() error { func (m *Migrator) updateStackResourceControlToDB27() error {
migrateLog.Info("- updating stack resource controls") log.Info().Msg("updating stack resource controls")
resourceControls, err := m.resourceControlService.ResourceControls() resourceControls, err := m.resourceControlService.ResourceControls()
if err != nil { if err != nil {
return err return err

View file

@ -1,12 +1,11 @@
package migrator package migrator
func (m *Migrator) migrateDBVersionToDB30() error { import "github.com/rs/zerolog/log"
migrateLog.Info("- updating legacy settings")
if err := m.MigrateSettingsToDB30(); err != nil {
return err
}
return nil func (m *Migrator) migrateDBVersionToDB30() error {
log.Info().Msg("updating legacy settings")
return m.MigrateSettingsToDB30()
} }
// so setting to false and "", is what would happen without this code // so setting to false and "", is what would happen without this code

View file

@ -2,14 +2,14 @@ package migrator
import ( import (
"fmt" "fmt"
"log"
"github.com/docker/docker/api/types/volume"
"github.com/portainer/portainer/api/dataservices/errors"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices/errors"
"github.com/portainer/portainer/api/internal/endpointutils" "github.com/portainer/portainer/api/internal/endpointutils"
snapshotutils "github.com/portainer/portainer/api/internal/snapshot" snapshotutils "github.com/portainer/portainer/api/internal/snapshot"
"github.com/docker/docker/api/types/volume"
"github.com/rs/zerolog/log"
) )
func (m *Migrator) migrateDBVersionToDB32() error { func (m *Migrator) migrateDBVersionToDB32() error {
@ -39,7 +39,8 @@ func (m *Migrator) migrateDBVersionToDB32() error {
} }
func (m *Migrator) updateRegistriesToDB32() error { func (m *Migrator) updateRegistriesToDB32() error {
migrateLog.Info("- updating registries") log.Info().Msg("updating registries")
registries, err := m.registryService.Registries() registries, err := m.registryService.Registries()
if err != nil { if err != nil {
return err return err
@ -82,7 +83,8 @@ func (m *Migrator) updateRegistriesToDB32() error {
} }
func (m *Migrator) updateDockerhubToDB32() error { func (m *Migrator) updateDockerhubToDB32() error {
migrateLog.Info("- updating dockerhub") log.Info().Msg("updating dockerhub")
dockerhub, err := m.dockerhubService.DockerHub() dockerhub, err := m.dockerhubService.DockerHub()
if err == errors.ErrObjectNotFound { if err == errors.ErrObjectNotFound {
return nil return nil
@ -171,7 +173,8 @@ func (m *Migrator) updateDockerhubToDB32() error {
} }
func (m *Migrator) updateVolumeResourceControlToDB32() error { func (m *Migrator) updateVolumeResourceControlToDB32() error {
migrateLog.Info("- updating resource controls") log.Info().Msg("updating resource controls")
endpoints, err := m.endpointService.Endpoints() endpoints, err := m.endpointService.Endpoints()
if err != nil { if err != nil {
return fmt.Errorf("failed fetching environments: %w", err) return fmt.Errorf("failed fetching environments: %w", err)
@ -199,7 +202,7 @@ func (m *Migrator) updateVolumeResourceControlToDB32() error {
totalSnapshots := len(endpoint.Snapshots) totalSnapshots := len(endpoint.Snapshots)
if totalSnapshots == 0 { if totalSnapshots == 0 {
log.Println("[DEBUG] [volume migration] [message: no snapshot found]") log.Debug().Msg("no snapshot found")
continue continue
} }
@ -207,13 +210,13 @@ func (m *Migrator) updateVolumeResourceControlToDB32() error {
endpointDockerID, err := snapshotutils.FetchDockerID(snapshot) endpointDockerID, err := snapshotutils.FetchDockerID(snapshot)
if err != nil { if err != nil {
log.Printf("[WARN] [database,migrator,v31] [message: failed fetching environment docker id] [err: %s]", err) log.Warn().Err(err).Msg("failed fetching environment docker id")
continue continue
} }
volumesData := snapshot.SnapshotRaw.Volumes volumesData := snapshot.SnapshotRaw.Volumes
if volumesData.Volumes == nil { if volumesData.Volumes == nil {
log.Println("[DEBUG] [volume migration] [message: no volume data found]") log.Debug().Msg("no volume data found")
continue continue
} }
@ -224,17 +227,18 @@ func (m *Migrator) updateVolumeResourceControlToDB32() error {
for _, resourceControl := range volumeResourceControls { for _, resourceControl := range volumeResourceControls {
if newResourceID, ok := toUpdate[resourceControl.ID]; ok { if newResourceID, ok := toUpdate[resourceControl.ID]; ok {
resourceControl.ResourceID = newResourceID resourceControl.ResourceID = newResourceID
err := m.resourceControlService.UpdateResourceControl(resourceControl.ID, resourceControl) err := m.resourceControlService.UpdateResourceControl(resourceControl.ID, resourceControl)
if err != nil { if err != nil {
return fmt.Errorf("failed updating resource control %d: %w", resourceControl.ID, err) return fmt.Errorf("failed updating resource control %d: %w", resourceControl.ID, err)
} }
} else { } else {
err := m.resourceControlService.DeleteResourceControl(resourceControl.ID) err := m.resourceControlService.DeleteResourceControl(resourceControl.ID)
if err != nil { if err != nil {
return fmt.Errorf("failed deleting resource control %d: %w", resourceControl.ID, err) return fmt.Errorf("failed deleting resource control %d: %w", resourceControl.ID, err)
} }
log.Printf("[DEBUG] [volume migration] [message: legacy resource control(%s) has been deleted]", resourceControl.ResourceID)
log.Debug().Str("resource_id", resourceControl.ResourceID).Msg("legacy resource control has been deleted")
} }
} }
@ -257,21 +261,25 @@ func findResourcesToUpdateForDB32(dockerID string, volumesData volume.VolumeList
} }
func (m *Migrator) kubeconfigExpiryToDB32() error { func (m *Migrator) kubeconfigExpiryToDB32() error {
migrateLog.Info("- updating kubeconfig expiry") log.Info().Msg("updating kubeconfig expiry")
settings, err := m.settingsService.Settings() settings, err := m.settingsService.Settings()
if err != nil { if err != nil {
return err return err
} }
settings.KubeconfigExpiry = portainer.DefaultKubeconfigExpiry settings.KubeconfigExpiry = portainer.DefaultKubeconfigExpiry
return m.settingsService.UpdateSettings(settings) return m.settingsService.UpdateSettings(settings)
} }
func (m *Migrator) helmRepositoryURLToDB32() error { func (m *Migrator) helmRepositoryURLToDB32() error {
migrateLog.Info("- setting default helm repository URL") log.Info().Msg("setting default helm repository URL")
settings, err := m.settingsService.Settings() settings, err := m.settingsService.Settings()
if err != nil { if err != nil {
return err return err
} }
settings.HelmRepositoryURL = portainer.DefaultHelmRepositoryURL settings.HelmRepositoryURL = portainer.DefaultHelmRepositoryURL
return m.settingsService.UpdateSettings(settings) return m.settingsService.UpdateSettings(settings)
} }

View file

@ -2,15 +2,14 @@ package migrator
import ( import (
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/rs/zerolog/log"
) )
func (m *Migrator) migrateDBVersionToDB33() error { func (m *Migrator) migrateDBVersionToDB33() error {
migrateLog.Info("- updating settings") log.Info().Msg("updating settings")
if err := m.migrateSettingsToDB33(); err != nil {
return err
}
return nil return m.migrateSettingsToDB33()
} }
func (m *Migrator) migrateSettingsToDB33() error { func (m *Migrator) migrateSettingsToDB33() error {
@ -19,7 +18,8 @@ func (m *Migrator) migrateSettingsToDB33() error {
return err return err
} }
migrateLog.Info("- setting default kubectl shell image") log.Info().Msg("setting default kubectl shell image")
settings.KubectlShellImage = portainer.DefaultKubectlShellImage settings.KubectlShellImage = portainer.DefaultKubectlShellImage
return m.settingsService.UpdateSettings(settings) return m.settingsService.UpdateSettings(settings)
} }

View file

@ -2,16 +2,14 @@ package migrator
import ( import (
"github.com/portainer/portainer/api/dataservices" "github.com/portainer/portainer/api/dataservices"
"github.com/rs/zerolog/log"
) )
func (m *Migrator) migrateDBVersionToDB34() error { func (m *Migrator) migrateDBVersionToDB34() error {
migrateLog.Info("- updating stacks") log.Info().Msg("updating stacks")
err := MigrateStackEntryPoint(m.stackService)
if err != nil {
return err
}
return nil return MigrateStackEntryPoint(m.stackService)
} }
// MigrateStackEntryPoint exported for testing (blah.) // MigrateStackEntryPoint exported for testing (blah.)
@ -20,15 +18,18 @@ func MigrateStackEntryPoint(stackService dataservices.StackService) error {
if err != nil { if err != nil {
return err return err
} }
for i := range stacks { for i := range stacks {
stack := &stacks[i] stack := &stacks[i]
if stack.GitConfig == nil { if stack.GitConfig == nil {
continue continue
} }
stack.GitConfig.ConfigFilePath = stack.EntryPoint stack.GitConfig.ConfigFilePath = stack.EntryPoint
if err := stackService.UpdateStack(stack.ID, stack); err != nil { if err := stackService.UpdateStack(stack.ID, stack); err != nil {
return err return err
} }
} }
return nil return nil
} }

View file

@ -1,12 +1,12 @@
package migrator package migrator
import "github.com/rs/zerolog/log"
func (m *Migrator) migrateDBVersionToDB35() error { func (m *Migrator) migrateDBVersionToDB35() error {
// These should have been migrated already, but due to an earlier bug and a bunch of duplicates, // These should have been migrated already, but due to an earlier bug and a bunch of duplicates,
// calling it again will now fix the issue as the function has been repaired. // calling it again will now fix the issue as the function has been repaired.
migrateLog.Info("- updating dockerhub registries")
err := m.updateDockerhubToDB32() log.Info().Msg("updating dockerhub registries")
if err != nil {
return err return m.updateDockerhubToDB32()
}
return nil
} }

View file

@ -3,15 +3,14 @@ package migrator
import ( import (
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/internal/authorization" "github.com/portainer/portainer/api/internal/authorization"
"github.com/rs/zerolog/log"
) )
func (m *Migrator) migrateDBVersionToDB36() error { func (m *Migrator) migrateDBVersionToDB36() error {
migrateLog.Info("Updating user authorizations") log.Info().Msg("updating user authorizations")
if err := m.migrateUsersToDB36(); err != nil {
return err
}
return nil return m.migrateUsersToDB36()
} }
func (m *Migrator) migrateUsersToDB36() error { func (m *Migrator) migrateUsersToDB36() error {

View file

@ -1,17 +1,18 @@
package migrator package migrator
import "github.com/portainer/portainer/api/internal/endpointutils" import (
"github.com/portainer/portainer/api/internal/endpointutils"
"github.com/rs/zerolog/log"
)
func (m *Migrator) migrateDBVersionToDB40() error { func (m *Migrator) migrateDBVersionToDB40() error {
if err := m.trustCurrentEdgeEndpointsDB40(); err != nil { return m.trustCurrentEdgeEndpointsDB40()
return err
}
return nil
} }
func (m *Migrator) trustCurrentEdgeEndpointsDB40() error { func (m *Migrator) trustCurrentEdgeEndpointsDB40() error {
migrateLog.Info("- trusting current edge endpoints") log.Info().Msg("trusting current edge endpoints")
endpoints, err := m.endpointService.Endpoints() endpoints, err := m.endpointService.Endpoints()
if err != nil { if err != nil {
return err return err

View file

@ -2,6 +2,7 @@ package migrator
import ( import (
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/rs/zerolog/log"
) )
func (m *Migrator) migrateDBVersionToDB50() error { func (m *Migrator) migrateDBVersionToDB50() error {
@ -9,7 +10,8 @@ func (m *Migrator) migrateDBVersionToDB50() error {
} }
func (m *Migrator) migratePasswordLengthSettings() error { func (m *Migrator) migratePasswordLengthSettings() error {
migrateLog.Info("Updating required password length") log.Info().Msg("updating required password length")
s, err := m.settingsService.Settings() s, err := m.settingsService.Settings()
if err != nil { if err != nil {
return errors.Wrap(err, "unable to retrieve settings") return errors.Wrap(err, "unable to retrieve settings")

View file

@ -1,17 +1,18 @@
package migrator package migrator
import portainer "github.com/portainer/portainer/api" import (
portainer "github.com/portainer/portainer/api"
"github.com/rs/zerolog/log"
)
func (m *Migrator) migrateDBVersionToDB60() error { func (m *Migrator) migrateDBVersionToDB60() error {
if err := m.addGpuInputFieldDB60(); err != nil { return m.addGpuInputFieldDB60()
return err
}
return nil
} }
func (m *Migrator) addGpuInputFieldDB60() error { func (m *Migrator) addGpuInputFieldDB60() error {
migrateLog.Info("- add gpu input field") log.Info().Msg("add gpu input field")
endpoints, err := m.endpointService.Endpoints() endpoints, err := m.endpointService.Endpoints()
if err != nil { if err != nil {
return err return err

View file

@ -18,12 +18,9 @@ import (
"github.com/portainer/portainer/api/dataservices/teammembership" "github.com/portainer/portainer/api/dataservices/teammembership"
"github.com/portainer/portainer/api/dataservices/user" "github.com/portainer/portainer/api/dataservices/user"
"github.com/portainer/portainer/api/dataservices/version" "github.com/portainer/portainer/api/dataservices/version"
plog "github.com/portainer/portainer/api/datastore/log"
"github.com/portainer/portainer/api/internal/authorization" "github.com/portainer/portainer/api/internal/authorization"
) )
var migrateLog = plog.NewScopedLog("database, migrate")
type ( type (
// Migrator defines a service to migrate data after a Portainer version update. // Migrator defines a service to migrate data after a Portainer version update.
Migrator struct { Migrator struct {

View file

@ -2,6 +2,7 @@ package datastore
import ( import (
"encoding/json" "encoding/json"
"fmt"
"io/ioutil" "io/ioutil"
"strconv" "strconv"
@ -34,7 +35,8 @@ import (
"github.com/portainer/portainer/api/dataservices/user" "github.com/portainer/portainer/api/dataservices/user"
"github.com/portainer/portainer/api/dataservices/version" "github.com/portainer/portainer/api/dataservices/version"
"github.com/portainer/portainer/api/dataservices/webhook" "github.com/portainer/portainer/api/dataservices/webhook"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
// Store defines the implementation of portainer.DataStore using // Store defines the implementation of portainer.DataStore using
@ -391,7 +393,7 @@ func (store *Store) Export(filename string) (err error) {
if c, err := store.CustomTemplate().CustomTemplates(); err != nil { if c, err := store.CustomTemplate().CustomTemplates(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Custom Templates") log.Error().Err(err).Msg("exporting Custom Templates")
} }
} else { } else {
backup.CustomTemplate = c backup.CustomTemplate = c
@ -399,7 +401,7 @@ func (store *Store) Export(filename string) (err error) {
if e, err := store.EdgeGroup().EdgeGroups(); err != nil { if e, err := store.EdgeGroup().EdgeGroups(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Edge Groups") log.Error().Err(err).Msg("exporting Edge Groups")
} }
} else { } else {
backup.EdgeGroup = e backup.EdgeGroup = e
@ -407,7 +409,7 @@ func (store *Store) Export(filename string) (err error) {
if e, err := store.EdgeJob().EdgeJobs(); err != nil { if e, err := store.EdgeJob().EdgeJobs(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Edge Jobs") log.Error().Err(err).Msg("exporting Edge Jobs")
} }
} else { } else {
backup.EdgeJob = e backup.EdgeJob = e
@ -415,7 +417,7 @@ func (store *Store) Export(filename string) (err error) {
if e, err := store.EdgeStack().EdgeStacks(); err != nil { if e, err := store.EdgeStack().EdgeStacks(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Edge Stacks") log.Error().Err(err).Msg("exporting Edge Stacks")
} }
} else { } else {
backup.EdgeStack = e backup.EdgeStack = e
@ -423,7 +425,7 @@ func (store *Store) Export(filename string) (err error) {
if e, err := store.Endpoint().Endpoints(); err != nil { if e, err := store.Endpoint().Endpoints(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Endpoints") log.Error().Err(err).Msg("exporting Endpoints")
} }
} else { } else {
backup.Endpoint = e backup.Endpoint = e
@ -431,7 +433,7 @@ func (store *Store) Export(filename string) (err error) {
if e, err := store.EndpointGroup().EndpointGroups(); err != nil { if e, err := store.EndpointGroup().EndpointGroups(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Endpoint Groups") log.Error().Err(err).Msg("exporting Endpoint Groups")
} }
} else { } else {
backup.EndpointGroup = e backup.EndpointGroup = e
@ -439,7 +441,7 @@ func (store *Store) Export(filename string) (err error) {
if r, err := store.EndpointRelation().EndpointRelations(); err != nil { if r, err := store.EndpointRelation().EndpointRelations(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Endpoint Relations") log.Error().Err(err).Msg("exporting Endpoint Relations")
} }
} else { } else {
backup.EndpointRelation = r backup.EndpointRelation = r
@ -447,7 +449,7 @@ func (store *Store) Export(filename string) (err error) {
if r, err := store.ExtensionService.Extensions(); err != nil { if r, err := store.ExtensionService.Extensions(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Extensions") log.Error().Err(err).Msg("exporting Extensions")
} }
} else { } else {
backup.Extensions = r backup.Extensions = r
@ -455,7 +457,7 @@ func (store *Store) Export(filename string) (err error) {
if r, err := store.HelmUserRepository().HelmUserRepositories(); err != nil { if r, err := store.HelmUserRepository().HelmUserRepositories(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Helm User Repositories") log.Error().Err(err).Msg("exporting Helm User Repositories")
} }
} else { } else {
backup.HelmUserRepository = r backup.HelmUserRepository = r
@ -463,7 +465,7 @@ func (store *Store) Export(filename string) (err error) {
if r, err := store.Registry().Registries(); err != nil { if r, err := store.Registry().Registries(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Registries") log.Error().Err(err).Msg("exporting Registries")
} }
} else { } else {
backup.Registry = r backup.Registry = r
@ -471,7 +473,7 @@ func (store *Store) Export(filename string) (err error) {
if c, err := store.ResourceControl().ResourceControls(); err != nil { if c, err := store.ResourceControl().ResourceControls(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Resource Controls") log.Error().Err(err).Msg("exporting Resource Controls")
} }
} else { } else {
backup.ResourceControl = c backup.ResourceControl = c
@ -479,7 +481,7 @@ func (store *Store) Export(filename string) (err error) {
if role, err := store.Role().Roles(); err != nil { if role, err := store.Role().Roles(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Roles") log.Error().Err(err).Msg("exporting Roles")
} }
} else { } else {
backup.Role = role backup.Role = role
@ -487,7 +489,7 @@ func (store *Store) Export(filename string) (err error) {
if r, err := store.ScheduleService.Schedules(); err != nil { if r, err := store.ScheduleService.Schedules(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Schedules") log.Error().Err(err).Msg("exporting Schedules")
} }
} else { } else {
backup.Schedules = r backup.Schedules = r
@ -495,7 +497,7 @@ func (store *Store) Export(filename string) (err error) {
if settings, err := store.Settings().Settings(); err != nil { if settings, err := store.Settings().Settings(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Settings") log.Error().Err(err).Msg("exporting Settings")
} }
} else { } else {
backup.Settings = *settings backup.Settings = *settings
@ -503,7 +505,7 @@ func (store *Store) Export(filename string) (err error) {
if settings, err := store.SSLSettings().Settings(); err != nil { if settings, err := store.SSLSettings().Settings(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting SSL Settings") log.Error().Err(err).Msg("exporting SSL Settings")
} }
} else { } else {
backup.SSLSettings = *settings backup.SSLSettings = *settings
@ -511,7 +513,7 @@ func (store *Store) Export(filename string) (err error) {
if t, err := store.Stack().Stacks(); err != nil { if t, err := store.Stack().Stacks(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Stacks") log.Error().Err(err).Msg("exporting Stacks")
} }
} else { } else {
backup.Stack = t backup.Stack = t
@ -519,7 +521,7 @@ func (store *Store) Export(filename string) (err error) {
if t, err := store.Tag().Tags(); err != nil { if t, err := store.Tag().Tags(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Tags") log.Error().Err(err).Msg("exporting Tags")
} }
} else { } else {
backup.Tag = t backup.Tag = t
@ -527,7 +529,7 @@ func (store *Store) Export(filename string) (err error) {
if t, err := store.TeamMembership().TeamMemberships(); err != nil { if t, err := store.TeamMembership().TeamMemberships(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Team Memberships") log.Error().Err(err).Msg("exporting Team Memberships")
} }
} else { } else {
backup.TeamMembership = t backup.TeamMembership = t
@ -535,7 +537,7 @@ func (store *Store) Export(filename string) (err error) {
if t, err := store.Team().Teams(); err != nil { if t, err := store.Team().Teams(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Teams") log.Error().Err(err).Msg("exporting Teams")
} }
} else { } else {
backup.Team = t backup.Team = t
@ -543,7 +545,7 @@ func (store *Store) Export(filename string) (err error) {
if info, err := store.TunnelServer().Info(); err != nil { if info, err := store.TunnelServer().Info(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Tunnel Server") log.Error().Err(err).Msg("exporting Tunnel Server")
} }
} else { } else {
backup.TunnelServer = *info backup.TunnelServer = *info
@ -551,7 +553,7 @@ func (store *Store) Export(filename string) (err error) {
if users, err := store.User().Users(); err != nil { if users, err := store.User().Users(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Users") log.Error().Err(err).Msg("exporting Users")
} }
} else { } else {
backup.User = users backup.User = users
@ -559,7 +561,7 @@ func (store *Store) Export(filename string) (err error) {
if webhooks, err := store.Webhook().Webhooks(); err != nil { if webhooks, err := store.Webhook().Webhooks(); err != nil {
if !store.IsErrObjectNotFound(err) { if !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting Webhooks") log.Error().Err(err).Msg("exporting Webhooks")
} }
} else { } else {
backup.Webhook = webhooks backup.Webhook = webhooks
@ -567,7 +569,7 @@ func (store *Store) Export(filename string) (err error) {
v, err := store.Version().DBVersion() v, err := store.Version().DBVersion()
if err != nil && !store.IsErrObjectNotFound(err) { if err != nil && !store.IsErrObjectNotFound(err) {
logrus.WithError(err).Errorf("Exporting DB version") log.Error().Err(err).Msg("exporting DB version")
} }
instance, _ := store.Version().InstanceID() instance, _ := store.Version().InstanceID()
backup.Version = map[string]string{ backup.Version = map[string]string{
@ -577,7 +579,7 @@ func (store *Store) Export(filename string) (err error) {
backup.Metadata, err = store.connection.BackupMetadata() backup.Metadata, err = store.connection.BackupMetadata()
if err != nil { if err != nil {
logrus.WithError(err).Errorf("Exporting Metadata") log.Error().Err(err).Msg("exporting Metadata")
} }
b, err := json.MarshalIndent(backup, "", " ") b, err := json.MarshalIndent(backup, "", " ")
@ -588,7 +590,6 @@ func (store *Store) Export(filename string) (err error) {
} }
func (store *Store) Import(filename string) (err error) { func (store *Store) Import(filename string) (err error) {
backup := storeExport{} backup := storeExport{}
s, err := ioutil.ReadFile(filename) s, err := ioutil.ReadFile(filename)
@ -604,13 +605,13 @@ func (store *Store) Import(filename string) (err error) {
if dbversion, ok := backup.Version["DB_VERSION"]; ok { if dbversion, ok := backup.Version["DB_VERSION"]; ok {
if v, err := strconv.Atoi(dbversion); err == nil { if v, err := strconv.Atoi(dbversion); err == nil {
if err := store.Version().StoreDBVersion(v); err != nil { if err := store.Version().StoreDBVersion(v); err != nil {
logrus.WithError(err).Errorf("DB_VERSION import issue") log.Error().Err(err).Msg("DB_VERSION import issue")
} }
} }
} }
if instanceID, ok := backup.Version["INSTANCE_ID"]; ok { if instanceID, ok := backup.Version["INSTANCE_ID"]; ok {
if err := store.Version().StoreInstanceID(instanceID); err != nil { if err := store.Version().StoreInstanceID(instanceID); err != nil {
logrus.WithError(err).Errorf("INSTANCE_ID import issue") log.Error().Err(err).Msg("INSTANCE_ID import issue")
} }
} }
@ -681,7 +682,7 @@ func (store *Store) Import(filename string) (err error) {
for _, user := range backup.User { for _, user := range backup.User {
if err := store.User().UpdateUser(user.ID, &user); err != nil { if err := store.User().UpdateUser(user.ID, &user); err != nil {
logrus.WithField("user", user).WithError(err).Errorf("User: Failed to Update Database") log.Debug().Str("user", fmt.Sprintf("%+v", user)).Err(err).Msg("user: failed to Update Database")
} }
} }

View file

@ -1,14 +1,14 @@
package datastore package datastore
import ( import (
"log"
"testing" "testing"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/database" "github.com/portainer/portainer/api/database"
"github.com/portainer/portainer/api/filesystem"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/portainer/portainer/api/filesystem" "github.com/rs/zerolog/log"
) )
var errTempDir = errors.New("can't create a temp dir") var errTempDir = errors.New("can't create a temp dir")
@ -23,7 +23,8 @@ func MustNewTestStore(t *testing.T, init, secure bool) (bool, *Store, func()) {
if !errors.Is(err, errTempDir) { if !errors.Is(err, errTempDir) {
teardown() teardown()
} }
log.Fatal(err)
log.Fatal().Err(err).Msg("")
} }
return newStore, store, teardown return newStore, store, teardown
@ -46,12 +47,15 @@ func NewTestStore(t *testing.T, init, secure bool) (bool, *Store, func(), error)
if err != nil { if err != nil {
panic(err) panic(err)
} }
store := NewStore(storePath, fileService, connection) store := NewStore(storePath, fileService, connection)
newStore, err := store.Open() newStore, err := store.Open()
if err != nil { if err != nil {
return newStore, nil, nil, err return newStore, nil, nil, err
} }
log.Debug().Msg("opened")
if init { if init {
err = store.Init() err = store.Init()
if err != nil { if err != nil {
@ -59,6 +63,8 @@ func NewTestStore(t *testing.T, init, secure bool) (bool, *Store, func(), error)
} }
} }
log.Debug().Msg("initialised")
if newStore { if newStore {
// from MigrateData // from MigrateData
store.VersionService.StoreDBVersion(portainer.DBVersion) store.VersionService.StoreDBVersion(portainer.DBVersion)
@ -77,6 +83,6 @@ func NewTestStore(t *testing.T, init, secure bool) (bool, *Store, func(), error)
func teardown(store *Store) { func teardown(store *Store) {
err := store.Close() err := store.Close()
if err != nil { if err != nil {
log.Fatalln(err) log.Fatal().Err(err).Msg("")
} }
} }

View file

@ -1,11 +1,11 @@
package demo package demo
import ( import (
"log"
"github.com/pkg/errors"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices" "github.com/portainer/portainer/api/dataservices"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
) )
type EnvironmentDetails struct { type EnvironmentDetails struct {
@ -27,7 +27,7 @@ func (service *Service) Details() EnvironmentDetails {
} }
func (service *Service) Init(store dataservices.DataStore, cryptoService portainer.CryptoService) error { func (service *Service) Init(store dataservices.DataStore, cryptoService portainer.CryptoService) error {
log.Print("[INFO] [main] Starting demo environment") log.Info().Msg("starting demo environment")
isClean, err := isCleanStore(store) isClean, err := isCleanStore(store)
if err != nil { if err != nil {

View file

@ -2,15 +2,16 @@ package docker
import ( import (
"context" "context"
"log"
"strings" "strings"
"time" "time"
portainer "github.com/portainer/portainer/api"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
_container "github.com/docker/docker/api/types/container" _container "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/filters"
"github.com/docker/docker/client" "github.com/docker/docker/client"
portainer "github.com/portainer/portainer/api" "github.com/rs/zerolog/log"
) )
// Snapshotter represents a service used to create environment(endpoint) snapshots // Snapshotter represents a service used to create environment(endpoint) snapshots
@ -48,44 +49,44 @@ func snapshot(cli *client.Client, endpoint *portainer.Endpoint) (*portainer.Dock
err = snapshotInfo(snapshot, cli) err = snapshotInfo(snapshot, cli)
if err != nil { if err != nil {
log.Printf("[WARN] [docker,snapshot] [message: unable to snapshot engine information] [environment: %s] [err: %s]", endpoint.Name, err) log.Warn().Str("environment", endpoint.Name).Err(err).Msg("unable to snapshot engine information")
} }
if snapshot.Swarm { if snapshot.Swarm {
err = snapshotSwarmServices(snapshot, cli) err = snapshotSwarmServices(snapshot, cli)
if err != nil { if err != nil {
log.Printf("[WARN] [docker,snapshot] [message: unable to snapshot Swarm services] [environment: %s] [err: %s]", endpoint.Name, err) log.Warn().Str("environment", endpoint.Name).Err(err).Msg("unable to snapshot Swarm services")
} }
err = snapshotNodes(snapshot, cli) err = snapshotNodes(snapshot, cli)
if err != nil { if err != nil {
log.Printf("[WARN] [docker,snapshot] [message: unable to snapshot Swarm nodes] [environment: %s] [err: %s]", endpoint.Name, err) log.Warn().Str("environment", endpoint.Name).Err(err).Msg("unable to snapshot Swarm nodes")
} }
} }
err = snapshotContainers(snapshot, cli) err = snapshotContainers(snapshot, cli)
if err != nil { if err != nil {
log.Printf("[WARN] [docker,snapshot] [message: unable to snapshot containers] [environment: %s] [err: %s]", endpoint.Name, err) log.Warn().Str("environment", endpoint.Name).Err(err).Msg("unable to snapshot containers")
} }
err = snapshotImages(snapshot, cli) err = snapshotImages(snapshot, cli)
if err != nil { if err != nil {
log.Printf("[WARN] [docker,snapshot] [message: unable to snapshot images] [environment: %s] [err: %s]", endpoint.Name, err) log.Warn().Str("environment", endpoint.Name).Err(err).Msg("unable to snapshot images")
} }
err = snapshotVolumes(snapshot, cli) err = snapshotVolumes(snapshot, cli)
if err != nil { if err != nil {
log.Printf("[WARN] [docker,snapshot] [message: unable to snapshot volumes] [environment: %s] [err: %s]", endpoint.Name, err) log.Warn().Str("environment", endpoint.Name).Err(err).Msg("unable to snapshot volumes")
} }
err = snapshotNetworks(snapshot, cli) err = snapshotNetworks(snapshot, cli)
if err != nil { if err != nil {
log.Printf("[WARN] [docker,snapshot] [message: unable to snapshot networks] [environment: %s] [err: %s]", endpoint.Name, err) log.Warn().Str("environment", endpoint.Name).Err(err).Msg("unable to snapshot networks")
} }
err = snapshotVersion(snapshot, cli) err = snapshotVersion(snapshot, cli)
if err != nil { if err != nil {
log.Printf("[WARN] [docker,snapshot] [message: unable to snapshot engine version] [environment: %s] [err: %s]", endpoint.Name, err) log.Warn().Str("environment", endpoint.Name).Err(err).Msg("unable to snapshot engine version")
} }
snapshot.Time = time.Now().Unix() snapshot.Time = time.Now().Unix()

View file

@ -3,7 +3,6 @@ package exec
import ( import (
"context" "context"
"fmt" "fmt"
"log"
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
@ -12,6 +11,8 @@ import (
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/internal/testhelpers" "github.com/portainer/portainer/api/internal/testhelpers"
"github.com/rs/zerolog/log"
) )
const composeFile = `version: "3.9" const composeFile = `version: "3.9"
@ -77,7 +78,7 @@ func containerExists(containerName string) bool {
out, err := cmd.Output() out, err := cmd.Output()
if err != nil { if err != nil {
log.Fatalf("failed to list containers: %s", err) log.Fatal().Err(err).Msg("failed to list containers")
} }
return strings.Contains(string(out), containerName) return strings.Contains(string(out), containerName)

View file

@ -6,10 +6,11 @@ import (
"path/filepath" "path/filepath"
"testing" "testing"
"github.com/portainer/portainer/api/archive"
"github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing/object" "github.com/go-git/go-git/v5/plumbing/object"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/portainer/portainer/api/archive"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )

View file

@ -35,7 +35,7 @@ require (
github.com/portainer/docker-compose-wrapper v0.0.0-20220708023447-a69a4ebaa021 github.com/portainer/docker-compose-wrapper v0.0.0-20220708023447-a69a4ebaa021
github.com/portainer/libcrypto v0.0.0-20220506221303-1f4fb3b30f9a github.com/portainer/libcrypto v0.0.0-20220506221303-1f4fb3b30f9a
github.com/portainer/libhelm v0.0.0-20210929000907-825e93d62108 github.com/portainer/libhelm v0.0.0-20210929000907-825e93d62108
github.com/portainer/libhttp v0.0.0-20211208103139-07a5f798eb3f github.com/portainer/libhttp v0.0.0-20220916153711-5d61e12f4b0a
github.com/rkl-/digest v0.0.0-20180419075440-8316caa4a777 github.com/rkl-/digest v0.0.0-20180419075440-8316caa4a777
github.com/robfig/cron/v3 v3.0.1 github.com/robfig/cron/v3 v3.0.1
github.com/sirupsen/logrus v1.8.1 github.com/sirupsen/logrus v1.8.1
@ -89,6 +89,8 @@ require (
github.com/jpillora/sizestr v1.0.0 // indirect github.com/jpillora/sizestr v1.0.0 // indirect
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
github.com/leodido/go-urn v1.2.1 // indirect github.com/leodido/go-urn v1.2.1 // indirect
github.com/mattn/go-colorable v0.1.12 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.1.2 // indirect github.com/mitchellh/mapstructure v1.1.2 // indirect
github.com/moby/spdystream v0.2.0 // indirect github.com/moby/spdystream v0.2.0 // indirect
@ -101,6 +103,7 @@ require (
github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.0.2 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rs/zerolog v1.28.0 // indirect
github.com/sergi/go-diff v1.1.0 // indirect github.com/sergi/go-diff v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce // indirect github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce // indirect

View file

@ -88,6 +88,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -167,6 +168,7 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl
github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig= github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig=
github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
@ -306,6 +308,10 @@ github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
@ -361,6 +367,8 @@ github.com/portainer/libhelm v0.0.0-20210929000907-825e93d62108 h1:5e8KAnDa2G3cE
github.com/portainer/libhelm v0.0.0-20210929000907-825e93d62108/go.mod h1:YvYAk7krKTzB+rFwDr0jQ3sQu2BtiXK1AR0sZH7nhJA= github.com/portainer/libhelm v0.0.0-20210929000907-825e93d62108/go.mod h1:YvYAk7krKTzB+rFwDr0jQ3sQu2BtiXK1AR0sZH7nhJA=
github.com/portainer/libhttp v0.0.0-20211208103139-07a5f798eb3f h1:GMIjRVV2LADpJprPG2+8MdRH6XvrFgC7wHm7dFUdOpc= github.com/portainer/libhttp v0.0.0-20211208103139-07a5f798eb3f h1:GMIjRVV2LADpJprPG2+8MdRH6XvrFgC7wHm7dFUdOpc=
github.com/portainer/libhttp v0.0.0-20211208103139-07a5f798eb3f/go.mod h1:nyQA6IahOruIvENCcBk54aaUvV2WHFdXkvBjIutg+SY= github.com/portainer/libhttp v0.0.0-20211208103139-07a5f798eb3f/go.mod h1:nyQA6IahOruIvENCcBk54aaUvV2WHFdXkvBjIutg+SY=
github.com/portainer/libhttp v0.0.0-20220916153711-5d61e12f4b0a h1:BJ5V4EDNhg3ImYbmXnGS8vrMhq6rzsEneIXyJh0g4dc=
github.com/portainer/libhttp v0.0.0-20220916153711-5d61e12f4b0a/go.mod h1:ckuHnoLA5kLuE5WkvPBXmrw63LUMdSH4aX71QRi9y10=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/rkl-/digest v0.0.0-20180419075440-8316caa4a777 h1:rDj3WeO+TiWyxfcydUnKegWAZoR5kQsnW0wzhggdOrw= github.com/rkl-/digest v0.0.0-20180419075440-8316caa4a777 h1:rDj3WeO+TiWyxfcydUnKegWAZoR5kQsnW0wzhggdOrw=
github.com/rkl-/digest v0.0.0-20180419075440-8316caa4a777/go.mod h1:xRVvTK+cS/dJSvrOufGUQFWfgvE7yXExeng96n8377o= github.com/rkl-/digest v0.0.0-20180419075440-8316caa4a777/go.mod h1:xRVvTK+cS/dJSvrOufGUQFWfgvE7yXExeng96n8377o=
@ -370,6 +378,9 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
@ -562,6 +573,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=

View file

@ -6,13 +6,14 @@ import (
"errors" "errors"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log"
"net/http" "net/http"
"net/url" "net/url"
"strings" "strings"
"time" "time"
"github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/rs/zerolog/log"
) )
var errInvalidResponseStatus = errors.New("Invalid response status (expecting 200)") var errInvalidResponseStatus = errors.New("Invalid response status (expecting 200)")
@ -90,7 +91,8 @@ func Get(url string, timeout int) ([]byte, error) {
defer response.Body.Close() defer response.Body.Close()
if response.StatusCode != http.StatusOK { if response.StatusCode != http.StatusOK {
log.Printf("[ERROR] [http,client] [message: unexpected status code] [status_code: %d]", response.StatusCode) log.Error().Int("status_code", response.StatusCode).Msg("unexpected status code")
return nil, errInvalidResponseStatus return nil, errInvalidResponseStatus
} }

View file

@ -2,17 +2,18 @@ package auth
import ( import (
"errors" "errors"
"log"
"net/http" "net/http"
"strings" "strings"
"github.com/asaskevich/govalidator"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response" "github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
httperrors "github.com/portainer/portainer/api/http/errors" httperrors "github.com/portainer/portainer/api/http/errors"
"github.com/portainer/portainer/api/internal/authorization" "github.com/portainer/portainer/api/internal/authorization"
"github.com/asaskevich/govalidator"
"github.com/rs/zerolog/log"
) )
type authenticatePayload struct { type authenticatePayload struct {
@ -31,9 +32,11 @@ func (payload *authenticatePayload) Validate(r *http.Request) error {
if govalidator.IsNull(payload.Username) { if govalidator.IsNull(payload.Username) {
return errors.New("Invalid username") return errors.New("Invalid username")
} }
if govalidator.IsNull(payload.Password) { if govalidator.IsNull(payload.Password) {
return errors.New("Invalid password") return errors.New("Invalid password")
} }
return nil return nil
} }
@ -101,6 +104,7 @@ func (handler *Handler) authenticateInternal(w http.ResponseWriter, user *portai
} }
forceChangePassword := !handler.passwordStrengthChecker.Check(password) forceChangePassword := !handler.passwordStrengthChecker.Check(password)
return handler.writeToken(w, user, forceChangePassword) return handler.writeToken(w, user, forceChangePassword)
} }
@ -125,7 +129,7 @@ func (handler *Handler) authenticateLDAP(w http.ResponseWriter, user *portainer.
err = handler.addUserIntoTeams(user, ldapSettings) err = handler.addUserIntoTeams(user, ldapSettings)
if err != nil { if err != nil {
log.Printf("Warning: unable to automatically add user into teams: %s\n", err.Error()) log.Warn().Err(err).Msg("unable to automatically add user into teams")
} }
return handler.writeToken(w, user, false) return handler.writeToken(w, user, false)
@ -191,6 +195,7 @@ func teamExists(teamName string, ldapGroups []string) bool {
return true return true
} }
} }
return false return false
} }
@ -200,6 +205,7 @@ func teamMembershipExists(teamID portainer.TeamID, memberships []portainer.TeamM
return true return true
} }
} }
return false return false
} }

View file

@ -2,14 +2,15 @@ package auth
import ( import (
"errors" "errors"
"log"
"net/http" "net/http"
"github.com/asaskevich/govalidator"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
httperrors "github.com/portainer/portainer/api/http/errors" httperrors "github.com/portainer/portainer/api/http/errors"
"github.com/asaskevich/govalidator"
"github.com/rs/zerolog/log"
) )
type oauthPayload struct { type oauthPayload struct {
@ -71,7 +72,8 @@ func (handler *Handler) validateOAuth(w http.ResponseWriter, r *http.Request) *h
username, err := handler.authenticateOAuth(payload.Code, &settings.OAuthSettings) username, err := handler.authenticateOAuth(payload.Code, &settings.OAuthSettings)
if err != nil { if err != nil {
log.Printf("[DEBUG] - OAuth authentication error: %s", err) log.Debug().Err(err).Msg("OAuth authentication error")
return httperror.InternalServerError("Unable to authenticate through OAuth", httperrors.ErrUnauthorized) return httperror.InternalServerError("Unable to authenticate through OAuth", httperrors.ErrUnauthorized)
} }

View file

@ -3,13 +3,11 @@ package customtemplates
import ( import (
"encoding/json" "encoding/json"
"errors" "errors"
"log"
"net/http" "net/http"
"os" "os"
"regexp" "regexp"
"strconv" "strconv"
"github.com/asaskevich/govalidator"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response" "github.com/portainer/libhttp/response"
@ -17,6 +15,9 @@ import (
"github.com/portainer/portainer/api/filesystem" "github.com/portainer/portainer/api/filesystem"
"github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/http/security"
"github.com/portainer/portainer/api/internal/authorization" "github.com/portainer/portainer/api/internal/authorization"
"github.com/asaskevich/govalidator"
"github.com/rs/zerolog/log"
) )
// @id CustomTemplateCreate // @id CustomTemplateCreate
@ -291,16 +292,18 @@ func (handler *Handler) createCustomTemplateFromGitRepository(r *http.Request) (
if err != nil { if err != nil {
return nil, err return nil, err
} }
isValidProject := true isValidProject := true
defer func() { defer func() {
if !isValidProject { if !isValidProject {
if err := handler.FileService.RemoveDirectory(projectPath); err != nil { if err := handler.FileService.RemoveDirectory(projectPath); err != nil {
log.Printf("[WARN] [http,customtemplate,git] [error: %s] [message: unable to remove git repository directory]", err) log.Warn().Err(err).Msg("unable to remove git repository directory")
} }
} }
}() }()
entryPath := filesystem.JoinPaths(projectPath, customTemplate.EntryPoint) entryPath := filesystem.JoinPaths(projectPath, customTemplate.EntryPoint)
exists, err := handler.FileService.FileExists(entryPath) exists, err := handler.FileService.FileExists(entryPath)
if err != nil || !exists { if err != nil || !exists {
isValidProject = false isValidProject = false

View file

@ -1,13 +1,14 @@
package endpoints package endpoints
import ( import (
"log"
"net/http" "net/http"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/response" "github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/internal/snapshot" "github.com/portainer/portainer/api/internal/snapshot"
"github.com/rs/zerolog/log"
) )
// @id EndpointSnapshots // @id EndpointSnapshots
@ -35,13 +36,23 @@ func (handler *Handler) endpointSnapshots(w http.ResponseWriter, r *http.Request
latestEndpointReference, err := handler.DataStore.Endpoint().Endpoint(endpoint.ID) latestEndpointReference, err := handler.DataStore.Endpoint().Endpoint(endpoint.ID)
if latestEndpointReference == nil { if latestEndpointReference == nil {
log.Printf("background schedule error (environment snapshot). Environment not found inside the database anymore (endpoint=%s, URL=%s) (err=%s)\n", endpoint.Name, endpoint.URL, err) log.Debug().
Str("endpoint", endpoint.Name).
Str("URL", endpoint.URL).
Err(err).
Msg("background schedule error (environment snapshot), environment not found inside the database anymore")
continue continue
} }
endpoint.Status = portainer.EndpointStatusUp endpoint.Status = portainer.EndpointStatusUp
if snapshotError != nil { if snapshotError != nil {
log.Printf("background schedule error (environment snapshot). Unable to create snapshot (endpoint=%s, URL=%s) (err=%s)\n", endpoint.Name, endpoint.URL, snapshotError) log.Debug().
Str("endpoint", endpoint.Name).
Str("URL", endpoint.URL).
Err(snapshotError).
Msg("background schedule error (environment snapshot), unable to create snapshot")
endpoint.Status = portainer.EndpointStatusDown endpoint.Status = portainer.EndpointStatusDown
} }

View file

@ -2,7 +2,6 @@ package helm
import ( import (
"fmt" "fmt"
"log"
"net/http" "net/http"
"net/url" "net/url"
@ -10,6 +9,8 @@ import (
"github.com/portainer/libhelm/options" "github.com/portainer/libhelm/options"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
"github.com/rs/zerolog/log"
) )
// @id HelmShow // @id HelmShow
@ -47,7 +48,7 @@ func (handler *Handler) helmShow(w http.ResponseWriter, r *http.Request) *httper
cmd, err := request.RetrieveRouteVariableValue(r, "command") cmd, err := request.RetrieveRouteVariableValue(r, "command")
if err != nil { if err != nil {
cmd = "all" cmd = "all"
log.Printf("[DEBUG] [internal,helm] [message: command not provided, defaulting to %s]", cmd) log.Debug().Str("default_command", cmd).Msg("command not provided, using default")
} }
showOptions := options.ShowOptions{ showOptions := options.ShowOptions{

View file

@ -7,13 +7,13 @@ import (
"net/url" "net/url"
"strings" "strings"
"github.com/fxamacker/cbor/v2"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response" "github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/fxamacker/cbor/v2"
"github.com/rs/zerolog/log"
) )
const ( const (
@ -63,7 +63,8 @@ func (payload *deviceConfigurePayload) Validate(r *http.Request) error {
func (handler *Handler) fdoConfigureDevice(w http.ResponseWriter, r *http.Request) *httperror.HandlerError { func (handler *Handler) fdoConfigureDevice(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
guid, err := request.RetrieveRouteVariableValue(r, "guid") guid, err := request.RetrieveRouteVariableValue(r, "guid")
if err != nil { if err != nil {
logrus.WithError(err).Info("fdoConfigureDevice: request.RetrieveRouteVariableValue()") log.Error().Err(err).Msg("fdoConfigureDevice: request.RetrieveRouteVariableValue()")
return httperror.InternalServerError("fdoConfigureDevice: guid not found", err) return httperror.InternalServerError("fdoConfigureDevice: guid not found", err)
} }
@ -71,7 +72,8 @@ func (handler *Handler) fdoConfigureDevice(w http.ResponseWriter, r *http.Reques
err = request.DecodeAndValidateJSONPayload(r, &payload) err = request.DecodeAndValidateJSONPayload(r, &payload)
if err != nil { if err != nil {
logrus.WithError(err).Error("Invalid request payload") log.Error().Err(err).Msg("invalid request payload")
return httperror.BadRequest("Invalid request payload", err) return httperror.BadRequest("Invalid request payload", err)
} }
@ -84,13 +86,15 @@ func (handler *Handler) fdoConfigureDevice(w http.ResponseWriter, r *http.Reques
fileContent, err := handler.FileService.GetFileContent(profile.FilePath, "") fileContent, err := handler.FileService.GetFileContent(profile.FilePath, "")
if err != nil { if err != nil {
logrus.WithError(err).Info("fdoConfigureDevice: GetFileContent") log.Error().Err(err).Msg("fdoConfigureDevice: GetFileContent")
return httperror.InternalServerError("fdoConfigureDevice: GetFileContent", err) return httperror.InternalServerError("fdoConfigureDevice: GetFileContent", err)
} }
fdoClient, err := handler.newFDOClient() fdoClient, err := handler.newFDOClient()
if err != nil { if err != nil {
logrus.WithError(err).Info("fdoConfigureDevice: newFDOClient()") log.Error().Err(err).Msg("fdoConfigureDevice: newFDOClient()")
return httperror.InternalServerError("fdoConfigureDevice: newFDOClient()", err) return httperror.InternalServerError("fdoConfigureDevice: newFDOClient()", err)
} }
@ -102,7 +106,8 @@ func (handler *Handler) fdoConfigureDevice(w http.ResponseWriter, r *http.Reques
"var": []string{"active"}, "var": []string{"active"},
"bytes": []string{"F5"}, // this is "true" in CBOR "bytes": []string{"F5"}, // this is "true" in CBOR
}, []byte("")); err != nil { }, []byte("")); err != nil {
logrus.WithError(err).Info("fdoConfigureDevice: PutDeviceSVIRaw()") log.Error().Err(err).Msg("fdoConfigureDevice: PutDeviceSVIRaw()")
return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw()", err) return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw()", err)
} }
@ -113,7 +118,8 @@ func (handler *Handler) fdoConfigureDevice(w http.ResponseWriter, r *http.Reques
"var": []string{"filedesc"}, "var": []string{"filedesc"},
"filename": []string{"DEVICE_edgeid.txt"}, "filename": []string{"DEVICE_edgeid.txt"},
}, []byte(payload.EdgeID)); err != nil { }, []byte(payload.EdgeID)); err != nil {
logrus.WithError(err).Info("fdoConfigureDevice: PutDeviceSVIRaw(edgeid)") log.Error().Err(err).Msg("fdoConfigureDevice: PutDeviceSVIRaw(edgeid)")
return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw(edgeid)", err) return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw(edgeid)", err)
} }
@ -125,7 +131,8 @@ func (handler *Handler) fdoConfigureDevice(w http.ResponseWriter, r *http.Reques
"var": []string{"filedesc"}, "var": []string{"filedesc"},
"filename": []string{"DEVICE_edgekey.txt"}, "filename": []string{"DEVICE_edgekey.txt"},
}, []byte(payload.EdgeKey)); err != nil { }, []byte(payload.EdgeKey)); err != nil {
logrus.WithError(err).Info("fdoConfigureDevice: PutDeviceSVIRaw(edgekey)") log.Error().Err(err).Msg("fdoConfigureDevice: PutDeviceSVIRaw(edgekey)")
return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw(edgekey)", err) return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw(edgekey)", err)
} }
@ -137,7 +144,8 @@ func (handler *Handler) fdoConfigureDevice(w http.ResponseWriter, r *http.Reques
"var": []string{"filedesc"}, "var": []string{"filedesc"},
"filename": []string{"DEVICE_name.txt"}, "filename": []string{"DEVICE_name.txt"},
}, []byte(payload.Name)); err != nil { }, []byte(payload.Name)); err != nil {
logrus.WithError(err).Info("fdoConfigureDevice: PutDeviceSVIRaw(name)") log.Error().Err(err).Msg("fdoConfigureDevice: PutDeviceSVIRaw(name)")
return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw(name)", err) return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw(name)", err)
} }
@ -149,7 +157,8 @@ func (handler *Handler) fdoConfigureDevice(w http.ResponseWriter, r *http.Reques
"var": []string{"filedesc"}, "var": []string{"filedesc"},
"filename": []string{"DEVICE_GUID.txt"}, "filename": []string{"DEVICE_GUID.txt"},
}, []byte(guid)); err != nil { }, []byte(guid)); err != nil {
logrus.WithError(err).Info("fdoConfigureDevice: PutDeviceSVIRaw()") log.Error().Err(err).Msg("fdoConfigureDevice: PutDeviceSVIRaw()")
return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw()", err) return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw()", err)
} }
@ -160,18 +169,20 @@ func (handler *Handler) fdoConfigureDevice(w http.ResponseWriter, r *http.Reques
"var": []string{"filedesc"}, "var": []string{"filedesc"},
"filename": []string{deploymentScriptName}, "filename": []string{deploymentScriptName},
}, fileContent); err != nil { }, fileContent); err != nil {
logrus.WithError(err).Info("fdoConfigureDevice: PutDeviceSVIRaw()") log.Error().Err(err).Msg("fdoConfigureDevice: PutDeviceSVIRaw()")
return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw()", err) return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw()", err)
} }
b, err := cbor.Marshal([]string{"/bin/sh", deploymentScriptName}) b, err := cbor.Marshal([]string{"/bin/sh", deploymentScriptName})
if err != nil { if err != nil {
logrus.WithError(err).Error("failed to marshal string to CBOR") log.Error().Err(err).Msg("failed to marshal string to CBOR")
return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw() failed to encode", err) return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw() failed to encode", err)
} }
cborBytes := strings.ToUpper(hex.EncodeToString(b)) cborBytes := strings.ToUpper(hex.EncodeToString(b))
logrus.WithField("cbor", cborBytes).WithField("string", deploymentScriptName).Info("converted to CBOR") log.Debug().Str("cbor", cborBytes).Str("string", deploymentScriptName).Msg("converted to CBOR")
if err = fdoClient.PutDeviceSVIRaw(url.Values{ if err = fdoClient.PutDeviceSVIRaw(url.Values{
"guid": []string{guid}, "guid": []string{guid},
@ -180,7 +191,8 @@ func (handler *Handler) fdoConfigureDevice(w http.ResponseWriter, r *http.Reques
"var": []string{"exec"}, "var": []string{"exec"},
"bytes": []string{cborBytes}, "bytes": []string{cborBytes},
}, []byte("")); err != nil { }, []byte("")); err != nil {
logrus.WithError(err).Info("fdoConfigureDevice: PutDeviceSVIRaw()") log.Error().Err(err).Msg("fdoConfigureDevice: PutDeviceSVIRaw()")
return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw()", err) return httperror.InternalServerError("fdoConfigureDevice: PutDeviceSVIRaw()", err)
} }

View file

@ -13,7 +13,8 @@ import (
"github.com/portainer/libhttp/response" "github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/hostmanagement/fdo" "github.com/portainer/portainer/api/hostmanagement/fdo"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
type fdoConfigurePayload portainer.FDOConfiguration type fdoConfigurePayload portainer.FDOConfiguration
@ -88,7 +89,8 @@ func (handler *Handler) fdoConfigure(w http.ResponseWriter, r *http.Request) *ht
err := request.DecodeAndValidateJSONPayload(r, &payload) err := request.DecodeAndValidateJSONPayload(r, &payload)
if err != nil { if err != nil {
logrus.WithError(err).Error("Invalid request payload") log.Error().Err(err).Msg("Invalid request payload")
return httperror.BadRequest("Invalid request payload", err) return httperror.BadRequest("Invalid request payload", err)
} }
@ -101,6 +103,7 @@ func (handler *Handler) fdoConfigure(w http.ResponseWriter, r *http.Request) *ht
if err != nil { if err != nil {
return httperror.InternalServerError("Error saving FDO settings", err) return httperror.InternalServerError("Error saving FDO settings", err)
} }
if len(profiles) == 0 { if len(profiles) == 0 {
err = handler.addDefaultProfile() err = handler.addDefaultProfile()
if err != nil { if err != nil {
@ -129,6 +132,7 @@ func (handler *Handler) addDefaultProfile() error {
if err != nil { if err != nil {
return err return err
} }
return nil return nil
} }

View file

@ -4,9 +4,9 @@ import (
"net/http" "net/http"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/sirupsen/logrus"
"github.com/portainer/libhttp/response" "github.com/portainer/libhttp/response"
"github.com/rs/zerolog/log"
) )
// @id fdoListAll // @id fdoListAll
@ -24,14 +24,16 @@ import (
func (handler *Handler) fdoListAll(w http.ResponseWriter, r *http.Request) *httperror.HandlerError { func (handler *Handler) fdoListAll(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
fdoClient, err := handler.newFDOClient() fdoClient, err := handler.newFDOClient()
if err != nil { if err != nil {
logrus.WithError(err).Info("fdoListAll: newFDOClient()") log.Error().Err(err).Msg("fdoListAll: newFDOClient()")
return httperror.InternalServerError("fdoRegisterDevice: newFDOClient()", err) return httperror.InternalServerError("fdoRegisterDevice: newFDOClient()", err)
} }
// Get all vouchers // Get all vouchers
guids, err := fdoClient.GetVouchers() guids, err := fdoClient.GetVouchers()
if err != nil { if err != nil {
logrus.WithError(err).Info("fdoListAll: GetVouchers()") log.Error().Err(err).Msg("fdoListAll: GetVouchers()")
return httperror.InternalServerError("fdoListAll: GetVouchers()", err) return httperror.InternalServerError("fdoListAll: GetVouchers()", err)
} }

View file

@ -6,7 +6,8 @@ import (
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response" "github.com/portainer/libhttp/response"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
type registerDeviceResponse struct { type registerDeviceResponse struct {
@ -29,19 +30,22 @@ func (handler *Handler) fdoRegisterDevice(w http.ResponseWriter, r *http.Request
// Post a voucher // Post a voucher
ov, filename, err := request.RetrieveMultiPartFormFile(r, "voucher") ov, filename, err := request.RetrieveMultiPartFormFile(r, "voucher")
if err != nil { if err != nil {
logrus.WithField("filename", filename).WithError(err).Info("fdoRegisterDevice: readVoucher()") log.Info().Str("filename", filename).Err(err).Msg("fdoRegisterDevice: readVoucher()")
return httperror.InternalServerError("fdoRegisterDevice: read Voucher()", err) return httperror.InternalServerError("fdoRegisterDevice: read Voucher()", err)
} }
fdoClient, err := handler.newFDOClient() fdoClient, err := handler.newFDOClient()
if err != nil { if err != nil {
logrus.WithError(err).Info("fdoRegisterDevice: newFDOClient()") log.Info().Err(err).Msg("fdoRegisterDevice: newFDOClient()")
return httperror.InternalServerError("fdoRegisterDevice: newFDOClient()", err) return httperror.InternalServerError("fdoRegisterDevice: newFDOClient()", err)
} }
guid, err := fdoClient.PostVoucher(ov) guid, err := fdoClient.PostVoucher(ov)
if err != nil { if err != nil {
logrus.WithError(err).Info("fdoRegisterDevice: PostVoucher()") log.Info().Err(err).Msg("fdoRegisterDevice: PostVoucher()")
return httperror.InternalServerError("fdoRegisterDevice: PostVoucher()", err) return httperror.InternalServerError("fdoRegisterDevice: PostVoucher()", err)
} }

View file

@ -7,13 +7,13 @@ import (
"net/http" "net/http"
"strings" "strings"
"github.com/sirupsen/logrus"
"software.sslmate.com/src/go-pkcs12"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response" "github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/rs/zerolog/log"
"software.sslmate.com/src/go-pkcs12"
) )
type openAMTConfigurePayload struct { type openAMTConfigurePayload struct {
@ -73,7 +73,8 @@ func (handler *Handler) openAMTConfigure(w http.ResponseWriter, r *http.Request)
var payload openAMTConfigurePayload var payload openAMTConfigurePayload
err := request.DecodeAndValidateJSONPayload(r, &payload) err := request.DecodeAndValidateJSONPayload(r, &payload)
if err != nil { if err != nil {
logrus.WithError(err).Error("Invalid request payload") log.Error().Err(err).Msg("invalid request payload")
return httperror.BadRequest("Invalid request payload", err) return httperror.BadRequest("Invalid request payload", err)
} }
@ -142,17 +143,20 @@ func (handler *Handler) enableOpenAMT(configurationPayload openAMTConfigurePaylo
err := handler.OpenAMTService.Configure(configuration) err := handler.OpenAMTService.Configure(configuration)
if err != nil { if err != nil {
logrus.WithError(err).Error("error configuring OpenAMT server") log.Error().Err(err).Msg("error configuring OpenAMT server")
return err return err
} }
err = handler.saveConfiguration(configuration) err = handler.saveConfiguration(configuration)
if err != nil { if err != nil {
logrus.WithError(err).Error("error updating OpenAMT configurations") log.Error().Err(err).Msg("error updating OpenAMT configurations")
return err return err
} }
logrus.Info("OpenAMT successfully enabled") log.Info().Msg("OpenAMT successfully enabled")
return nil return nil
} }
@ -186,6 +190,7 @@ func (handler *Handler) disableOpenAMT() error {
return err return err
} }
logrus.Info("OpenAMT successfully disabled") log.Info().Msg("OpenAMT successfully disabled")
return nil return nil
} }

View file

@ -9,7 +9,8 @@ import (
"github.com/portainer/libhttp/response" "github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
bolterrors "github.com/portainer/portainer/api/dataservices/errors" bolterrors "github.com/portainer/portainer/api/dataservices/errors"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
// @id OpenAMTDevices // @id OpenAMTDevices
@ -67,6 +68,7 @@ func (payload *deviceActionPayload) Validate(r *http.Request) error {
if payload.Action == "" { if payload.Action == "" {
return errors.New("device action must be provided") return errors.New("device action must be provided")
} }
return nil return nil
} }
@ -93,7 +95,8 @@ func (handler *Handler) deviceAction(w http.ResponseWriter, r *http.Request) *ht
var payload deviceActionPayload var payload deviceActionPayload
err = request.DecodeAndValidateJSONPayload(r, &payload) err = request.DecodeAndValidateJSONPayload(r, &payload)
if err != nil { if err != nil {
logrus.WithError(err).Error("Invalid request payload") log.Error().Err(err).Msg("invalid request payload")
return httperror.BadRequest("Invalid request payload", err) return httperror.BadRequest("Invalid request payload", err)
} }
@ -104,7 +107,8 @@ func (handler *Handler) deviceAction(w http.ResponseWriter, r *http.Request) *ht
err = handler.OpenAMTService.ExecuteDeviceAction(settings.OpenAMTConfiguration, deviceID, payload.Action) err = handler.OpenAMTService.ExecuteDeviceAction(settings.OpenAMTConfiguration, deviceID, payload.Action)
if err != nil { if err != nil {
logrus.WithError(err).Error("Error executing device action") log.Error().Err(err).Msg("error executing device action")
return httperror.BadRequest("Error executing device action", err) return httperror.BadRequest("Error executing device action", err)
} }
@ -119,6 +123,7 @@ func (payload *deviceFeaturesPayload) Validate(r *http.Request) error {
if payload.Features.UserConsent == "" { if payload.Features.UserConsent == "" {
return errors.New("device user consent status must be provided") return errors.New("device user consent status must be provided")
} }
return nil return nil
} }
@ -150,7 +155,8 @@ func (handler *Handler) deviceFeatures(w http.ResponseWriter, r *http.Request) *
var payload deviceFeaturesPayload var payload deviceFeaturesPayload
err = request.DecodeAndValidateJSONPayload(r, &payload) err = request.DecodeAndValidateJSONPayload(r, &payload)
if err != nil { if err != nil {
logrus.WithError(err).Error("Invalid request payload") log.Error().Err(err).Msg("invalid request payload")
return httperror.BadRequest("Invalid request payload", err) return httperror.BadRequest("Invalid request payload", err)
} }
@ -166,7 +172,8 @@ func (handler *Handler) deviceFeatures(w http.ResponseWriter, r *http.Request) *
token, err := handler.OpenAMTService.EnableDeviceFeatures(settings.OpenAMTConfiguration, deviceID, payload.Features) token, err := handler.OpenAMTService.EnableDeviceFeatures(settings.OpenAMTConfiguration, deviceID, payload.Features)
if err != nil { if err != nil {
logrus.WithError(err).Error("Error executing device action") log.Error().Err(err).Msg("error executing device action")
return httperror.BadRequest("Error executing device action", err) return httperror.BadRequest("Error executing device action", err)
} }
@ -174,5 +181,6 @@ func (handler *Handler) deviceFeatures(w http.ResponseWriter, r *http.Request) *
Server: settings.OpenAMTConfiguration.MPSServer, Server: settings.OpenAMTConfiguration.MPSServer,
Token: token, Token: token,
} }
return response.JSON(w, authorizationResponse) return response.JSON(w, authorizationResponse)
} }

View file

@ -4,24 +4,23 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/portainer/portainer/api/hostmanagement/openamt"
"io/ioutil" "io/ioutil"
"log"
"net/http" "net/http"
"time" "time"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/filters"
"github.com/docker/docker/api/types/network"
"github.com/docker/docker/client"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response" "github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
bolterrors "github.com/portainer/portainer/api/dataservices/errors" bolterrors "github.com/portainer/portainer/api/dataservices/errors"
"github.com/sirupsen/logrus" "github.com/portainer/portainer/api/hostmanagement/openamt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/filters"
"github.com/docker/docker/api/types/network"
"github.com/docker/docker/client"
"github.com/rs/zerolog/log"
) )
type HostInfo struct { type HostInfo struct {
@ -60,7 +59,7 @@ func (handler *Handler) openAMTHostInfo(w http.ResponseWriter, r *http.Request)
return httperror.BadRequest("Invalid environment identifier route variable", err) return httperror.BadRequest("Invalid environment identifier route variable", err)
} }
logrus.WithField("endpointID", endpointID).Info("OpenAMTHostInfo") log.Info().Int("endpointID", endpointID).Msg("OpenAMTHostInfo")
endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID)) endpoint, err := handler.DataStore.Endpoint().Endpoint(portainer.EndpointID(endpointID))
if err == bolterrors.ErrObjectNotFound { if err == bolterrors.ErrObjectNotFound {
@ -121,6 +120,7 @@ func (handler *Handler) PullAndRunContainer(ctx context.Context, endpoint *porta
if err != nil { if err != nil {
return "Could not run container", err return "Could not run container", err
} }
return output, nil return output, nil
} }
@ -133,18 +133,20 @@ func (handler *Handler) PullAndRunContainer(ctx context.Context, endpoint *porta
func pullImage(ctx context.Context, docker *client.Client, imageName string) error { func pullImage(ctx context.Context, docker *client.Client, imageName string) error {
out, err := docker.ImagePull(ctx, imageName, types.ImagePullOptions{}) out, err := docker.ImagePull(ctx, imageName, types.ImagePullOptions{})
if err != nil { if err != nil {
logrus.WithError(err).WithField("imageName", imageName).Error("Could not pull image from registry") log.Error().Str("image_name", imageName).Err(err).Msg("could not pull image from registry")
return err return err
} }
defer out.Close() defer out.Close()
outputBytes, err := ioutil.ReadAll(out) outputBytes, err := ioutil.ReadAll(out)
if err != nil { if err != nil {
logrus.WithError(err).WithField("imageName", imageName).Error("Could not read image pull output") log.Error().Str("image_name", imageName).Err(err).Msg("could not read image pull output")
return err return err
} }
log.Printf("%s imaged pulled with output:\n%s", imageName, string(outputBytes)) log.Debug().Str("image_name", imageName).Str("output", string(outputBytes)).Msg("image pulled")
return nil return nil
} }
@ -158,14 +160,24 @@ func runContainer(ctx context.Context, docker *client.Client, imageName, contain
opts.Filters.Add("name", containerName) opts.Filters.Add("name", containerName)
existingContainers, err := docker.ContainerList(ctx, opts) existingContainers, err := docker.ContainerList(ctx, opts)
if err != nil { if err != nil {
logrus.WithError(err).WithField("imagename", imageName).WithField("containername", containerName).Error("listing existing container") log.Error().
Str("image_name", imageName).
Str("container_name", containerName).
Err(err).
Msg("listing existing container")
return "", err return "", err
} }
if len(existingContainers) > 0 { if len(existingContainers) > 0 {
err = docker.ContainerRemove(ctx, existingContainers[0].ID, types.ContainerRemoveOptions{Force: true}) err = docker.ContainerRemove(ctx, existingContainers[0].ID, types.ContainerRemoveOptions{Force: true})
if err != nil { if err != nil {
logrus.WithError(err).WithField("imagename", imageName).WithField("containername", containerName).Error("removing existing container") log.Error().
Str("image_name", imageName).
Str("container_name", containerName).
Err(err).
Msg("removing existing container")
return "", err return "", err
} }
} }
@ -188,50 +200,82 @@ func runContainer(ctx context.Context, docker *client.Client, imageName, contain
nil, nil,
containerName, containerName,
) )
if err != nil { if err != nil {
logrus.WithError(err).WithField("imagename", imageName).WithField("containername", containerName).Error("creating container") log.Error().
return "", err Str("image_name", imageName).
} Str("container_name", containerName).
err = docker.ContainerStart(ctx, created.ID, types.ContainerStartOptions{}) Err(err).
if err != nil { Msg("creating container")
logrus.WithError(err).WithField("imagename", imageName).WithField("containername", containerName).Error("starting container")
return "", err return "", err
} }
log.Printf("%s container created and started\n", containerName) err = docker.ContainerStart(ctx, created.ID, types.ContainerStartOptions{})
if err != nil {
log.Error().
Str("image_name", imageName).
Str("container_name", containerName).
Err(err).
Msg("starting container")
return "", err
}
log.Debug().Str("container_name", containerName).Msg("container created and started")
statusCh, errCh := docker.ContainerWait(ctx, created.ID, container.WaitConditionNotRunning) statusCh, errCh := docker.ContainerWait(ctx, created.ID, container.WaitConditionNotRunning)
var statusCode int64 var statusCode int64
select { select {
case err := <-errCh: case err := <-errCh:
if err != nil { if err != nil {
logrus.WithError(err).WithField("imagename", imageName).WithField("containername", containerName).Error("starting container") log.Error().
Str("image_name", imageName).
Str("container_name", containerName).
Err(err).
Msg("starting container")
return "", err return "", err
} }
case status := <-statusCh: case status := <-statusCh:
statusCode = status.StatusCode statusCode = status.StatusCode
} }
logrus.WithField("status", statusCode).Debug("container wait status")
log.Debug().Int64("status", statusCode).Msg("container wait status")
out, err := docker.ContainerLogs(ctx, created.ID, types.ContainerLogsOptions{ShowStdout: true}) out, err := docker.ContainerLogs(ctx, created.ID, types.ContainerLogsOptions{ShowStdout: true})
if err != nil { if err != nil {
logrus.WithError(err).WithField("imagename", imageName).WithField("containername", containerName).Error("getting container log") log.Error().Err(err).Str("image_name", imageName).Str("container_name", containerName).Msg("getting container log")
return "", err return "", err
} }
err = docker.ContainerRemove(ctx, created.ID, types.ContainerRemoveOptions{}) err = docker.ContainerRemove(ctx, created.ID, types.ContainerRemoveOptions{})
if err != nil { if err != nil {
logrus.WithError(err).WithField("imagename", imageName).WithField("containername", containerName).Error("removing container") log.Error().
Str("image_name", imageName).
Str("container_name", containerName).
Err(err).
Msg("removing container")
return "", err return "", err
} }
outputBytes, err := ioutil.ReadAll(out) outputBytes, err := ioutil.ReadAll(out)
if err != nil { if err != nil {
logrus.WithError(err).WithField("imagename", imageName).WithField("containername", containerName).Error("read container output") log.Error().
Str("image_name", imageName).
Str("container_name", containerName).
Err(err).
Msg("read container output")
return "", err return "", err
} }
log.Printf("%s container finished with output:\n%s", containerName, string(outputBytes)) log.Debug().
Str("container_name", containerName).
Str("output", string(outputBytes)).
Msg("container finished with output")
return string(outputBytes), nil return string(outputBytes), nil
} }
@ -269,6 +313,7 @@ func (handler *Handler) deactivateDevice(endpoint *portainer.Endpoint, settings
"-u", fmt.Sprintf("wss://%s/activate", config.MPSServer), "-u", fmt.Sprintf("wss://%s/activate", config.MPSServer),
"-password", config.MPSPassword, "-password", config.MPSPassword,
} }
_, err := handler.PullAndRunContainer(ctx, endpoint, rpcGoImageName, rpcGoContainerName, cmdLine) _, err := handler.PullAndRunContainer(ctx, endpoint, rpcGoImageName, rpcGoContainerName, cmdLine)
if err != nil { if err != nil {
return err return err

View file

@ -1,7 +1,6 @@
package stacks package stacks
import ( import (
"log"
"time" "time"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
@ -9,6 +8,8 @@ import (
"github.com/portainer/portainer/api/dataservices" "github.com/portainer/portainer/api/dataservices"
"github.com/portainer/portainer/api/scheduler" "github.com/portainer/portainer/api/scheduler"
"github.com/portainer/portainer/api/stacks" "github.com/portainer/portainer/api/stacks"
"github.com/rs/zerolog/log"
) )
func startAutoupdate(stackID portainer.StackID, interval string, scheduler *scheduler.Scheduler, stackDeployer stacks.StackDeployer, datastore dataservices.DataStore, gitService portainer.GitService) (jobID string, e *httperror.HandlerError) { func startAutoupdate(stackID portainer.StackID, interval string, scheduler *scheduler.Scheduler, stackDeployer stacks.StackDeployer, datastore dataservices.DataStore, gitService portainer.GitService) (jobID string, e *httperror.HandlerError) {
@ -30,6 +31,6 @@ func stopAutoupdate(stackID portainer.StackID, jobID string, scheduler scheduler
} }
if err := scheduler.StopJob(jobID); err != nil { if err := scheduler.StopJob(jobID); err != nil {
log.Printf("[WARN] could not stop the job for the stack %v", stackID) log.Warn().Int("stack_id", int(stackID)).Msg("could not stop the job for the stack")
} }
} }

View file

@ -2,7 +2,6 @@ package stacks
import ( import (
"fmt" "fmt"
"log"
"net/http" "net/http"
"strconv" "strconv"
"time" "time"
@ -16,6 +15,8 @@ import (
gittypes "github.com/portainer/portainer/api/git/types" gittypes "github.com/portainer/portainer/api/git/types"
"github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/http/security"
"github.com/portainer/portainer/api/internal/stackutils" "github.com/portainer/portainer/api/internal/stackutils"
"github.com/rs/zerolog/log"
) )
type composeStackFromFileContentPayload struct { type composeStackFromFileContentPayload struct {
@ -44,6 +45,7 @@ func (handler *Handler) checkAndCleanStackDupFromSwarm(w http.ResponseWriter, r
if err != nil { if err != nil {
return err return err
} }
// stop scheduler updates of the stack before removal // stop scheduler updates of the stack before removal
if stack.AutoUpdate != nil { if stack.AutoUpdate != nil {
stopAutoupdate(stack.ID, stack.AutoUpdate.JobID, *handler.Scheduler) stopAutoupdate(stack.ID, stack.AutoUpdate.JobID, *handler.Scheduler)
@ -57,16 +59,21 @@ func (handler *Handler) checkAndCleanStackDupFromSwarm(w http.ResponseWriter, r
if resourceControl != nil { if resourceControl != nil {
err = handler.DataStore.ResourceControl().DeleteResourceControl(resourceControl.ID) err = handler.DataStore.ResourceControl().DeleteResourceControl(resourceControl.ID)
if err != nil { if err != nil {
log.Printf("[ERROR] [Stack] Unable to remove the associated resource control from the database for stack: [%+v].", stack) log.Error().
Str("stack", fmt.Sprintf("%+v", stack)).
Msg("unable to remove the associated resource control from the database for stack")
} }
} }
if exists, _ := handler.FileService.FileExists(stack.ProjectPath); exists { if exists, _ := handler.FileService.FileExists(stack.ProjectPath); exists {
err = handler.FileService.RemoveDirectory(stack.ProjectPath) err = handler.FileService.RemoveDirectory(stack.ProjectPath)
if err != nil { if err != nil {
log.Printf("Unable to remove stack files from disk for stack: [%+v].", stack) log.Warn().
Str("stack", fmt.Sprintf("%+v", stack)).
Msg("unable to remove stack files from disk for stack")
} }
} }
return nil return nil
} }

View file

@ -1,12 +1,8 @@
package stacks package stacks
import ( import (
"log"
"net/http" "net/http"
"github.com/docker/cli/cli/compose/loader"
"github.com/docker/cli/cli/compose/types"
"github.com/pkg/errors"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response" "github.com/portainer/libhttp/response"
@ -14,6 +10,11 @@ import (
"github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/http/security"
"github.com/portainer/portainer/api/internal/authorization" "github.com/portainer/portainer/api/internal/authorization"
"github.com/portainer/portainer/api/internal/stackutils" "github.com/portainer/portainer/api/internal/stackutils"
"github.com/docker/cli/cli/compose/loader"
"github.com/docker/cli/cli/compose/types"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
) )
func (handler *Handler) cleanUp(stack *portainer.Stack, doCleanUp *bool) error { func (handler *Handler) cleanUp(stack *portainer.Stack, doCleanUp *bool) error {
@ -23,8 +24,9 @@ func (handler *Handler) cleanUp(stack *portainer.Stack, doCleanUp *bool) error {
err := handler.FileService.RemoveDirectory(stack.ProjectPath) err := handler.FileService.RemoveDirectory(stack.ProjectPath)
if err != nil { if err != nil {
log.Printf("http error: Unable to cleanup stack creation (err=%s)\n", err) log.Error().Err(err).Msg("unable to cleanup stack creation")
} }
return nil return nil
} }

View file

@ -1,14 +1,10 @@
package stacks package stacks
import ( import (
"log"
"net/http" "net/http"
"strconv" "strconv"
"time" "time"
"github.com/pkg/errors"
"github.com/asaskevich/govalidator"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response" "github.com/portainer/libhttp/response"
@ -16,6 +12,10 @@ import (
httperrors "github.com/portainer/portainer/api/http/errors" httperrors "github.com/portainer/portainer/api/http/errors"
"github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/http/security"
"github.com/portainer/portainer/api/internal/stackutils" "github.com/portainer/portainer/api/internal/stackutils"
"github.com/asaskevich/govalidator"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
) )
type updateComposeStackPayload struct { type updateComposeStackPayload struct {
@ -197,7 +197,7 @@ func (handler *Handler) updateComposeStack(r *http.Request, stack *portainer.Sta
_, err = handler.FileService.UpdateStoreStackFileFromBytes(stackFolder, stack.EntryPoint, []byte(payload.StackFileContent)) _, err = handler.FileService.UpdateStoreStackFileFromBytes(stackFolder, stack.EntryPoint, []byte(payload.StackFileContent))
if err != nil { if err != nil {
if rollbackErr := handler.FileService.RollbackStackFile(stackFolder, stack.EntryPoint); rollbackErr != nil { if rollbackErr := handler.FileService.RollbackStackFile(stackFolder, stack.EntryPoint); rollbackErr != nil {
log.Printf("[WARN] [stack,update] [message: rollback stack file error] [err: %s]", rollbackErr) log.Warn().Err(rollbackErr).Msg("rollback stack file error")
} }
return httperror.InternalServerError("Unable to persist updated Compose file on disk", err) return httperror.InternalServerError("Unable to persist updated Compose file on disk", err)
@ -206,7 +206,7 @@ func (handler *Handler) updateComposeStack(r *http.Request, stack *portainer.Sta
config, configErr := handler.createComposeDeployConfig(r, stack, endpoint, payload.PullImage) config, configErr := handler.createComposeDeployConfig(r, stack, endpoint, payload.PullImage)
if configErr != nil { if configErr != nil {
if rollbackErr := handler.FileService.RollbackStackFile(stackFolder, stack.EntryPoint); rollbackErr != nil { if rollbackErr := handler.FileService.RollbackStackFile(stackFolder, stack.EntryPoint); rollbackErr != nil {
log.Printf("[WARN] [stack,update] [message: rollback stack file error] [err: %s]", rollbackErr) log.Warn().Err(rollbackErr).Msg("rollback stack file error")
} }
return configErr return configErr
@ -215,7 +215,7 @@ func (handler *Handler) updateComposeStack(r *http.Request, stack *portainer.Sta
err = handler.deployComposeStack(config, false) err = handler.deployComposeStack(config, false)
if err != nil { if err != nil {
if rollbackErr := handler.FileService.RollbackStackFile(stackFolder, stack.EntryPoint); rollbackErr != nil { if rollbackErr := handler.FileService.RollbackStackFile(stackFolder, stack.EntryPoint); rollbackErr != nil {
log.Printf("[WARN] [stack,update] [message: rollback stack file error] [err: %s]", rollbackErr) log.Warn().Err(rollbackErr).Msg("rollback stack file error")
} }
return httperror.InternalServerError(err.Error(), err) return httperror.InternalServerError(err.Error(), err)
@ -248,7 +248,7 @@ func (handler *Handler) updateSwarmStack(r *http.Request, stack *portainer.Stack
_, err = handler.FileService.UpdateStoreStackFileFromBytes(stackFolder, stack.EntryPoint, []byte(payload.StackFileContent)) _, err = handler.FileService.UpdateStoreStackFileFromBytes(stackFolder, stack.EntryPoint, []byte(payload.StackFileContent))
if err != nil { if err != nil {
if rollbackErr := handler.FileService.RollbackStackFile(stackFolder, stack.EntryPoint); rollbackErr != nil { if rollbackErr := handler.FileService.RollbackStackFile(stackFolder, stack.EntryPoint); rollbackErr != nil {
log.Printf("[WARN] [swarm,stack,update] [message: rollback stack file error] [err: %s]", rollbackErr) log.Warn().Err(rollbackErr).Msg("rollback stack file error")
} }
return httperror.InternalServerError("Unable to persist updated Compose file on disk", err) return httperror.InternalServerError("Unable to persist updated Compose file on disk", err)
@ -257,7 +257,7 @@ func (handler *Handler) updateSwarmStack(r *http.Request, stack *portainer.Stack
config, configErr := handler.createSwarmDeployConfig(r, stack, endpoint, payload.Prune, payload.PullImage) config, configErr := handler.createSwarmDeployConfig(r, stack, endpoint, payload.Prune, payload.PullImage)
if configErr != nil { if configErr != nil {
if rollbackErr := handler.FileService.RollbackStackFile(stackFolder, stack.EntryPoint); rollbackErr != nil { if rollbackErr := handler.FileService.RollbackStackFile(stackFolder, stack.EntryPoint); rollbackErr != nil {
log.Printf("[WARN] [swarm,stack,update] [message: rollback stack file error] [err: %s]", rollbackErr) log.Warn().Err(rollbackErr).Msg("rollback stack file error")
} }
return configErr return configErr
@ -266,7 +266,7 @@ func (handler *Handler) updateSwarmStack(r *http.Request, stack *portainer.Stack
err = handler.deploySwarmStack(config) err = handler.deploySwarmStack(config)
if err != nil { if err != nil {
if rollbackErr := handler.FileService.RollbackStackFile(stackFolder, stack.EntryPoint); rollbackErr != nil { if rollbackErr := handler.FileService.RollbackStackFile(stackFolder, stack.EntryPoint); rollbackErr != nil {
log.Printf("[WARN] [swarm,stack,update] [message: rollback stack file error] [err: %s]", rollbackErr) log.Warn().Err(rollbackErr).Msg("rollback stack file error")
} }
return httperror.InternalServerError(err.Error(), err) return httperror.InternalServerError(err.Error(), err)

View file

@ -2,7 +2,6 @@ package stacks
import ( import (
"fmt" "fmt"
"log"
"net/http" "net/http"
"time" "time"
@ -16,6 +15,8 @@ import (
"github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/http/security"
"github.com/portainer/portainer/api/internal/stackutils" "github.com/portainer/portainer/api/internal/stackutils"
k "github.com/portainer/portainer/api/kubernetes" k "github.com/portainer/portainer/api/kubernetes"
"github.com/rs/zerolog/log"
) )
type stackGitRedployPayload struct { type stackGitRedployPayload struct {
@ -156,7 +157,7 @@ func (handler *Handler) stackGitRedeploy(w http.ResponseWriter, r *http.Request)
if err != nil { if err != nil {
restoreError := filesystem.MoveDirectory(backupProjectPath, stack.ProjectPath) restoreError := filesystem.MoveDirectory(backupProjectPath, stack.ProjectPath)
if restoreError != nil { if restoreError != nil {
log.Printf("[WARN] [http,stacks,git] [error: %s] [message: failed restoring backup folder]", restoreError) log.Warn().Err(restoreError).Msg("failed restoring backup folder")
} }
return httperror.InternalServerError("Unable to clone git repository", err) return httperror.InternalServerError("Unable to clone git repository", err)
@ -165,7 +166,7 @@ func (handler *Handler) stackGitRedeploy(w http.ResponseWriter, r *http.Request)
defer func() { defer func() {
err = handler.FileService.RemoveDirectory(backupProjectPath) err = handler.FileService.RemoveDirectory(backupProjectPath)
if err != nil { if err != nil {
log.Printf("[WARN] [http,stacks,git] [error: %s] [message: unable to remove git repository directory]", err) log.Warn().Err(err).Msg("unable to remove git repository directory")
} }
}() }()

View file

@ -3,13 +3,10 @@ package stacks
import ( import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log"
"net/http" "net/http"
"os" "os"
"strconv" "strconv"
"github.com/asaskevich/govalidator"
"github.com/pkg/errors"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
@ -17,6 +14,10 @@ import (
gittypes "github.com/portainer/portainer/api/git/types" gittypes "github.com/portainer/portainer/api/git/types"
"github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/http/security"
k "github.com/portainer/portainer/api/kubernetes" k "github.com/portainer/portainer/api/kubernetes"
"github.com/asaskevich/govalidator"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
) )
type kubernetesFileStackUpdatePayload struct { type kubernetesFileStackUpdatePayload struct {
@ -128,7 +129,7 @@ func (handler *Handler) updateKubernetesStack(r *http.Request, stack *portainer.
projectPath, err := handler.FileService.UpdateStoreStackFileFromBytes(stackFolder, stack.EntryPoint, []byte(payload.StackFileContent)) projectPath, err := handler.FileService.UpdateStoreStackFileFromBytes(stackFolder, stack.EntryPoint, []byte(payload.StackFileContent))
if err != nil { if err != nil {
if rollbackErr := handler.FileService.RollbackStackFile(stackFolder, stack.EntryPoint); rollbackErr != nil { if rollbackErr := handler.FileService.RollbackStackFile(stackFolder, stack.EntryPoint); rollbackErr != nil {
log.Printf("[WARN] [kubernetes,stack,update] [message: rollback stack file error] [err: %s]", rollbackErr) log.Warn().Err(rollbackErr).Msg("rollback stack file error")
} }
fileType := "Manifest" fileType := "Manifest"

View file

@ -3,15 +3,13 @@ package stacks
import ( import (
"net/http" "net/http"
"github.com/gofrs/uuid"
"github.com/sirupsen/logrus"
"github.com/portainer/libhttp/response"
"github.com/portainer/portainer/api/stacks"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response"
"github.com/portainer/portainer/api/stacks"
"github.com/gofrs/uuid"
"github.com/rs/zerolog/log"
) )
// @id WebhookInvoke // @id WebhookInvoke
@ -36,6 +34,7 @@ func (handler *Handler) webhookInvoke(w http.ResponseWriter, r *http.Request) *h
if handler.DataStore.IsErrObjectNotFound(err) { if handler.DataStore.IsErrObjectNotFound(err) {
statusCode = http.StatusNotFound statusCode = http.StatusNotFound
} }
return &httperror.HandlerError{StatusCode: statusCode, Message: "Unable to find the stack by webhook ID", Err: err} return &httperror.HandlerError{StatusCode: statusCode, Message: "Unable to find the stack by webhook ID", Err: err}
} }
@ -43,7 +42,9 @@ func (handler *Handler) webhookInvoke(w http.ResponseWriter, r *http.Request) *h
if _, ok := err.(*stacks.StackAuthorMissingErr); ok { if _, ok := err.(*stacks.StackAuthorMissingErr); ok {
return &httperror.HandlerError{StatusCode: http.StatusConflict, Message: "Autoupdate for the stack isn't available", Err: err} return &httperror.HandlerError{StatusCode: http.StatusConflict, Message: "Autoupdate for the stack isn't available", Err: err}
} }
logrus.WithError(err).Error("failed to update the stack")
log.Error().Err(err).Msg("failed to update the stack")
return httperror.InternalServerError("Failed to update the stack", err) return httperror.InternalServerError("Failed to update the stack", err)
} }
@ -57,7 +58,6 @@ func retrieveUUIDRouteVariableValue(r *http.Request, name string) (uuid.UUID, er
} }
uid, err := uuid.FromString(webhookID) uid, err := uuid.FromString(webhookID)
if err != nil { if err != nil {
return uuid.Nil, err return uuid.Nil, err
} }

View file

@ -5,14 +5,13 @@ import (
"net/http" "net/http"
"strconv" "strconv"
"github.com/coreos/go-semver/semver" "github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/build" "github.com/portainer/portainer/api/build"
"github.com/portainer/portainer/api/http/client" "github.com/portainer/portainer/api/http/client"
"github.com/portainer/libhttp/response" "github.com/coreos/go-semver/semver"
log "github.com/sirupsen/logrus" "github.com/rs/zerolog/log"
) )
type versionResponse struct { type versionResponse struct {
@ -71,7 +70,8 @@ func (handler *Handler) version(w http.ResponseWriter, r *http.Request) {
func getLatestVersion() string { func getLatestVersion() string {
motd, err := client.Get(portainer.VersionCheckURL, 5) motd, err := client.Get(portainer.VersionCheckURL, 5)
if err != nil { if err != nil {
log.WithError(err).Debug("couldn't fetch latest Portainer release version") log.Debug().Err(err).Msg("couldn't fetch latest Portainer release version")
return "" return ""
} }
@ -81,7 +81,8 @@ func getLatestVersion() string {
err = json.Unmarshal(motd, &data) err = json.Unmarshal(motd, &data)
if err != nil { if err != nil {
log.WithError(err).Debug("couldn't parse latest Portainer version") log.Debug().Err(err).Msg("couldn't parse latest Portainer version")
return "" return ""
} }
@ -91,13 +92,15 @@ func getLatestVersion() string {
func hasNewerVersion(currentVersion, latestVersion string) bool { func hasNewerVersion(currentVersion, latestVersion string) bool {
currentVersionSemver, err := semver.NewVersion(currentVersion) currentVersionSemver, err := semver.NewVersion(currentVersion)
if err != nil { if err != nil {
log.WithField("version", currentVersion).Debug("current Portainer version isn't a semver") log.Debug().Str("version", currentVersion).Msg("current Portainer version isn't a semver")
return false return false
} }
latestVersionSemver, err := semver.NewVersion(latestVersion) latestVersionSemver, err := semver.NewVersion(latestVersion)
if err != nil { if err != nil {
log.WithField("version", latestVersion).Debug("latest Portainer version isn't a semver") log.Debug().Str("version", latestVersion).Msg("latest Portainer version isn't a semver")
return false return false
} }

View file

@ -3,7 +3,6 @@ package templates
import ( import (
"encoding/json" "encoding/json"
"errors" "errors"
"log"
"net/http" "net/http"
"github.com/asaskevich/govalidator" "github.com/asaskevich/govalidator"
@ -11,6 +10,8 @@ import (
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
"github.com/portainer/libhttp/response" "github.com/portainer/libhttp/response"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/rs/zerolog/log"
) )
type filePayload struct { type filePayload struct {
@ -114,7 +115,8 @@ func (handler *Handler) templateFile(w http.ResponseWriter, r *http.Request) *ht
func (handler *Handler) cleanUp(projectPath string) error { func (handler *Handler) cleanUp(projectPath string) error {
err := handler.FileService.RemoveDirectory(projectPath) err := handler.FileService.RemoveDirectory(projectPath)
if err != nil { if err != nil {
log.Printf("http error: Unable to cleanup stack creation (err=%s)\n", err) log.Debug().Err(err).Msg("HTTP error: unable to cleanup stack creation")
} }
return nil return nil
} }

View file

@ -3,17 +3,17 @@ package websocket
import ( import (
"fmt" "fmt"
"io" "io"
"log"
"net/http" "net/http"
"strings" "strings"
"github.com/portainer/portainer/api/http/security"
"github.com/gorilla/websocket"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/portainer/libhttp/request" "github.com/portainer/libhttp/request"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/http/proxy/factory/kubernetes" "github.com/portainer/portainer/api/http/proxy/factory/kubernetes"
"github.com/portainer/portainer/api/http/security"
"github.com/gorilla/websocket"
"github.com/rs/zerolog/log"
) )
// @summary Execute a websocket on pod // @summary Execute a websocket on pod
@ -149,7 +149,8 @@ func (handler *Handler) hijackPodExecStartOperation(
// websocket client successfully disconnected // websocket client successfully disconnected
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseNoStatusReceived) { if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseNoStatusReceived) {
log.Printf("websocket error: %s \n", err.Error()) log.Debug().Err(err).Msg("websocket error")
return nil return nil
} }

View file

@ -1,12 +1,13 @@
package offlinegate package offlinegate
import ( import (
"log"
"net/http" "net/http"
"strings" "strings"
"time" "time"
httperror "github.com/portainer/libhttp/error" httperror "github.com/portainer/libhttp/error"
"github.com/rs/zerolog/log"
lock "github.com/viney-shih/go-lock" lock "github.com/viney-shih/go-lock"
) )
@ -40,7 +41,7 @@ func (o *OfflineGate) WaitingMiddleware(timeout time.Duration, next http.Handler
} }
if !o.lock.RTryLockWithTimeout(timeout) { if !o.lock.RTryLockWithTimeout(timeout) {
log.Println("error: Timeout waiting for the offline gate to signal") log.Error().Msg("timeout waiting for the offline gate to signal")
httperror.WriteError(w, http.StatusRequestTimeout, "Timeout waiting for the offline gate to signal", http.ErrHandlerTimeout) httperror.WriteError(w, http.StatusRequestTimeout, "Timeout waiting for the offline gate to signal", http.ErrHandlerTimeout)
return return
} }

View file

@ -2,16 +2,17 @@ package factory
import ( import (
"fmt" "fmt"
"log"
"net" "net"
"net/http" "net/http"
"github.com/pkg/errors"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/crypto" "github.com/portainer/portainer/api/crypto"
"github.com/portainer/portainer/api/http/proxy/factory/agent" "github.com/portainer/portainer/api/http/proxy/factory/agent"
"github.com/portainer/portainer/api/internal/endpointutils" "github.com/portainer/portainer/api/internal/endpointutils"
"github.com/portainer/portainer/api/internal/url" "github.com/portainer/portainer/api/internal/url"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
) )
// ProxyServer provide an extended proxy with a local server to forward requests // ProxyServer provide an extended proxy with a local server to forward requests
@ -24,7 +25,7 @@ type ProxyServer struct {
func (factory *ProxyFactory) NewAgentProxy(endpoint *portainer.Endpoint) (*ProxyServer, error) { func (factory *ProxyFactory) NewAgentProxy(endpoint *portainer.Endpoint) (*ProxyServer, error) {
urlString := endpoint.URL urlString := endpoint.URL
if endpointutils.IsEdgeEndpoint((endpoint)) { if endpointutils.IsEdgeEndpoint(endpoint) {
tunnel, err := factory.reverseTunnelService.GetActiveTunnel(endpoint) tunnel, err := factory.reverseTunnelService.GetActiveTunnel(endpoint)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failed starting tunnel") return nil, errors.Wrap(err, "failed starting tunnel")
@ -77,15 +78,16 @@ func (proxy *ProxyServer) start() error {
} }
proxy.Port = listener.Addr().(*net.TCPAddr).Port proxy.Port = listener.Addr().(*net.TCPAddr).Port
go func() { go func() {
proxyHost := fmt.Sprintf("127.0.0.1:%d", proxy.Port) proxyHost := fmt.Sprintf("127.0.0.1:%d", proxy.Port)
log.Printf("Starting Proxy server on %s...\n", proxyHost) log.Debug().Str("host", proxyHost).Msg("starting proxy server")
err := proxy.server.Serve(listener) err := proxy.server.Serve(listener)
log.Printf("Exiting Proxy server %s\n", proxyHost) log.Debug().Str("host", proxyHost).Msg("exiting proxy server")
if err != nil && err != http.ErrServerClosed { if err != nil && err != http.ErrServerClosed {
log.Printf("Proxy server %s exited with an error: %s\n", proxyHost, err) log.Debug().Str("host", proxyHost).Err(err).Msg("proxy server exited with an error")
} }
}() }()

View file

@ -1,12 +1,13 @@
package azure package azure
import ( import (
"log"
"net/http" "net/http"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/http/security"
"github.com/portainer/portainer/api/internal/authorization" "github.com/portainer/portainer/api/internal/authorization"
"github.com/rs/zerolog/log"
) )
func (transport *Transport) createAzureRequestContext(request *http.Request) (*azureRequestContext, error) { func (transport *Transport) createAzureRequestContext(request *http.Request) (*azureRequestContext, error) {
@ -65,7 +66,11 @@ func (transport *Transport) createPrivateResourceControl(
err := transport.dataStore.ResourceControl().Create(resourceControl) err := transport.dataStore.ResourceControl().Create(resourceControl)
if err != nil { if err != nil {
log.Printf("[ERROR] [http,proxy,azure,transport] [message: unable to persist resource control] [resource: %s] [err: %s]", resourceIdentifier, err) log.Error().
Str("resource", resourceIdentifier).
Err(err).
Msg("unable to persist resource control")
return nil, err return nil, err
} }
@ -76,6 +81,7 @@ func (transport *Transport) userCanDeleteContainerGroup(request *http.Request, c
if context.isAdmin { if context.isAdmin {
return true return true
} }
resourceIdentifier := request.URL.Path resourceIdentifier := request.URL.Path
resourceControl := transport.findResourceControl(resourceIdentifier, context) resourceControl := transport.findResourceControl(resourceIdentifier, context)
return authorization.UserCanAccessResource(context.userID, context.userTeamIDs, resourceControl) return authorization.UserCanAccessResource(context.userID, context.userTeamIDs, resourceControl)
@ -100,7 +106,7 @@ func (transport *Transport) decorateContainerGroup(containerGroup map[string]int
containerGroup = decorateObject(containerGroup, resourceControl) containerGroup = decorateObject(containerGroup, resourceControl)
} }
} else { } else {
log.Printf("[WARN] [http,proxy,azure,decorate] [message: unable to find resource id property in container group]") log.Warn().Msg("unable to find resource id property in container group")
} }
return containerGroup return containerGroup
@ -137,7 +143,7 @@ func (transport *Transport) removeResourceControl(containerGroup map[string]inte
return err return err
} }
} else { } else {
log.Printf("[WARN] [http,proxy,azure] [message: missign ID in container group]") log.Debug().Msg("missing ID in container group")
} }
return nil return nil

View file

@ -3,7 +3,6 @@ package factory
import ( import (
"fmt" "fmt"
"io" "io"
"log"
"net/http" "net/http"
"strings" "strings"
@ -12,6 +11,8 @@ import (
"github.com/portainer/portainer/api/crypto" "github.com/portainer/portainer/api/crypto"
"github.com/portainer/portainer/api/http/proxy/factory/docker" "github.com/portainer/portainer/api/http/proxy/factory/docker"
"github.com/portainer/portainer/api/internal/url" "github.com/portainer/portainer/api/internal/url"
"github.com/rs/zerolog/log"
) )
func (factory *ProxyFactory) newDockerProxy(endpoint *portainer.Endpoint) (http.Handler, error) { func (factory *ProxyFactory) newDockerProxy(endpoint *portainer.Endpoint) (http.Handler, error) {
@ -107,6 +108,6 @@ func (proxy *dockerLocalProxy) ServeHTTP(w http.ResponseWriter, r *http.Request)
w.WriteHeader(res.StatusCode) w.WriteHeader(res.StatusCode)
if _, err := io.Copy(w, res.Body); err != nil { if _, err := io.Copy(w, res.Body); err != nil {
log.Printf("proxy error: %s\n", err) log.Debug().Err(err).Msg("proxy error")
} }
} }

View file

@ -1,16 +1,15 @@
package docker package docker
import ( import (
"log"
"net/http" "net/http"
"strings" "strings"
"github.com/portainer/portainer/api/internal/stackutils" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/http/proxy/factory/utils" "github.com/portainer/portainer/api/http/proxy/factory/utils"
"github.com/portainer/portainer/api/internal/authorization" "github.com/portainer/portainer/api/internal/authorization"
"github.com/portainer/portainer/api/internal/stackutils"
portainer "github.com/portainer/portainer/api" "github.com/rs/zerolog/log"
) )
const ( const (
@ -79,7 +78,11 @@ func (transport *Transport) newResourceControlFromPortainerLabels(labelsObject m
for _, name := range teamNames { for _, name := range teamNames {
team, err := transport.dataStore.Team().TeamByName(name) team, err := transport.dataStore.Team().TeamByName(name)
if err != nil { if err != nil {
log.Printf("[WARN] [http,proxy,docker] [message: unknown team name in access control label, ignoring access control rule for this team] [name: %s] [resource_id: %s]", name, resourceID) log.Warn().
Str("name", name).
Str("resource_id", resourceID).
Msg("unknown team name in access control label, ignoring access control rule for this team")
continue continue
} }
@ -89,7 +92,11 @@ func (transport *Transport) newResourceControlFromPortainerLabels(labelsObject m
for _, name := range userNames { for _, name := range userNames {
user, err := transport.dataStore.User().UserByUsername(name) user, err := transport.dataStore.User().UserByUsername(name)
if err != nil { if err != nil {
log.Printf("[WARN] [http,proxy,docker] [message: unknown user name in access control label, ignoring access control rule for this user] [name: %s] [resource_id: %s]", name, resourceID) log.Warn().
Str("name", name).
Str("resource_id", resourceID).
Msg("unknown user name in access control label, ignoring access control rule for this user")
continue continue
} }
@ -114,7 +121,11 @@ func (transport *Transport) createPrivateResourceControl(resourceIdentifier stri
err := transport.dataStore.ResourceControl().Create(resourceControl) err := transport.dataStore.ResourceControl().Create(resourceControl)
if err != nil { if err != nil {
log.Printf("[ERROR] [http,proxy,docker,transport] [message: unable to persist resource control] [resource: %s] [err: %s]", resourceIdentifier, err) log.Error().
Str("resource", resourceIdentifier).
Err(err).
Msg("unable to persist resource control")
return nil, err return nil, err
} }
@ -148,7 +159,10 @@ func (transport *Transport) getInheritedResourceControlFromServiceOrStack(resour
func (transport *Transport) applyAccessControlOnResource(parameters *resourceOperationParameters, responseObject map[string]interface{}, response *http.Response, executor *operationExecutor) error { func (transport *Transport) applyAccessControlOnResource(parameters *resourceOperationParameters, responseObject map[string]interface{}, response *http.Response, executor *operationExecutor) error {
if responseObject[parameters.resourceIdentifierAttribute] == nil { if responseObject[parameters.resourceIdentifierAttribute] == nil {
log.Printf("[WARN] [message: unable to find resource identifier property in resource object] [identifier_attribute: %s]", parameters.resourceIdentifierAttribute) log.Warn().
Str("identifier_attribute", parameters.resourceIdentifierAttribute).
Msg("unable to find resource identifier property in resource object")
return nil return nil
} }
@ -195,7 +209,10 @@ func (transport *Transport) decorateResourceList(parameters *resourceOperationPa
resourceObject := resource.(map[string]interface{}) resourceObject := resource.(map[string]interface{})
if resourceObject[parameters.resourceIdentifierAttribute] == nil { if resourceObject[parameters.resourceIdentifierAttribute] == nil {
log.Printf("[WARN] [http,proxy,docker,decorate] [message: unable to find resource identifier property in resource list element] [identifier_attribute: %s]", parameters.resourceIdentifierAttribute) log.Warn().
Str("identifier_attribute", parameters.resourceIdentifierAttribute).
Msg("unable to find resource identifier property in resource list element")
continue continue
} }
@ -232,7 +249,10 @@ func (transport *Transport) filterResourceList(parameters *resourceOperationPara
for _, resource := range resourceData { for _, resource := range resourceData {
resourceObject := resource.(map[string]interface{}) resourceObject := resource.(map[string]interface{})
if resourceObject[parameters.resourceIdentifierAttribute] == nil { if resourceObject[parameters.resourceIdentifierAttribute] == nil {
log.Printf("[WARN] [http,proxy,docker,filter] [message: unable to find resource identifier property in resource list element] [identifier_attribute: %s]", parameters.resourceIdentifierAttribute) log.Warn().
Str("identifier_attribute", parameters.resourceIdentifierAttribute).
Msg("unable to find resource identifier property in resource list element")
continue continue
} }

View file

@ -5,11 +5,12 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"io/ioutil" "io/ioutil"
"log"
"mime" "mime"
"net/http" "net/http"
"github.com/portainer/portainer/api/archive" "github.com/portainer/portainer/api/archive"
"github.com/rs/zerolog/log"
) )
const OneMegabyte = 1024768 const OneMegabyte = 1024768
@ -78,7 +79,7 @@ func buildOperation(request *http.Request) error {
defer f.Close() defer f.Close()
log.Printf("[INFO] [http,proxy,docker] [message: upload the file to build image] [filename: %s] [size: %d]", hdr.Filename, hdr.Size) log.Info().Str("filename", hdr.Filename).Int64("size", hdr.Size).Msg("upload the file to build image")
content, err := ioutil.ReadAll(f) content, err := ioutil.ReadAll(f)
if err != nil { if err != nil {

View file

@ -7,7 +7,6 @@ import (
"errors" "errors"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log"
"net/http" "net/http"
"path" "path"
"regexp" "regexp"
@ -21,6 +20,8 @@ import (
"github.com/portainer/portainer/api/http/proxy/factory/utils" "github.com/portainer/portainer/api/http/proxy/factory/utils"
"github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/http/security"
"github.com/portainer/portainer/api/internal/authorization" "github.com/portainer/portainer/api/internal/authorization"
"github.com/rs/zerolog/log"
) )
var apiVersionRe = regexp.MustCompile(`(/v[0-9]\.[0-9]*)?`) var apiVersionRe = regexp.MustCompile(`(/v[0-9]\.[0-9]*)?`)
@ -422,6 +423,7 @@ func (transport *Transport) proxyImageRequest(request *http.Request) (*http.Resp
func (transport *Transport) replaceRegistryAuthenticationHeader(request *http.Request) (*http.Response, error) { func (transport *Transport) replaceRegistryAuthenticationHeader(request *http.Request) (*http.Response, error) {
transport.decorateRegistryAuthenticationHeader(request) transport.decorateRegistryAuthenticationHeader(request)
return transport.decorateGenericResourceCreationOperation(request, serviceObjectIdentifier, portainer.ServiceResourceControl) return transport.decorateGenericResourceCreationOperation(request, serviceObjectIdentifier, portainer.ServiceResourceControl)
} }
@ -601,7 +603,8 @@ func (transport *Transport) decorateGenericResourceCreationResponse(response *ht
} }
if responseObject[resourceIdentifierAttribute] == nil { if responseObject[resourceIdentifierAttribute] == nil {
log.Printf("[ERROR] [proxy,docker]") log.Error().Msg("missing identifier in Docker resource creation response")
return errors.New("missing identifier in Docker resource creation response") return errors.New("missing identifier in Docker resource creation response")
} }
@ -754,6 +757,7 @@ func (transport *Transport) createOperationContext(request *http.Request) (*rest
for _, membership := range teamMemberships { for _, membership := range teamMemberships {
userTeamIDs = append(userTeamIDs, membership.TeamID) userTeamIDs = append(userTeamIDs, membership.TeamID)
} }
operationContext.userTeamIDs = userTeamIDs operationContext.userTeamIDs = userTeamIDs
} }

View file

@ -6,18 +6,18 @@ import (
"errors" "errors"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log"
"net/http" "net/http"
"path" "path"
"regexp" "regexp"
"strconv" "strconv"
"strings" "strings"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/dataservices" "github.com/portainer/portainer/api/dataservices"
"github.com/portainer/portainer/api/http/security" "github.com/portainer/portainer/api/http/security"
"github.com/portainer/portainer/api/kubernetes/cli" "github.com/portainer/portainer/api/kubernetes/cli"
portainer "github.com/portainer/portainer/api" "github.com/rs/zerolog/log"
) )
type baseTransport struct { type baseTransport struct {
@ -132,7 +132,10 @@ func (transport *baseTransport) getRoundTripToken(request *http.Request, tokenMa
} else { } else {
token, err = tokenManager.GetUserServiceAccountToken(int(tokenData.ID), transport.endpoint.ID) token, err = tokenManager.GetUserServiceAccountToken(int(tokenData.ID), transport.endpoint.ID)
if err != nil { if err != nil {
log.Printf("Failed retrieving service account token: %v", err) log.Debug().
Err(err).
Msg("failed retrieving service account token")
return "", err return "", err
} }
} }

View file

@ -3,10 +3,12 @@ package utils
import ( import (
"bytes" "bytes"
"errors" "errors"
"fmt"
"io/ioutil" "io/ioutil"
"log"
"net/http" "net/http"
"strconv" "strconv"
"github.com/rs/zerolog/log"
) )
// GetResponseAsJSONObject returns the response content as a generic JSON object // GetResponseAsJSONObject returns the response content as a generic JSON object
@ -34,10 +36,17 @@ func GetResponseAsJSONArray(response *http.Response) ([]interface{}, error) {
if responseObject["message"] != nil { if responseObject["message"] != nil {
return nil, errors.New(responseObject["message"].(string)) return nil, errors.New(responseObject["message"].(string))
} }
log.Printf("[ERROR] [http,proxy,response] [message: invalid response format, expecting JSON array] [response: %+v]", responseObject)
log.Error().
Str("response", fmt.Sprintf("%+v", responseObject)).
Msg("invalid response format, expecting JSON array")
return nil, errors.New("unable to parse response: expected JSON array, got JSON object") return nil, errors.New("unable to parse response: expected JSON array, got JSON object")
default: default:
log.Printf("[ERROR] [http,proxy,response] [message: invalid response format, expecting JSON array] [response: %+v]", responseObject) log.Error().
Str("response", fmt.Sprintf("%+v", responseObject)).
Msg("invalid response format, expecting JSON array")
return nil, errors.New("unable to parse response: expected JSON array") return nil, errors.New("unable to parse response: expected JSON array")
} }
} }
@ -50,6 +59,7 @@ type errorResponse struct {
func WriteAccessDeniedResponse() (*http.Response, error) { func WriteAccessDeniedResponse() (*http.Response, error) {
response := &http.Response{} response := &http.Response{}
err := RewriteResponse(response, errorResponse{Message: "access denied to resource"}, http.StatusForbidden) err := RewriteResponse(response, errorResponse{Message: "access denied to resource"}, http.StatusForbidden)
return response, err return response, err
} }

View file

@ -2,7 +2,8 @@ package security
import ( import (
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog/log"
) )
type PasswordStrengthChecker interface { type PasswordStrengthChecker interface {
@ -23,7 +24,8 @@ func NewPasswordStrengthChecker(settings settingsService) *passwordStrengthCheck
func (c *passwordStrengthChecker) Check(password string) bool { func (c *passwordStrengthChecker) Check(password string) bool {
s, err := c.settings.Settings() s, err := c.settings.Settings()
if err != nil { if err != nil {
logrus.WithError(err).Warn("failed to fetch Portainer settings to validate user password") log.Warn().Err(err).Msg("failed to fetch Portainer settings to validate user password")
return true return true
} }

View file

@ -3,8 +3,6 @@ package http
import ( import (
"context" "context"
"crypto/tls" "crypto/tls"
"fmt"
"log"
"net/http" "net/http"
"path/filepath" "path/filepath"
"time" "time"
@ -64,6 +62,8 @@ import (
"github.com/portainer/portainer/api/kubernetes/cli" "github.com/portainer/portainer/api/kubernetes/cli"
"github.com/portainer/portainer/api/scheduler" "github.com/portainer/portainer/api/scheduler"
stackdeployer "github.com/portainer/portainer/api/stacks" stackdeployer "github.com/portainer/portainer/api/stacks"
"github.com/rs/zerolog/log"
) )
// Server implements the portainer.Server interface // Server implements the portainer.Server interface
@ -319,21 +319,22 @@ func (server *Server) Start() error {
handler := adminMonitor.WithRedirect(offlineGate.WaitingMiddleware(time.Minute, server.Handler)) handler := adminMonitor.WithRedirect(offlineGate.WaitingMiddleware(time.Minute, server.Handler))
if server.HTTPEnabled { if server.HTTPEnabled {
go func() { go func() {
log.Printf("[INFO] [http,server] [message: starting HTTP server on port %s]", server.BindAddress) log.Info().Str("bind_address", server.BindAddress).Msg("starting HTTP server")
httpServer := &http.Server{ httpServer := &http.Server{
Addr: server.BindAddress, Addr: server.BindAddress,
Handler: handler, Handler: handler,
} }
go shutdown(server.ShutdownCtx, httpServer) go shutdown(server.ShutdownCtx, httpServer)
err := httpServer.ListenAndServe() err := httpServer.ListenAndServe()
if err != nil && err != http.ErrServerClosed { if err != nil && err != http.ErrServerClosed {
log.Printf("[ERROR] [message: http server failed] [error: %s]", err) log.Error().Err(err).Msg("HTTP server failed to start")
} }
}() }()
} }
log.Printf("[INFO] [http,server] [message: starting HTTPS server on port %s]", server.BindAddressHTTPS) log.Info().Str("bind_address", server.BindAddressHTTPS).Msg("starting HTTPS server")
httpsServer := &http.Server{ httpsServer := &http.Server{
Addr: server.BindAddressHTTPS, Addr: server.BindAddressHTTPS,
Handler: handler, Handler: handler,
@ -345,18 +346,21 @@ func (server *Server) Start() error {
} }
go shutdown(server.ShutdownCtx, httpsServer) go shutdown(server.ShutdownCtx, httpsServer)
return httpsServer.ListenAndServeTLS("", "") return httpsServer.ListenAndServeTLS("", "")
} }
func shutdown(shutdownCtx context.Context, httpServer *http.Server) { func shutdown(shutdownCtx context.Context, httpServer *http.Server) {
<-shutdownCtx.Done() <-shutdownCtx.Done()
log.Println("[DEBUG] [http,server] [message: shutting down http server]") log.Debug().Msg("shutting down the HTTP server")
shutdownTimeout, cancel := context.WithTimeout(context.Background(), 30*time.Second) shutdownTimeout, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel() defer cancel()
err := httpServer.Shutdown(shutdownTimeout) err := httpServer.Shutdown(shutdownTimeout)
if err != nil { if err != nil {
fmt.Printf("[ERROR] [http,server] [message: failed shutdown http server] [error: %s]", err) log.Error().
Err(err).
Msg("failed to shut down the HTTP server")
} }
} }

View file

@ -3,11 +3,11 @@ package registryutils
import ( import (
"time" "time"
log "github.com/sirupsen/logrus"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/aws/ecr" "github.com/portainer/portainer/api/aws/ecr"
"github.com/portainer/portainer/api/dataservices" "github.com/portainer/portainer/api/dataservices"
"github.com/rs/zerolog/log"
) )
func isRegTokenValid(registry *portainer.Registry) (valid bool) { func isRegTokenValid(registry *portainer.Registry) (valid bool) {
@ -37,11 +37,11 @@ func parseRegToken(registry *portainer.Registry) (username, password string, err
func EnsureRegTokenValid(dataStore dataservices.DataStore, registry *portainer.Registry) (err error) { func EnsureRegTokenValid(dataStore dataservices.DataStore, registry *portainer.Registry) (err error) {
if registry.Type == portainer.EcrRegistry { if registry.Type == portainer.EcrRegistry {
if isRegTokenValid(registry) { if isRegTokenValid(registry) {
log.Println("[DEBUG] [registry, GetEcrAccessToken] [message: current ECR token is still valid]") log.Debug().Msg("current ECR token is still valid")
} else { } else {
err = doGetRegToken(dataStore, registry) err = doGetRegToken(dataStore, registry)
if err != nil { if err != nil {
log.Println("[DEBUG] [registry, GetEcrAccessToken] [message: refresh ECR token]") log.Debug().Msg("refresh ECR token")
} }
} }
} }

View file

@ -4,13 +4,14 @@ import (
"context" "context"
"crypto/tls" "crypto/tls"
"errors" "errors"
"log"
"time" "time"
portainer "github.com/portainer/portainer/api" portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/agent" "github.com/portainer/portainer/api/agent"
"github.com/portainer/portainer/api/crypto" "github.com/portainer/portainer/api/crypto"
"github.com/portainer/portainer/api/dataservices" "github.com/portainer/portainer/api/dataservices"
"github.com/rs/zerolog/log"
) )
// Service repesents a service to manage environment(endpoint) snapshots. // Service repesents a service to manage environment(endpoint) snapshots.
@ -149,7 +150,7 @@ func (service *Service) startSnapshotLoop() {
err := service.snapshotEndpoints() err := service.snapshotEndpoints()
if err != nil { if err != nil {
log.Printf("[ERROR] [internal,snapshot] [message: background schedule error (environment snapshot).] [error: %s]", err) log.Error().Err(err).Msg("background schedule error (environment snapshot)")
} }
for { for {
@ -157,10 +158,10 @@ func (service *Service) startSnapshotLoop() {
case <-ticker.C: case <-ticker.C:
err := service.snapshotEndpoints() err := service.snapshotEndpoints()
if err != nil { if err != nil {
log.Printf("[ERROR] [internal,snapshot] [message: background schedule error (environment snapshot).] [error: %s]", err) log.Error().Err(err).Msg("background schedule error (environment snapshot)")
} }
case <-service.shutdownCtx.Done(): case <-service.shutdownCtx.Done():
log.Println("[DEBUG] [internal,snapshot] [message: shutting down snapshotting]") log.Debug().Msg("shutting down snapshotting")
ticker.Stop() ticker.Stop()
return return
case interval := <-service.snapshotIntervalCh: case interval := <-service.snapshotIntervalCh:
@ -184,13 +185,21 @@ func (service *Service) snapshotEndpoints() error {
latestEndpointReference, err := service.dataStore.Endpoint().Endpoint(endpoint.ID) latestEndpointReference, err := service.dataStore.Endpoint().Endpoint(endpoint.ID)
if latestEndpointReference == nil { if latestEndpointReference == nil {
log.Printf("background schedule error (environment snapshot). Environment not found inside the database anymore (endpoint=%s, URL=%s) (err=%s)\n", endpoint.Name, endpoint.URL, err) log.Debug().
Str("endpoint", endpoint.Name).
Str("URL", endpoint.URL).Err(err).
Msg("background schedule error (environment snapshot), environment not found inside the database anymore")
continue continue
} }
latestEndpointReference.Status = portainer.EndpointStatusUp latestEndpointReference.Status = portainer.EndpointStatusUp
if snapshotError != nil { if snapshotError != nil {
log.Printf("background schedule error (environment snapshot). Unable to create snapshot (endpoint=%s, URL=%s) (err=%s)\n", endpoint.Name, endpoint.URL, snapshotError) log.Debug().
Str("endpoint", endpoint.Name).
Str("URL", endpoint.URL).Err(err).
Msg("background schedule error (environment snapshot), unable to create snapshot")
latestEndpointReference.Status = portainer.EndpointStatusDown latestEndpointReference.Status = portainer.EndpointStatusDown
} }
@ -200,7 +209,11 @@ func (service *Service) snapshotEndpoints() error {
err = service.dataStore.Endpoint().UpdateEndpoint(latestEndpointReference.ID, latestEndpointReference) err = service.dataStore.Endpoint().UpdateEndpoint(latestEndpointReference.ID, latestEndpointReference)
if err != nil { if err != nil {
log.Printf("background schedule error (environment snapshot). Unable to update environment (endpoint=%s, URL=%s) (err=%s)\n", endpoint.Name, endpoint.URL, err) log.Debug().
Str("endpoint", endpoint.Name).
Str("URL", endpoint.URL).Err(err).
Msg("background schedule error (environment snapshot), unable to update environment")
continue continue
} }
} }

Some files were not shown because too many files have changed in this diff Show more