54 lines
1.4 KiB
Go
54 lines
1.4 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/spf13/cobra"
|
|
"github.com/mirivlad/sshkeeper/internal/config"
|
|
"github.com/mirivlad/sshkeeper/internal/db"
|
|
)
|
|
|
|
var initCmd = &cobra.Command{
|
|
Use: "init",
|
|
Short: "Initialize sshkeeper",
|
|
Long: "Create config, database, and vault directories.",
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
cfg, err := config.Load()
|
|
if err != nil {
|
|
return fmt.Errorf("load config: %w", err)
|
|
}
|
|
|
|
dirs := []string{cfg.ConfigDir, cfg.DataDir}
|
|
for _, dir := range dirs {
|
|
if err := os.MkdirAll(dir, 0700); err != nil {
|
|
return fmt.Errorf("create dir %s: %w", dir, err)
|
|
}
|
|
}
|
|
|
|
// Open database (triggers migrations)
|
|
database, err := db.Open(cfg.DataDir)
|
|
if err != nil {
|
|
return fmt.Errorf("open database: %w", err)
|
|
}
|
|
defer database.Close()
|
|
|
|
// Create empty vault if not exists
|
|
vaultPath := config.VaultPath(cfg.DataDir)
|
|
if _, err := os.Stat(vaultPath); os.IsNotExist(err) {
|
|
f, err := os.OpenFile(vaultPath, os.O_CREATE|os.O_WRONLY, 0600)
|
|
if err != nil {
|
|
return fmt.Errorf("create vault: %w", err)
|
|
}
|
|
f.Close()
|
|
}
|
|
|
|
fmt.Printf("Created config: %s/config.toml\n", cfg.ConfigDir)
|
|
fmt.Printf("Created database: %s/sshkeeper.db\n", cfg.DataDir)
|
|
fmt.Printf("Created vault: %s/vault.bin\n", cfg.DataDir)
|
|
fmt.Println()
|
|
fmt.Println("Next step: run 'sshkeeper vault unlock' to set master password.")
|
|
return nil
|
|
},
|
|
}
|