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