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 }