Skip to content

Commit 70db875

Browse files
authored
[client] Add --disable-update-settings flag to the service (#4335)
[client] Add --disable-update-settings flag to the service (#4335)
1 parent 86a00ab commit 70db875

File tree

12 files changed

+354
-74
lines changed

12 files changed

+354
-74
lines changed

client/cmd/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ var (
7373
dnsRouteInterval time.Duration
7474
lazyConnEnabled bool
7575
profilesDisabled bool
76+
updateSettingsDisabled bool
7677

7778
rootCmd = &cobra.Command{
7879
Use: "netbird",

client/cmd/service.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ func init() {
4242
}
4343

4444
serviceCmd.AddCommand(runCmd, startCmd, stopCmd, restartCmd, svcStatusCmd, installCmd, uninstallCmd, reconfigureCmd)
45-
serviceCmd.PersistentFlags().BoolVar(&profilesDisabled, "disable-profiles", false, "Disables profiles feature. If enabled, the client will not be able to change or edit any profile.")
45+
serviceCmd.PersistentFlags().BoolVar(&profilesDisabled, "disable-profiles", false, "Disables profiles feature. If enabled, the client will not be able to change or edit any profile. To persist this setting, use: netbird service install --disable-profiles")
46+
serviceCmd.PersistentFlags().BoolVar(&updateSettingsDisabled, "disable-update-settings", false, "Disables update settings feature. If enabled, the client will not be able to change or edit any settings. To persist this setting, use: netbird service install --disable-update-settings")
4647

4748
rootCmd.PersistentFlags().StringVarP(&serviceName, "service", "s", defaultServiceName, "Netbird system service name")
4849
serviceEnvDesc := `Sets extra environment variables for the service. ` +

client/cmd/service_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func (p *program) Start(svc service.Service) error {
6161
}
6262
}
6363

64-
serverInstance := server.New(p.ctx, util.FindFirstLogPath(logFiles), configPath, profilesDisabled)
64+
serverInstance := server.New(p.ctx, util.FindFirstLogPath(logFiles), configPath, profilesDisabled, updateSettingsDisabled)
6565
if err := serverInstance.Start(); err != nil {
6666
log.Fatalf("failed to start daemon: %v", err)
6767
}

client/cmd/service_installer.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@ func buildServiceArguments() []string {
4949
args = append(args, "--log-file", logFile)
5050
}
5151

52+
if profilesDisabled {
53+
args = append(args, "--disable-profiles")
54+
}
55+
56+
if updateSettingsDisabled {
57+
args = append(args, "--disable-update-settings")
58+
}
59+
5260
return args
5361
}
5462

client/cmd/testutil_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ import (
2727

2828
clientProto "github.com/netbirdio/netbird/client/proto"
2929
client "github.com/netbirdio/netbird/client/server"
30-
mgmtProto "github.com/netbirdio/netbird/shared/management/proto"
3130
mgmt "github.com/netbirdio/netbird/management/server"
31+
mgmtProto "github.com/netbirdio/netbird/shared/management/proto"
3232
sigProto "github.com/netbirdio/netbird/shared/signal/proto"
3333
sig "github.com/netbirdio/netbird/signal/server"
3434
)
@@ -136,7 +136,7 @@ func startClientDaemon(
136136
s := grpc.NewServer()
137137

138138
server := client.New(ctx,
139-
"", "", false)
139+
"", "", false, false)
140140
if err := server.Start(); err != nil {
141141
t.Fatal(err)
142142
}

client/proto/daemon.pb.go

Lines changed: 147 additions & 50 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/proto/daemon.proto

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ service DaemonService {
8282

8383
// Logout disconnects from the network and deletes the peer from the management server
8484
rpc Logout(LogoutRequest) returns (LogoutResponse) {}
85+
86+
rpc GetFeatures(GetFeaturesRequest) returns (GetFeaturesResponse) {}
8587
}
8688

8789

@@ -624,4 +626,11 @@ message LogoutRequest {
624626
optional string username = 2;
625627
}
626628

627-
message LogoutResponse {}
629+
message LogoutResponse {}
630+
631+
message GetFeaturesRequest{}
632+
633+
message GetFeaturesResponse{
634+
bool disable_profiles = 1;
635+
bool disable_update_settings = 2;
636+
}

client/proto/daemon_grpc.pb.go

Lines changed: 36 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/server/server.go

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ const (
4646
defaultMaxRetryTime = 14 * 24 * time.Hour
4747
defaultRetryMultiplier = 1.7
4848

49-
errRestoreResidualState = "failed to restore residual state: %v"
50-
errProfilesDisabled = "profiles are disabled, you cannot use this feature without profiles enabled"
49+
errRestoreResidualState = "failed to restore residual state: %v"
50+
errProfilesDisabled = "profiles are disabled, you cannot use this feature without profiles enabled"
51+
errUpdateSettingsDisabled = "update settings are disabled, you cannot use this feature without update settings enabled"
5152
)
5253

5354
var ErrServiceNotUp = errors.New("service is not up")
@@ -74,8 +75,9 @@ type Server struct {
7475
persistSyncResponse bool
7576
isSessionActive atomic.Bool
7677

77-
profileManager *profilemanager.ServiceManager
78-
profilesDisabled bool
78+
profileManager *profilemanager.ServiceManager
79+
profilesDisabled bool
80+
updateSettingsDisabled bool
7981
}
8082

8183
type oauthAuthFlow struct {
@@ -86,14 +88,15 @@ type oauthAuthFlow struct {
8688
}
8789

8890
// New server instance constructor.
89-
func New(ctx context.Context, logFile string, configFile string, profilesDisabled bool) *Server {
91+
func New(ctx context.Context, logFile string, configFile string, profilesDisabled bool, updateSettingsDisabled bool) *Server {
9092
return &Server{
91-
rootCtx: ctx,
92-
logFile: logFile,
93-
persistSyncResponse: true,
94-
statusRecorder: peer.NewRecorder(""),
95-
profileManager: profilemanager.NewServiceManager(configFile),
96-
profilesDisabled: profilesDisabled,
93+
rootCtx: ctx,
94+
logFile: logFile,
95+
persistSyncResponse: true,
96+
statusRecorder: peer.NewRecorder(""),
97+
profileManager: profilemanager.NewServiceManager(configFile),
98+
profilesDisabled: profilesDisabled,
99+
updateSettingsDisabled: updateSettingsDisabled,
97100
}
98101
}
99102

@@ -322,8 +325,8 @@ func (s *Server) SetConfig(callerCtx context.Context, msg *proto.SetConfigReques
322325
s.mutex.Lock()
323326
defer s.mutex.Unlock()
324327

325-
if s.checkProfilesDisabled() {
326-
return nil, gstatus.Errorf(codes.Unavailable, errProfilesDisabled)
328+
if s.checkUpdateSettingsDisabled() {
329+
return nil, gstatus.Errorf(codes.Unavailable, errUpdateSettingsDisabled)
327330
}
328331

329332
profState := profilemanager.ActiveProfileState{
@@ -1330,10 +1333,31 @@ func (s *Server) GetActiveProfile(ctx context.Context, msg *proto.GetActiveProfi
13301333
}, nil
13311334
}
13321335

1336+
// GetFeatures returns the features supported by the daemon.
1337+
func (s *Server) GetFeatures(ctx context.Context, msg *proto.GetFeaturesRequest) (*proto.GetFeaturesResponse, error) {
1338+
s.mutex.Lock()
1339+
defer s.mutex.Unlock()
1340+
1341+
features := &proto.GetFeaturesResponse{
1342+
DisableProfiles: s.checkProfilesDisabled(),
1343+
DisableUpdateSettings: s.checkUpdateSettingsDisabled(),
1344+
}
1345+
1346+
return features, nil
1347+
}
1348+
13331349
func (s *Server) checkProfilesDisabled() bool {
13341350
// Check if the environment variable is set to disable profiles
13351351
if s.profilesDisabled {
1336-
log.Warn("Profiles are disabled via NB_DISABLE_PROFILES environment variable")
1352+
return true
1353+
}
1354+
1355+
return false
1356+
}
1357+
1358+
func (s *Server) checkUpdateSettingsDisabled() bool {
1359+
// Check if the environment variable is set to disable profiles
1360+
if s.updateSettingsDisabled {
13371361
return true
13381362
}
13391363

client/server/server_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"github.com/netbirdio/netbird/client/internal/peer"
2626
"github.com/netbirdio/netbird/client/internal/profilemanager"
2727
daemonProto "github.com/netbirdio/netbird/client/proto"
28-
mgmtProto "github.com/netbirdio/netbird/shared/management/proto"
2928
"github.com/netbirdio/netbird/management/server"
3029
"github.com/netbirdio/netbird/management/server/activity"
3130
"github.com/netbirdio/netbird/management/server/integrations/port_forwarding"
@@ -34,6 +33,7 @@ import (
3433
"github.com/netbirdio/netbird/management/server/store"
3534
"github.com/netbirdio/netbird/management/server/telemetry"
3635
"github.com/netbirdio/netbird/management/server/types"
36+
mgmtProto "github.com/netbirdio/netbird/shared/management/proto"
3737
"github.com/netbirdio/netbird/shared/signal/proto"
3838
signalServer "github.com/netbirdio/netbird/signal/server"
3939
)
@@ -95,7 +95,7 @@ func TestConnectWithRetryRuns(t *testing.T) {
9595
t.Fatalf("failed to set active profile state: %v", err)
9696
}
9797

98-
s := New(ctx, "debug", "", false)
98+
s := New(ctx, "debug", "", false, false)
9999

100100
s.config = config
101101

@@ -152,7 +152,7 @@ func TestServer_Up(t *testing.T) {
152152
t.Fatalf("failed to set active profile state: %v", err)
153153
}
154154

155-
s := New(ctx, "console", "", false)
155+
s := New(ctx, "console", "", false, false)
156156

157157
err = s.Start()
158158
require.NoError(t, err)
@@ -228,7 +228,7 @@ func TestServer_SubcribeEvents(t *testing.T) {
228228
t.Fatalf("failed to set active profile state: %v", err)
229229
}
230230

231-
s := New(ctx, "console", "", false)
231+
s := New(ctx, "console", "", false, false)
232232

233233
err = s.Start()
234234
require.NoError(t, err)

0 commit comments

Comments
 (0)