Module: Template

Included in:
Exer::Make
Defined in:
lib/exer/template/main.rb,
lib/exer/template/functions.rb

Overview

Set of predefined functions in go language. Consist of function definitions, and main function that run it.

Constant Summary collapse

MAIN_FUNCTION =

Main functions in golang file.

{
  binary_exist: 'BinaryExist("COMMAND")',
  ruby_exist: 'RubyExist()',
  ruby_exec: 'RubyExec("COMMAND")',
  gem_install: 'GemInstall("COMMAND")',
  gem_run: 'GemRun("COMMAND")'
}.freeze
WAIT_FOR_ENTER =

Wait for user to press enter before exit. Useful only when you install gem without running.

<<~CODE

   fmt.Println("")
   fmt.Println("Press [ENTER] key to exit")
  var reader = bufio.NewReader(os.Stdin)
  reader.ReadString('\\n')
CODE
GO_PACKAGES =
<<~CODE
  package main
  import ("bytes"; "fmt"; "os"; "os/exec"; "syscall"; "runtime";)
CODE
BINARY_EXIST =
<<~CODE
  func BinaryExist(binary string) (string, error) {
    path, err := exec.LookPath(binary)
    if err == nil {
        fmt.Println("[+] Found", binary, "binary:", path)
    } else {
        fmt.Println("[-]", binary, "binary not found in path")
    }
    return path, err
  }
CODE
RUBY_EXIST =
<<~CODE
  func RubyExist() (string, error) {
    rbin, rerr := BinaryExist("ruby")

    if rerr == nil {
        RubyExec("print '[+] Ruby Version: ' + RUBY_VERSION")
        RubyExec("print '[+] Ruby Platform: ' + RUBY_PLATFORM")
    } else {
        fmt.Println("Error:", rerr)
        os.Exit(1)
    }
    return rbin, rerr
  }
CODE
RUBY_EXEC =
<<~CODE
  func RubyExec(command string) (string, string, error) {
    var stdout bytes.Buffer
    var stderr bytes.Buffer

    cmd := exec.Command("ruby", "-e", command)

    cmd.Stdout = &stdout
    cmd.Stderr = &stderr
    err := cmd.Run()

    sout := stdout.String()
    serr := stderr.String()

    if err == nil {
        fmt.Println(sout)
    } else {
        fmt.Println("Error:", serr, err)
    }
    return sout, serr, err
  }
CODE
GEM_INSTALL =
<<~CODE
  func GemInstall(gem string) (string, string, error) {
    _, gerr := exec.LookPath("gem")
    if gerr != nil { fmt.Println(gerr); os.Exit(1) }

    var stdout bytes.Buffer
    var stderr bytes.Buffer

    cmd := exec.Command("gem", "install", gem, "--no-doc")

    cmd.Stdout = &stdout
    cmd.Stderr = &stderr
    err := cmd.Run()

    sout := stdout.String()
    serr := stderr.String()

    if err == nil {
        fmt.Println(sout)
    } else {
        fmt.Println("Error:", serr, err)
    }
    return sout, serr, err
  }
CODE
GEM_RUN =
<<~CODE
  func GemRun(command string) {
    envs := os.Environ()
    cpath, cerr := BinaryExist(command)
    if cerr != nil { GemInstall(command); cpath, cerr = BinaryExist(command) }

    os := runtime.GOOS
    switch os {
    case "windows":
        cmd := exec.Command("cmd", "/c", "start", cpath)
        err := cmd.Run()
        if err != nil { fmt.Println(err) }
    case "linux", "darwin":
        com := []string{command}
        err := syscall.Exec(cpath, com, envs)
        if err != nil { fmt.Println(err) }
    }
  }
CODE
FUNCTION =

Predefined functions in golang. go_packages always go first.

{
  go_packages: GO_PACKAGES,
  binary_exist: BINARY_EXIST,
  ruby_exist: RUBY_EXIST,
  ruby_exec: RUBY_EXEC,
  gem_install: GEM_INSTALL,
  gem_run: GEM_RUN
}.freeze