126 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| package fail2ban
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"os/exec"
 | |
| 	"strings"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf/testutil"
 | |
| )
 | |
| 
 | |
| // By all rights, we should use `string literal`, but the string contains "`".
 | |
| var execStatusOutput = "Status\n" +
 | |
| 	"|- Number of jail:\t3\n" +
 | |
| 	"`- Jail list:\tdovecot, postfix, sshd"
 | |
| var execStatusDovecotOutput = "Status for the jail: dovecot\n" +
 | |
| 	"|- Filter\n" +
 | |
| 	"|  |- Currently failed:\t11\n" +
 | |
| 	"|  |- Total failed:\t22\n" +
 | |
| 	"|  `- File list:\t/var/log/maillog\n" +
 | |
| 	"`- Actions\n" +
 | |
| 	"   |- Currently banned:\t0\n" +
 | |
| 	"   |- Total banned:\t100\n" +
 | |
| 	"   `- Banned IP list:"
 | |
| var execStatusPostfixOutput = "Status for the jail: postfix\n" +
 | |
| 	"|- Filter\n" +
 | |
| 	"|  |- Currently failed:\t4\n" +
 | |
| 	"|  |- Total failed:\t10\n" +
 | |
| 	"|  `- File list:\t/var/log/maillog\n" +
 | |
| 	"`- Actions\n" +
 | |
| 	"   |- Currently banned:\t3\n" +
 | |
| 	"   |- Total banned:\t60\n" +
 | |
| 	"   `- Banned IP list:\t192.168.10.1 192.168.10.3"
 | |
| var execStatusSshdOutput = "Status for the jail: sshd\n" +
 | |
| 	"|- Filter\n" +
 | |
| 	"|  |- Currently failed:\t0\n" +
 | |
| 	"|  |- Total failed:\t5\n" +
 | |
| 	"|  `- File list:\t/var/log/secure\n" +
 | |
| 	"`- Actions\n" +
 | |
| 	"   |- Currently banned:\t2\n" +
 | |
| 	"   |- Total banned:\t50\n" +
 | |
| 	"   `- Banned IP list:\t192.168.0.1 192.168.1.1"
 | |
| 
 | |
| func TestGather(t *testing.T) {
 | |
| 	f := Fail2ban{
 | |
| 		path: "/usr/bin/fail2ban-client",
 | |
| 	}
 | |
| 
 | |
| 	execCommand = fakeExecCommand
 | |
| 	defer func() { execCommand = exec.Command }()
 | |
| 	var acc testutil.Accumulator
 | |
| 	err := f.Gather(&acc)
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	fields1 := map[string]interface{}{
 | |
| 		"banned": 2,
 | |
| 		"failed": 0,
 | |
| 	}
 | |
| 	tags1 := map[string]string{
 | |
| 		"jail": "sshd",
 | |
| 	}
 | |
| 
 | |
| 	fields2 := map[string]interface{}{
 | |
| 		"banned": 3,
 | |
| 		"failed": 4,
 | |
| 	}
 | |
| 	tags2 := map[string]string{
 | |
| 		"jail": "postfix",
 | |
| 	}
 | |
| 
 | |
| 	fields3 := map[string]interface{}{
 | |
| 		"banned": 0,
 | |
| 		"failed": 11,
 | |
| 	}
 | |
| 	tags3 := map[string]string{
 | |
| 		"jail": "dovecot",
 | |
| 	}
 | |
| 
 | |
| 	acc.AssertContainsTaggedFields(t, "fail2ban", fields1, tags1)
 | |
| 	acc.AssertContainsTaggedFields(t, "fail2ban", fields2, tags2)
 | |
| 	acc.AssertContainsTaggedFields(t, "fail2ban", fields3, tags3)
 | |
| }
 | |
| 
 | |
| func fakeExecCommand(command string, args ...string) *exec.Cmd {
 | |
| 	cs := []string{"-test.run=TestHelperProcess", "--", command}
 | |
| 	cs = append(cs, args...)
 | |
| 	cmd := exec.Command(os.Args[0], cs...)
 | |
| 	cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"}
 | |
| 	return cmd
 | |
| }
 | |
| 
 | |
| func TestHelperProcess(t *testing.T) {
 | |
| 	if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	args := os.Args
 | |
| 	cmd, args := args[3], args[4:]
 | |
| 
 | |
| 	if !strings.HasSuffix(cmd, "fail2ban-client") {
 | |
| 		fmt.Fprint(os.Stdout, "command not found")
 | |
| 		os.Exit(1)
 | |
| 	}
 | |
| 
 | |
| 	if len(args) == 1 && args[0] == "status" {
 | |
| 		fmt.Fprint(os.Stdout, execStatusOutput)
 | |
| 		os.Exit(0)
 | |
| 	} else if len(args) == 2 && args[0] == "status" {
 | |
| 		if args[1] == "sshd" {
 | |
| 			fmt.Fprint(os.Stdout, execStatusSshdOutput)
 | |
| 			os.Exit(0)
 | |
| 		} else if args[1] == "postfix" {
 | |
| 			fmt.Fprint(os.Stdout, execStatusPostfixOutput)
 | |
| 			os.Exit(0)
 | |
| 		} else if args[1] == "dovecot" {
 | |
| 			fmt.Fprint(os.Stdout, execStatusDovecotOutput)
 | |
| 			os.Exit(0)
 | |
| 		}
 | |
| 	}
 | |
| 	fmt.Fprint(os.Stdout, "invalid argument")
 | |
| 	os.Exit(1)
 | |
| }
 |