Skip to content

alistairking/scurry

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

scurry

Golang interface to Scamper.

Note: This is still very much a work-in-progress. The measurement structures are only partially implemented.

Dependencies

Other than the normal go module dependencies, you will also need to have built Scamper (or installed it from a package).

Usage

Current this module is just a very basic scamper control socket client. It can be used either as a basic CLI tool, or as a package.

In either mode, you will first need to start scamper and have it listen on a control socket:

# scamper -p 1000 -U /tmp/scamper.sock

CLI

The scurry CLI is just a simple wrapper around the package. It can execute parallel measurements of a single type against a set of targets.

Usage

scurry --help
Usage: scurry --target=TARGET,... --scamper-url=STRING <command>

Flags:
  -h, --help                  Show context-sensitive help.
  -t, --target=TARGET,...     IP to execute measurements towards
  -s, --scamper-url=STRING    URL to connect to scamper on (host:port or unix
                              domain socket)
      --log-level="info"      Log level

Commands:
  ping --target=TARGET,... --scamper-url=STRING
    Ping measurements

  traceroute --target=TARGET,... --scamper-url=STRING
    Traceroute measurements

Run "scurry <command> --help" for more information on a command.

Examples

Ping 8.8.8.8

$ scurry -s /tmp/scamper.sock ping -t 8.8.8.8 | jq
2021-08-22T10:02:55-07:00 INF Scurrying! cfg={"LogLevel":"info","Ping":{},"ScamperURL":"/tmp/scamper.sock","Target":["8.8.8.8"],"Traceroute":{}}
2021-08-22T10:02:55-07:00 INF Waiting for remaining measurements to complete linger=60000 module=controller outstanding=1 package=scurry
2021-08-22T10:02:59-07:00 INF Finished receiving results total=1
{
  "type": "ping",
  "target": "8.8.8.8",
  "options": {
    "ping": {},
    "traceroute": {}
  },
  "result": {
    "type": "ping",
    "version": "0.4",
    "method": "icmp-echo",
    "src": "10.250.100.2",
    "dst": "8.8.8.8",
    "start": {
      "sec": 1629651775,
      "usec": 474003
    },
    "ping_sent": 4,
    "probe_size": 84,
    "userid": 1,
    "ttl": 64,
    "wait": 1,
    "timeout": 1
  }
}

Traceroute to 8.8.8.8

scurry -s /tmp/scamper.sock trace -t 8.8.8.8 | jq
2021-08-22T10:39:25-07:00 INF Scurrying! cfg={"LogLevel":"info","Ping":{},"ScamperURL":"/tmp/scamper.sock","Target":["8.8.8.8"],"Trace":{}}
2021-08-22T10:39:25-07:00 INF Waiting for remaining measurements to complete linger=60000 module=controller outstanding=1 package=scurry
2021-08-22T10:39:35-07:00 INF Finished receiving results total=1
{
  "type": "trace",
  "target": "8.8.8.8",
  "options": {
    "ping": {},
    "trace": {}
  },
  "result": {
    "type": "trace",
    "version": "0.1",
    "method": "udp-paris",
    "src": "10.250.100.2",
    "dst": "8.8.8.8",
    "start": {
      "sec": 1629653965,
      "usec": 261318
    },
    "ping_sent": 0,
    "probe_size": 44,
    "userid": 1,
    "ttl": 0,
    "wait": 5,
    "timeout": 0
  }
}

Package

Controller

The Controller type is currently the easiest way to drive scamper. It accepts Task objects over a channel (Controller.TaskQueue()), and (asynchronously) returns the same objects populated with a scamper result object over another channel (Controller.ResultQueue()).

See the main() function of the scurry CLI for a worked example of using the Controller.

ScAttach

The ScAttach type is a low-level Scamper "attach" driver. It connects to an already-running Scamper daemon (either via TCP or unix domain socket), attaches using the (as-yet undocumented) attach format json command to request results be returned in JSON format rather than uuencoded warts binary.

ScAttach exposes three channels:

  • CommandQueue() chan string
  • ResultQueue() chan string
  • ErrorQueue() chan string

Scamper command strings can be sent directly to the buffered CommandQueue channel. For example: attach.CommandQueue() <- "ping 8.8.8.8"

Results and/or errors received from Scamper will be returned over the ResultQueue() and ErrorQueue() channels respectively. These channels must be serviced otherwise ScAttach will deadlock once the channel buffers fill up.

TODOs

The ultimate goal would be for Scamper to support usage as library, in which case we could use cgo to drive scamper directly rather than needing to connect to a stand-alone instance.

In the meantime:

  • Tests!!
  • Finish ScResult implementation.
  • Better CLI measurement building (see note for initTask in main.go)
  • Automatically start scamper daemon just in time for ScAttach to connect to it.
  • Transparently manage a pool of scamper instances (using ^^) to allow high-volume probing (round-robin between instances). Could also steer tasks based on target to try and work-around scamper's one-concurrent-measurement-per-target limitation.

About

Golang interface to Scamper

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors