@@ -19,17 +19,18 @@ limitations under the License.
19
19
package controller
20
20
21
21
import (
22
+ "bufio"
22
23
"context"
23
24
"errors"
24
25
"fmt"
25
- "io/fs "
26
+ "io"
26
27
"net"
27
28
"os"
28
29
"path/filepath"
29
30
"slices"
30
31
"text/template"
31
32
32
- "github.com/k0sproject/k0s/internal/pkg/dir "
33
+ "github.com/k0sproject/k0s/internal/pkg/file "
33
34
"github.com/k0sproject/k0s/internal/pkg/users"
34
35
k0sAPI "github.com/k0sproject/k0s/pkg/apis/k0s/v1beta1"
35
36
"github.com/k0sproject/k0s/pkg/assets"
@@ -48,6 +49,7 @@ type Keepalived struct {
48
49
uid int
49
50
supervisor * supervisor.Supervisor
50
51
log * logrus.Entry
52
+ configFilePath string
51
53
}
52
54
53
55
// Init extracts the needed binaries and creates the directories
@@ -63,15 +65,7 @@ func (k *Keepalived) Init(_ context.Context) error {
63
65
k .log .Warnf ("Unable to get %s UID running keepalived as root: %v" , constant .KeepalivedUser , err )
64
66
}
65
67
66
- basepath := filepath .Dir (k .K0sVars .KeepalivedConfigFile )
67
- if err = dir .Init (basepath , constant .KeepalivedDirMode ); err != nil {
68
- return fmt .Errorf ("failed to create keepalived data dir: %w" , err )
69
- }
70
-
71
- if err = os .Chown (basepath , k .uid , - 1 ); err != nil {
72
- return fmt .Errorf ("failed to chown keepalived data dir: %w" , err )
73
- }
74
-
68
+ k .configFilePath = filepath .Join (k .K0sVars .RunDir , "keepalived.conf" )
75
69
return assets .Stage (k .K0sVars .BinDir , "keepalived" , constant .BinDirMode )
76
70
}
77
71
@@ -96,7 +90,7 @@ func (k *Keepalived) Start(_ context.Context) error {
96
90
args := []string {
97
91
"--dont-fork" ,
98
92
"--use-file" ,
99
- k .K0sVars . KeepalivedConfigFile ,
93
+ k .configFilePath ,
100
94
"--no-syslog" ,
101
95
"--log-console" ,
102
96
}
@@ -110,8 +104,8 @@ func (k *Keepalived) Start(_ context.Context) error {
110
104
Name : "keepalived" ,
111
105
BinPath : assets .BinPath ("keepalived" , k .K0sVars .BinDir ),
112
106
Args : args ,
113
- RunDir : filepath . Dir ( k .K0sVars .KeepalivedConfigFile ) ,
114
- DataDir : filepath . Dir ( k .K0sVars .KeepalivedConfigFile ) ,
107
+ RunDir : k .K0sVars .RunDir ,
108
+ DataDir : k .K0sVars .DataDir ,
115
109
UID : k .uid ,
116
110
}
117
111
return k .supervisor .Supervise ()
@@ -274,31 +268,25 @@ func (*Keepalived) getLinkAddresses(link netlink.Link) ([]netlink.Addr, []string
274
268
}
275
269
276
270
func (k * Keepalived ) generateKeepalivedTemplate () error {
277
- f , err := os .OpenFile (k .K0sVars .KeepalivedConfigFile , os .O_CREATE | os .O_WRONLY | os .O_TRUNC , fs .FileMode (0500 ))
278
- if err != nil {
279
- return fmt .Errorf ("failed to open keepalived config file: %w" , err )
280
- }
281
- defer f .Close ()
282
-
283
- template , err := template .New ("keepalived" ).Parse (keepalivedConfigTemplate )
284
- if err != nil {
285
- return fmt .Errorf ("failed to parse keepalived template: %w" , err )
286
- }
287
-
271
+ template := template .Must (template .New ("keepalived" ).Parse (keepalivedConfigTemplate ))
288
272
kc := keepalivedConfig {
289
273
VRRPInstances : k .Config .VRRPInstances ,
290
274
}
291
- if err = template .Execute (f , kc ); err != nil {
292
- return fmt .Errorf ("failed to execute keepalived template: %w" , err )
293
- }
294
275
295
- // TODO: Do we really need to this every single time?
296
- if err = os .Chown (k .K0sVars .KeepalivedConfigFile , k .uid , - 1 ); err != nil {
297
- return fmt .Errorf ("failed to chown keepalived config file: %w" , err )
298
- }
299
- if err = os .Chmod (k .K0sVars .KeepalivedConfigFile , fs .FileMode (0400 )); err != nil {
300
- return fmt .Errorf ("failed to chmod keepalived config file: %w" , err )
276
+ if err := file .WriteAtomically (k .configFilePath , 0400 , func (file io.Writer ) error {
277
+ if err := file .(* os.File ).Chown (k .uid , - 1 ); err != nil {
278
+ return err
279
+ }
280
+
281
+ w := bufio .NewWriter (file )
282
+ if err := template .Execute (w , kc ); err != nil {
283
+ return err
284
+ }
285
+ return w .Flush ()
286
+ }); err != nil {
287
+ return fmt .Errorf ("failed to write keepalived config file: %w" , err )
301
288
}
289
+
302
290
return nil
303
291
}
304
292
0 commit comments