Skip to content

Commit

Permalink
Merge pull request #87 from HilkopterBob/project-restructuring
Browse files Browse the repository at this point in the history
refactor: project restructuring
  • Loading branch information
HilkopterBob authored Oct 14, 2024
2 parents c174ba3 + e07f6f2 commit 809ead9
Show file tree
Hide file tree
Showing 9 changed files with 487 additions and 457 deletions.
87 changes: 87 additions & 0 deletions cmd/generate.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package cmd

import (
"fmt"
"packagelock/certs"
"packagelock/config"
"packagelock/db"
"packagelock/logger"
"packagelock/structs"
"time"

"github.com/google/uuid"
"github.com/k0kubun/pp/v3"
"github.com/sethvargo/go-password/password"
"github.com/spf13/cobra"
"github.com/surrealdb/surrealdb.go"
)

var generateCmd = &cobra.Command{
Use: "generate [certs|config|admin]",
Short: "Generate certificates, configuration files, or an admin",
Long: "Generate certificates, configuration files, or an admin user required by the application.",
Args: cobra.ExactValidArgs(1),
ValidArgs: []string{"certs", "config", "admin"},
Run: func(cmd *cobra.Command, args []string) {
switch args[0] {
case "certs":
err := certs.CreateSelfSignedCert(
config.Config.GetString("network.ssl-config.certificatepath"),
config.Config.GetString("network.ssl-config.privatekeypath"))
if err != nil {
fmt.Printf("There was an error generating the self-signed certs: %v\n", err)
logger.Logger.Warnf("There was an error generating the self-signed certs: %v", err)
}
case "config":
config.CreateDefaultConfig(config.Config)
case "admin":
err := generateAdmin()
if err != nil {
logger.Logger.Panicf("Failed to generate default admin, got: %v", err)
}
default:
fmt.Println("Invalid argument. Use 'certs', 'config', or 'admin'.")
}
},
}

func generateAdmin() error {
// Initialize the database
err := db.InitDB()
if err != nil {
logger.Logger.Panicf("Got error from db.InitDB: %v", err)
}

adminPw, err := password.Generate(64, 10, 10, false, false)
if err != nil {
logger.Logger.Panicf("Got error while generating admin password: %v", err)
}

// Admin data
temporalAdmin := structs.User{
UserID: uuid.New(),
Username: "admin",
Password: adminPw,
Groups: []string{"Admin", "StorageAdmin", "Audit"},
CreationTime: time.Now(),
UpdateTime: time.Now(),
ApiKeys: nil,
}

// Insert admin
adminInsertionData, err := db.DB.Create("user", temporalAdmin)
if err != nil {
logger.Logger.Panicf("Got error while inserting default admin into DB: %v", err)
}

// Unmarshal data
var createdUser structs.User
err = surrealdb.Unmarshal(adminInsertionData, &createdUser)
if err != nil {
logger.Logger.Panicf("Got error while querying default admin: %v", err)
}

pp.Println("Admin Username:", createdUser.Username)
pp.Println("Admin Password:", createdUser.Password)
return nil
}
13 changes: 13 additions & 0 deletions cmd/print_routes.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package cmd

import (
"github.com/spf13/cobra"
)

var printRoutesCmd = &cobra.Command{
Use: "print-routes",
Short: "Prints out all registered routes",
Run: func(cmd *cobra.Command, args []string) {
initServer(true)
},
}
25 changes: 25 additions & 0 deletions cmd/restart.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package cmd

import (
"fmt"
"packagelock/logger"
"time"

"github.com/spf13/cobra"
)

var restartCmd = &cobra.Command{
Use: "restart",
Short: "Restart the running server",
Run: func(cmd *cobra.Command, args []string) {
restartServer()
},
}

func restartServer() {
stopServer()
time.Sleep(5 * time.Second)
fmt.Println("Restarting the server...")
logger.Logger.Info("Restarting the server...")
startServer(false)
}
40 changes: 40 additions & 0 deletions cmd/root.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package cmd

import (
"packagelock/config"
"packagelock/logger"

"github.com/spf13/cobra"
)

var rootCmd = &cobra.Command{
Use: "packagelock",
Short: "Packagelock CLI tool",
Long: `Packagelock CLI manages the server and other operations.`,
}

// Execute runs the root command
func Execute() error {
return rootCmd.Execute()
}

func init() {
// Initialize the logger
var loggerError error
logger.Logger, loggerError = logger.InitLogger()
if loggerError != nil {
// Essential APP-Part, so crash out asap
panic(loggerError)
}

// Initialize the configuration
config.InitConfig("")

// Add subcommands to the root command
rootCmd.AddCommand(startCmd)
rootCmd.AddCommand(stopCmd)
rootCmd.AddCommand(restartCmd)
rootCmd.AddCommand(setupCmd)
rootCmd.AddCommand(generateCmd)
rootCmd.AddCommand(printRoutesCmd)
}
100 changes: 100 additions & 0 deletions cmd/setup.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package cmd

import (
"os"
"packagelock/logger"
"path/filepath"
"text/template"

"github.com/k0kubun/pp/v3"
"github.com/spf13/cobra"
)

var setupCmd = &cobra.Command{
Use: "setup",
Short: "Setup PackageLock",
Run: func(cmd *cobra.Command, args []string) {
setup()
},
}

func setup() {
pp.Println("Starting the PackageLock setup!")

err := os.MkdirAll("logs/", os.ModePerm)
if err != nil {
pp.Printf("Couldn't create 'logs' directory. Got: %s", err)
panic(err)
}
pp.Println("Generated logs directory")

err = os.MkdirAll("certs/", os.ModePerm)
if err != nil {
pp.Printf("Couldn't create 'certs' directory. Got: %s", err)
panic(err)
}
pp.Println("Generated certs directory")

generateUnitFile()
pp.Println("Generated systemd unit file")

pp.Println("Setup finished successfully!")
}

func generateUnitFile() {
const systemdTemplate = `[Unit]
Description=PackageLock Management Server
After=network.target
[Service]
ExecStart={{.ExecStart}} start
Restart=always
User={{.User}}
Group={{.Group}}
[Install]
WantedBy=multi-user.target
`

type unitFileData struct {
ExecStart string
User string
Group string
}

execPath, err := os.Executable()
if err != nil {
logger.Logger.Panicf("Failed to get executable path: %v", err)
}
execPath, err = filepath.Abs(execPath)
if err != nil {
logger.Logger.Panicf("Failed to get absolute executable path: %v", err)
}

data := unitFileData{
ExecStart: execPath,
User: "your-user", // Replace with actual user
Group: "your-group", // Replace with actual group
}

filePath := "/etc/systemd/system/packagelock.service"
file, err := os.Create(filePath)
if err != nil {
pp.Println("Seems like you can't generate the unit file...")
pp.Println("Did you run this with 'sudo'? 🚀")
logger.Logger.Panicf("Failed to create systemd unit file: %v", err)
}
defer file.Close()

tmpl, err := template.New("systemd").Parse(systemdTemplate)
if err != nil {
logger.Logger.Panicf("Failed to parse systemd template: %v", err)
}

err = tmpl.Execute(file, data)
if err != nil {
logger.Logger.Panicf("Failed to execute template: %v", err)
}

pp.Printf("Systemd unit file created at %s\n", filePath)
}
Loading

0 comments on commit 809ead9

Please sign in to comment.