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() }