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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
package main
import ( "fmt"
"log"
"os"
"strconv" )
// http://go-database-sql.org/importing.html
// _ "github.com/mattn/go-sqlite3"
// _ "code.google.com/p/gosqlite/sqlite3"
import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
"github.com/pborman/getopt"
)
func ethers(db *sql.DB, vlan int) {
var (
mac string
ipv4 string
)
// CREATE TABLE devices (name, mac, interface);
// CREATE TABLE addresses (mac, vlan, ipv4);
rows, err := db.Query("SELECT mac, ipv4 FROM addresses WHERE vlan=?", vlan)
if err != nil {
log.Fatal(err)
}
for rows.Next() {
err := rows.Scan(&mac, &ipv4)
if err != nil {
log.Fatal(err)
}
fmt.Println(mac, " ", ipv4)
}
}
func hosts(db *sql.DB, vlan int) {
var (
ipv4 string
name string
suffix *string
alias string
hostpart string
)
// CREATE TABLE devices (name, mac, interface);
// CREATE TABLE addresses (mac, vlan, ipv4);
rows, err := db.Query("SELECT a.ipv4, d.name, d.suffix " +
"FROM addresses AS a JOIN devices AS d ON a.mac=d.mac WHERE vlan=?",
vlan)
if err != nil {
log.Fatal(err)
}
for rows.Next() {
err := rows.Scan(&ipv4, &name, &suffix)
if err != nil {
log.Fatal(err)
}
if suffix != nil {
hostpart = name + "-" + *suffix
} else {
hostpart = name
}
fmt.Print(ipv4, "\t", hostpart)
// CREATE TABLE aliases (alias, target);
rows, err := db.Query("SELECT alias FROM aliases WHERE target=?", hostpart)
if err != nil {
log.Fatal(err)
}
for rows.Next() {
err := rows.Scan(&alias)
if err != nil {
log.Fatal(err)
}
fmt.Print(" ", alias)
}
fmt.Println()
}
}
func main() {
var (
description string
ipv4 string
)
optDatabase := getopt.StringLong("database", 'd', "",
"Path to SQLite3 database file with device addresses")
optHelp := getopt.BoolLong("help", 0, "Help")
getopt.SetParameters("{ethers|hosts} list_of_networks")
getopt.Parse()
if *optHelp {
getopt.Usage()
os.Exit(0)
}
args := getopt.Args()
db, err := sql.Open("sqlite3", *optDatabase)
if err != nil {
log.Fatal(err)
}
for _, arg := range args[1:] {
vlan, _ := strconv.Atoi(arg)
rows, err := db.Query(
"SELECT description, ipv4 FROM networks WHERE vlan=?", vlan)
if err != nil {
log.Fatal(err)
}
for rows.Next() {
err := rows.Scan(&description, &ipv4)
if err != nil {
log.Fatal(err)
}
fmt.Print("\n# ", description, ", ", ipv4, "\n")
fmt.Println("# vlan:", vlan)
switch args[0] {
case "ethers":
ethers(db, vlan)
case "hosts":
hosts(db, vlan)
default:
os.Exit(1)
}
}
}
db.Close()
}
|