• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mendersoftware / mender-server / 1600238645

23 Dec 2024 10:30AM UTC coverage: 76.615% (+3.8%) from 72.818%
1600238645

Pull #274

gitlab-ci

bahaa-ghazal
fix: implement signal handler for `server` commands

Changelog: Title
Ticket: QA-782
Signed-off-by: Bahaa Aldeen Ghazal <bahaa.ghazal@northern.tech>
Pull Request #274: fix: implement signal handler for `server` commands

4254 of 6166 branches covered (68.99%)

Branch coverage included in aggregate %.

63 of 91 new or added lines in 8 files covered. (69.23%)

46 existing lines in 5 files now uncovered.

45257 of 58457 relevant lines covered (77.42%)

21.82 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

67.59
/backend/services/deviceauth/server.go
1
// Copyright 2023 Northern.tech AS
2
//
3
//    Licensed under the Apache License, Version 2.0 (the "License");
4
//    you may not use this file except in compliance with the License.
5
//    You may obtain a copy of the License at
6
//
7
//        http://www.apache.org/licenses/LICENSE-2.0
8
//
9
//    Unless required by applicable law or agreed to in writing, software
10
//    distributed under the License is distributed on an "AS IS" BASIS,
11
//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
//    See the License for the specific language governing permissions and
13
//    limitations under the License.
14

15
package main
16

17
import (
18
        "context"
19
        "net/http"
20
        "os"
21
        "os/signal"
22
        "time"
23

24
        "github.com/pkg/errors"
25
        "golang.org/x/sys/unix"
26

27
        "github.com/mendersoftware/mender-server/pkg/config"
28
        "github.com/mendersoftware/mender-server/pkg/log"
29

30
        api_http "github.com/mendersoftware/mender-server/services/deviceauth/api/http"
31
        "github.com/mendersoftware/mender-server/services/deviceauth/cache"
32
        "github.com/mendersoftware/mender-server/services/deviceauth/client/orchestrator"
33
        "github.com/mendersoftware/mender-server/services/deviceauth/client/tenant"
34
        dconfig "github.com/mendersoftware/mender-server/services/deviceauth/config"
35
        "github.com/mendersoftware/mender-server/services/deviceauth/devauth"
36
        "github.com/mendersoftware/mender-server/services/deviceauth/jwt"
37
        "github.com/mendersoftware/mender-server/services/deviceauth/store/mongo"
38
)
39

