github.com/mackerelio/mackerel-agent-plugins@v0.89.3/mackerel-plugin.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "log" 6 "os" 7 "os/exec" 8 "path/filepath" 9 "regexp" 10 "runtime" 11 "runtime/debug" 12 "strings" 13 ) 14 15 func main() { 16 os.Exit(run(os.Args)) 17 } 18 19 const ( 20 exitOK = iota 21 exitError 22 ) 23 24 var helpReg = regexp.MustCompile(`--?h(?:elp)?`) 25 26 //go:generate sh -c "perl tool/gen_mackerel_plugin.pl > mackerel-plugin_gen.go" 27 func run(args []string) int { 28 var plug string 29 f, err := exec.LookPath(args[0]) 30 if err != nil { 31 log.Println(err) 32 return exitError 33 } 34 fi, err := os.Lstat(f) 35 if err != nil { 36 log.Println(err) 37 return exitError 38 } 39 base := filepath.Base(f) 40 if fi.Mode()&os.ModeSymlink == os.ModeSymlink && strings.HasPrefix(base, "mackerel-plugin-") { 41 // if mackerel-plugin is symbolic linked from mackerel-plugin-memcached, run the memcached plugin 42 plug = strings.TrimPrefix(base, "mackerel-plugin-") 43 } else { 44 if len(args) < 2 { 45 printHelp() 46 return exitError 47 } 48 plug = args[1] 49 if helpReg.MatchString(plug) { 50 printHelp() 51 return exitOK 52 } 53 os.Args = append([]string{f}, args[2:]...) 54 } 55 56 err = runPlugin(plug) 57 58 if err != nil { 59 return exitError 60 } 61 return exitOK 62 } 63 64 func fromVCS() (version, rev string) { 65 version = "unknown" 66 rev = "unknown" 67 info, ok := debug.ReadBuildInfo() 68 if !ok { 69 return 70 } 71 version = info.Main.Version 72 for _, s := range info.Settings { 73 if s.Key == "vcs.revision" { 74 rev = s.Value 75 return 76 } 77 } 78 return 79 } 80 81 func printHelp() { 82 version, gitcommit := fromVCS() 83 fmt.Printf(`mackerel-plugin %s (rev %s) [%s %s %s] 84 85 Usage: mackerel-plugin <plugin> [<args>] 86 87 Following plugins are available: 88 %s 89 90 See `+"`mackerel-plugin <plugin> -h` "+`for more information on a specific plugin 91 `, version, gitcommit, runtime.GOOS, runtime.GOARCH, runtime.Version(), strings.Join(plugins, "\n ")) 92 }