blob: 751a7977db6bdcfa14f7a33a00fdec4dc5c3d67a [file] [log] [blame]
giof6ad2982024-08-23 17:42:49 +04001package cluster
2
3import (
4 "bytes"
5 "fmt"
6 "golang.org/x/crypto/ssh"
7 "os"
8 "strings"
9)
10
11type SSHClient struct {
12 client *ssh.Client
13}
14
15func (c *SSHClient) Close() error {
16 return c.client.Close()
17}
18
19func (c *SSHClient) Exec(cmd string) (string, error) {
20 ses, err := c.client.NewSession()
21 if err != nil {
22 return "", err
23 }
24 defer ses.Close()
25 var out bytes.Buffer
26 ses.Stdout = &out
27 ses.Stderr = os.Stdout
28 err = ses.Run(cmd)
29 if err != nil {
30 return "", err
31 }
32 return out.String(), nil
33}
34
35func GetHostname(c *SSHClient) (string, error) {
36 name, err := c.Exec("hostname")
37 if err != nil {
38 return "", nil
39 }
40 return strings.TrimSpace(name), nil
41}
42
43func InstallTailscale(c *SSHClient) error {
44 return nil
45 fmt.Println("Installing Tailscale")
46 if _, err := c.Exec("which tailscale"); err == nil {
47 return nil
48 }
49 _, err := c.Exec(tailscaleInstallCmd)
50 return err
51}
52
53func TailscaleUp(c *SSHClient, loginServer, hostname, authKey string) error {
54 return nil
55 fmt.Println("Starting up Tailscale")
56 if _, err := c.Exec("sudo tailscale down"); err != nil {
57 return err
58 }
59 cmd := fmt.Sprintf(tailscaleUpCmd, loginServer, authKey, hostname)
60 fmt.Println(cmd)
61 _, err := c.Exec(cmd)
62 return err
63}
64
65func InstallK3s(c *SSHClient) error {
66 fmt.Println("Starting k3s")
67 if _, err := c.Exec("which k3s"); err == nil {
68 return nil
69 }
70 _, err := c.Exec("curl -sfL https://get.k3s.io | sh -s - --cluster-init --disable traefik --disable local-storage --disable servicelb --kube-proxy-arg proxy-mode=ipvs --kube-proxy-arg ipvs-strict-arp --flannel-backend vxlan --cluster-cidr=10.45.0.0/16 --service-cidr=10.46.0.0/16 # --flannel-iface=tailscale0")
71 return err
72}
73
74func InstallK3sJoinServer(c *SSHClient, serverAddr, token string) error {
75 fmt.Println("Starting k3s")
76 if _, err := c.Exec("which k3s"); err == nil {
77 return nil
78 }
79 _, err := c.Exec(fmt.Sprintf("curl -sfL https://get.k3s.io | sh -s - server --server=https://%s --token=%s --disable traefik --disable local-storage --disable servicelb --kube-proxy-arg proxy-mode=ipvs --kube-proxy-arg ipvs-strict-arp --flannel-backend vxlan --cluster-cidr=10.45.0.0/16 --service-cidr=10.46.0.0/16 # --flannel-iface=tailscale0", serverAddr, token))
80 return err
81}
82
83func InstallK3sJoinAgent(c *SSHClient, serverAddr, token string) error {
84 fmt.Println("Starting k3s")
85 if _, err := c.Exec("which k3s"); err == nil {
86 return nil
87 }
88 _, err := c.Exec(fmt.Sprintf("curl -sfL https://get.k3s.io | sh -s - agent --server=https://%s --token=%s", serverAddr, token))
89 return err
90}
91
92func UninstallK3sServer(c *SSHClient) error {
93 fmt.Println("Uninstalling k3s")
94 if _, err := c.Exec("which k3s-uninstall.sh"); err != nil {
95 return nil
96 }
97 _, err := c.Exec("k3s-uninstall.sh")
98 return err
99}
100
101func UninstallK3sAgent(c *SSHClient) error {
102 fmt.Println("Uninstalling k3s")
103 if _, err := c.Exec("which k3s-agent-uninstall.sh"); err != nil {
104 return nil
105 }
106 _, err := c.Exec("k3s-agent-uninstall.sh")
107 return err
108}
109
110func GetTailscaleIP(c *SSHClient) (string, error) {
111 fmt.Println("Getting Tailscale IP")
112 if _, err := c.Exec("sudo apt-get install net-tools -y"); err != nil {
113 return "", err
114 }
115 ip, err := c.Exec("sudo ifconfig | grep 10.42")
116 if err != nil {
117 return "", err
118 }
119 return strings.Fields(ip)[1], nil
120 // ip, err := c.Exec("sudo tailscale ip")
121 // return strings.TrimSpace(ip), err
122}
123
124func GetKubeconfig(c *SSHClient) (string, error) {
125 // return "", nil
126 fmt.Println("Getting Kubeconfig")
127 out, err := c.Exec("sudo cat /etc/rancher/k3s/k3s.yaml")
128 if err != nil {
129 return "", err
130 }
131 ip, err := GetTailscaleIP(c)
132 if err != nil {
133 return "", err
134 }
135 return strings.Replace(out, "server: https://127.0.0.1:6443", fmt.Sprintf("server: https://%s:6443", ip), 1), nil
136}
137
138func GetServerToken(c *SSHClient) (string, error) {
139 fmt.Println("Getting server token")
140 out, err := c.Exec("sudo cat /var/lib/rancher/k3s/server/node-token")
141 if err != nil {
142 return "", err
143 }
144 return strings.TrimSpace(out), err
145}