diff --git a/.github/workflows/markdown.yml b/.github/workflows/markdown.yml index dd8177ba..74782f4e 100644 --- a/.github/workflows/markdown.yml +++ b/.github/workflows/markdown.yml @@ -20,7 +20,7 @@ jobs: steps: - uses: actions/checkout@v5 - - uses: DavidAnson/markdownlint-cli2-action@v20 + - uses: DavidAnson/markdownlint-cli2-action@v21 with: globs: "**.md" config: .markdownlint-cli2.jsonc diff --git a/internal/cli/nooplogger.go b/internal/cli/nooplogger.go index 86753309..aa66ce50 100644 --- a/internal/cli/nooplogger.go +++ b/internal/cli/nooplogger.go @@ -7,3 +7,4 @@ func newNoopLogger() *noopLogger { } func (l *noopLogger) Info(string) {} +func (l *noopLogger) Warn(string) {} diff --git a/internal/cli/update.go b/internal/cli/update.go index ae05bd23..2acad8ae 100644 --- a/internal/cli/update.go +++ b/internal/cli/update.go @@ -81,7 +81,11 @@ func (c *CLI) Update(ctx context.Context, args []string, logger UpdaterLogger) e return fmt.Errorf("options validation failed: %w", err) } - storage, err := storage.New(logger, constants.ServersData) + serversDataPath := constants.ServersData + if maintainerMode { + serversDataPath = "" + } + storage, err := storage.New(logger, serversDataPath) if err != nil { return fmt.Errorf("creating servers storage: %w", err) } diff --git a/internal/dns/run.go b/internal/dns/run.go index 5a73e352..b0d35578 100644 --- a/internal/dns/run.go +++ b/internal/dns/run.go @@ -38,7 +38,6 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { if err == nil { l.backoffTime = defaultBackoffTime l.logger.Info("ready") - l.signalOrSetStatus(constants.Running) break } @@ -54,6 +53,7 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { } l.logAndWait(ctx, err) } + l.signalOrSetStatus(constants.Running) const fallback = false l.useUnencryptedDNS(fallback) diff --git a/internal/provider/protonvpn/updater/api.go b/internal/provider/protonvpn/updater/api.go index 55ed516b..006f6739 100644 --- a/internal/provider/protonvpn/updater/api.go +++ b/internal/provider/protonvpn/updater/api.go @@ -371,7 +371,7 @@ func (c *apiClient) authInfo(ctx context.Context, username string, unauthCookie case info.SRPSession == "": return "", "", "", "", 0, fmt.Errorf("%w: SRP session is empty", ErrDataFieldMissing) - case info.Username != username: + case !strings.EqualFold(info.Username, username): return "", "", "", "", 0, fmt.Errorf("%w: expected %s got %s", ErrUsernameMismatch, username, info.Username) case info.Version == nil: diff --git a/internal/storage/mocks_generate_test.go b/internal/storage/mocks_generate_test.go index 7227fef6..34399c07 100644 --- a/internal/storage/mocks_generate_test.go +++ b/internal/storage/mocks_generate_test.go @@ -1,3 +1,3 @@ package storage -//go:generate mockgen -destination=mocks_test.go -package $GOPACKAGE . Infoer +//go:generate mockgen -destination=mocks_test.go -package $GOPACKAGE . Logger diff --git a/internal/storage/mocks_test.go b/internal/storage/mocks_test.go index 7f701b14..e99aa5c3 100644 --- a/internal/storage/mocks_test.go +++ b/internal/storage/mocks_test.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/qdm12/gluetun/internal/storage (interfaces: Infoer) +// Source: github.com/qdm12/gluetun/internal/storage (interfaces: Logger) // Package storage is a generated GoMock package. package storage @@ -10,37 +10,49 @@ import ( gomock "github.com/golang/mock/gomock" ) -// MockInfoer is a mock of Infoer interface. -type MockInfoer struct { +// MockLogger is a mock of Logger interface. +type MockLogger struct { ctrl *gomock.Controller - recorder *MockInfoerMockRecorder + recorder *MockLoggerMockRecorder } -// MockInfoerMockRecorder is the mock recorder for MockInfoer. -type MockInfoerMockRecorder struct { - mock *MockInfoer +// MockLoggerMockRecorder is the mock recorder for MockLogger. +type MockLoggerMockRecorder struct { + mock *MockLogger } -// NewMockInfoer creates a new mock instance. -func NewMockInfoer(ctrl *gomock.Controller) *MockInfoer { - mock := &MockInfoer{ctrl: ctrl} - mock.recorder = &MockInfoerMockRecorder{mock} +// NewMockLogger creates a new mock instance. +func NewMockLogger(ctrl *gomock.Controller) *MockLogger { + mock := &MockLogger{ctrl: ctrl} + mock.recorder = &MockLoggerMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockInfoer) EXPECT() *MockInfoerMockRecorder { +func (m *MockLogger) EXPECT() *MockLoggerMockRecorder { return m.recorder } // Info mocks base method. -func (m *MockInfoer) Info(arg0 string) { +func (m *MockLogger) Info(arg0 string) { m.ctrl.T.Helper() m.ctrl.Call(m, "Info", arg0) } // Info indicates an expected call of Info. -func (mr *MockInfoerMockRecorder) Info(arg0 interface{}) *gomock.Call { +func (mr *MockLoggerMockRecorder) Info(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Info", reflect.TypeOf((*MockInfoer)(nil).Info), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Info", reflect.TypeOf((*MockLogger)(nil).Info), arg0) +} + +// Warn mocks base method. +func (m *MockLogger) Warn(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Warn", arg0) +} + +// Warn indicates an expected call of Warn. +func (mr *MockLoggerMockRecorder) Warn(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Warn", reflect.TypeOf((*MockLogger)(nil).Warn), arg0) } diff --git a/internal/storage/read_test.go b/internal/storage/read_test.go index 60e70efe..20bbe17a 100644 --- a/internal/storage/read_test.go +++ b/internal/storage/read_test.go @@ -95,7 +95,7 @@ func Test_extractServersFromBytes(t *testing.T) { t.Parallel() ctrl := gomock.NewController(t) - logger := NewMockInfoer(ctrl) + logger := NewMockLogger(ctrl) var previousLogCall *gomock.Call for _, logged := range testCase.logged { call := logger.EXPECT().Info(logged) diff --git a/internal/storage/storage.go b/internal/storage/storage.go index 5210b07f..ab0378f8 100644 --- a/internal/storage/storage.go +++ b/internal/storage/storage.go @@ -13,30 +13,35 @@ type Storage struct { // the embedded JSON file on every call to the // SyncServers method. hardcodedServers models.AllServers - logger Infoer + logger Logger filepath string } -type Infoer interface { +type Logger interface { Info(s string) + Warn(s string) } // New creates a new storage and reads the servers from the // embedded servers file and the file on disk. -// Passing an empty filepath disables writing servers to a file. -func New(logger Infoer, filepath string) (storage *Storage, err error) { +// Passing an empty filepath disables the reading and writing of +// servers. +func New(logger Logger, filepath string) (storage *Storage, err error) { // A unit test prevents any error from being returned // and ensures all providers are part of the servers returned. hardcodedServers, _ := parseHardcodedServers() storage = &Storage{ hardcodedServers: hardcodedServers, + mergedServers: hardcodedServers, logger: logger, filepath: filepath, } - if err := storage.syncServers(); err != nil { - return nil, err + if filepath != "" { + if err := storage.syncServers(); err != nil { + return nil, err + } } return storage, nil diff --git a/internal/storage/sync.go b/internal/storage/sync.go index 1e0b539b..de355c9c 100644 --- a/internal/storage/sync.go +++ b/internal/storage/sync.go @@ -46,13 +46,13 @@ func (s *Storage) syncServers() (err error) { } // Eventually write file - if s.filepath == "" || reflect.DeepEqual(serversOnFile, s.mergedServers) { + if reflect.DeepEqual(serversOnFile, s.mergedServers) { return nil } err = s.flushToFile(s.filepath) if err != nil { - return fmt.Errorf("writing servers to file: %w", err) + s.logger.Warn("failed writing servers to file: " + err.Error()) } return nil }