feat: node UUID
This commit is contained in:
		
							parent
							
								
									eb97d49d1f
								
							
						
					
					
						commit
						0c703465af
					
				@ -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
									
								
							
							
						
						
									
										64
									
								
								node.go
									
									
									
									
									
										Normal 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  
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user