cloudflare/cloudflared

Public

mirrored from https://github.com/cloudflare/cloudflaredAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
2021.12.4

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

cfapi/ip_route_filter.go

165lines · modecode

1package cfapi
2
3import (
4 "fmt"
5 "net"
6 "net/url"
7 "strconv"
8 "time"
9
10 "github.com/google/uuid"
11 "github.com/pkg/errors"
12 "github.com/urfave/cli/v2"
13)
14
15var (
16 filterIpRouteDeleted = cli.BoolFlag{
17 Name: "filter-is-deleted",
18 Usage: "If false (default), only show non-deleted routes. If true, only show deleted routes.",
19 }
20 filterIpRouteTunnelID = cli.StringFlag{
21 Name: "filter-tunnel-id",
22 Usage: "Show only routes with the given tunnel ID.",
23 }
24 filterSubsetIpRoute = cli.StringFlag{
25 Name: "filter-network-is-subset-of",
26 Aliases: []string{"nsub"},
27 Usage: "Show only routes whose network is a subset of the given network.",
28 }
29 filterSupersetIpRoute = cli.StringFlag{
30 Name: "filter-network-is-superset-of",
31 Aliases: []string{"nsup"},
32 Usage: "Show only routes whose network is a superset of the given network.",
33 }
34 filterIpRouteComment = cli.StringFlag{
35 Name: "filter-comment-is",
36 Usage: "Show only routes with this comment.",
37 }
38 filterIpRouteByVnet = cli.StringFlag{
39 Name: "filter-virtual-network-id",
40 Usage: "Show only routes that are attached to the given virtual network ID.",
41 }
42
43 // Flags contains all filter flags.
44 IpRouteFilterFlags = []cli.Flag{
45 &filterIpRouteDeleted,
46 &filterIpRouteTunnelID,
47 &filterSubsetIpRoute,
48 &filterSupersetIpRoute,
49 &filterIpRouteComment,
50 &filterIpRouteByVnet,
51 }
52)
53
54// IpRouteFilter which routes get queried.
55type IpRouteFilter struct {
56 queryParams url.Values
57}
58
59// NewIpRouteFilterFromCLI parses CLI flags to discover which filters should get applied.
60func NewIpRouteFilterFromCLI(c *cli.Context) (*IpRouteFilter, error) {
61 f := &IpRouteFilter{
62 queryParams: url.Values{},
63 }
64
65 // Set deletion filter
66 if flag := filterIpRouteDeleted.Name; c.IsSet(flag) && c.Bool(flag) {
67 f.deleted()
68 } else {
69 f.notDeleted()
70 }
71
72 if subset, err := cidrFromFlag(c, filterSubsetIpRoute); err != nil {
73 return nil, err
74 } else if subset != nil {
75 f.networkIsSupersetOf(*subset)
76 }
77
78 if superset, err := cidrFromFlag(c, filterSupersetIpRoute); err != nil {
79 return nil, err
80 } else if superset != nil {
81 f.networkIsSupersetOf(*superset)
82 }
83
84 if comment := c.String(filterIpRouteComment.Name); comment != "" {
85 f.commentIs(comment)
86 }
87
88 if tunnelID := c.String(filterIpRouteTunnelID.Name); tunnelID != "" {
89 u, err := uuid.Parse(tunnelID)
90 if err != nil {
91 return nil, errors.Wrapf(err, "Couldn't parse UUID from %s", filterIpRouteTunnelID.Name)
92 }
93 f.tunnelID(u)
94 }
95
96 if vnetId := c.String(filterIpRouteByVnet.Name); vnetId != "" {
97 u, err := uuid.Parse(vnetId)
98 if err != nil {
99 return nil, errors.Wrapf(err, "Couldn't parse UUID from %s", filterIpRouteByVnet.Name)
100 }
101 f.vnetID(u)
102 }
103
104 if maxFetch := c.Int("max-fetch-size"); maxFetch > 0 {
105 f.MaxFetchSize(uint(maxFetch))
106 }
107
108 return f, nil
109}
110
111// Parses a CIDR from the flag. If the flag was unset, returns (nil, nil).
112func cidrFromFlag(c *cli.Context, flag cli.StringFlag) (*net.IPNet, error) {
113 if !c.IsSet(flag.Name) {
114 return nil, nil
115 }
116
117 _, subset, err := net.ParseCIDR(c.String(flag.Name))
118 if err != nil {
119 return nil, err
120 } else if subset == nil {
121 return nil, fmt.Errorf("Invalid CIDR supplied for %s", flag.Name)
122 }
123
124 return subset, nil
125}
126
127func (f *IpRouteFilter) commentIs(comment string) {
128 f.queryParams.Set("comment", comment)
129}
130
131func (f *IpRouteFilter) notDeleted() {
132 f.queryParams.Set("is_deleted", "false")
133}
134
135func (f *IpRouteFilter) deleted() {
136 f.queryParams.Set("is_deleted", "true")
137}
138
139func (f *IpRouteFilter) networkIsSubsetOf(superset net.IPNet) {
140 f.queryParams.Set("network_subset", superset.String())
141}
142
143func (f *IpRouteFilter) networkIsSupersetOf(subset net.IPNet) {
144 f.queryParams.Set("network_superset", subset.String())
145}
146
147func (f *IpRouteFilter) existedAt(existedAt time.Time) {
148 f.queryParams.Set("existed_at", existedAt.Format(time.RFC3339))
149}
150
151func (f *IpRouteFilter) tunnelID(id uuid.UUID) {
152 f.queryParams.Set("tunnel_id", id.String())
153}
154
155func (f *IpRouteFilter) vnetID(id uuid.UUID) {
156 f.queryParams.Set("virtual_network_id", id.String())
157}
158
159func (f *IpRouteFilter) MaxFetchSize(max uint) {
160 f.queryParams.Set("per_page", strconv.Itoa(int(max)))
161}
162
163func (f IpRouteFilter) Encode() string {
164 return f.queryParams.Encode()
165}
166