blob: 82dd6cf9575f85535aca8b35f95fb4a701daff5c [file] [log] [blame]
/*
* Copyright 2018-present Open Networking Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package setup
import (
"log"
"os/exec"
"time"
)
const (
UNI_VETH_UP_PFX = "sim_uu"
UNI_VETH_DW_PFX = "sim_ud"
NNI_VETH_UP_PFX = "sim_nu"
NNI_VETH_DW_PFX = "sim_nd"
)
func ActivateWPASups(vethnames []string, delay int) error {
for _, vethname := range vethnames {
time.Sleep(time.Duration(delay) * time.Second)
log.Printf("ActivateWPASups for interface %v\n", vethname)
if err := activateWPASupplicant(vethname); err != nil {
return err
}
}
return nil
}
func ActivateDHCPClients(vethnames []string, delay int) error {
for _, vethname := range vethnames {
time.Sleep(time.Duration(delay) * time.Second)
log.Printf("activateDHCPClient for interface %v\n", vethname)
if err := activateDHCPClient(vethname); err != nil {
return err
}
}
return nil
}
func KillProcess(name string) error {
err := exec.Command("pkill", name).Run()
if err != nil {
log.Printf("[ERROR] Fail to pkill %s: %v\n", name, err)
return err
}
log.Printf("Successfully killed %s\n", name)
return nil
}
func TearVethDown(veths []string) {
for _, veth := range veths {
RemoveVeth(veth)
}
}
func CreateVethPairs(name1 string, name2 string) (err error) {
err = exec.Command("ip", "link", "add", name1, "type", "veth", "peer", "name", name2).Run()
if err != nil {
log.Printf("[ERROR] Fail to createVeth() for %s and %s veth creation error: %s\n", name1, name2, err.Error())
return
}
log.Printf("%s & %s was created.", name1, name2)
err = exec.Command("ip", "link", "set", name1, "up").Run()
if err != nil {
log.Println("[ERROR] Fail to createVeth() veth1 up", err)
return
}
err = exec.Command("ip", "link", "set", name2, "up").Run()
if err != nil {
log.Println("[ERROR] Fail to createVeth() veth2 up", err)
return
}
log.Printf("%s & %s was up.", name1, name2)
return
}
func RemoveVeth(name string) {
err := exec.Command("ip", "link", "del", name).Run()
if err != nil {
log.Println("[ERROR] Fail to removeVeth()", err)
}
log.Printf("%s was removed.", name)
}
func RemoveVeths(names []string) {
log.Printf("RemoveVeths() :%s\n", names)
for _, name := range names {
RemoveVeth(name)
}
}
func activateWPASupplicant(vethname string) (err error) {
cmd := "/sbin/wpa_supplicant"
conf := "/etc/wpa_supplicant/wpa_supplicant.conf"
err = exec.Command(cmd, "-D", "wired", "-i", vethname, "-c", conf).Start()
if err != nil {
log.Printf("[ERROR] Fail to activateWPASupplicant() for: %s %v\n", vethname, err)
return
}
log.Printf("activateWPASupplicant() for: %s\n", vethname)
return
}
func activateDHCPClient(vethname string) (err error) {
log.Printf("activateDHCPClient() start for: %s\n", vethname)
cmd := exec.Command("/usr/local/bin/dhclient", vethname)
// if err := cmd.Run(); err != nil {
if err := cmd.Start(); err != nil {
log.Printf("[ERROR] Failed to activateDHCPClient() for: %s", vethname)
log.Panic(err)
}
// if the dhclient commands return we got an IP,
// so kill it
// if err := KillProcess("/usr/local/bin/dhclient"); err != nil {
// log.Printf("[ERROR] Failed to kill activateDHCPClient() for: %s", vethname, err)
// }
log.Printf("activateDHCPClient() done for: %s\n", vethname)
return
}
func ActivateDHCPServer(veth string, serverip string) error {
err := exec.Command("ip", "addr", "add", serverip, "dev", veth).Run()
if err != nil {
log.Printf("[ERROR] Fail to add ip to %s address: %s\n", veth, err)
return err
}
err = exec.Command("ip", "link", "set", veth, "up").Run()
if err != nil {
log.Printf("[ERROR] Fail to set %s up: %s\n", veth, err)
return err
}
cmd := "/usr/local/bin/dhcpd"
conf := "/etc/dhcp/dhcpd.conf"
err = exec.Command(cmd, "-cf", conf, veth).Run()
if err != nil {
log.Printf("[ERROR] Fail to activateDHCP Server (): %s\n", err)
return err
}
log.Printf("Activate DHCP Server()\n")
return err
}