60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
package system
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"k8s.io/klog/v2"
|
|
)
|
|
|
|
const DefaultSecond = 1_000_000_000
|
|
|
|
func EnsureServiceRunning(ctx context.Context, r *Runner, svc string) error {
|
|
|
|
if _, err := r.Run(ctx, " rc-service", svc, "status"); err == nil {
|
|
return nil
|
|
}
|
|
|
|
klog.Infof("Starting service: %q", svc)
|
|
_, err := r.RunRetry(ctx, RetryOptions{
|
|
Attempts: 3,
|
|
Delay: 2 * DefaultSecond,
|
|
}, "rc-service", svc, "start")
|
|
if err != nil {
|
|
return fmt.Errorf("failed to start service %q: %w", svc, err)
|
|
}
|
|
|
|
_, err = r.Run(ctx, "rc-service", svc, "status")
|
|
if err != nil {
|
|
return fmt.Errorf("service %q still not healthy after start: %w", svc, err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func EnsureSysctl(ctx context.Context, r *Runner, key, want string) error {
|
|
_, err := r.Run(ctx, "sysctl", "-w", key+"="+want)
|
|
if err != nil {
|
|
return fmt.Errorf("failed setting sysctl %s=%s: %w", key, want, err)
|
|
}
|
|
|
|
// verify
|
|
path := "/proc/sys/" + strings.ReplaceAll(key, ".", "/")
|
|
raw, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return fmt.Errorf("failed verifying sysctl %s: %w", key, err)
|
|
}
|
|
if strings.TrimSpace(string(raw)) != want {
|
|
return fmt.Errorf("sysctl %s not applied, expected %s got %s",
|
|
key, want, strings.TrimSpace(string(raw)))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func EnsureDir(ctx context.Context, r *Runner, path string, mode string) error {
|
|
_, err := r.Run(ctx, "install", "-d", "-m", mode, path)
|
|
return err
|
|
}
|