-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #87 from HilkopterBob/project-restructuring
refactor: project restructuring
- Loading branch information
Showing
9 changed files
with
487 additions
and
457 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
}, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} |
Oops, something went wrong.