Skip to content

Commit e8641eb

Browse files
Decoupled the creation of servers so we can hide dbus behind a build flag and move on to simpler implementations without abandoning dbus completely
1 parent 6e0edc3 commit e8641eb

File tree

5 files changed

+121
-34
lines changed

5 files changed

+121
-34
lines changed

cmd/main.go

+21-12
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package main
22

33
import (
44
"context"
5-
"io"
65
"os"
76
"os/signal"
87
"syscall"
@@ -12,7 +11,7 @@ import (
1211

1312
"github.com/dereulenspiegel/raucgithub"
1413
"github.com/dereulenspiegel/raucgithub/repository/github"
15-
"github.com/dereulenspiegel/raucgithub/server/dbus"
14+
"github.com/dereulenspiegel/raucgithub/server"
1615
)
1716

1817
func setDefaults() {
@@ -46,12 +45,12 @@ func main() {
4645
logger.Info("Starting raucgithub")
4746

4847
var contextCancels []context.CancelFunc
49-
var closers []io.Closer
48+
var servers []server.Server
5049
defer func() {
5150
for _, cancelFunc := range contextCancels {
5251
cancelFunc()
5352
}
54-
for _, closer := range closers {
53+
for _, closer := range servers {
5554
closer.Close()
5655
}
5756
}()
@@ -73,15 +72,25 @@ func main() {
7372
logger.WithError(err).Fatal("failed to create update manager")
7473
}
7574

76-
dbusConfig := viper.Sub("dbus")
77-
dbusCtx, dbusCancel := context.WithCancel(ctx)
78-
contextCancels = append(contextCancels, dbusCancel)
79-
dbusServer, err := dbus.StartWithConfig(dbusCtx, manager, dbusConfig)
80-
if err != nil {
81-
logger.WithError(err).Error("failed to start dbus server")
82-
} else {
83-
closers = append(closers, dbusServer)
75+
serverBuilders := server.Builders()
76+
77+
for _, builder := range serverBuilders {
78+
logger := logger.WithField("server", builder.Name())
79+
logger.Info("configuring server")
80+
serverConfig := viper.Sub(builder.ConfigKey())
81+
serverCtx, serverCancel := context.WithCancel(ctx)
82+
contextCancels = append(contextCancels, serverCancel)
83+
server, err := builder.New(manager, serverConfig)
84+
if err != nil {
85+
logger.WithError(err).Error("failed to configure server")
86+
}
87+
servers = append(servers, server)
88+
logger.Info("starting server")
89+
if err := server.Start(serverCtx); err != nil {
90+
logger.WithError(err).Error("failed to start server")
91+
}
8492
}
93+
8594
logger.Info("Started successfully, waiting...")
8695
}()
8796

server/dbus.go

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//go:build dbus
2+
3+
package server
4+
5+
import (
6+
"github.com/dereulenspiegel/raucgithub"
7+
"github.com/dereulenspiegel/raucgithub/server/dbus"
8+
"github.com/spf13/viper"
9+
)
10+
11+
func init() {
12+
RegisterBuilder("dbus", DBusBuilder{})
13+
}
14+
15+
type DBusBuilder struct{}
16+
17+
func (b DBusBuilder) Name() string {
18+
return "DBus"
19+
}
20+
21+
func (b DBusBuilder) ConfigKey() string {
22+
return "dbus"
23+
}
24+
25+
func (b DBusBuilder) New(manager *raucgithub.UpdateManager, conf *viper.Viper) (Server, error) {
26+
return dbus.NewWithConfig(manager, conf)
27+
}

server/dbus/server.go

+18-12
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
//go:build dbus
2+
13
package dbus
24

35
import (
@@ -46,21 +48,27 @@ type Server struct {
4648

4749
type Option func(*Server) *Server
4850

49-
func StartWithConfig(ctx context.Context, manager *raucgithub.UpdateManager, conf *viper.Viper) (*Server, error) {
51+
func NewWithConfig(manager *raucgithub.UpdateManager, conf *viper.Viper) (*Server, error) {
5052
enabled := viper.GetBool("enabled")
5153
if !enabled {
5254
return nil, errors.New("dbus server not enabled")
5355
}
54-
return Start(ctx, manager)
56+
return New(manager)
5557
}
5658

57-
func Start(ctx context.Context, manager *raucgithub.UpdateManager, opts ...Option) (s *Server, err error) {
59+
func New(manager *raucgithub.UpdateManager, opts ...Option) (s *Server, err error) {
5860
s = &Server{
59-
logger: logrus.WithField("component", "dbusServer"),
61+
logger: logrus.WithField("component", "dbusServer"),
62+
manager: manager,
6063
}
6164
for _, opt := range opts {
6265
s = opt(s)
6366
}
67+
68+
return s, nil
69+
}
70+
71+
func (s *Server) Start(ctx context.Context) (err error) {
6472
dbusContext, dbusCancel := context.WithCancel(ctx)
6573
s.dbusCancel = dbusCancel
6674

@@ -71,32 +79,30 @@ func Start(ctx context.Context, manager *raucgithub.UpdateManager, opts ...Optio
7179
conn, err = dbus.ConnectSystemBus(dbus.WithContext(dbusContext))
7280
}
7381
if err != nil {
74-
return nil, fmt.Errorf("failed to connect to DBus: %w", err)
82+
return fmt.Errorf("failed to connect to DBus: %w", err)
7583
}
7684

7785
s.conn = conn
78-
s.manager = manager
7986
s.ctx = ctx
8087
if err := conn.Export(s, "/com/github/dereulenspiegel/rauc", "com.github.dereulenspiegel.rauc"); err != nil {
81-
return nil, fmt.Errorf("failed to register DBus service: %w", err)
88+
return fmt.Errorf("failed to register DBus service: %w", err)
8289
}
8390
if err := conn.Export(introspect.Introspectable(intro), "/com/github/dereulenspiegel/rauc",
8491
"org.freedesktop.DBus.Introspectable"); err != nil {
85-
return nil, fmt.Errorf("failed to register DBus introspection: %w", err)
92+
return fmt.Errorf("failed to register DBus introspection: %w", err)
8693
}
8794

8895
reply, err := conn.RequestName("com.github.dereulenspiegel.rauc",
8996
dbus.NameFlagDoNotQueue)
9097
if err != nil {
91-
return nil, fmt.Errorf("failed to request name on system DBus: %w", err)
98+
return fmt.Errorf("failed to request name on system DBus: %w", err)
9299
}
93100
if reply != dbus.RequestNameReplyPrimaryOwner {
94-
return nil, errors.New("name on system DBus already taken")
101+
return errors.New("name on system DBus already taken")
95102
}
96103

97104
s.manager.RegisterUpdateAvailableCallback(s.updateAvailable)
98-
99-
return s, nil
105+
return nil
100106
}
101107

102108
func (s *Server) Close() error {

server/dbus/server_test.go

+15-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
//go:build dbus_test
2-
// +build dbus_test
1+
//go:build dbus && dbus_test
32

43
package dbus
54

@@ -31,11 +30,13 @@ func useSessionBus() Option {
3130
func TestCreateDBusServer(t *testing.T) {
3231
// Creste simple update manager without functionality to get DBus server to startup
3332
manager := &raucgithub.UpdateManager{}
34-
dbusServer, err := Start(context.Background(), manager)
33+
dbusServer, err := New(manager)
34+
require.NoError(t, err)
35+
err = dbusServer.Start(context.Background())
36+
require.NoError(t, err)
3537
t.Cleanup(func() {
3638
dbusServer.Close()
3739
})
38-
require.NoError(t, err)
3940
assert.NotNil(t, dbusServer)
4041
}
4142

@@ -93,12 +94,14 @@ func TestRunningDBusServerIntegration(t *testing.T) {
9394
raucClient.EXPECT().GetProgress().Return(75, "installing", 1, nil)
9495
raucClient.EXPECT().GetOperation().Return("installing", nil)
9596

96-
dbusServer, err := Start(context.Background(), updater, useSessionBus())
97+
dbusServer, err := New(updater, useSessionBus())
98+
require.NoError(t, err)
99+
require.NotNil(t, dbusServer)
100+
err = dbusServer.Start(context.Background())
101+
require.NoError(t, err)
97102
t.Cleanup(func() {
98103
dbusServer.Close()
99104
})
100-
require.NoError(t, err)
101-
assert.NotNil(t, dbusServer)
102105

103106
cmd := exec.Command("./test_run_update.py")
104107
stdoutStderr, err := cmd.CombinedOutput()
@@ -156,12 +159,14 @@ func TestNewUpdateSignal(t *testing.T) {
156159
},
157160
}, nil)
158161

159-
dbusServer, err := Start(context.Background(), updater, useSessionBus())
162+
dbusServer, err := New(updater, useSessionBus())
163+
require.NoError(t, err)
164+
require.NotNil(t, dbusServer)
165+
err = dbusServer.Start(context.Background())
166+
require.NoError(t, err)
160167
t.Cleanup(func() {
161168
dbusServer.Close()
162169
})
163-
require.NoError(t, err)
164-
assert.NotNil(t, dbusServer)
165170

166171
cmd := exec.Command("./test_update_signal.py")
167172
stdoutStderr, err := cmd.CombinedOutput()

server/server.go

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package server
2+
3+
import (
4+
"context"
5+
"io"
6+
"sync"
7+
8+
"github.com/dereulenspiegel/raucgithub"
9+
"github.com/spf13/viper"
10+
)
11+
12+
var (
13+
registryLock = &sync.Mutex{}
14+
registry = make(map[string]Builder)
15+
)
16+
17+
func RegisterBuilder(name string, b Builder) {
18+
registryLock.Lock()
19+
defer registryLock.Unlock()
20+
registry[name] = b
21+
}
22+
23+
func Builders() (builders []Builder) {
24+
registryLock.Lock()
25+
defer registryLock.Unlock()
26+
for _, b := range registry {
27+
builders = append(builders, b)
28+
}
29+
return
30+
}
31+
32+
type Server interface {
33+
io.Closer
34+
Start(context.Context) error
35+
}
36+
type Builder interface {
37+
ConfigKey() string
38+
Name() string
39+
New(*raucgithub.UpdateManager, *viper.Viper) (Server, error)
40+
}

0 commit comments

Comments
 (0)