cloudflare/cloudflared

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
2026.5.1

Branches

Tags

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

Clone

HTTPS

Download ZIP

cfapi/ip_route_filter.go

176lines · 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-vnet-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 := NewIPRouteFilter()
62
63 // Set deletion filter
64 if flag := filterIpRouteDeleted.Name; c.IsSet(flag) && c.Bool(flag) {
65 f.Deleted()
66 } else {
67 f.NotDeleted()
68 }
69
70 if subset, err := cidrFromFlag(c, filterSubsetIpRoute); err != nil {
71 return nil, err
72 } else if subset != nil {
73 f.NetworkIsSupersetOf(*subset)
74 }
75
76 if superset, err := cidrFromFlag(c, filterSupersetIpRoute); err != nil {
77 return nil, err
78 } else if superset != nil {
79 f.NetworkIsSupersetOf(*superset)
80 }
81
82 if comment := c.String(filterIpRouteComment.Name); comment != "" {
83 f.CommentIs(comment)
84 }
85
86 if tunnelID := c.String(filterIpRouteTunnelID.Name); tunnelID != "" {
87 u, err := uuid.Parse(tunnelID)
88 if err != nil {
89 return nil, errors.Wrapf(err, "Couldn't parse UUID from %s", filterIpRouteTunnelID.Name)
90 }
91 f.TunnelID(u)
92 }
93
94 if vnetId := c.String(filterIpRouteByVnet.Name); vnetId != "" {
95 u, err := uuid.Parse(vnetId)
96 if err != nil {
97 return nil, errors.Wrapf(err, "Couldn't parse UUID from %s", filterIpRouteByVnet.Name)
98 }
99 f.VNetID(u)
100 }
101
102 if maxFetch := c.Int("max-fetch-size"); maxFetch > 0 {
103 f.MaxFetchSize(uint(maxFetch))
104 }
105
106 return f, nil
107}
108
109// Parses a CIDR from the flag. If the flag was unset, returns (nil, nil).
110func cidrFromFlag(c *cli.Context, flag cli.StringFlag) (*net.IPNet, error) {
111 if !c.IsSet(flag.Name) {
112 return nil, nil
113 }
114
115 _, subset, err := net.ParseCIDR(c.String(flag.Name))
116 if err != nil {
117 return nil, err
118 } else if subset == nil {
119 return nil, fmt.Errorf("Invalid CIDR supplied for %s", flag.Name)
120 }
121
122 return subset, nil
123}
124
125func NewIPRouteFilter() *IpRouteFilter {
126 values := &IpRouteFilter{queryParams: url.Values{}}
127
128 // always list cfd_tunnel routes only
129 values.queryParams.Set("tun_types", "cfd_tunnel")
130
131 return values
132}
133
134func (f *IpRouteFilter) CommentIs(comment string) {
135 f.queryParams.Set("comment", comment)
136}
137
138func (f *IpRouteFilter) NotDeleted() {
139 f.queryParams.Set("is_deleted", "false")
140}
141
142func (f *IpRouteFilter) Deleted() {
143 f.queryParams.Set("is_deleted", "true")
144}
145
146func (f *IpRouteFilter) NetworkIsSubsetOf(superset net.IPNet) {
147 f.queryParams.Set("network_subset", superset.String())
148}
149
150func (f *IpRouteFilter) NetworkIsSupersetOf(subset net.IPNet) {
151 f.queryParams.Set("network_superset", subset.String())
152}
153
154func (f *IpRouteFilter) ExistedAt(existedAt time.Time) {
155 f.queryParams.Set("existed_at", existedAt.Format(time.RFC3339))
156}
157
158func (f *IpRouteFilter) TunnelID(id uuid.UUID) {
159 f.queryParams.Set("tunnel_id", id.String())
160}
161
162func (f *IpRouteFilter) VNetID(id uuid.UUID) {
163 f.queryParams.Set("virtual_network_id", id.String())
164}
165
166func (f *IpRouteFilter) MaxFetchSize(max uint) {
167 f.queryParams.Set("per_page", strconv.Itoa(int(max)))
168}
169
170func (f *IpRouteFilter) Page(page int) {
171 f.queryParams.Set("page", strconv.Itoa(page))
172}
173
174func (f IpRouteFilter) Encode() string {
175 return f.queryParams.Encode()
176}
177