Giter Site home page Giter Site logo

terminus's Introduction

Terminus

Terminus is an IPv4 subnet address calculator

It can be used

  • as a standalone tool to output human readable information about a network or address,
  • as a tool suitable to be used by scripts or other programs via template language,
  • as well as a library for applications written in Go.

Why Terminus?

In Roman religion, Terminus was the god who protected boundary stones. His name was the Latin word for such a marker. Therefore, it is the ideal name of an application, which calculates network boundaries.

Besides, there are a few command-line applications, which output information about IP addresses in human readable form. However, they lack flexibility when it comes to output format.

Features

For a given IPv4 address (and optional prefix length), Terminus calculates

  • IP / netmask in dot-decimal notation
  • prefix length
  • broadcast address / network address
  • host address range of the subnet
  • maximum number of hosts / IPs in the subnet
  • wildcard mask in dot-decimal notation

Examples

$ terminus -i eth0
172.16.57.200

$ terminus -p 10.0.0.138
8

$ terminus -b 192.168.100.1/24
192.168.100.255

$ terminus -f -l lo
127.0.0.1
127.255.255.254

# using a template expression
$ terminus -t "{{.ip}}/{{.prefix}} ({{.network}} - {{.broadcast}})" tun0
10.197.63.254/11 (10.192.0.0 - 10.223.255.255)

Template Language

When given a template expression, Terminus evaluates it using Go templates. Thus, all actions, expressions and functions available in a Go template can be used.

For example, the following statement checks if the environment variable IP is a loopback address. If so, it replaces the IP with "localhost", and it yields a nice URL:

$ export IP="127.100.100.1"
$ terminus -t "{{if .ip.IsLoopback}}http://localhost{{else}}https://{{.ip}}{{end}}:8080/" "${IP}"
http://localhost:8080/

Network Interfaces

If an IP address or network interface is passed as a command line argument, it is set as the default interface. In this way it can be accessed with . e.g., {{.ip}}.

In general, all interfaces can be addressed by name via {{.interfaces.<NAME>}} e.g., {{.interfaces.tun0.ip}}. In other words, the following expressions are equivalent:

terminus -t "{{.network}} - {{.broadcast}}" tun0
terminus -t "{{.interfaces.tun0.network}} - {{.interfaces.tun0.broadcast}}"

While the short syntax is preferred for retrieving multiple properties of a single network interface, the long syntax can be used for retrieving properties of multiple network interfaces.

$ terminus -t '{{.interfaces.eth0.ip}}{{"\n"}}{{.interfaces.eth1.ip}}'
172.16.57.200
192.168.100.1

Windows

Network adapters can contain whitespaces e.g., "Local Area Connection". Therefore, it is essential to quote them in template expressions. The Windows command interpreter cmd requires two double quotes to quote a literal string e.g., ""Local Area Connection"". Due to the nested quotes, the index function must be used to address properties. This adds additional double quotes to the literals:

>terminus -t "{{index .interfaces """Local Area Connection""" """ip"""}} {{index .interfaces """Local Area Connection""" """netmask"""}}"
192.168.100.200 255.255.255.0

Network Interface Properties

Every network interface has the following properties:

Expression      Example         Type    Description
{{.broadcast}}  10.0.3.255      net.IP  broadcast address
{{.first}}      10.0.0.1        net.IP  first usable IP address of the subnet
{{.ip}}         10.0.0.42       net.IP  IP address
{{.last}}       10.0.3.254      net.IP  last usable IP address of the subnet
{{.name}}       eth0            string  name of the network interface
{{.netmask}}    255.255.252.0   net.IP  subnet mask
{{.network}}    10.0.0.0        net.IP  network address
{{.prefix}}     22              int     prefix length
{{.size}}       1024            int     size of the subnet
{{.usable}}     1022            int     usable size of the subnet (host count)
{{.wildcard}}   0.0.3.255       net.IP  wildcard mask

Note that values might be absent if an interface is not up.

Functions

terminus comes with built-in functions for converting IP addresses and netmasks, and for formatting output. The following functions are available:

  • toBinary: converts an IP address (or netmask) to binary dot-decimal notation
  • toHex: converts a netmask (or IP address) to hexadecimal notation
  • toJson: converts the input to a valid JSON object/array/string (if possible)
$ terminus -t '{{.ip}} {{.ip | toBinary}}{{"\n"}}{{.netmask}} {{.netmask | toHex}}' eth0
172.16.57.200 10101100.00010000.00111001.11001000
255.255.254.0 0xfffffe00

The following example dumps all properties of the eth0 interface as JSON object:

$ terminus -t "{{. | toJson}}" eth0
{"broadcast":"172.16.57.255","first":"172.16.56.1","ip":"172.16.57.200","last":"172.16.57.254","name":"eth0","netmask":"255.255.254.0","network":"172.16.56.0","prefix":23,"size":512,"usable":510,"version":4,"wildcard":"0.0.1.255"}

The toJson function comes in handy when combined with other tools like jq. For example, a JSON array of all network interfaces and their properties can be created as follows:

$ terminus -L | cut -f 1 | xargs -n1 terminus -t "{{. | toJson}}" | jq -rs "."
[
  {
    "broadcast": "172.16.57.255",
    "first": "172.16.56.1",
    "ip": "172.16.57.200",
    "last": "172.16.57.254",
    "name": "eth0",
    "netmask": "255.255.254.0",
    "network": "172.16.56.0",
    "prefix": 23,
    "size": 512,
    "usable": 510,
    "version": 4,
    "wildcard": "0.0.1.255"
  },
  ...
]

Pipes & stdin

When using Terminus in a pipeline, the output of the previous command is appended to the arguments passed to Terminus. Note that template expressions must be quoted to prevent word splitting.

The following example reads the template from a file and parametrizes it with the interface eth0:

$ cat macOS_format.tmpl
-t "inet {{.ip}} netmask {{.netmask | toHex}} broadcast {{.broadcast}}"
$ cat macOS_format.tmpl | terminus eth0
inet 172.16.57.200 netmask 0xfffffe00 broadcast 172.16.57.255
# equivalent to
# terminus -t "inet {{.ip}} netmask {{.netmask | toHex}} broadcast {{.broadcast}}" eth0

Also xargs can be useful e.g., for iterating over all ethernet adapters and printing their IP addresses:

$ terminus -L | cut -f 1 | grep -E "^eth" | xargs -n1 terminus -t '{{.name}}{{"\t"}}{{.ip}}'
eth0  172.16.57.200
eth0:0  127.16.57.100
eth1  192.168.100.1

Roadmap

  • IPv6 support (including conversions)
  • subnet splitting

Related Projects (in alphabetical order)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.