61 lines
2.1 KiB
Go
61 lines
2.1 KiB
Go
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"os"
|
||
"os/exec"
|
||
"strconv"
|
||
"strings"
|
||
)
|
||
|
||
// для всех обычных фаерволов хватит двух команд
|
||
// iptables --version если в ответе есть nf_tables (а это почти 100% случаев теперь), то просто команда
|
||
// nft -j list ruleset
|
||
// в ином случае можно добавить iptables -L
|
||
// довольно сложный json, быстро у меня не получится его разоброать. Временно, я заберу просто вывод без json построчно
|
||
// и так же, построчно отображу в читалке. Там даже в простом варианте из убунты, где их никто не настраивал, 590 строк.
|
||
// значит пока что структура nfrRuleset
|
||
// type nftRuleset struct {
|
||
// Lines []string
|
||
// }
|
||
//
|
||
|
||
func getNftRuleset(dirName string) (nftRuleset, []error) {
|
||
var rules nftRuleset
|
||
var errs []error
|
||
|
||
cmd := exec.Command("nft", "list", "ruleset")
|
||
output, err := cmd.Output()
|
||
if err != nil {
|
||
err = fmt.Errorf("Ошибка при выполнении команды fmt list ruleset : %v", err)
|
||
errs = append(errs, err)
|
||
return rules, errs
|
||
}
|
||
i := 0
|
||
rulesFile, err := os.Create(dirName + "/nftListRuleset.txt")
|
||
|
||
if err != nil {
|
||
err = fmt.Errorf("Ошибка создания файла nftListRuleset.txt : %v", err)
|
||
errs = append(errs, err)
|
||
for line := range strings.SplitSeq(string(output), "\n") {
|
||
line = strconv.Itoa(i) + " " + strings.TrimSpace(line)
|
||
rules.Lines = append(rules.Lines, line)
|
||
i += 1
|
||
}
|
||
} else {
|
||
for line := range strings.SplitSeq(string(output), "\n") {
|
||
line = strings.TrimSpace(line) + "\n"
|
||
_, err := rulesFile.WriteString(line)
|
||
if err != nil {
|
||
err = fmt.Errorf("Ошибка при записи в файл nftListRuleset.txt")
|
||
errs = append(errs, err)
|
||
}
|
||
line = strconv.Itoa(i) + " " + strings.TrimSpace(line)
|
||
rules.Lines = append(rules.Lines, line)
|
||
i += 1
|
||
}
|
||
}
|
||
defer rulesFile.Close()
|
||
return rules, errs
|
||
}
|