Skip to content

Commit 42a8572

Browse files
author
chaehni
authored
RAINS name resolution (#52)
* vendor RAINS deps * enabled resolving names via RAINS * temporarily removed vendoring * updated RAINS bootstrapping * removed test files * revised after feedback * added RAINS deps to vendor.json * simplified init * fixed ineffectual assignment
1 parent 7faa7a8 commit 42a8572

File tree

4 files changed

+170
-15
lines changed

4 files changed

+170
-15
lines changed

bat/bat.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ var (
7474
)
7575

7676
func init() {
77-
7877
flag.BoolVar(&interactive, "in", false, "Lets user choose the path to destination")
7978
flag.BoolVar(&ver, "v", false, "Print Version Number")
8079
flag.BoolVar(&ver, "version", false, "Print Version Number")

lib/scionutil/hosts.go

Lines changed: 65 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,39 @@ import (
1818
"bytes"
1919
"fmt"
2020
"io/ioutil"
21-
"log"
21+
"os"
22+
"path"
2223
"regexp"
2324
"strings"
25+
"time"
2426

27+
"github.com/netsec-ethz/rains/pkg/rains"
2528
libaddr "github.com/scionproto/scion/go/lib/addr"
29+
"github.com/scionproto/scion/go/lib/snet"
2630
)
2731

2832
type scionAddress struct {
2933
ia libaddr.IA
3034
l3 libaddr.HostAddr
3135
}
3236

37+
// hosts file
3338
var (
3439
hostFilePath = "/etc/hosts"
3540
addrRegexp = regexp.MustCompile(`^(?P<ia>\d+-[\d:A-Fa-f]+),\[(?P<host>[^\]]+)\]`)
36-
hosts map[string]scionAddress // hostname -> scionAddress
37-
revHosts map[string][]string // SCION address w/o port -> hostnames
41+
hosts = make(map[string]scionAddress) // hostname -> scionAddress
42+
revHosts = make(map[string][]string) // SCION address w/o port -> hostnames
43+
)
44+
45+
// RAINS
46+
var (
47+
rainsConfigPath = path.Join(os.Getenv("SC"), "gen", "rains.cfg")
48+
ctx = "." // use global context
49+
qType = rains.OTScionAddr4 // request SCION IPv4 addresses
50+
qOpts = []rains.Option{} // no options
51+
expire = 5 * time.Minute // sensible expiry date?
52+
timeout = 500 * time.Millisecond // timeout for query
53+
rainsServer *snet.Addr // resolver address
3854
)
3955

4056
const (
@@ -43,19 +59,20 @@ const (
4359
)
4460

4561
func init() {
62+
// parse hosts file
4663
hostsFile, err := readHostsFile()
47-
if err != nil {
48-
hostsFile = []byte{}
49-
}
50-
parseHostsFile(hostsFile)
51-
if err != nil {
52-
log.Fatal(err)
64+
if err == nil {
65+
parseHostsFile(hostsFile)
5366
}
67+
68+
// read RAINS server address
69+
rainsServer = readRainsConfig()
5470
}
5571

5672
// AddHost adds a host to the map of known hosts
5773
// An error is returned if the address has a wrong format or
5874
// the hostname already exists
75+
// The added host will not persist between program executions
5976
func AddHost(hostname, address string) error {
6077
if addrs, ok := hosts[hostname]; ok {
6178
return fmt.Errorf("Host %q already exists, address(es): %v", hostname, addrs)
@@ -72,14 +89,35 @@ func AddHost(hostname, address string) error {
7289

7390
// GetHostByName returns the IA and HostAddr corresponding to hostname
7491
func GetHostByName(hostname string) (libaddr.IA, libaddr.HostAddr, error) {
92+
// try to resolve hostname locally
7593
addr, ok := hosts[hostname]
76-
if !ok {
77-
return libaddr.IA{}, nil, fmt.Errorf("Address for host %q not found", hostname)
94+
if ok {
95+
return addr.ia, addr.l3, nil
96+
}
97+
98+
if rainsServer == nil {
99+
return libaddr.IA{}, nil, fmt.Errorf("Could not resolve %q, no RAINS server configured", hostname)
78100
}
79-
return addr.ia, addr.l3, nil
101+
102+
// fall back to RAINS
103+
104+
// TODO(chaehni): This call can sometimes cause a timeout even though the server is reachable (see issue #221)
105+
// The timeout value has been decreased to counter this behavior until the problem is resolved.
106+
reply, err := rains.Query(hostname, ctx, []rains.Type{qType}, qOpts, expire, timeout, rainsServer)
107+
if err != nil {
108+
return libaddr.IA{}, nil, fmt.Errorf("Address for host %q not found: %v", hostname, err)
109+
}
110+
scionAddr, err := addrFromString(reply[qType])
111+
if err != nil {
112+
return libaddr.IA{}, nil, fmt.Errorf("Address for host %q invalid: %v", hostname, err)
113+
}
114+
115+
return scionAddr.ia, scionAddr.l3, nil
116+
80117
}
81118

82119
// GetHostnamesByAddress returns the hostnames corresponding to address
120+
// TODO: (chaehni) RAINS address query to resolve address to name
83121
func GetHostnamesByAddress(address string) ([]string, error) {
84122
match := addrRegexp.FindString(address)
85123
host, ok := revHosts[match]
@@ -98,8 +136,6 @@ func readHostsFile() ([]byte, error) {
98136
}
99137

100138
func parseHostsFile(hostsFile []byte) {
101-
hosts = make(map[string]scionAddress)
102-
revHosts = make(map[string][]string)
103139
lines := bytes.Split(hostsFile, []byte("\n"))
104140
for _, line := range lines {
105141
fields := strings.Fields(string(line))
@@ -124,8 +160,23 @@ func parseHostsFile(hostsFile []byte) {
124160
}
125161
}
126162

163+
func readRainsConfig() *snet.Addr {
164+
bs, err := ioutil.ReadFile(rainsConfigPath)
165+
if err != nil {
166+
return nil
167+
}
168+
addr, err := snet.AddrFromString(strings.TrimSpace(string(bs)))
169+
if err != nil {
170+
return nil
171+
}
172+
return addr
173+
}
174+
127175
func addrFromString(addr string) (scionAddress, error) {
128176
parts := addrRegexp.FindStringSubmatch(addr)
177+
if parts == nil {
178+
return scionAddress{}, fmt.Errorf("No valid SCION address: %q", addr)
179+
}
129180
ia, err := libaddr.IAFromString(parts[iaIndex])
130181
if err != nil {
131182
return scionAddress{}, fmt.Errorf("Invalid IA string: %v", parts[iaIndex])

lib/scionutil/initialization.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ func GetDefaultDispatcher() string {
6767
// GetLocalhost returns a local SCION address an application can bind to
6868
func GetLocalhost() (*snet.Addr, error) {
6969
str, err := GetLocalhostString()
70+
if err != nil {
71+
return nil, err
72+
}
7073
addr, err := snet.AddrFromString(str)
7174
if err != nil {
7275
return nil, err

vendor/vendor.json

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@
9090
"revision": "198357931e6129b810c9c77c12e0dd754846170c",
9191
"revisionTime": "2018-03-06T13:52:33Z"
9292
},
93+
{
94+
"checksumSHA1": "I9USlnFClp2E/Ap9vfano+H7/bk=",
95+
"path": "github.com/britram/borat",
96+
"revision": "f891bcfcfb9b69c58b8348ec13eadad5bf2a5a2d",
97+
"revisionTime": "2018-10-11T13:03:14Z"
98+
},
9399
{
94100
"checksumSHA1": "PYXuf7wvcj492uWhjvmXlyyQUYc=",
95101
"path": "github.com/cheekybits/genny/generic",
@@ -316,6 +322,90 @@
316322
"revision": "b3511bfdd742af558b54eb6160aca9446d762a19",
317323
"revisionTime": "2018-07-18T00:29:43Z"
318324
},
325+
{
326+
"checksumSHA1": "oAzVVzZ8G62Tc8Z6QKKuFmI79bk=",
327+
"path": "github.com/netsec-ethz/rains/internal/pkg/algorithmTypes",
328+
"revision": "ea31b8af8390375bf72b810804de21f17036a5d0",
329+
"revisionTime": "2019-03-25T15:14:30Z"
330+
},
331+
{
332+
"checksumSHA1": "74bjp4b7F8YZIKKsMTfTF1cPafU=",
333+
"path": "github.com/netsec-ethz/rains/internal/pkg/cbor",
334+
"revision": "ea31b8af8390375bf72b810804de21f17036a5d0",
335+
"revisionTime": "2019-03-25T15:14:30Z"
336+
},
337+
{
338+
"checksumSHA1": "JF0HSoKCifEckCKfi9eX54lxUb0=",
339+
"path": "github.com/netsec-ethz/rains/internal/pkg/connection",
340+
"revision": "ea31b8af8390375bf72b810804de21f17036a5d0",
341+
"revisionTime": "2019-03-25T15:14:30Z"
342+
},
343+
{
344+
"checksumSHA1": "1WY5z5R39nDBaunrcEnUs1l0itI=",
345+
"path": "github.com/netsec-ethz/rains/internal/pkg/datastructures/bitarray",
346+
"revision": "ea31b8af8390375bf72b810804de21f17036a5d0",
347+
"revisionTime": "2019-03-25T15:14:30Z"
348+
},
349+
{
350+
"checksumSHA1": "vq0RzZ/9ctflFEOJ4nn/arquwwA=",
351+
"path": "github.com/netsec-ethz/rains/internal/pkg/keys",
352+
"revision": "ea31b8af8390375bf72b810804de21f17036a5d0",
353+
"revisionTime": "2019-03-25T15:14:30Z"
354+
},
355+
{
356+
"checksumSHA1": "7n3dj+WS6lVlWGXNLfVYzPOT8tU=",
357+
"path": "github.com/netsec-ethz/rains/internal/pkg/message",
358+
"revision": "ea31b8af8390375bf72b810804de21f17036a5d0",
359+
"revisionTime": "2019-03-25T15:14:30Z"
360+
},
361+
{
362+
"checksumSHA1": "gR86BQoomx0zX22xefse2trtHJw=",
363+
"path": "github.com/netsec-ethz/rains/internal/pkg/object",
364+
"revision": "ea31b8af8390375bf72b810804de21f17036a5d0",
365+
"revisionTime": "2019-03-25T15:14:30Z"
366+
},
367+
{
368+
"checksumSHA1": "aaQD2Wm6Q9yETQaqk0bByLgYyNE=",
369+
"path": "github.com/netsec-ethz/rains/internal/pkg/query",
370+
"revision": "ea31b8af8390375bf72b810804de21f17036a5d0",
371+
"revisionTime": "2019-03-25T15:14:30Z"
372+
},
373+
{
374+
"checksumSHA1": "I3t/4fX/VIEUBhaEZlja2G0EcBE=",
375+
"path": "github.com/netsec-ethz/rains/internal/pkg/section",
376+
"revision": "ea31b8af8390375bf72b810804de21f17036a5d0",
377+
"revisionTime": "2019-03-25T15:14:30Z"
378+
},
379+
{
380+
"checksumSHA1": "lCbtqf/yBKG45tYEZs9SvjODing=",
381+
"path": "github.com/netsec-ethz/rains/internal/pkg/signature",
382+
"revision": "ea31b8af8390375bf72b810804de21f17036a5d0",
383+
"revisionTime": "2019-03-25T15:14:30Z"
384+
},
385+
{
386+
"checksumSHA1": "0mE6gU++UPNzNQmeRkQmTah/C/U=",
387+
"path": "github.com/netsec-ethz/rains/internal/pkg/token",
388+
"revision": "ea31b8af8390375bf72b810804de21f17036a5d0",
389+
"revisionTime": "2019-03-25T15:14:30Z"
390+
},
391+
{
392+
"checksumSHA1": "DqmAjSj4jCz7MIk72DFhu8WxzWw=",
393+
"path": "github.com/netsec-ethz/rains/internal/pkg/util",
394+
"revision": "ea31b8af8390375bf72b810804de21f17036a5d0",
395+
"revisionTime": "2019-03-25T15:14:30Z"
396+
},
397+
{
398+
"checksumSHA1": "chhRV8twUksUbKcKaRMmXhWKRlQ=",
399+
"path": "github.com/netsec-ethz/rains/internal/pkg/zonefile",
400+
"revision": "ea31b8af8390375bf72b810804de21f17036a5d0",
401+
"revisionTime": "2019-03-25T15:14:30Z"
402+
},
403+
{
404+
"checksumSHA1": "jup0QWu5f6W4YKZkZ1YZnWlfKJ4=",
405+
"path": "github.com/netsec-ethz/rains/pkg/rains",
406+
"revision": "ea31b8af8390375bf72b810804de21f17036a5d0",
407+
"revisionTime": "2019-03-25T15:14:30Z"
408+
},
319409
{
320410
"checksumSHA1": "SQi5yeNb9HnAMRpEhQgcv9x9yKc=",
321411
"path": "github.com/patrickmn/go-cache",
@@ -669,6 +759,12 @@
669759
"revision": "8ac0e0d97ce45cd83d1d7243c060cb8461dda5e9",
670760
"revisionTime": "2018-06-07T13:59:11Z"
671761
},
762+
{
763+
"checksumSHA1": "asZBHvcTKF5gVlI7AYnMlLXRYys=",
764+
"path": "golang.org/x/crypto/sha3",
765+
"revision": "b7391e95e576cacdcdd422573063bc057239113d",
766+
"revisionTime": "2019-03-19T22:29:04Z"
767+
},
672768
{
673769
"checksumSHA1": "GtamqiJoL7PGHsN454AoffBFMa8=",
674770
"path": "golang.org/x/net/context",
@@ -699,6 +795,12 @@
699795
"revision": "65e2d4e15006aab9813ff8769e768bbf4bb667a0",
700796
"revisionTime": "2019-02-01T23:59:58Z"
701797
},
798+
{
799+
"checksumSHA1": "c2uqM0KcVJ2SFu/9Nt4w63GZ9xo=",
800+
"path": "golang.org/x/sys/cpu",
801+
"revision": "f49334f85ddcf0f08d7fb6dd7363e9e6d6b777eb",
802+
"revisionTime": "2019-03-21T05:14:46Z"
803+
},
702804
{
703805
"checksumSHA1": "tY+5thYxjKDUQyQXYcBqogmMS5U=",
704806
"license": "3-BSD",

0 commit comments

Comments
 (0)