diff --git a/cli/commands.go b/cli/commands.go index 38904209..3fcbeea7 100644 --- a/cli/commands.go +++ b/cli/commands.go @@ -99,11 +99,14 @@ func (c *cli) CmdHelp() error { help += fmt.Sprintf("CLI commands:\n") for _, command := range [][]string{ {"add", "Add a new mirror"}, + {"addMetric", "Add a tracked file to the metrics route"}, {"disable", "Disable a mirror"}, + {"delMetric", "Delete a tracked file from the metrics route"}, {"edit", "Edit a mirror"}, {"enable", "Enable a mirror"}, {"export", "Export the mirror database"}, {"list", "List all mirrors"}, + {"listMetrics", "List all tracked files from the metrics route"}, {"logs", "Print logs of a mirror"}, {"refresh", "Refresh the local repository"}, {"reload", "Reload configuration"}, @@ -349,6 +352,99 @@ func (c *cli) CmdAdd(args ...string) error { return nil } +func (c *cli) CmdAddmetric(args ...string) error { + cmd := SubCmd("addMetric", "FILE_PATH", "Add a file to the metrics route") + + if err := cmd.Parse(args); err != nil { + return nil + } + if cmd.NArg() != 1 { + cmd.Usage() + return nil + } + file := cmd.Arg(0) + + client := c.GetRPC() + ctx, cancel := context.WithTimeout(context.Background(), defaultRPCTimeout) + defer cancel() + _, err := client.AddMetric(ctx, &rpc.Metric{ + Filename: string(file), + }) + if err != nil { + log.Fatal("Error while adding metric: ", err) + } + + log.Info("File ", file, " successfully added to metrics.") + return nil +} + +func (c *cli) CmdDelmetric(args ...string) error { + cmd := SubCmd("delMetric", "FILE_PATH", "Delete a file from the metrics route") + + if err := cmd.Parse(args); err != nil { + return nil + } + if cmd.NArg() != 1 { + cmd.Usage() + return nil + } + file := cmd.Arg(0) + + client := c.GetRPC() + ctx, cancel := context.WithTimeout(context.Background(), defaultRPCTimeout) + defer cancel() + _, err := client.DelMetric(ctx, &rpc.Metric{ + Filename: string(file), + }) + if err != nil { + log.Fatal("Error while deleting metric: ", err) + } + + log.Info("File ", file, " successfully deleted from metrics.") + return nil +} + +func (c *cli) CmdListmetrics(args ...string) error { + cmd := SubCmd("listMetric", "[OPTIONNAL FILTER PATTERN]", + "Optionnal pattern to filter results") + + filterPattern := "*" + if err := cmd.Parse(args); err != nil { + return nil + } + nArg := cmd.NArg() + if nArg > 1 { + cmd.Usage() + return nil + } else if nArg == 1 { + filterPattern = "*" + cmd.Arg(0) + "*" + } + + client := c.GetRPC() + ctx, cancel := context.WithTimeout(context.Background(), defaultRPCTimeout) + defer cancel() + fileList, err := client.ListMetrics(ctx, &rpc.Metric{ + Filename: string(filterPattern), + }) + if err != nil { + log.Fatal("Error while listing metrics: ", err) + } + + if len(fileList.Filename) == 0 { + if nArg == 1 { + log.Info("There are no tracked files matching your request.") + } else { + log.Info("There are no tracked files.") + } + } else { + for _, file := range fileList.Filename { + log.Info(file) + } + } + + return nil +} + func (c *cli) CmdRemove(args ...string) error { cmd := SubCmd("remove", "IDENTIFIER", "Remove an existing mirror") force := cmd.Bool("f", false, "Never prompt for confirmation") diff --git a/database/utils.go b/database/utils.go index 7f6be4b0..ac4e0c90 100644 --- a/database/utils.go +++ b/database/utils.go @@ -65,6 +65,43 @@ func (r *Redis) GetListOfFiles() ([]string, error) { return files, nil } +func (r *Redis) IsFileTracked(file string) (bool, error) { + trackedFileList, err := r.GetListOfTrackedFiles() + if err != nil { + return false, nil + } + for _, v := range trackedFileList { + if v == file { + return true, nil + } + } + return false, nil +} + +func (r *Redis) GetListOfTrackedFiles() ([]string, error) { + conn, err := r.Connect() + if err != nil { + return nil, err + } + defer conn.Close() + + values, err := redis.Values(conn.Do("SMEMBERS", "TRACKED_FILES")) + if err != nil { + return nil, err + } + + files := make([]string, len(values)) + for i, v := range values { + value, okValue := v.([]byte) + if !okValue { + return nil, errors.New("invalid type for file") + } + files[i] = string(value) + } + + return files, nil +} + func (r *Redis) GetListOfCountries() ([]string, error) { conn, err := r.Connect() if err != nil { diff --git a/http/http.go b/http/http.go index 73c31147..5d52c933 100644 --- a/http/http.go +++ b/http/http.go @@ -331,10 +331,15 @@ func (h *HTTP) mirrorHandler(w http.ResponseWriter, r *http.Request, ctx *Contex http.Error(w, err.Error(), status) } + isTracked, err := h.redis.IsFileTracked(fileInfo.Path) + if err != nil { + log.Error("There was a problem fetching the tracked file list: ", err) + } + if !ctx.IsMirrorlist() { logs.LogDownload(resultRenderer.Type(), status, results, err) if len(mlist) > 0 { - h.stats.CountDownload(mlist[0], fileInfo, clientInfo) + h.stats.CountDownload(mlist[0], fileInfo, clientInfo, isTracked) } } diff --git a/http/metrics.go b/http/metrics.go index caa2bc02..53cd80ec 100644 --- a/http/metrics.go +++ b/http/metrics.go @@ -3,6 +3,9 @@ package http import ( "fmt" "net/http" + "regexp" + "strconv" + "strings" "time" "github.com/gomodule/redigo/redis" @@ -15,17 +18,18 @@ type metrics struct { Total int } -func statsToPrometheusFormat(metrics metrics, labelName string, labelValue string) string { +func statsToPrometheusFormat(metrics metrics, label_name string, + label_value string) string { var output string output += fmt.Sprintf("%s_total{%s=\"%s\"} %d\n", - labelName, labelName, labelValue, metrics.Total) + label_name, label_name, label_value, metrics.Total) output += fmt.Sprintf("%s_day{%s=\"%s\"} %d\n", - labelName, labelName, labelValue, metrics.Day) + label_name, label_name, label_value, metrics.Day) output += fmt.Sprintf("%s_month{%s=\"%s\"} %d\n", - labelName, labelName, labelValue, metrics.Month) + label_name, label_name, label_value, metrics.Month) output += fmt.Sprintf("%s_year{%s=\"%s\"} %d\n\n", - labelName, labelName, labelValue, metrics.Year) + label_name, label_name, label_value, metrics.Year) return output } @@ -141,5 +145,83 @@ func (h *HTTP) metricsHandler(w http.ResponseWriter, r *http.Request) { index += 4 } + // Get all tracked files + var trackedFilesList []string + mkeyLenMap := make(map[string]int) + mkeyFileMap := make(map[string]string) + trackedFilesList, err = h.redis.GetListOfTrackedFiles() + if err != nil { + log.Error("Cannot fetch list of files: " + err.Error()) + return + } + + // Get tracked files downloads per country and mirror + // rconn.Send("MULTI") + for _, file := range trackedFilesList { + log.Info("Tracked files: ", file) + mkey := "STATS_TRACKED_" + file + "_" + today.Format("2006_01_02") + for i := 0; i < 4; i++ { + exists, _ := redis.Bool(rconn.Do("EXISTS", mkey)) + if exists { + mkeyLenMap[mkey], _ = redis.Int(rconn.Do("HLEN", mkey)) + log.Info("mKey: ", mkey) + log.Info(file, " len: ", mkeyLenMap[mkey]) + mkeyFileMap[mkey] = file + // rconn.Send("HGETALL", mkey) + mkey = mkey[:strings.LastIndex(mkey, "_")] + } + } + } + + rconn.Send("MULTI") + for mkey := range mkeyLenMap { + rconn.Send("HGETALL", mkey) + } + stats, err = redis.Values(rconn.Do("EXEC")) + if err != nil { + log.Error("Cannot fetch file per country stats: " + err.Error()) + return + } + + pattern := regexp.MustCompile("_") + index = 0 + for mkey, hashLen := range mkeyLenMap { + for i := 0; i < 2*hashLen; i += 2 { + hashSlice, _ := redis.ByteSlices(stats[index], err) + key, _ := redis.String(hashSlice[i], err) + value, _ := redis.Int(hashSlice[i+1], err) + log.Info("mkey: ", mkey) + log.Info("File: ", mkeyFileMap[mkey]) + log.Info("Key: ", key) + log.Info("Value: ", value) + sep := strings.Index(key, "_") + country := key[:sep] + mirrorID, err := strconv.Atoi(key[sep+1:]) + if err != nil { + log.Error("Failed to convert mirror ID: ", err) + return + } + mirror := mirrorsMap[mirrorID] + duration := len(pattern.FindAllStringIndex(mkey, -1)) + var durationStr string + switch duration { + case 2: + durationStr = "total" + case 3: + durationStr = "year" + case 4: + durationStr = "month" + case 5: + durationStr = "day" + } + output += fmt.Sprintf("stats_tracked_"+ + "%s{file=\"%s\",country=\"%s\",mirror=\"%s\"} %d\n", + durationStr, mkeyFileMap[mkey], country, mirror, value, + ) + } + output += "\n" + index++ + } + w.Write([]byte(output)) } diff --git a/http/stats.go b/http/stats.go index c5e21188..898ebe77 100644 --- a/http/stats.go +++ b/http/stats.go @@ -56,6 +56,7 @@ type countItem struct { country string size int64 time time.Time + tracked bool } // NewStats returns an instance of the stats counter @@ -79,7 +80,7 @@ func (s *Stats) Terminate() { // CountDownload is a lightweight method used to count a new download for a specific file and mirror func (s *Stats) CountDownload(m mirrors.Mirror, fileinfo filesystem.FileInfo, - clientInfo network.GeoIPRecord) error { + clientInfo network.GeoIPRecord, isTracked bool) error { if m.Name == "" { return errUnknownMirror } @@ -91,7 +92,7 @@ func (s *Stats) CountDownload(m mirrors.Mirror, fileinfo filesystem.FileInfo, } s.countChan <- countItem{m.ID, fileinfo.Path, clientInfo.Country, - fileinfo.Size, time.Now().UTC()} + fileinfo.Size, time.Now().UTC(), isTracked} return nil } @@ -114,6 +115,9 @@ func (s *Stats) processCountDownload() { s.mapStats["s"+date+mirrorID] += c.size s.mapStats["c"+date+c.country]++ s.mapStats["S"+date+c.country] += c.size + if c.tracked { + s.mapStats["F"+date+c.filepath+"|"+c.country+"_"+mirrorID]++ + } case <-pushTicker.C: s.pushStats() } @@ -202,6 +206,18 @@ func (s *Stats) pushStats() { rconn.Send("HINCRBY", mkey, object, v) mkey = mkey[:strings.LastIndex(mkey, "_")] } + } else if typ == "F" { + // File downloads per country + + sep := strings.LastIndex(object, "|") + file := object[:sep] + key := object[sep+1:] + mkey := fmt.Sprintf("STATS_TRACKED_%s_%s", file, date) + + for i := 0; i < 4; i++ { + rconn.Send("HINCRBY", mkey, key, v) + mkey = mkey[:strings.LastIndex(mkey, "_")] + } } else { log.Warning("Stats: unknown type", typ) } diff --git a/rpc/rpc.go b/rpc/rpc.go index d31de05c..ddb9c400 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -728,3 +728,74 @@ func (c *CLI) GetMirrorLogs(ctx context.Context, in *GetMirrorLogsRequest) (*Get return &GetMirrorLogsReply{Line: lines}, nil } + +func (c *CLI) AddMetric(ctx context.Context, in *Metric) (*empty.Empty, error) { + conn, err := c.redis.Connect() + if err != nil { + return nil, err + } + defer conn.Close() + + exists, err := redis.Int(conn.Do("SISMEMBER", "FILES", in.Filename)) + if err != nil { + return nil, errors.Wrap(err, "failed to check for file presence") + } else if exists == 0 { + return nil, status.Error(codes.FailedPrecondition, + "file does not exist") + } + + exists, err = redis.Int(conn.Do("SADD", "TRACKED_FILES", in.Filename)) + if err != nil { + return nil, errors.Wrap(err, "failed to add file to metrics") + } else if exists == 0 { + return nil, status.Error(codes.AlreadyExists, + "file already is in metrics") + } + + return &empty.Empty{}, nil +} + +func (c *CLI) DelMetric(ctx context.Context, in *Metric) (*empty.Empty, error) { + conn, err := c.redis.Connect() + if err != nil { + return nil, err + } + defer conn.Close() + + exists, err := redis.Int(conn.Do("SISMEMBER", "TRACKED_FILES", in.Filename)) + if err != nil { + return nil, errors.Wrap(err, "failed to check for file presence") + } else if exists == 0 { + return nil, status.Error(codes.FailedPrecondition, + "file is not part of tracked files") + } + + _, err = conn.Do("SREM", "TRACKED_FILES", in.Filename) + if err != nil { + return nil, errors.Wrap(err, "failed to remove file from tracked files") + } + + return &empty.Empty{}, nil +} + +func (c *CLI) ListMetrics(ctx context.Context, in *Metric) (*MetricsList, error) { + conn, err := c.redis.Connect() + if err != nil { + return nil, err + } + defer conn.Close() + + values, err := redis.Values(conn.Do("SSCAN", "TRACKED_FILES", + "0", "MATCH", in.Filename, "COUNT", 1000)) + if err != nil { + return nil, err + } + + byteValues, err := redis.ByteSlices(values[1], err) + files := make([]string, len(byteValues)) + for i, v := range byteValues { + files[i] = string(v) + } + + return &MetricsList{Filename: files}, nil +} diff --git a/rpc/rpc.pb.go b/rpc/rpc.pb.go index 908c8086..ec50a600 100644 --- a/rpc/rpc.pb.go +++ b/rpc/rpc.pb.go @@ -1227,6 +1227,84 @@ func (m *GetMirrorLogsReply) GetLine() []string { return nil } +type Metric struct { + Filename string `protobuf:"bytes,1,opt,name=Filename,proto3" json:"Filename,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Metric) Reset() { *m = Metric{} } +func (m *Metric) String() string { return proto.CompactTextString(m) } +func (*Metric) ProtoMessage() {} +func (*Metric) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{19} +} + +func (m *Metric) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Metric.Unmarshal(m, b) +} +func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Metric.Marshal(b, m, deterministic) +} +func (m *Metric) XXX_Merge(src proto.Message) { + xxx_messageInfo_Metric.Merge(m, src) +} +func (m *Metric) XXX_Size() int { + return xxx_messageInfo_Metric.Size(m) +} +func (m *Metric) XXX_DiscardUnknown() { + xxx_messageInfo_Metric.DiscardUnknown(m) +} + +var xxx_messageInfo_Metric proto.InternalMessageInfo + +func (m *Metric) GetFilename() string { + if m != nil { + return m.Filename + } + return "" +} + +type MetricsList struct { + Filename []string `protobuf:"bytes,1,rep,name=Filename,proto3" json:"Filename,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MetricsList) Reset() { *m = MetricsList{} } +func (m *MetricsList) String() string { return proto.CompactTextString(m) } +func (*MetricsList) ProtoMessage() {} +func (*MetricsList) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{20} +} + +func (m *MetricsList) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MetricsList.Unmarshal(m, b) +} +func (m *MetricsList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MetricsList.Marshal(b, m, deterministic) +} +func (m *MetricsList) XXX_Merge(src proto.Message) { + xxx_messageInfo_MetricsList.Merge(m, src) +} +func (m *MetricsList) XXX_Size() int { + return xxx_messageInfo_MetricsList.Size(m) +} +func (m *MetricsList) XXX_DiscardUnknown() { + xxx_messageInfo_MetricsList.DiscardUnknown(m) +} + +var xxx_messageInfo_MetricsList proto.InternalMessageInfo + +func (m *MetricsList) GetFilename() []string { + if m != nil { + return m.Filename + } + return nil +} + func init() { proto.RegisterEnum("ScanMirrorRequest_Method", ScanMirrorRequest_Method_name, ScanMirrorRequest_Method_value) proto.RegisterType((*VersionReply)(nil), "VersionReply") @@ -1249,101 +1327,107 @@ func init() { proto.RegisterType((*StatsMirrorReply)(nil), "StatsMirrorReply") proto.RegisterType((*GetMirrorLogsRequest)(nil), "GetMirrorLogsRequest") proto.RegisterType((*GetMirrorLogsReply)(nil), "GetMirrorLogsReply") + proto.RegisterType((*Metric)(nil), "Metric") + proto.RegisterType((*MetricsList)(nil), "MetricsList") } func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 1413 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0x5d, 0x73, 0xdb, 0x44, - 0x17, 0xb6, 0xec, 0xc4, 0xb1, 0x8f, 0x9d, 0xc4, 0xd9, 0xa4, 0x79, 0x55, 0xb5, 0x6f, 0xeb, 0xee, - 0xfb, 0x51, 0x33, 0x0c, 0x2a, 0x35, 0x2d, 0x64, 0xca, 0xd7, 0x18, 0x3b, 0x49, 0x03, 0x76, 0x93, - 0x91, 0x1b, 0x18, 0xb8, 0x53, 0xa5, 0xb5, 0xa3, 0x41, 0xd6, 0x1a, 0xed, 0xaa, 0x8d, 0x67, 0xf8, - 0x19, 0x0c, 0x57, 0x5c, 0xc0, 0x0f, 0x60, 0x86, 0xdf, 0xc7, 0x15, 0xb3, 0x1f, 0xb2, 0x65, 0x3b, - 0x71, 0x98, 0x5e, 0x70, 0xb7, 0xe7, 0x39, 0x67, 0xf7, 0x7c, 0xe8, 0x9c, 0x67, 0x57, 0x50, 0x8e, - 0xc7, 0x9e, 0x3d, 0x8e, 0x29, 0xa7, 0xd6, 0x9d, 0x21, 0xa5, 0xc3, 0x90, 0x3c, 0x92, 0xd2, 0xab, - 0x64, 0xf0, 0x88, 0x8c, 0xc6, 0x7c, 0xa2, 0x95, 0xf7, 0x17, 0x95, 0x3c, 0x18, 0x11, 0xc6, 0xdd, - 0xd1, 0x58, 0x19, 0xe0, 0x5f, 0x0d, 0xa8, 0x7e, 0x4d, 0x62, 0x16, 0xd0, 0xc8, 0x21, 0xe3, 0x70, - 0x82, 0x4c, 0xd8, 0xd0, 0xb2, 0x69, 0xd4, 0x8d, 0x46, 0xd9, 0x49, 0x45, 0xb4, 0x07, 0xeb, 0x5f, - 0x24, 0x41, 0xe8, 0x9b, 0x79, 0x89, 0x2b, 0x01, 0xdd, 0x85, 0xf2, 0x31, 0x4d, 0x77, 0x14, 0xa4, - 0x66, 0x06, 0xa0, 0x2d, 0xc8, 0x9f, 0xf6, 0xcd, 0x35, 0x09, 0xe7, 0x4f, 0xfb, 0x08, 0xc1, 0x5a, - 0x2b, 0xf6, 0x2e, 0xcc, 0x75, 0x89, 0xc8, 0x35, 0xba, 0x07, 0x70, 0x4c, 0x7b, 0xee, 0xe5, 0x59, - 0x4c, 0x3d, 0x66, 0x16, 0xeb, 0x46, 0x63, 0xdd, 0xc9, 0x20, 0xb8, 0x01, 0xd5, 0x9e, 0xcb, 0xbd, - 0x0b, 0x87, 0xfc, 0x90, 0x10, 0xc6, 0x45, 0x84, 0x67, 0x2e, 0xe7, 0x24, 0x9e, 0x46, 0xa8, 0x45, - 0xfc, 0x73, 0x09, 0x8a, 0xbd, 0x20, 0x8e, 0x69, 0x2c, 0x1c, 0x9f, 0x74, 0xa4, 0x7e, 0xdd, 0xc9, - 0x9f, 0x74, 0x84, 0xe3, 0x17, 0xee, 0x88, 0xe8, 0xd8, 0xe5, 0x5a, 0x1c, 0xf4, 0x9c, 0xf3, 0xf1, - 0xb9, 0xd3, 0xd5, 0x81, 0xa7, 0x22, 0xb2, 0xa0, 0xe4, 0xb0, 0x49, 0xe4, 0x09, 0x95, 0x0a, 0x7e, - 0x2a, 0xa3, 0x7d, 0x28, 0x1e, 0xa9, 0x4d, 0x2a, 0x09, 0x2d, 0xa1, 0x3a, 0x54, 0xfa, 0x63, 0x1a, - 0x31, 0x1a, 0x4b, 0x47, 0x45, 0xa9, 0xcc, 0x42, 0x22, 0x51, 0x2d, 0x8a, 0xdd, 0x1b, 0xd2, 0x20, - 0x83, 0xa0, 0xff, 0xc3, 0x96, 0x96, 0xba, 0x74, 0x48, 0x85, 0x4d, 0x49, 0xda, 0x2c, 0xa0, 0xa2, - 0xe4, 0x2d, 0x7f, 0x14, 0x44, 0xd2, 0x4f, 0x59, 0x95, 0x7c, 0x0a, 0x08, 0x2f, 0x52, 0x38, 0x1c, - 0xb9, 0x41, 0x68, 0x82, 0xf2, 0x32, 0x43, 0x84, 0xbe, 0x9d, 0x30, 0x4e, 0x47, 0x1d, 0x97, 0xbb, - 0x66, 0x45, 0xe9, 0x67, 0x08, 0xfa, 0x2f, 0x6c, 0xb6, 0x69, 0xc4, 0x83, 0x88, 0x44, 0xfc, 0x34, - 0x0a, 0x27, 0x66, 0xb5, 0x6e, 0x34, 0x4a, 0xce, 0x3c, 0x28, 0xb2, 0x6d, 0xd3, 0x24, 0xe2, 0xf1, - 0x44, 0xda, 0x6c, 0x4a, 0x9b, 0x2c, 0x24, 0xea, 0xd4, 0xea, 0x4b, 0xe5, 0x96, 0x54, 0x6a, 0x49, - 0xb4, 0x51, 0xdf, 0xa3, 0x31, 0x31, 0xb7, 0xe5, 0xc7, 0x51, 0x82, 0xa8, 0x78, 0xd7, 0xe5, 0x01, - 0x4f, 0x7c, 0x62, 0xd6, 0xea, 0x46, 0x23, 0xef, 0x4c, 0x65, 0x91, 0x6f, 0x97, 0x46, 0x43, 0xa5, - 0xdc, 0x91, 0xca, 0x19, 0x30, 0x17, 0x6f, 0x9b, 0xfa, 0xc4, 0x44, 0x32, 0xa5, 0x79, 0x10, 0x61, - 0xa8, 0xea, 0xe0, 0x84, 0xc8, 0xcc, 0x5d, 0x69, 0x34, 0x87, 0xa1, 0x26, 0xec, 0x1d, 0x5e, 0x7a, - 0x61, 0xe2, 0x13, 0x7f, 0xce, 0x76, 0x4f, 0xda, 0x5e, 0xa9, 0x13, 0xd9, 0xb4, 0x58, 0x94, 0x8c, - 0xcc, 0x5b, 0x75, 0xa3, 0xb1, 0xe9, 0x28, 0x41, 0x74, 0x56, 0x9b, 0x8e, 0x46, 0x24, 0xe2, 0xe6, - 0xbe, 0xea, 0x2c, 0x2d, 0x0a, 0xcd, 0x61, 0xe4, 0xbe, 0x0a, 0x89, 0x6f, 0xfe, 0x4b, 0x96, 0x25, - 0x15, 0x45, 0xc7, 0x9e, 0x8f, 0x4d, 0x53, 0x82, 0xf9, 0xf3, 0xb1, 0xc8, 0x4b, 0x7b, 0x74, 0x88, - 0xcb, 0x68, 0x64, 0xde, 0x56, 0x79, 0xcd, 0x81, 0xe8, 0x19, 0x40, 0x9f, 0xbb, 0x9c, 0xf4, 0x83, - 0xc8, 0x23, 0xa6, 0x55, 0x37, 0x1a, 0x95, 0xa6, 0x65, 0xab, 0xa9, 0xb7, 0xd3, 0xa9, 0xb7, 0x5f, - 0xa6, 0x53, 0xef, 0x64, 0xac, 0x45, 0xbf, 0xb5, 0xc2, 0x90, 0xbe, 0x71, 0x88, 0x1f, 0xc4, 0xc4, - 0xe3, 0xcc, 0xbc, 0x23, 0x3f, 0xc9, 0x02, 0x8a, 0x3e, 0x14, 0xdf, 0x86, 0xf1, 0xfe, 0x24, 0xf2, - 0xcc, 0xbb, 0x37, 0x7a, 0x98, 0xda, 0xa2, 0x2f, 0x01, 0xc9, 0x75, 0xe2, 0x79, 0x84, 0xb1, 0x41, - 0x12, 0xca, 0x13, 0xfe, 0x7d, 0xe3, 0x09, 0x57, 0xec, 0x42, 0x9f, 0x40, 0x45, 0xa0, 0x3d, 0xea, - 0x0b, 0x3b, 0xf3, 0xde, 0x8d, 0x87, 0x64, 0xcd, 0xf1, 0x13, 0xd8, 0x56, 0xbc, 0xd0, 0x0d, 0x18, - 0x57, 0x3c, 0xf7, 0x00, 0x36, 0x14, 0xc4, 0x4c, 0xa3, 0x5e, 0x68, 0x54, 0x9a, 0x1b, 0xb6, 0x92, - 0x9d, 0x14, 0xc7, 0x36, 0x94, 0xd4, 0xf2, 0xa4, 0xf3, 0x77, 0xf8, 0x04, 0x3f, 0x06, 0xd0, 0x44, - 0x25, 0x1c, 0xfc, 0x67, 0xd1, 0x41, 0xd9, 0x4e, 0x4f, 0x9b, 0xb9, 0xf8, 0x1c, 0x76, 0xdb, 0x17, - 0x6e, 0x34, 0x24, 0xe2, 0xb3, 0x24, 0x2c, 0xa5, 0xb8, 0x45, 0x6f, 0x99, 0xae, 0xc9, 0xcf, 0x75, - 0x0d, 0x7e, 0x90, 0x66, 0x76, 0xd2, 0xb9, 0x66, 0x33, 0xfe, 0xc3, 0x80, 0xad, 0x96, 0xef, 0xeb, - 0xec, 0x64, 0x6c, 0xd9, 0x69, 0x33, 0x56, 0x4d, 0x5b, 0x7e, 0x71, 0xda, 0x64, 0x67, 0xcb, 0xfe, - 0x4f, 0x39, 0x53, 0x8b, 0x62, 0xdf, 0x74, 0xe4, 0x34, 0x69, 0xce, 0x00, 0x54, 0x83, 0x42, 0xab, - 0xff, 0x42, 0x53, 0xa6, 0x58, 0x8a, 0x18, 0xbe, 0x71, 0xe3, 0x28, 0x88, 0x86, 0x82, 0xf4, 0x0b, - 0x82, 0x63, 0x53, 0x19, 0x3f, 0x84, 0x9d, 0xf3, 0xb1, 0xef, 0x72, 0x92, 0x0d, 0x1a, 0xc1, 0x5a, - 0x27, 0x18, 0x0c, 0x34, 0xe9, 0xcb, 0x35, 0x6e, 0x82, 0xe9, 0x90, 0x41, 0x4c, 0x98, 0x28, 0x3a, - 0x65, 0x01, 0xa7, 0xf1, 0x24, 0xad, 0xc3, 0x3e, 0x14, 0x1d, 0x72, 0xe1, 0xb2, 0x0b, 0xb9, 0xa3, - 0xe4, 0x68, 0x09, 0xff, 0x66, 0xc0, 0x4e, 0xdf, 0x73, 0xa3, 0xf4, 0xec, 0xab, 0x4b, 0x2e, 0x68, - 0x34, 0xe1, 0x54, 0xd5, 0x59, 0x57, 0x3d, 0x83, 0xa0, 0xa7, 0x50, 0x3a, 0x13, 0x5d, 0xe7, 0xd1, - 0x50, 0x56, 0x62, 0xab, 0x79, 0xdb, 0x5e, 0x3a, 0xd5, 0xee, 0x11, 0x7e, 0x41, 0x7d, 0x67, 0x6a, - 0x8a, 0xff, 0x07, 0x45, 0x85, 0xa1, 0x0d, 0x28, 0xb4, 0xba, 0xdd, 0x5a, 0x4e, 0x2c, 0x8e, 0x5e, - 0x9e, 0xd5, 0x0c, 0x54, 0x86, 0x75, 0xa7, 0xff, 0xed, 0x8b, 0x76, 0x2d, 0x8f, 0x7f, 0x37, 0x60, - 0x3b, 0x7b, 0x9a, 0xbe, 0x99, 0xd3, 0x26, 0x30, 0xe6, 0xa9, 0x03, 0x43, 0xf5, 0x28, 0x08, 0x09, - 0x3b, 0x89, 0x7c, 0x72, 0xa9, 0x7b, 0xa4, 0xe0, 0xcc, 0x61, 0xc2, 0xe6, 0xab, 0x88, 0xbe, 0x89, - 0x52, 0x9b, 0x82, 0xb2, 0xc9, 0x62, 0xc2, 0x83, 0x43, 0x46, 0xf4, 0x35, 0xf1, 0xe5, 0x07, 0x2c, - 0x38, 0xa9, 0x28, 0xaa, 0xf1, 0xf2, 0xbb, 0xd3, 0xc1, 0x80, 0x11, 0xde, 0x63, 0xf2, 0x2b, 0x16, - 0x9c, 0x0c, 0x82, 0x7f, 0x31, 0xa0, 0x26, 0x5a, 0x98, 0x09, 0x9f, 0x37, 0x5e, 0xd4, 0xe8, 0x00, - 0xca, 0x1d, 0x41, 0x43, 0xdc, 0x8d, 0xb9, 0x8c, 0x76, 0xf5, 0x2c, 0xcf, 0x8c, 0xd1, 0x13, 0xd8, - 0x10, 0xc2, 0x61, 0xa4, 0x32, 0x58, 0xbd, 0x2f, 0x35, 0xc5, 0x3f, 0xc2, 0x56, 0x26, 0x3a, 0x51, - 0xcc, 0xf7, 0x61, 0x7d, 0x20, 0xca, 0xa3, 0x67, 0xd3, 0xb2, 0xe7, 0xf5, 0xb6, 0xac, 0xdd, 0xa1, - 0x68, 0x6c, 0x47, 0x19, 0x5a, 0x07, 0x00, 0x33, 0x50, 0xf4, 0xf3, 0xf7, 0x64, 0xa2, 0xf3, 0x12, - 0x4b, 0x71, 0x13, 0xbc, 0x76, 0xc3, 0x84, 0xe8, 0xea, 0x2b, 0xe1, 0x59, 0xfe, 0xc0, 0xc0, 0x3f, - 0x19, 0x80, 0xe4, 0xf1, 0xab, 0x3b, 0xee, 0x9f, 0x2e, 0x0a, 0xd1, 0x9f, 0x2c, 0xdb, 0x63, 0xf7, - 0xd3, 0x07, 0x94, 0x8c, 0x2b, 0x43, 0x8a, 0xe9, 0xbb, 0x4a, 0xbc, 0x8c, 0x54, 0xfc, 0x4c, 0x27, - 0x3a, 0x95, 0xe5, 0x03, 0x71, 0xc2, 0x09, 0xd3, 0xbd, 0xa5, 0x04, 0x7c, 0x04, 0x7b, 0xc7, 0x84, - 0x6b, 0xfa, 0xa5, 0x43, 0xb6, 0x62, 0xe0, 0x7a, 0xee, 0xa5, 0x43, 0x58, 0x12, 0xea, 0xb3, 0xd7, - 0x9d, 0x0c, 0x82, 0x1b, 0x80, 0x16, 0xce, 0xd1, 0xa4, 0x10, 0x06, 0x11, 0x91, 0x9f, 0xb1, 0xec, - 0xc8, 0x75, 0xf3, 0xcf, 0x22, 0x14, 0xda, 0xdd, 0x13, 0xf4, 0x14, 0xe0, 0x98, 0xf0, 0xf4, 0x29, - 0xba, 0xbf, 0x54, 0x93, 0x43, 0xf1, 0x50, 0xb6, 0x36, 0xed, 0xec, 0xfb, 0x17, 0xe7, 0xd0, 0xc7, - 0xb0, 0x71, 0x3e, 0x1e, 0xc6, 0xae, 0x4f, 0xae, 0xdd, 0x73, 0x0d, 0x8e, 0x73, 0xe8, 0x99, 0x20, - 0x9d, 0x90, 0xba, 0xfe, 0x5b, 0xec, 0xfd, 0x0c, 0xaa, 0xd9, 0xcb, 0x00, 0xed, 0xd9, 0x57, 0xdc, - 0x0d, 0x2b, 0xf6, 0x37, 0x61, 0x4d, 0xdc, 0x6f, 0xd7, 0x7a, 0xae, 0xd9, 0x0b, 0x97, 0x20, 0xce, - 0xa1, 0x77, 0x00, 0xf4, 0xfd, 0x11, 0x0d, 0x28, 0xaa, 0xd9, 0x0b, 0x97, 0x89, 0x95, 0x36, 0x00, - 0xce, 0xa1, 0x87, 0xe2, 0xd9, 0xa9, 0xaf, 0x11, 0x94, 0xe2, 0xd6, 0xb6, 0x3d, 0x7f, 0xb7, 0xe0, - 0x1c, 0x7a, 0x0f, 0xaa, 0x59, 0xf6, 0x9e, 0xd9, 0x22, 0x7b, 0x89, 0xd5, 0x65, 0xc9, 0xaa, 0x8a, - 0x66, 0xb4, 0xf9, 0x72, 0x10, 0xd7, 0xa7, 0xfc, 0x1c, 0x76, 0x96, 0xf8, 0x1f, 0xdd, 0xb6, 0xaf, - 0xbb, 0x13, 0x56, 0x9c, 0xf4, 0x04, 0x60, 0x46, 0xb8, 0x08, 0x2d, 0x73, 0xb9, 0x55, 0xb3, 0x17, - 0x18, 0x19, 0xe7, 0xd0, 0x63, 0x28, 0x4f, 0x89, 0x03, 0xed, 0xd8, 0x8b, 0x14, 0x68, 0x6d, 0x2f, - 0xf0, 0x0a, 0xce, 0xa1, 0x8f, 0xa0, 0x92, 0x19, 0x3b, 0xb4, 0x6b, 0x2f, 0x53, 0x83, 0xb5, 0x63, - 0x2f, 0x4e, 0x26, 0xce, 0xa1, 0x03, 0x58, 0x3b, 0x0b, 0xa2, 0xe1, 0x5b, 0x34, 0xd6, 0xa7, 0xb0, - 0x39, 0x37, 0x3a, 0xe8, 0x96, 0x7d, 0xd5, 0x48, 0x5a, 0xbb, 0xf6, 0xf2, 0x84, 0xe1, 0x1c, 0x7a, - 0x17, 0x2a, 0xf2, 0x5d, 0xa3, 0x23, 0xde, 0xb4, 0xb3, 0xbf, 0x63, 0x56, 0xc5, 0x9e, 0x3d, 0x7a, - 0x70, 0xee, 0x55, 0x51, 0x7a, 0xff, 0xe0, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x30, 0xff, 0xff, - 0x89, 0xa2, 0x0e, 0x00, 0x00, + // 1477 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0x5f, 0x73, 0x1a, 0x47, + 0x12, 0x67, 0x41, 0x12, 0xd0, 0x20, 0x09, 0x8d, 0x64, 0xdd, 0x1a, 0xfb, 0x6c, 0x3c, 0xe7, 0xb3, + 0x71, 0x5d, 0xdd, 0xf8, 0xac, 0xb3, 0xef, 0x54, 0xbe, 0x3f, 0x29, 0x02, 0x92, 0xac, 0x04, 0x59, + 0xaa, 0xc5, 0x4a, 0x2a, 0x79, 0x5b, 0xb3, 0x03, 0xda, 0xca, 0xb2, 0x43, 0x76, 0x07, 0x5b, 0x54, + 0xe5, 0x29, 0x9f, 0x21, 0x95, 0xa7, 0x3c, 0x24, 0x1f, 0x20, 0x55, 0xf9, 0x88, 0xa9, 0x9e, 0x99, + 0x85, 0x05, 0x24, 0xe4, 0xf2, 0x43, 0xde, 0xf6, 0xf7, 0xeb, 0x9e, 0xe9, 0x9e, 0x9e, 0xfe, 0x33, + 0x0b, 0xc5, 0x68, 0xd8, 0x65, 0xc3, 0x48, 0x48, 0x51, 0xbd, 0xd3, 0x17, 0xa2, 0x1f, 0xf0, 0xa7, + 0x0a, 0xbd, 0x1d, 0xf5, 0x9e, 0xf2, 0xc1, 0x50, 0x8e, 0x8d, 0xf0, 0xfe, 0xbc, 0x50, 0xfa, 0x03, + 0x1e, 0x4b, 0x77, 0x30, 0xd4, 0x0a, 0xf4, 0x67, 0x0b, 0xca, 0x5f, 0xf0, 0x28, 0xf6, 0x45, 0xe8, + 0xf0, 0x61, 0x30, 0x26, 0x36, 0xe4, 0x0d, 0xb6, 0xad, 0x9a, 0x55, 0x2f, 0x3a, 0x09, 0x24, 0x3b, + 0xb0, 0xfa, 0xe9, 0xc8, 0x0f, 0x3c, 0x3b, 0xab, 0x78, 0x0d, 0xc8, 0x5d, 0x28, 0x1e, 0x89, 0x64, + 0x45, 0x4e, 0x49, 0xa6, 0x04, 0xd9, 0x80, 0xec, 0x69, 0xc7, 0x5e, 0x51, 0x74, 0xf6, 0xb4, 0x43, + 0x08, 0xac, 0x34, 0xa2, 0xee, 0x85, 0xbd, 0xaa, 0x18, 0xf5, 0x4d, 0xee, 0x01, 0x1c, 0x89, 0x13, + 0xf7, 0xf2, 0x2c, 0x12, 0xdd, 0xd8, 0x5e, 0xab, 0x59, 0xf5, 0x55, 0x27, 0xc5, 0xd0, 0x3a, 0x94, + 0x4f, 0x5c, 0xd9, 0xbd, 0x70, 0xf8, 0xb7, 0x23, 0x1e, 0x4b, 0xf4, 0xf0, 0xcc, 0x95, 0x92, 0x47, + 0x13, 0x0f, 0x0d, 0xa4, 0x3f, 0x16, 0x60, 0xed, 0xc4, 0x8f, 0x22, 0x11, 0xa1, 0xe1, 0xe3, 0x96, + 0x92, 0xaf, 0x3a, 0xd9, 0xe3, 0x16, 0x1a, 0x7e, 0xed, 0x0e, 0xb8, 0xf1, 0x5d, 0x7d, 0xe3, 0x46, + 0xaf, 0xa4, 0x1c, 0x9e, 0x3b, 0x6d, 0xe3, 0x78, 0x02, 0x49, 0x15, 0x0a, 0x4e, 0x3c, 0x0e, 0xbb, + 0x28, 0xd2, 0xce, 0x4f, 0x30, 0xd9, 0x85, 0xb5, 0x43, 0xbd, 0x48, 0x1f, 0xc2, 0x20, 0x52, 0x83, + 0x52, 0x67, 0x28, 0xc2, 0x58, 0x44, 0xca, 0xd0, 0x9a, 0x12, 0xa6, 0x29, 0x3c, 0xa8, 0x81, 0xb8, + 0x3a, 0xaf, 0x14, 0x52, 0x0c, 0x79, 0x04, 0x1b, 0x06, 0xb5, 0x45, 0x5f, 0xa0, 0x4e, 0x41, 0xe9, + 0xcc, 0xb1, 0x18, 0xf2, 0x86, 0x37, 0xf0, 0x43, 0x65, 0xa7, 0xa8, 0x43, 0x3e, 0x21, 0xd0, 0x8a, + 0x02, 0x07, 0x03, 0xd7, 0x0f, 0x6c, 0xd0, 0x56, 0xa6, 0x0c, 0xca, 0x9b, 0xa3, 0x58, 0x8a, 0x41, + 0xcb, 0x95, 0xae, 0x5d, 0xd2, 0xf2, 0x29, 0x43, 0x1e, 0xc2, 0x7a, 0x53, 0x84, 0xd2, 0x0f, 0x79, + 0x28, 0x4f, 0xc3, 0x60, 0x6c, 0x97, 0x6b, 0x56, 0xbd, 0xe0, 0xcc, 0x92, 0x78, 0xda, 0xa6, 0x18, + 0x85, 0x32, 0x1a, 0x2b, 0x9d, 0x75, 0xa5, 0x93, 0xa6, 0x30, 0x4e, 0x8d, 0x8e, 0x12, 0x6e, 0x28, + 0xa1, 0x41, 0x98, 0x46, 0x9d, 0xae, 0x88, 0xb8, 0xbd, 0xa9, 0x2e, 0x47, 0x03, 0x8c, 0x78, 0xdb, + 0x95, 0xbe, 0x1c, 0x79, 0xdc, 0xae, 0xd4, 0xac, 0x7a, 0xd6, 0x99, 0x60, 0x3c, 0x6f, 0x5b, 0x84, + 0x7d, 0x2d, 0xdc, 0x52, 0xc2, 0x29, 0x31, 0xe3, 0x6f, 0x53, 0x78, 0xdc, 0x26, 0xea, 0x48, 0xb3, + 0x24, 0xa1, 0x50, 0x36, 0xce, 0x21, 0x8c, 0xed, 0x6d, 0xa5, 0x34, 0xc3, 0x91, 0x3d, 0xd8, 0x39, + 0xb8, 0xec, 0x06, 0x23, 0x8f, 0x7b, 0x33, 0xba, 0x3b, 0x4a, 0xf7, 0x4a, 0x19, 0x9e, 0xa6, 0x11, + 0x87, 0xa3, 0x81, 0x7d, 0xab, 0x66, 0xd5, 0xd7, 0x1d, 0x0d, 0x30, 0xb3, 0x9a, 0x62, 0x30, 0xe0, + 0xa1, 0xb4, 0x77, 0x75, 0x66, 0x19, 0x88, 0x92, 0x83, 0xd0, 0x7d, 0x1b, 0x70, 0xcf, 0xfe, 0x93, + 0x0a, 0x4b, 0x02, 0x31, 0x63, 0xcf, 0x87, 0xb6, 0xad, 0xc8, 0xec, 0xf9, 0x10, 0xcf, 0x65, 0x2c, + 0x3a, 0xdc, 0x8d, 0x45, 0x68, 0xdf, 0xd6, 0xe7, 0x9a, 0x21, 0xc9, 0x4b, 0x80, 0x8e, 0x74, 0x25, + 0xef, 0xf8, 0x61, 0x97, 0xdb, 0xd5, 0x9a, 0x55, 0x2f, 0xed, 0x55, 0x99, 0xae, 0x7a, 0x96, 0x54, + 0x3d, 0x7b, 0x93, 0x54, 0xbd, 0x93, 0xd2, 0xc6, 0x7c, 0x6b, 0x04, 0x81, 0x78, 0xef, 0x70, 0xcf, + 0x8f, 0x78, 0x57, 0xc6, 0xf6, 0x1d, 0x75, 0x25, 0x73, 0x2c, 0xf9, 0x17, 0xde, 0x4d, 0x2c, 0x3b, + 0xe3, 0xb0, 0x6b, 0xdf, 0xbd, 0xd1, 0xc2, 0x44, 0x97, 0x7c, 0x06, 0x44, 0x7d, 0x8f, 0xba, 0x5d, + 0x1e, 0xc7, 0xbd, 0x51, 0xa0, 0x76, 0xf8, 0xf3, 0x8d, 0x3b, 0x5c, 0xb1, 0x8a, 0xfc, 0x17, 0x4a, + 0xc8, 0x9e, 0x08, 0x0f, 0xf5, 0xec, 0x7b, 0x37, 0x6e, 0x92, 0x56, 0xa7, 0xcf, 0x61, 0x53, 0xf7, + 0x85, 0xb6, 0x1f, 0x4b, 0xdd, 0xe7, 0x1e, 0x40, 0x5e, 0x53, 0xb1, 0x6d, 0xd5, 0x72, 0xf5, 0xd2, + 0x5e, 0x9e, 0x69, 0xec, 0x24, 0x3c, 0x65, 0x50, 0xd0, 0x9f, 0xc7, 0xad, 0x0f, 0xe9, 0x27, 0xf4, + 0x19, 0x80, 0x69, 0x54, 0x68, 0xe0, 0x2f, 0xf3, 0x06, 0x8a, 0x2c, 0xd9, 0x6d, 0x6a, 0xe2, 0x13, + 0xd8, 0x6e, 0x5e, 0xb8, 0x61, 0x9f, 0xe3, 0xb5, 0x8c, 0xe2, 0xa4, 0xc5, 0xcd, 0x5b, 0x4b, 0x65, + 0x4d, 0x76, 0x26, 0x6b, 0xe8, 0x83, 0xe4, 0x64, 0xc7, 0xad, 0x6b, 0x16, 0xd3, 0xdf, 0x2c, 0xd8, + 0x68, 0x78, 0x9e, 0x39, 0x9d, 0xf2, 0x2d, 0x5d, 0x6d, 0xd6, 0xb2, 0x6a, 0xcb, 0xce, 0x57, 0x9b, + 0xca, 0x6c, 0x95, 0xff, 0x49, 0xcf, 0x34, 0x10, 0xd7, 0x4d, 0x4a, 0xce, 0x34, 0xcd, 0x29, 0x41, + 0x2a, 0x90, 0x6b, 0x74, 0x5e, 0x9b, 0x96, 0x89, 0x9f, 0xe8, 0xc3, 0x97, 0x6e, 0x14, 0xfa, 0x61, + 0x1f, 0x9b, 0x7e, 0x0e, 0x7b, 0x6c, 0x82, 0xe9, 0x63, 0xd8, 0x3a, 0x1f, 0x7a, 0xae, 0xe4, 0x69, + 0xa7, 0x09, 0xac, 0xb4, 0xfc, 0x5e, 0xcf, 0x34, 0x7d, 0xf5, 0x4d, 0xf7, 0xc0, 0x76, 0x78, 0x2f, + 0xe2, 0x31, 0x06, 0x5d, 0xc4, 0xbe, 0x14, 0xd1, 0x38, 0x89, 0xc3, 0x2e, 0xac, 0x39, 0xfc, 0xc2, + 0x8d, 0x2f, 0xd4, 0x8a, 0x82, 0x63, 0x10, 0xfd, 0xc5, 0x82, 0xad, 0x4e, 0xd7, 0x0d, 0x93, 0xbd, + 0xaf, 0x0e, 0x39, 0xb6, 0xd1, 0x91, 0x14, 0x3a, 0xce, 0x26, 0xea, 0x29, 0x86, 0xbc, 0x80, 0xc2, + 0x19, 0x66, 0x5d, 0x57, 0x04, 0x2a, 0x12, 0x1b, 0x7b, 0xb7, 0xd9, 0xc2, 0xae, 0xec, 0x84, 0xcb, + 0x0b, 0xe1, 0x39, 0x13, 0x55, 0xfa, 0x57, 0x58, 0xd3, 0x1c, 0xc9, 0x43, 0xae, 0xd1, 0x6e, 0x57, + 0x32, 0xf8, 0x71, 0xf8, 0xe6, 0xac, 0x62, 0x91, 0x22, 0xac, 0x3a, 0x9d, 0xaf, 0x5e, 0x37, 0x2b, + 0x59, 0xfa, 0xab, 0x05, 0x9b, 0xe9, 0xdd, 0xcc, 0x64, 0x4e, 0x92, 0xc0, 0x9a, 0x6d, 0x1d, 0x14, + 0xca, 0x87, 0x7e, 0xc0, 0xe3, 0xe3, 0xd0, 0xe3, 0x97, 0x26, 0x47, 0x72, 0xce, 0x0c, 0x87, 0x3a, + 0x9f, 0x87, 0xe2, 0x7d, 0x98, 0xe8, 0xe4, 0xb4, 0x4e, 0x9a, 0x43, 0x0b, 0x0e, 0x1f, 0x88, 0x77, + 0xdc, 0x53, 0x17, 0x98, 0x73, 0x12, 0x88, 0xd1, 0x78, 0xf3, 0xf5, 0x69, 0xaf, 0x17, 0x73, 0x79, + 0x12, 0xab, 0x5b, 0xcc, 0x39, 0x29, 0x86, 0xfe, 0x64, 0x41, 0x05, 0x53, 0x38, 0x46, 0x9b, 0x37, + 0x0e, 0x6a, 0xb2, 0x0f, 0xc5, 0x16, 0xb6, 0x21, 0xe9, 0x46, 0x52, 0x79, 0xbb, 0xbc, 0x96, 0xa7, + 0xca, 0xe4, 0x39, 0xe4, 0x11, 0x1c, 0x84, 0xfa, 0x04, 0xcb, 0xd7, 0x25, 0xaa, 0xf4, 0x3b, 0xd8, + 0x48, 0x79, 0x87, 0xc1, 0xfc, 0x07, 0xac, 0xf6, 0x30, 0x3c, 0xa6, 0x36, 0xab, 0x6c, 0x56, 0xce, + 0x54, 0xec, 0x0e, 0x30, 0xb1, 0x1d, 0xad, 0x58, 0xdd, 0x07, 0x98, 0x92, 0x98, 0xcf, 0xdf, 0xf0, + 0xb1, 0x39, 0x17, 0x7e, 0xe2, 0x24, 0x78, 0xe7, 0x06, 0x23, 0x6e, 0xa2, 0xaf, 0xc1, 0xcb, 0xec, + 0xbe, 0x45, 0x7f, 0xb0, 0x80, 0xa8, 0xed, 0x97, 0x67, 0xdc, 0x1f, 0x1d, 0x14, 0x6e, 0xae, 0x2c, + 0x9d, 0x63, 0xf7, 0x93, 0x07, 0x94, 0xf2, 0x2b, 0xd5, 0x14, 0x93, 0x77, 0x15, 0xbe, 0x8c, 0xb4, + 0xff, 0xb1, 0x39, 0xe8, 0x04, 0xab, 0x07, 0xe2, 0x58, 0xf2, 0xd8, 0xe4, 0x96, 0x06, 0xf4, 0x10, + 0x76, 0x8e, 0xb8, 0x34, 0xed, 0x57, 0xf4, 0xe3, 0x25, 0x05, 0x77, 0xe2, 0x5e, 0x3a, 0x3c, 0x1e, + 0x05, 0x66, 0xef, 0x55, 0x27, 0xc5, 0xd0, 0x3a, 0x90, 0xb9, 0x7d, 0x4c, 0x53, 0x08, 0xfc, 0x90, + 0xab, 0x6b, 0x2c, 0x3a, 0xea, 0x9b, 0x3e, 0x54, 0x35, 0x16, 0xf9, 0x5d, 0xf4, 0x16, 0xef, 0x2c, + 0xc4, 0x4e, 0xad, 0xaf, 0x6a, 0x82, 0xe9, 0x13, 0x28, 0x69, 0xad, 0x18, 0x87, 0xc2, 0x9c, 0x6a, + 0x2e, 0xad, 0xba, 0xf7, 0x7d, 0x01, 0x72, 0xcd, 0xf6, 0x31, 0x79, 0x01, 0x70, 0xc4, 0x65, 0xf2, + 0xb6, 0xdd, 0x5d, 0x08, 0xf2, 0x01, 0xbe, 0xbc, 0xab, 0xeb, 0x2c, 0xfd, 0xa0, 0xa6, 0x19, 0xf2, + 0x1f, 0xc8, 0x9f, 0x0f, 0xfb, 0x91, 0xeb, 0xf1, 0x6b, 0xd7, 0x5c, 0xc3, 0xd3, 0x0c, 0x79, 0x89, + 0x5d, 0x2c, 0x10, 0xae, 0xf7, 0x11, 0x6b, 0xff, 0x0f, 0xe5, 0xf4, 0x74, 0x21, 0x3b, 0xec, 0x8a, + 0x61, 0xb3, 0x64, 0xfd, 0x1e, 0xac, 0xa8, 0xd8, 0x5c, 0x67, 0xb9, 0xc2, 0xe6, 0xa6, 0x2a, 0xcd, + 0x90, 0x27, 0x00, 0x66, 0x20, 0x85, 0x3d, 0x41, 0x2a, 0x6c, 0x6e, 0x3a, 0x55, 0x93, 0x8c, 0xa2, + 0x19, 0xf2, 0x18, 0xdf, 0xb1, 0x66, 0x2e, 0x91, 0x84, 0xaf, 0x6e, 0xb2, 0xd9, 0x61, 0x45, 0x33, + 0xe4, 0xef, 0x50, 0x4e, 0x8f, 0x83, 0xa9, 0x2e, 0x61, 0x0b, 0x63, 0x42, 0x85, 0xac, 0xac, 0xfb, + 0x96, 0x51, 0x5f, 0x74, 0xe2, 0xfa, 0x23, 0xbf, 0x82, 0xad, 0x85, 0x81, 0x42, 0x6e, 0xb3, 0xeb, + 0x86, 0xcc, 0x92, 0x9d, 0x9e, 0x03, 0x4c, 0x3b, 0x38, 0x21, 0x8b, 0xc3, 0xa1, 0x5a, 0x61, 0x73, + 0x2d, 0x9e, 0x66, 0xc8, 0x33, 0x28, 0x4e, 0x3a, 0x11, 0xd9, 0x62, 0xf3, 0x3d, 0xb5, 0xba, 0x39, + 0xd7, 0xa8, 0x68, 0x86, 0xfc, 0x1b, 0x4a, 0xa9, 0x3a, 0x26, 0xdb, 0x6c, 0xb1, 0xd7, 0x54, 0xb7, + 0xd8, 0x7c, 0xa9, 0xd3, 0x0c, 0xd9, 0x87, 0x95, 0x33, 0x3f, 0xec, 0x7f, 0x44, 0x62, 0xfd, 0x0f, + 0xd6, 0x67, 0x6a, 0x91, 0xdc, 0x62, 0x57, 0xd5, 0x78, 0x75, 0x9b, 0x2d, 0x96, 0x2c, 0xcd, 0x10, + 0xa6, 0x2f, 0x5e, 0xd7, 0x68, 0x9e, 0xe9, 0x8f, 0x25, 0xe6, 0x18, 0x14, 0x5b, 0x3c, 0xf8, 0x70, + 0xfd, 0x47, 0x50, 0xc2, 0x94, 0x34, 0xe5, 0x3d, 0x5d, 0x51, 0x66, 0xa9, 0x8a, 0xa7, 0x19, 0xf2, + 0x37, 0x28, 0xa9, 0x07, 0x9b, 0x89, 0xdc, 0x3a, 0x4b, 0xff, 0x67, 0x56, 0x4b, 0x6c, 0xfa, 0x9a, + 0xa3, 0x99, 0xb7, 0x6b, 0xca, 0xcc, 0x3f, 0x7f, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x88, 0xe0, 0x29, + 0xb9, 0x7b, 0x0f, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1373,6 +1457,9 @@ type CLIClient interface { StatsMirror(ctx context.Context, in *StatsMirrorRequest, opts ...grpc.CallOption) (*StatsMirrorReply, error) Ping(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) GetMirrorLogs(ctx context.Context, in *GetMirrorLogsRequest, opts ...grpc.CallOption) (*GetMirrorLogsReply, error) + AddMetric(ctx context.Context, in *Metric, opts ...grpc.CallOption) (*empty.Empty, error) + DelMetric(ctx context.Context, in *Metric, opts ...grpc.CallOption) (*empty.Empty, error) + ListMetrics(ctx context.Context, in *Metric, opts ...grpc.CallOption) (*MetricsList, error) // Tools MatchMirror(ctx context.Context, in *MatchRequest, opts ...grpc.CallOption) (*MatchReply, error) } @@ -1520,6 +1607,33 @@ func (c *cLIClient) GetMirrorLogs(ctx context.Context, in *GetMirrorLogsRequest, return out, nil } +func (c *cLIClient) AddMetric(ctx context.Context, in *Metric, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/CLI/AddMetric", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *cLIClient) DelMetric(ctx context.Context, in *Metric, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/CLI/DelMetric", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *cLIClient) ListMetrics(ctx context.Context, in *Metric, opts ...grpc.CallOption) (*MetricsList, error) { + out := new(MetricsList) + err := c.cc.Invoke(ctx, "/CLI/ListMetrics", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *cLIClient) MatchMirror(ctx context.Context, in *MatchRequest, opts ...grpc.CallOption) (*MatchReply, error) { out := new(MatchReply) err := c.cc.Invoke(ctx, "/CLI/MatchMirror", in, out, opts...) @@ -1546,6 +1660,9 @@ type CLIServer interface { StatsMirror(context.Context, *StatsMirrorRequest) (*StatsMirrorReply, error) Ping(context.Context, *empty.Empty) (*empty.Empty, error) GetMirrorLogs(context.Context, *GetMirrorLogsRequest) (*GetMirrorLogsReply, error) + AddMetric(context.Context, *Metric) (*empty.Empty, error) + DelMetric(context.Context, *Metric) (*empty.Empty, error) + ListMetrics(context.Context, *Metric) (*MetricsList, error) // Tools MatchMirror(context.Context, *MatchRequest) (*MatchReply, error) } @@ -1599,6 +1716,15 @@ func (*UnimplementedCLIServer) Ping(ctx context.Context, req *empty.Empty) (*emp func (*UnimplementedCLIServer) GetMirrorLogs(ctx context.Context, req *GetMirrorLogsRequest) (*GetMirrorLogsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetMirrorLogs not implemented") } +func (*UnimplementedCLIServer) AddMetric(ctx context.Context, req *Metric) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddMetric not implemented") +} +func (*UnimplementedCLIServer) DelMetric(ctx context.Context, req *Metric) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DelMetric not implemented") +} +func (*UnimplementedCLIServer) ListMetrics(ctx context.Context, req *Metric) (*MetricsList, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListMetrics not implemented") +} func (*UnimplementedCLIServer) MatchMirror(ctx context.Context, req *MatchRequest) (*MatchReply, error) { return nil, status.Errorf(codes.Unimplemented, "method MatchMirror not implemented") } @@ -1877,6 +2003,60 @@ func _CLI_GetMirrorLogs_Handler(srv interface{}, ctx context.Context, dec func(i return interceptor(ctx, in, info, handler) } +func _CLI_AddMetric_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Metric) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CLIServer).AddMetric(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/CLI/AddMetric", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CLIServer).AddMetric(ctx, req.(*Metric)) + } + return interceptor(ctx, in, info, handler) +} + +func _CLI_DelMetric_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Metric) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CLIServer).DelMetric(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/CLI/DelMetric", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CLIServer).DelMetric(ctx, req.(*Metric)) + } + return interceptor(ctx, in, info, handler) +} + +func _CLI_ListMetrics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Metric) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CLIServer).ListMetrics(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/CLI/ListMetrics", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CLIServer).ListMetrics(ctx, req.(*Metric)) + } + return interceptor(ctx, in, info, handler) +} + func _CLI_MatchMirror_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(MatchRequest) if err := dec(in); err != nil { @@ -1959,6 +2139,18 @@ var _CLI_serviceDesc = grpc.ServiceDesc{ MethodName: "GetMirrorLogs", Handler: _CLI_GetMirrorLogs_Handler, }, + { + MethodName: "AddMetric", + Handler: _CLI_AddMetric_Handler, + }, + { + MethodName: "DelMetric", + Handler: _CLI_DelMetric_Handler, + }, + { + MethodName: "ListMetrics", + Handler: _CLI_ListMetrics_Handler, + }, { MethodName: "MatchMirror", Handler: _CLI_MatchMirror_Handler, diff --git a/rpc/rpc.proto b/rpc/rpc.proto index fed9eb39..37778460 100644 --- a/rpc/rpc.proto +++ b/rpc/rpc.proto @@ -19,6 +19,9 @@ service CLI { rpc StatsMirror (StatsMirrorRequest) returns (StatsMirrorReply) {} rpc Ping (google.protobuf.Empty) returns (google.protobuf.Empty) {} rpc GetMirrorLogs (GetMirrorLogsRequest) returns (GetMirrorLogsReply) {} + rpc AddMetric (Metric) returns (google.protobuf.Empty) {} + rpc DelMetric (Metric) returns (google.protobuf.Empty) {} + rpc ListMetrics (Metric) returns (MetricsList) {} // Tools rpc MatchMirror (MatchRequest) returns (MatchReply) {} @@ -157,4 +160,12 @@ message GetMirrorLogsRequest { message GetMirrorLogsReply { repeated string line = 1; +} + +message Metric { + string Filename = 1; +} + +message MetricsList { + repeated string Filename = 1; } \ No newline at end of file