Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ start-local: clean-db #for testing on your local system without firewalld
env=local go run cmd/main.go
start-server:
go run cmd/main.go
build-linux: # example: make build-linux DB_PATH=/dir/to/db
env GOOS=linux GOARCH=amd64 go build -ldflags "-X github.com/prashantgupta24/firewalld-rest/db.pathFromEnv=$(DB_PATH)" -o build/firewalld-rest cmd/main.go
build-linux:
env GOOS=linux GOARCH=amd64 go build -o build/firewalld-rest cmd/main.go
local-build:
go build -ldflags "-X github.com/prashantgupta24/firewalld-rest/db.pathFromEnv=$(DB_PATH)" -o build/firewalld-rest cmd/main.go
go build -o build/firewalld-rest cmd/main.go
copy: build-linux
scp build/firewalld-rest root@<server>:/root/rest
clean-db:
Expand Down
9 changes: 0 additions & 9 deletions db/db.go

This file was deleted.

132 changes: 0 additions & 132 deletions db/fileType.go

This file was deleted.

58 changes: 57 additions & 1 deletion firewallcmd/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,22 @@ package firewallcmd

import (
"fmt"
"net"
"os/exec"
"regexp"
"strings"
)

//EnableRichRuleForIP enables rich rule for IP access + reloads
//example:
//firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="10.10.99.10/32" port protocol="tcp" port="22" accept'
func EnableRichRuleForIP(ipAddr string) (string, error) {
cmd1 := exec.Command(`firewall-cmd`, `--permanent`, "--zone=public", `--add-rich-rule=rule family="ipv4" source address="`+ipAddr+`/32" port protocol="tcp" port="22" accept`)

//check if valid ipv4 address
if !isValidIpv4(ipAddr) {
return "", fmt.Errorf("not a valid IPv4 address : %v", ipAddr)
}
cmd1 := exec.Command(`firewall-cmd`, `--permanent`, "--zone=public", `--add-rich-rule=`+createRichRule(ipAddr))
//uncomment for debugging
// for _, v := range cmd1.Args {
// fmt.Println(v)
Expand Down Expand Up @@ -51,3 +59,51 @@ func reload() (*exec.Cmd, []byte, error) {
output, err := cmd.CombinedOutput()
return cmd, output, err
}

//GetIPSInFirewall gets IPs currently in firewall
func GetIPSInFirewallRule() ([]string, error) {

var ipsInFirewall []string
cmd := exec.Command("firewall-cmd", "--zone=public", "--list-rich-rules")
output, err := cmd.CombinedOutput()
if err != nil {
return nil, fmt.Errorf("error while fetching IPs from firewall-cmd, err: %v", err)
}

stringToSearch := "address=\""
richRuleLines := strings.Split(string(output), "\n")

for _, rule := range richRuleLines {
r, _ := regexp.Compile(stringToSearch + "[0-9.]*")
ipAddr := strings.TrimPrefix(r.FindString(rule), stringToSearch)
if isValidIpv4(ipAddr) {
ipsInFirewall = append(ipsInFirewall, ipAddr)
//fmt.Println(ipAddr)
}
}
return ipsInFirewall, err
}

//CheckIPExistsInFirewallRule checks if rich rule exists with IP
func CheckIPExistsInFirewallRule(ipAddr string) (bool, error) {
cmd := exec.Command(`firewall-cmd`, "--zone=public", `--query-rich-rule=`+createRichRule(ipAddr))
output, err := cmd.CombinedOutput()
if err != nil {
return false, err
}
strOutput := strings.TrimSpace(string(output))
if strOutput == "yes" {
return true, nil
} else if strOutput == "no" {
return false, nil
}
return false, nil
}

func createRichRule(ipAddr string) string {
richRule := `rule family="ipv4" source address="` + ipAddr + `/32" port protocol="tcp" port="22" accept`
return richRule
}
func isValidIpv4(host string) bool {
return net.ParseIP(host) != nil
}
Loading