Skip to content

Commit 5040fa4

Browse files
authored
Merge pull request #180 from ipinfo/ahmad/BE-2211
CLI: ipinfo tool prefix Masked / Bits / IsValid
2 parents 3f1b10a + 6a4160f commit 5040fa4

File tree

7 files changed

+284
-2
lines changed

7 files changed

+284
-2
lines changed

ipinfo/cmd_tool_prefix.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ import (
1111

1212
var completionsToolPrefix = &complete.Command{
1313
Sub: map[string]*complete.Command{
14-
"addr": completionsToolPrefixAddr,
14+
"addr": completionsToolPrefixAddr,
15+
"bits": completionsToolPrefixBits,
16+
"masked": completionsToolPrefixMasked,
17+
"is_valid": completionsToolPrefixIsValid,
1518
},
1619
Flags: map[string]complete.Predictor{
1720
"-h": predict.Nothing,
@@ -24,7 +27,10 @@ func printHelpToolPrefix() {
2427
`Usage: %s tool prefix <cmd> [<opts>] [<args>]
2528
2629
Commands:
27-
addr returns the base IP address of a prefix.
30+
addr returns the base IP address of a prefix.
31+
bits returns the length of a prefix and reports -1 if invalid.
32+
masked returns canonical form of a prefix, masking off non-high bits, and returns the zero if invalid.
33+
is_valid reports whether a prefix is valid.
2834
2935
Options:
3036
--help, -h
@@ -55,6 +61,12 @@ func cmdToolPrefix() error {
5561
switch {
5662
case cmd == "addr":
5763
err = cmdToolPrefixAddr()
64+
case cmd == "bits":
65+
err = cmdToolPrefixBits()
66+
case cmd == "masked":
67+
err = cmdToolPrefixMasked()
68+
case cmd == "is_valid":
69+
err = cmdToolPrefixIsValid()
5870
default:
5971
err = toolPrefixHelp()
6072
}

ipinfo/cmd_tool_prefix_bits.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/ipinfo/cli/lib"
7+
"github.com/ipinfo/cli/lib/complete"
8+
"github.com/ipinfo/cli/lib/complete/predict"
9+
"github.com/spf13/pflag"
10+
)
11+
12+
var completionsToolPrefixBits = &complete.Command{
13+
Flags: map[string]complete.Predictor{
14+
"-h": predict.Nothing,
15+
"--help": predict.Nothing,
16+
},
17+
}
18+
19+
func printHelpToolPrefixBits() {
20+
fmt.Printf(
21+
`Usage: %s tool prefix bits <cidr>
22+
23+
Description:
24+
Returns the length of a prefix and reports -1 if invalid.
25+
26+
Examples:
27+
# CIDR Valid Examples.
28+
$ %[1]s tool prefix bits 192.168.0.0/16
29+
$ %[1]s tool prefix bits 10.0.0.0/8
30+
$ %[1]s tool prefix bits 2001:0db8:1234::/48
31+
$ %[1]s tool prefix bits 2606:2800:220:1::/64
32+
33+
# CIDR Invalid Examples.
34+
$ %[1]s tool prefix bits 192.168.0.0/40
35+
$ %[1]s tool prefix bits 2001:0db8:1234::/129
36+
37+
Options:
38+
--help, -h
39+
show help.
40+
`, progBase)
41+
}
42+
43+
func cmdToolPrefixBits() (err error) {
44+
f := lib.CmdToolPrefixBitsFlags{}
45+
f.Init()
46+
pflag.Parse()
47+
48+
return lib.CmdToolPrefixBits(f, pflag.Args()[3:], printHelpToolPrefixBits)
49+
}

ipinfo/cmd_tool_prefix_isValid.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/ipinfo/cli/lib"
7+
"github.com/ipinfo/cli/lib/complete"
8+
"github.com/ipinfo/cli/lib/complete/predict"
9+
"github.com/spf13/pflag"
10+
)
11+
12+
var completionsToolPrefixIsValid = &complete.Command{
13+
Flags: map[string]complete.Predictor{
14+
"-h": predict.Nothing,
15+
"--help": predict.Nothing,
16+
},
17+
}
18+
19+
func printHelpToolPrefixIsValid() {
20+
fmt.Printf(
21+
`Usage: %s tool prefix is_valid <cidr>
22+
23+
Description:
24+
Reports whether a prefix is valid.
25+
26+
Examples:
27+
# CIDR Valid Examples.
28+
$ %[1]s tool prefix is_valid 192.168.0.0/16
29+
$ %[1]s tool prefix is_valid 10.0.0.0/8
30+
$ %[1]s tool prefix is_valid 2001:0db8:1234::/48
31+
$ %[1]s tool prefix is_valid 2606:2800:220:1::/64
32+
33+
# CIDR Invalid Examples.
34+
$ %[1]s tool prefix is_valid 192.168.0.0/40
35+
$ %[1]s tool prefix is_valid 2001:0db8:1234::/129
36+
37+
Options:
38+
--help, -h
39+
show help.
40+
`, progBase)
41+
}
42+
43+
func cmdToolPrefixIsValid() (err error) {
44+
f := lib.CmdToolPrefixIsValidFlags{}
45+
f.Init()
46+
pflag.Parse()
47+
48+
return lib.CmdToolPrefixIsValid(f, pflag.Args()[3:], printHelpToolPrefixIsValid)
49+
}

ipinfo/cmd_tool_prefix_masked.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/ipinfo/cli/lib"
7+
"github.com/ipinfo/cli/lib/complete"
8+
"github.com/ipinfo/cli/lib/complete/predict"
9+
"github.com/spf13/pflag"
10+
)
11+
12+
var completionsToolPrefixMasked = &complete.Command{
13+
Flags: map[string]complete.Predictor{
14+
"-h": predict.Nothing,
15+
"--help": predict.Nothing,
16+
},
17+
}
18+
19+
func printHelpToolPrefixMasked() {
20+
fmt.Printf(
21+
`Usage: %s tool prefix masked <cidr>
22+
23+
Description:
24+
Returns canonical form of a prefix, masking off non-high bits, and returns the zero if invalid.
25+
26+
Examples:
27+
# CIDR Valid Examples.
28+
$ %[1]s tool prefix masked 192.168.0.0/16
29+
$ %[1]s tool prefix masked 10.0.0.0/8
30+
$ %[1]s tool prefix masked 2001:0db8:1234::/48
31+
$ %[1]s tool prefix masked 2606:2800:220:1::/64
32+
33+
# CIDR Invalid Examples.
34+
$ %[1]s tool prefix masked 192.168.0.0/40
35+
$ %[1]s tool prefix masked 2001:0db8:1234::/129
36+
37+
Options:
38+
--help, -h
39+
show help.
40+
`, progBase)
41+
}
42+
43+
func cmdToolPrefixMasked() (err error) {
44+
f := lib.CmdToolPrefixMaskedFlags{}
45+
f.Init()
46+
pflag.Parse()
47+
48+
return lib.CmdToolPrefixMasked(f, pflag.Args()[3:], printHelpToolPrefixMasked)
49+
}

lib/cmd_tool_prefix_bits.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package lib
2+
3+
import (
4+
"fmt"
5+
"net/netip"
6+
7+
"github.com/spf13/pflag"
8+
)
9+
10+
type CmdToolPrefixBitsFlags struct {
11+
Help bool
12+
}
13+
14+
func (f *CmdToolPrefixBitsFlags) Init() {
15+
pflag.BoolVarP(
16+
&f.Help,
17+
"help", "h", false,
18+
"show help.",
19+
)
20+
}
21+
22+
func CmdToolPrefixBits(f CmdToolPrefixBitsFlags, args []string, printHelp func()) error {
23+
if f.Help {
24+
printHelp()
25+
return nil
26+
}
27+
28+
op := func(input string, inputType INPUT_TYPE) error {
29+
switch inputType {
30+
case INPUT_TYPE_CIDR:
31+
prefix, err := netip.ParsePrefix(input)
32+
if err != nil {
33+
return err
34+
}
35+
fmt.Printf("%s,%d\n", input, prefix.Bits())
36+
}
37+
return nil
38+
}
39+
40+
return GetInputFrom(args, true, true, op)
41+
}

lib/cmd_tool_prefix_masked.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package lib
2+
3+
import (
4+
"fmt"
5+
"net/netip"
6+
7+
"github.com/spf13/pflag"
8+
)
9+
10+
type CmdToolPrefixMaskedFlags struct {
11+
Help bool
12+
}
13+
14+
func (f *CmdToolPrefixMaskedFlags) Init() {
15+
pflag.BoolVarP(
16+
&f.Help,
17+
"help", "h", false,
18+
"show help.",
19+
)
20+
}
21+
22+
func CmdToolPrefixMasked(f CmdToolPrefixMaskedFlags, args []string, printHelp func()) error {
23+
if f.Help {
24+
printHelp()
25+
return nil
26+
}
27+
28+
op := func(input string, inputType INPUT_TYPE) error {
29+
switch inputType {
30+
case INPUT_TYPE_CIDR:
31+
prefix, err := netip.ParsePrefix(input)
32+
if err != nil {
33+
return err
34+
}
35+
fmt.Printf("%s,%s\n", input, prefix.Masked())
36+
}
37+
return nil
38+
}
39+
40+
return GetInputFrom(args, true, true, op)
41+
}

lib/cmd_tool_prefix_valid.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package lib
2+
3+
import (
4+
"fmt"
5+
"net/netip"
6+
7+
"github.com/spf13/pflag"
8+
)
9+
10+
type CmdToolPrefixIsValidFlags struct {
11+
Help bool
12+
}
13+
14+
func (f *CmdToolPrefixIsValidFlags) Init() {
15+
pflag.BoolVarP(
16+
&f.Help,
17+
"help", "h", false,
18+
"show help.",
19+
)
20+
}
21+
22+
func CmdToolPrefixIsValid(f CmdToolPrefixIsValidFlags, args []string, printHelp func()) error {
23+
if f.Help {
24+
printHelp()
25+
return nil
26+
}
27+
28+
op := func(input string, inputType INPUT_TYPE) error {
29+
switch inputType {
30+
case INPUT_TYPE_CIDR:
31+
prefix, err := netip.ParsePrefix(input)
32+
if err != nil {
33+
return err
34+
}
35+
fmt.Printf("%s,%t\n", input, prefix.IsValid())
36+
}
37+
return nil
38+
}
39+
40+
return GetInputFrom(args, true, true, op)
41+
}

0 commit comments

Comments
 (0)