Skip to content

Commit 06c3f47

Browse files
authored
Merge pull request #13 from FortnoxAB/bugfix/multiple-stuff
Fix multiple stuff
2 parents 5697be8 + 1cfc867 commit 06c3f47

File tree

6 files changed

+55
-18
lines changed

6 files changed

+55
-18
lines changed

pkg/admin/bootstrap.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ func (a *Admin) Bootstrap(ctx context.Context, hosts []string) error {
6161
if err != nil {
6262
return err
6363
}
64-
6564
}
6665
return nil
6766
}
@@ -125,14 +124,15 @@ func runOverSSH(ctx context.Context, client *ssh.Client, cmd string) error {
125124
}
126125
// session.Stdout = os.Stdout
127126
defer session.Close()
128-
buf := &bytes.Buffer{}
129-
buf2 := &bytes.Buffer{}
130-
session.Stdout = buf
131-
session.Stderr = buf2
127+
// buf := &bytes.Buffer{} // TODO do we want io.MultiWriter aswell?
128+
// buf2 := &bytes.Buffer{}
129+
session.Stdout = os.Stdout
130+
session.Stderr = os.Stderr
132131
session.Stdin = os.Stdin
133132
err = session.Start(cmd)
134133
if err != nil {
135-
return fmt.Errorf("%w stdout: %s stderr: %s", err, buf.String(), buf2.String())
134+
return fmt.Errorf("ssh: error running command %s error: %w", cmd, err)
135+
// return fmt.Errorf("%w stdout: %s stderr: %s", err, buf.String(), buf2.String())
136136
}
137137