40
func RunServer(c config.Reader) error {
2✔
41
        var tenantadmAddr = c.GetString(dconfig.SettingTenantAdmAddr)
2✔
42

2✔
43
        l := log.New(log.Ctx{})
2✔
44

2✔
45
        db, err := mongo.NewDataStoreMongo(
2✔
46
                mongo.DataStoreMongoConfig{
2✔
47
                        ConnectionString: c.GetString(dconfig.SettingDb),
2✔
48

2✔
49
                        SSL:           c.GetBool(dconfig.SettingDbSSL),
2✔
50
                        SSLSkipVerify: c.GetBool(dconfig.SettingDbSSLSkipVerify),
2✔
51

2✔
52
                        Username: c.GetString(dconfig.SettingDbUsername),
2✔
53
                        Password: c.GetString(dconfig.SettingDbPassword),
2✔
54
                })
2✔
55
        if err != nil {
2✔
56
                return errors.Wrap(err, "database connection failed")
×
57
        }
×
58

59
        jwtHandler, err := jwt.NewJWTHandler(
2✔
60
                c.GetString(dconfig.SettingServerPrivKeyPath),
2✔
61
        )
2✔
62
        var jwtFallbackHandler jwt.Handler
2✔
63
        fallback := c.GetString(dconfig.SettingServerFallbackPrivKeyPath)
2✔
64
        if err == nil && fallback != "" {
2✔
65
                jwtFallbackHandler, err = jwt.NewJWTHandler(
×
66
                        fallback,
×
67
                )
×
68
        }
×
69
        if err != nil {
2✔
70
                return err
×
71
        }
×
72

73
        orchClientConf := orchestrator.Config{
2✔
74
                OrchestratorAddr: c.GetString(dconfig.SettingOrchestratorAddr),
2✔
75
                Timeout:          time.Duration(30) * time.Second,
2✔
76
        }
2✔
77

2✔
78
        devauth := devauth.NewDevAuth(db,
2✔
79
                orchestrator.NewClient(orchClientConf),
2✔
80
                jwtHandler,
2✔
81
                devauth.Config{
2✔
82
                        Issuer:             c.GetString(dconfig.SettingJWTIssuer),
2✔
83
                        ExpirationTime:     int64(c.GetInt(dconfig.SettingJWTExpirationTimeout)),
2✔
84
                        DefaultTenantToken: c.GetString(dconfig.SettingDefaultTenantToken),
2✔
85
                        InventoryAddr:      config.Config.GetString(dconfig.SettingInventoryAddr),
2✔
86

2✔
87
                        EnableReporting: config.Config.GetBool(dconfig.SettingEnableReporting),
2✔
88
                        HaveAddons: config.Config.GetBool(dconfig.SettingHaveAddons) &&
2✔
89
                                tenantadmAddr != "",
2✔
90
                })
2✔
91

2✔
92
        if jwtFallbackHandler != nil {
2✔
93
                devauth = devauth.WithJWTFallbackHandler(jwtFallbackHandler)
×
94
        }
×
95

96
        if tenantadmAddr != "" {
2✔
97
                tc := tenant.NewClient(tenant.Config{
×
98
                        TenantAdmAddr: tenantadmAddr,
×
99
                })
×
100
                devauth = devauth.WithTenantVerification(tc)
×
101
        }
×
102

103
        cacheConnStr := c.GetString(dconfig.SettingRedisConnectionString)
2✔
104
        if cacheConnStr == "" {
4✔
105
                // for backward compatibility check old redis_addr setting
2✔
106
                cacheConnStr = c.GetString(dconfig.SettingRedisAddr)
2✔
107
        }
2✔
108
        if cacheConnStr != "" {
2✔
109
                l.Infof("setting up redis cache")
×
110

×
111
                cache, err := cache.NewRedisCache(
×
112
                        context.TODO(),
×
113
                        cacheConnStr,
×
114
                        c.GetString(dconfig.SettingRedisKeyPrefix),
×
115
                        c.GetInt(dconfig.SettingRedisLimitsExpSec),
×
116
                )
×
117

×
118
                if err != nil {
×
119
                        return err
×
120
                }
×
121

122
                devauth = devauth.WithCache(cache)
×
123
        }
124

125
        devauthapi := api_http.NewDevAuthApiHandlers(devauth, db)
2✔
126

2✔
127
        apiHandler, err := devauthapi.Build()
2✔
128
        if err != nil {
2✔
129
                return errors.Wrap(err, "device authentication API handlers setup failed")
×
130
        }
×
131

132
        addr := c.GetString(dconfig.SettingListen)
2✔
133
        l.Printf("listening on %s", addr)
2✔
134

2✔
135
        srv := &http.Server{
2✔
136
                Addr:    addr,
2✔
137
                Handler: apiHandler,
2✔
138
        }
2✔
139

2✔
140
        errChan := make(chan error, 1)
2✔
141
        go func() {
4✔
142
                if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
2✔
NEW
143
                        errChan <- err
×
NEW
144
                }
×
145
        }()
146
        quit := make(chan os.Signal, 1)
2✔
147
        signal.Notify(quit, unix.SIGINT, unix.SIGTERM)
2✔
148
        select {
2✔
149
        case sig := <-quit:
2✔
150
                l.Infof("received signal %s: terminating", sig)
2✔
NEW
151
        case err = <-errChan:
×
NEW
152
                l.Errorf("server terminated unexpectedly: %s", err.Error())
×
NEW
153
                return err
×
154
        }
155
        l.Info("server shutdown")
2✔
156

2✔
157
        return nil
2✔
158
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc