1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
package main
import (
"bytes"
"fmt"
"io/ioutil"
"log"
"net"
"os"
"path/filepath"
"github.com/BurntSushi/toml"
"github.com/jessevdk/go-flags"
"github.com/osrg/gobgp/config"
)
type QuaggaConfig struct {
id int
config *config.Neighbor
gobgpConfig *config.Global
serverIP net.IP
}
func NewQuaggaConfig(id int, gConfig *config.Global, myConfig *config.Neighbor, server net.IP) *QuaggaConfig {
return &QuaggaConfig{
id: id,
config: myConfig,
gobgpConfig: gConfig,
serverIP: server,
}
}
func (qt *QuaggaConfig) Config() *bytes.Buffer {
buf := bytes.NewBuffer(nil)
buf.WriteString("hostname bgpd\n")
buf.WriteString("password zebra\n")
buf.WriteString(fmt.Sprintf("router bgp %d\n", qt.config.Config.PeerAs))
buf.WriteString(fmt.Sprintf("bgp router-id 192.168.0.%d\n", qt.id))
buf.WriteString(fmt.Sprintf("network 192.168.%d.0/24\n", qt.id))
buf.WriteString(fmt.Sprintf("neighbor %s remote-as %d\n", qt.serverIP, qt.gobgpConfig.Config.As))
buf.WriteString(fmt.Sprintf("neighbor %s password %s\n", qt.serverIP, qt.config.Config.AuthPassword))
buf.WriteString("log file /var/log/quagga/bgpd.log")
return buf
}
func create_config_files(nr int, outputDir string) {
gobgpConf := config.Bgp{}
gobgpConf.Global.Config.As = 65000
gobgpConf.Global.Config.RouterId = "192.168.255.1"
for i := 1; i < nr+1; i++ {
c := config.Neighbor{}
c.Config.PeerAs = 65000 + uint32(i)
c.Config.NeighborAddress = fmt.Sprintf("10.0.0.%d", i)
c.Config.AuthPassword = fmt.Sprintf("password%d", i)
gobgpConf.Neighbors = append(gobgpConf.Neighbors, c)
q := NewQuaggaConfig(i, &gobgpConf.Global, &c, net.ParseIP("10.0.255.1"))
if err := os.Mkdir(fmt.Sprintf("%s/q%d", outputDir, i), 0755); err != nil {
log.Fatalf("failed to make directory: %v", err)
}
if err := ioutil.WriteFile(fmt.Sprintf("%s/q%d/bgpd.conf", outputDir, i), q.Config().Bytes(), 0644); err != nil {
log.Fatal(err)
}
}
var buffer bytes.Buffer
encoder := toml.NewEncoder(&buffer)
if err := encoder.Encode(gobgpConf); err != nil {
log.Fatalf("failed to encode config: %v", err)
}
if err := ioutil.WriteFile(fmt.Sprintf("%s/gobgpd.conf", outputDir), buffer.Bytes(), 0644); err != nil {
log.Fatalf("failed to write config file: %v", err)
}
}
func main() {
var opts struct {
ClientNumber int `short:"n" long:"client-number" description:"specfying the number of clients" default:"8"`
OutputDir string `short:"c" long:"output" description:"specifying the output directory"`
}
parser := flags.NewParser(&opts, flags.Default)
_, err := parser.Parse()
if err != nil {
os.Exit(1)
}
if opts.OutputDir == "" {
opts.OutputDir, _ = filepath.Abs(".")
} else {
if _, err := os.Stat(opts.OutputDir); os.IsNotExist(err) {
os.Mkdir(opts.OutputDir, 0755)
}
}
create_config_files(opts.ClientNumber, opts.OutputDir)
}
|