/ pkg / system / ssh.go
ssh.go
 1  package system
 2  
 3  import (
 4  	"crypto/rand"
 5  	"encoding/hex"
 6  	"fmt"
 7  	"time"
 8  
 9  	dogeboxd "github.com/dogeorg/dogeboxd/pkg"
10  )
11  
12  func (t SystemUpdater) sshUpdate(dbxState dogeboxd.DogeboxState, log dogeboxd.SubLogger) error {
13  	patch := t.nix.NewPatch(log)
14  	t.nix.UpdateFirewallRules(patch, dbxState)
15  	t.nix.UpdateSystem(patch, dogeboxd.NixSystemTemplateValues{
16  		SYSTEM_HOSTNAME: dbxState.Hostname,
17  		SSH_ENABLED:     dbxState.SSH.Enabled,
18  		SSH_KEYS:        dbxState.SSH.Keys,
19  		KEYMAP:          dbxState.KeyMap,
20  	})
21  
22  	if err := patch.Apply(); err != nil {
23  		log.Errf("Failed to enable SSH: %v", err)
24  		return err
25  	}
26  
27  	return nil
28  }
29  
30  func (t SystemUpdater) EnableSSH(l dogeboxd.SubLogger) error {
31  	state := t.sm.Get().Dogebox
32  	state.SSH.Enabled = true
33  
34  	if err := t.sm.SetDogebox(state); err != nil {
35  		return err
36  	}
37  
38  	return t.sshUpdate(state, l)
39  }
40  
41  func (t SystemUpdater) DisableSSH(l dogeboxd.SubLogger) error {
42  	state := t.sm.Get().Dogebox
43  	state.SSH.Enabled = false
44  	if err := t.sm.SetDogebox(state); err != nil {
45  		return err
46  	}
47  
48  	return t.sshUpdate(state, l)
49  }
50  
51  func (t SystemUpdater) ListSSHKeys() ([]dogeboxd.DogeboxStateSSHKey, error) {
52  	state := t.sm.Get().Dogebox
53  	return state.SSH.Keys, nil
54  }
55  
56  func (t SystemUpdater) AddSSHKey(key string, l dogeboxd.SubLogger) error {
57  	state := t.sm.Get().Dogebox
58  
59  	keyID := make([]byte, 8)
60  	if _, err := rand.Read(keyID); err != nil {
61  		return fmt.Errorf("failed to generate random key ID: %v", err)
62  	}
63  
64  	state.SSH.Keys = append(state.SSH.Keys, dogeboxd.DogeboxStateSSHKey{
65  		ID:        hex.EncodeToString(keyID),
66  		DateAdded: time.Now(),
67  		Key:       key,
68  	})
69  
70  	if err := t.sm.SetDogebox(state); err != nil {
71  		return err
72  	}
73  
74  	return t.sshUpdate(state, l)
75  }
76  
77  func (t SystemUpdater) RemoveSSHKey(id string, l dogeboxd.SubLogger) error {
78  	state := t.sm.Get().Dogebox
79  
80  	keyFound := false
81  	for i, key := range state.SSH.Keys {
82  		if key.ID == id {
83  			state.SSH.Keys = append(state.SSH.Keys[:i], state.SSH.Keys[i+1:]...)
84  			keyFound = true
85  			break
86  		}
87  	}
88  
89  	if !keyFound {
90  		return fmt.Errorf("SSH key with ID %s not found", id)
91  	}
92  
93  	if err := t.sm.SetDogebox(state); err != nil {
94  		return err
95  	}
96  
97  	return t.sshUpdate(state, l)
98  }