feat: node UUID

This commit is contained in:
HeshamTB 2024-03-14 02:28:36 +03:00
parent eb97d49d1f
commit 0c703465af
2 changed files with 71 additions and 3 deletions

View File

@ -44,15 +44,19 @@ func main() {
} else if uid == 0 { } else if uid == 0 {
slog.Warn("Running as root! avoid running as root by setting CAP_NET_ADMIN") slog.Warn("Running as root! avoid running as root by setting CAP_NET_ADMIN")
} }
uuid, err := hvpnnode3.InitNodeUUID()
if err != nil {
slog.Error(err.Error())
os.Exit(-1)
}
slog.Info("Node UUID: " + uuid.String())
app := createCliApp() app := createCliApp()
err := app.Run(os.Args) err = app.Run(os.Args)
if err != nil { if err != nil {
slog.Error(err.Error()) slog.Error(err.Error())
os.Exit(1) os.Exit(1)
} }
} }
func run(ctx *cli.Context) { func run(ctx *cli.Context) {

64
node.go Normal file
View File

@ -0,0 +1,64 @@
package hvpnnode3
import (
"errors"
"fmt"
"log/slog"
"os"
"github.com/google/uuid"
)
const UUID_PATH = "/etc/hvpn/uuid"
const CONFIG_PATH = "/etc/hvpn"
const UUIDV4_LEN = 16
// Gets or creates a UUID for this node
func InitNodeUUID() (*uuid.UUID, error) {
// TODO: check and write to os.UserHomeDir() to avoid root
_, err := os.Stat(UUID_PATH)
if err != nil {
if errors.Is(err, os.ErrNotExist) {
slog.Info(UUID_PATH + " does not exist. Creating...")
return createNodeUUID()
}
}
f, err := os.Open(UUID_PATH)
if err != nil {
return nil, err
}
buffer := make([]byte, UUIDV4_LEN)
n, err := f.Read(buffer)
if err != nil {
return nil, err
}
slog.Debug("UUID: Read " + fmt.Sprint(n) + "bytes" )
uuid, err := uuid.FromBytes(buffer)
return &uuid, err
}
func createNodeUUID() (*uuid.UUID, error) {
err := os.MkdirAll(CONFIG_PATH, 0600)
if err != nil {
return nil, err
}
mode := os.O_RDWR | os.O_CREATE | os.O_EXCL
f, err := os.OpenFile(UUID_PATH, mode, 0600)
if err != nil {
return nil, err
}
uuid, err := uuid.NewRandom()
if err != nil {
return nil, err
}
n, err := f.Write(uuid[:])
if err != nil {
return nil, err
}
slog.Debug("UUID: Wrote " + fmt.Sprint(n) + "bytes")
return &uuid, nil
}