mirror of
https://github.com/speatzle/nfsense.git
synced 2025-05-10 18:38:22 +00:00
141 lines
3.4 KiB
Go
141 lines
3.4 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/netip"
|
|
|
|
"github.com/godbus/dbus/v5"
|
|
"github.com/pterm/pterm"
|
|
"golang.org/x/exp/slog"
|
|
"nfsense.net/nfsense/internal/api/network"
|
|
"nfsense.net/nfsense/internal/api/system"
|
|
"nfsense.net/nfsense/internal/config"
|
|
netdefs "nfsense.net/nfsense/internal/definitions/network"
|
|
)
|
|
|
|
func setup(configManager *config.ConfigManager, dbusConn *dbus.Conn) {
|
|
slog.Info("Entering Setup...")
|
|
|
|
err := configManager.LoadDefaultConfig()
|
|
if err != nil {
|
|
slog.Error("Loading Default Config", "err", err)
|
|
return
|
|
}
|
|
s := system.System{ConfigManager: configManager}
|
|
n := network.Network{ConfigManager: configManager, DbusConn: dbusConn}
|
|
|
|
slog.Info("Create Admin User")
|
|
|
|
err = createUser(s)
|
|
if err != nil {
|
|
slog.Error("Error Creating User", "err", err)
|
|
return
|
|
}
|
|
|
|
slog.Info("Configure LAN Interface")
|
|
err = createInterface(n)
|
|
if err != nil {
|
|
slog.Error("Error Creating Interface", "err", err)
|
|
return
|
|
}
|
|
|
|
slog.Info("Saving Changes...")
|
|
err = configManager.SaveWithoutApplying()
|
|
if err != nil {
|
|
slog.Error("Saving", "err", err)
|
|
return
|
|
}
|
|
|
|
slog.Info("Setup Done")
|
|
}
|
|
|
|
func createUser(s system.System) error {
|
|
username, err := pterm.DefaultInteractiveTextInput.WithDefaultText("Username").Show()
|
|
if err != nil {
|
|
return fmt.Errorf("Reading Username Prompt: %w", err)
|
|
}
|
|
|
|
password:
|
|
|
|
password, err := pterm.DefaultInteractiveTextInput.WithDefaultText("Password").WithMask("*").Show()
|
|
if err != nil {
|
|
return fmt.Errorf("Reading Password Prompt: %w", err)
|
|
}
|
|
|
|
repeat, err := pterm.DefaultInteractiveTextInput.WithDefaultText("Repeat").WithMask("*").Show()
|
|
if err != nil {
|
|
return fmt.Errorf("Reading Repeat Prompt: %w", err)
|
|
}
|
|
|
|
if password != repeat {
|
|
slog.Error("Password and Repeat Dont Match")
|
|
goto password
|
|
}
|
|
|
|
_, err = s.CreateUser(context.Background(), system.CreateUserParameters{
|
|
Name: username,
|
|
Password: password,
|
|
})
|
|
if err != nil {
|
|
return fmt.Errorf("Doing API Call: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func createInterface(n network.Network) error {
|
|
links, err := n.GetLinks(context.Background(), struct{}{})
|
|
if err != nil {
|
|
return fmt.Errorf("Getting Links: %w", err)
|
|
}
|
|
|
|
options := []string{}
|
|
|
|
for _, l := range links.Links {
|
|
options = append(options, l.Name)
|
|
}
|
|
|
|
if len(options) == 0 {
|
|
return fmt.Errorf("No Links Found")
|
|
}
|
|
|
|
link, err := pterm.DefaultInteractiveSelect.WithDefaultText("Select Hardware Interface").WithOptions(options).Show()
|
|
if err != nil {
|
|
return fmt.Errorf("Reading link Prompt: %w", err)
|
|
}
|
|
|
|
interfaceName, err := pterm.DefaultInteractiveTextInput.WithDefaultText("Interface Name").Show()
|
|
if err != nil {
|
|
return fmt.Errorf("Reading Interface Prompt: %w", err)
|
|
}
|
|
|
|
if interfaceName == "" {
|
|
return fmt.Errorf("Interface Name Cannot be empty")
|
|
}
|
|
|
|
ipv4, err := pterm.DefaultInteractiveTextInput.WithDefaultText("Set IPv4 Address with CIDR").Show()
|
|
if err != nil {
|
|
return fmt.Errorf("Reading ipv4 Prompt: %w", err)
|
|
}
|
|
|
|
address, err := netip.ParsePrefix(ipv4)
|
|
if err != nil {
|
|
return fmt.Errorf("Parsing ipv4: %w", err)
|
|
}
|
|
|
|
_, err = n.CreateInterface(context.Background(), network.CreateInterfaceParameters{
|
|
Name: interfaceName,
|
|
Interface: netdefs.Interface{
|
|
Type: netdefs.Hardware,
|
|
HardwareDevice: &link,
|
|
AddressingMode: netdefs.Static,
|
|
Address: &address,
|
|
Comment: "Created by CLI Setup",
|
|
},
|
|
})
|
|
if err != nil {
|
|
return fmt.Errorf("Doing API Call: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|