138138
exit := make(chan struct{}, 1)
@@ -144,7 +144,7 @@ func runOverSSH(ctx context.Context, client *ssh.Client, cmd string) error {
144144
select {
145145
case <-ctx.Done():
146146
if ctx.Err() != nil {
147-
fmt.Println("stdout", buf.String(), "stderr", buf2.String())
147+
// fmt.Println("stdout", buf.String(), "stderr", buf2.String())
148148
session.Signal(ssh.SIGINT)
149149
session.Close()
150150
}
@@ -154,7 +154,8 @@ func runOverSSH(ctx context.Context, client *ssh.Client, cmd string) error {
154154

155155
err = session.Wait()
156156
if err != nil {
157-
return fmt.Errorf("%w stdout: %s stderr: %s", err, buf.String(), buf2.String())
157+
// return fmt.Errorf("%w stdout: %s stderr: %s", err, buf.String(), buf2.String())
158+
return fmt.Errorf("ssh: error waiting for command %s error: %w", cmd, err)
158159
}
159160

160161
return nil

pkg/agent/agent.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"crypto/tls"
66
"encoding/json"
7+
"errors"
78
"net/http"
89
"os"
910
"path/filepath"
@@ -130,13 +131,24 @@ func (a *Agent) run(pCtx context.Context) error {
130131
if err != nil {
131132
logrus.Error(err)
132133
cancel()
134+
time.Sleep(1 * time.Second)
133135
continue
134136
}
135137

136138
err = a.client.ConnectContext(ctx, u, headers)
137139
if err != nil {
138140
logrus.Error(err)
139141
cancel()
142+
143+
if errors.Is(err, websocket.ErrUnauthorized) {
144+
logrus.Errorf("error asdf")
145+
146+
// remove token in runtime if we get auth error. Then the machine will have to be accepted again.
147+
a.mutex.Lock()
148+
a.config.Token = ""
149+
a.mutex.Unlock()
150+
}
151+
time.Sleep(1 * time.Second)
140152
continue
141153
}
142154

pkg/agent/reconciliation/files.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,14 @@ func assertSameOwner(file os.FileInfo, fileSpec *types.File) (bool, error) {
6262
if fileSpec.User == "" && fileSpec.Group == "" {
6363
return false, nil
6464
}
65-
var fileUid string
66-
var fileGid string
65+
var existingFileUid int
66+
var existingFileGid int
6767
stat, ok := file.Sys().(*syscall.Stat_t)
6868
if !ok {
6969
return false, fmt.Errorf("not syscall.Stat_t")
7070
}
71-
fileUid = strconv.Itoa(int(stat.Uid))
72-
fileGid = strconv.Itoa(int(stat.Gid))
71+
existingFileUid = (int(stat.Uid))
72+
existingFileGid = (int(stat.Gid))
7373
u, err := user.Lookup(fileSpec.User)
7474
if err != nil {
7575
return false, err
@@ -79,11 +79,14 @@ func assertSameOwner(file os.FileInfo, fileSpec *types.File) (bool, error) {
7979
return false, err
8080
}
8181

82-
if fileUid == u.Uid && fileGid == g.Gid {
82+
newUid, _ := strconv.Atoi(u.Uid)
83+
newGid, _ := strconv.Atoi(g.Gid)
84+
85+
if existingFileUid == newUid && existingFileGid == newGid {
8386
return false, nil
8487
}
8588

86-
return true, os.Chown(file.Name(), int(stat.Uid), int(stat.Gid))
89+
return true, os.Chown(fileSpec.Path, newUid, newGid)
8790
}
8891
func chown(file *os.File, userName, group string) error {
8992
if userName == "" && group == "" {

pkg/api/v1/types/types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ type File struct {
105105

106106
func (f File) FileMode() (os.FileMode, error) {
107107
if f.Mode == "" {
108-
return os.FileMode(0700), nil // default to this
108+
return os.FileMode(0600), nil // default to this
109109
}
110110
u, err := strconv.ParseUint(f.Mode, 8, 32)
111111
return os.FileMode(u), err

pkg/master/webserver/webserver.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,12 @@ func (ws *Webserver) approveMachine(c *gin.Context) error {
179179
func (ws *Webserver) listPendingMachines(c *gin.Context) error {
180180
t := `<!DOCTYPE html>
181181
<html lang="en">
182+
<head>
183+
<style>
184+
td {padding-right: 25px;}
185+
tr {text-align: left;}
186+
</style>
187+
</head>
182188
<body>
183189
<script>
184190
const acceptHost = (hostname) => {
@@ -290,7 +296,7 @@ func (ws *Webserver) hostList() (map[string]*host, error) {
290296

291297
func (ws *Webserver) initWS(router *gin.Engine) {
292298
router.GET("/api/websocket-v1", func(c *gin.Context) {
293-
keys := make(map[string]interface{})
299+
keys := make(map[string]any)
294300
keys["allowed"] = false
295301
keys["admin"] = false
296302
keys["ip"] = c.ClientIP()

pkg/websocket/websocketclient.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,20 +91,35 @@ func (ws *websocketClient) getOnConnect() func() {
9191
return ws.onConnect
9292
}
9393

94+
var ErrUnauthorized = fmt.Errorf("websocket: error status 401 Unauthorized")
95+
9496
func (ws *websocketClient) ConnectContext(ctx context.Context, addr string, headers http.Header) error {
9597
var err error
9698
var c *websocket.Conn
99+
var resp *http.Response
97100
logrus.Debugf("websocket: connecting to %s", addr)
98101
if ws.tlsClientConfig != nil {
99102
dialer := &websocket.Dialer{
100103
Proxy: http.ProxyFromEnvironment,
101104
HandshakeTimeout: 10 * time.Second,
102105
TLSClientConfig: ws.tlsClientConfig,
103106
}
104-
c, _, err = dialer.DialContext(ctx, addr, headers)
107+
c, resp, err = dialer.DialContext(ctx, addr, headers)
105108
} else {
106-
c, _, err = websocket.DefaultDialer.DialContext(ctx, addr, headers)
109+
c, resp, err = websocket.DefaultDialer.DialContext(ctx, addr, headers)
110+
}
111+
112+
if resp.StatusCode != 101 {
113+
114+
if resp.StatusCode == 401 {
115+
ws.wasDisconnected(err)
116+
return ErrUnauthorized
117+
}
118+
119+
ws.wasDisconnected(err)
120+
return fmt.Errorf("websocket: error from server got status code: %d", resp.StatusCode)
107121
}
122+
108123
if err != nil {
109124
ws.wasDisconnected(err)
110125
return err

0 commit comments

Comments
 (0)