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  }