summaryrefslogtreecommitdiff
path: root/hisgle.go
blob: ea7a397b9f71a4ba80bcb9fda2277c0170dd8fe7 (plain)
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()
}