1// Copyright (C) MongoDB, Inc. 2014-present. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); you may 4// not use this file except in compliance with the License. You may obtain 5// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 6 7package main 8 9import ( 10 "github.com/jessevdk/go-flags" 11 "github.com/mongodb/mongo-tools/mongoreplay" 12 13 "fmt" 14 "os" 15 "runtime" 16) 17 18const ( 19 ExitOk = 0 20 ExitError = 1 21 ExitNonFatal = 3 22 // Go reserves exit code 2 for its own use 23) 24 25func main() { 26 versionOpts := mongoreplay.VersionOptions{} 27 versionFlagParser := flags.NewParser(&versionOpts, flags.Default) 28 versionFlagParser.Options = flags.IgnoreUnknown 29 _, err := versionFlagParser.Parse() 30 if err != nil { 31 os.Exit(ExitError) 32 } 33 34 if versionOpts.PrintVersion() { 35 os.Exit(ExitOk) 36 } 37 38 if runtime.NumCPU() == 1 { 39 fmt.Fprint(os.Stderr, "mongoreplay must be run with multiple threads") 40 os.Exit(ExitError) 41 } 42 43 opts := mongoreplay.Options{} 44 45 var parser = flags.NewParser(&opts, flags.Default) 46 47 _, err = parser.AddCommand("play", "Play captured traffic against a mongodb instance", "", 48 &mongoreplay.PlayCommand{GlobalOpts: &opts}) 49 if err != nil { 50 panic(err) 51 } 52 53 _, err = parser.AddCommand("record", "Convert network traffic into mongodb queries", "", 54 &mongoreplay.RecordCommand{GlobalOpts: &opts}) 55 if err != nil { 56 panic(err) 57 } 58 59 _, err = parser.AddCommand("monitor", "Inspect live or pre-recorded mongodb traffic", "", 60 &mongoreplay.MonitorCommand{GlobalOpts: &opts}) 61 if err != nil { 62 panic(err) 63 } 64 65 _, err = parser.AddCommand("filter", "Filter playback file", "", 66 &mongoreplay.FilterCommand{GlobalOpts: &opts}) 67 if err != nil { 68 panic(err) 69 } 70 71 _, err = parser.Parse() 72 73 if err != nil { 74 switch err.(type) { 75 case mongoreplay.ErrPacketsDropped: 76 os.Exit(ExitNonFatal) 77 default: 78 os.Exit(ExitError) 79 } 80 } 81} 82