-
Notifications
You must be signed in to change notification settings - Fork 0
/
seeshell.go
144 lines (113 loc) · 4.66 KB
/
seeshell.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// Package cmd implements the seeshell CLI command.
package cmd
import (
"fmt"
"io"
"log"
"os"
"github.com/antoniomika/seeshell/handler"
"github.com/antoniomika/seeshell/utils"
"github.com/fsnotify/fsnotify"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"gopkg.in/natefinch/lumberjack.v2"
)
var (
// Version describes the version of the current build.
Version = "dev"
// Commit describes the commit of the current build.
Commit = "none"
// Date describes the date of the current build.
Date = "unknown"
// configFile holds the location of the config file from CLI flags.
configFile string
// rootCmd is the root cobra command.
rootCmd = &cobra.Command{
Use: "seeshell",
Short: "The seeshell command",
Long: "The seeshell command",
Run: runCommand,
Version: Version,
}
)
// init initializes flags used by the root command.
func init() {
cobra.OnInitialize(initConfig)
rootCmd.SetVersionTemplate(fmt.Sprintf("Version: %v\nCommit: %v\nDate: %v\n", Version, Commit, Date))
rootCmd.PersistentFlags().StringVarP(&configFile, "config", "c", "config.yml", "Config file")
rootCmd.PersistentFlags().StringP("tcp-transparent-address", "", "localhost:8082", "TCP transparent address")
rootCmd.PersistentFlags().StringP("tcp-address", "", "localhost:8081", "TCP service address")
rootCmd.PersistentFlags().StringP("http-address", "", "localhost:8080", "HTTP/WS service address")
rootCmd.PersistentFlags().StringP("http-domain", "", "localhost", "The domain for the service to be outputted")
rootCmd.PersistentFlags().StringP("secret-path", "", "", "The path used to print session ids. An empty string is used to disable this")
rootCmd.PersistentFlags().StringP("time-format", "", "2006/01/02 - 15:04:05", "The time format to use for general log messages")
rootCmd.PersistentFlags().StringP("log-to-file-path", "", "/tmp/seeshell.log", "The file to write log output to")
rootCmd.PersistentFlags().StringP("data-directory", "", "deploy/data/", "Directory that holds data")
rootCmd.PersistentFlags().BoolP("https-enabled", "", false, "Whether HTTPS is enabled (reverse proxy)")
rootCmd.PersistentFlags().BoolP("debug", "", false, "Enable debugging information")
rootCmd.PersistentFlags().BoolP("log-to-stdout", "", true, "Enable writing log output to stdout")
rootCmd.PersistentFlags().BoolP("log-to-file", "", false, "Enable writing log output to file, specified by log-to-file-path")
rootCmd.PersistentFlags().BoolP("log-to-file-compress", "", false, "Enable compressing log output files")
rootCmd.PersistentFlags().IntP("http-port", "", 8080, "The http port to display in command output")
rootCmd.PersistentFlags().IntP("log-to-file-max-size", "", 500, "The maximum size of outputed log files in megabytes")
rootCmd.PersistentFlags().IntP("log-to-file-max-backups", "", 3, "The maxium number of rotated logs files to keep")
rootCmd.PersistentFlags().IntP("log-to-file-max-age", "", 28, "The maxium number of days to store log output in a file")
}
// initConfig initializes the configuration and loads needed
// values. It initializes logging and other vars.
func initConfig() {
viper.SetConfigFile(configFile)
err := viper.BindPFlags(rootCmd.PersistentFlags())
if err != nil {
log.Println("Unable to bind pflags:", err)
}
viper.AutomaticEnv()
if err := viper.ReadInConfig(); err == nil {
log.Println("Using config file:", viper.ConfigFileUsed())
}
viper.WatchConfig()
writers := []io.Writer{}
if viper.GetBool("log-to-stdout") {
writers = append(writers, os.Stdout)
}
if viper.GetBool("log-to-file") {
writers = append(writers, &lumberjack.Logger{
Filename: viper.GetString("log-to-file-path"),
MaxSize: viper.GetInt("log-to-file-max-size"),
MaxBackups: viper.GetInt("log-to-file-max-backups"),
MaxAge: viper.GetInt("log-to-file-max-age"),
Compress: viper.GetBool("log-to-file-compress"),
})
}
multiWriter := io.MultiWriter(writers...)
viper.OnConfigChange(func(e fsnotify.Event) {
log.Println("Reloaded configuration file.")
log.SetFlags(0)
log.SetOutput(utils.LogWriter{
TimeFmt: viper.GetString("time-format"),
MultiWriter: multiWriter,
})
if viper.GetBool("debug") {
logrus.SetLevel(logrus.DebugLevel)
}
})
log.SetFlags(0)
log.SetOutput(utils.LogWriter{
TimeFmt: viper.GetString("time-format"),
MultiWriter: multiWriter,
})
if viper.GetBool("debug") {
logrus.SetLevel(logrus.DebugLevel)
}
logrus.SetOutput(multiWriter)
utils.Setup(multiWriter)
}
// Execute executes the root command.
func Execute() error {
return rootCmd.Execute()
}
// runCommand is used to start the root muxer.
func runCommand(cmd *cobra.Command, args []string) {
handler.Handle()
}