package main import ( "fmt" "os" "github.com/Wifx/gonetworkmanager" "github.com/google/uuid" ) const ( ethernetType = "802-3-ethernet" ethernetSection = "802-3-ethernet" ethernetSectionAutoNegotiate = "auto-negotiate" connectionSection = "connection" connectionSectionID = "id" connectionSectionType = "type" connectionSectionUUID = "uuid" connectionSectionIfaceName = "interface-name" connectionSectionAutoconnect = "autoconnect" ip4Section = "ipv4" ip4SectionAddressData = "address-data" ip4SectionAddresses = "addresses" ip4SectionAddress = "address" ip4SectionPrefix = "prefix" ip4SectionMethod = "method" ip4SectionGateway = "gateway" ip4SectionNeverDefault = "never-default" ip6Section = "ipv6" ip6SectionMethod = "method" connectionID = "My Connection" interfaceName = "eth1" desiredIPAddress = "192.168.1.1" desiredGatewayAddress = "192.168.1.1" desiredIPAddressNumerical = 16885952 desiredIPPrefix = 24 desiredGatewayAddressNumerical = 16885952 // Allows for static ip desiredIP4Method = "manual" // Would like this to be "disabled" however not supported // in the current network manager stack desiredIP6Method = "ignore" ) func printVersion() { /* Create new instance of gonetworkmanager */ nm, err := gonetworkmanager.NewNetworkManager() if err != nil { fmt.Println(err.Error()) os.Exit(1) } // Don't really need the network manager object per se // however knowing the version isn't bad var nmVersion string nmVersion, err = nm.GetPropertyVersion() if err != nil { fmt.Println(err.Error()) os.Exit(1) } fmt.Println("Network Manager Version: " + nmVersion) } func checkForExistingConnection() error { // See if our connection already exists everactiveSettings, err := gonetworkmanager.NewSettings() if err != nil { return err } currentConnections, err := everactiveSettings.ListConnections() if err != nil { return err } for _, v := range currentConnections { connectionSettings, settingsError := v.GetSettings() if settingsError != nil { fmt.Println("settings error, continuing") continue } currentConnectionSection := connectionSettings[connectionSection] if currentConnectionSection[connectionSectionID] == connectionID { return fmt.Errorf("connection already exists") } } return nil } func createNewConnection() error { connection := make(map[string]map[string]interface{}) connection[ethernetSection] = make(map[string]interface{}) connection[ethernetSection][ethernetSectionAutoNegotiate] = false connection[connectionSection] = make(map[string]interface{}) connection[connectionSection][connectionSectionID] = connectionID connection[connectionSection][connectionSectionType] = ethernetType connectionUUID, err := uuid.NewUUID() if err != nil { fmt.Println(err.Error()) os.Exit(1) } connection[connectionSection][connectionSectionUUID] = connectionUUID.String() connection[connectionSection][connectionSectionIfaceName] = interfaceName connection[connectionSection][connectionSectionAutoconnect] = true connection[ip4Section] = make(map[string]interface{}) addressData := make([]map[string]interface{}, 1) addressData[0] = make(map[string]interface{}) addressData[0][ip4SectionAddress] = desiredIPAddress addressData[0][ip4SectionPrefix] = desiredIPPrefix connection[ip4Section][ip4SectionAddressData] = addressData // order defined by network manager addresses := make([]uint32, 3) addresses[0] = desiredIPAddressNumerical addresses[1] = desiredIPPrefix addresses[2] = desiredGatewayAddressNumerical addressArray := make([][]uint32, 1) addressArray[0] = addresses connection[ip4Section][ip4SectionAddresses] = addressArray connection[ip4Section][ip4SectionGateway] = desiredGatewayAddress connection[ip4Section][ip4SectionMethod] = desiredIP4Method connection[ip4Section][ip4SectionNeverDefault] = true connection[ip6Section] = make(map[string]interface{}) connection[ip6Section][ip6SectionMethod] = desiredIP6Method everactiveSettings, err := gonetworkmanager.NewSettings() if err != nil { return err } _, err = everactiveSettings.AddConnection(connection) if err != nil { return err } return nil } func main() { // show the version printVersion() // See if our connection already exists err := checkForExistingConnection() if err != nil { fmt.Println(err.Error()) os.Exit(0) } // create the new connection err = createNewConnection() if err != nil { fmt.Println(err.Error()) os.Exit(1) } fmt.Print("added " + connectionID + " to the system.") os.Exit(0) }