mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 11:27:17 +08:00
108 lines
2.5 KiB
Go
108 lines
2.5 KiB
Go
package service
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/go-rat/chix"
|
|
|
|
"github.com/TheTNB/panel/internal/http/request"
|
|
"github.com/TheTNB/panel/pkg/firewall"
|
|
"github.com/TheTNB/panel/pkg/systemctl"
|
|
)
|
|
|
|
type FirewallService struct {
|
|
firewall *firewall.Firewall
|
|
}
|
|
|
|
func NewFirewallService() *FirewallService {
|
|
return &FirewallService{
|
|
firewall: firewall.NewFirewall(),
|
|
}
|
|
}
|
|
|
|
func (s *FirewallService) GetStatus(w http.ResponseWriter, r *http.Request) {
|
|
running, err := s.firewall.Status()
|
|
if err != nil {
|
|
Error(w, http.StatusInternalServerError, "%v", err)
|
|
return
|
|
}
|
|
|
|
Success(w, running)
|
|
}
|
|
|
|
func (s *FirewallService) UpdateStatus(w http.ResponseWriter, r *http.Request) {
|
|
req, err := Bind[request.FirewallStatus](r)
|
|
if err != nil {
|
|
Error(w, http.StatusUnprocessableEntity, "%v", err)
|
|
return
|
|
}
|
|
|
|
if req.Status {
|
|
err = systemctl.Start("firewalld")
|
|
if err == nil {
|
|
err = systemctl.Enable("firewalld")
|
|
}
|
|
} else {
|
|
err = systemctl.Stop("firewalld")
|
|
if err == nil {
|
|
err = systemctl.Disable("firewalld")
|
|
}
|
|
}
|
|
|
|
if err != nil {
|
|
Error(w, http.StatusInternalServerError, "%v", err)
|
|
return
|
|
}
|
|
|
|
Success(w, nil)
|
|
}
|
|
|
|
func (s *FirewallService) GetRules(w http.ResponseWriter, r *http.Request) {
|
|
rules, err := s.firewall.ListRule()
|
|
if err != nil {
|
|
Error(w, http.StatusInternalServerError, "%v", err)
|
|
return
|
|
}
|
|
|
|
paged, total := Paginate(r, rules)
|
|
|
|
Success(w, chix.M{
|
|
"total": total,
|
|
"items": paged,
|
|
})
|
|
}
|
|
|
|
func (s *FirewallService) CreateRule(w http.ResponseWriter, r *http.Request) {
|
|
req, err := Bind[request.FirewallRule](r)
|
|
if err != nil {
|
|
Error(w, http.StatusUnprocessableEntity, "%v", err)
|
|
return
|
|
}
|
|
|
|
if err = s.firewall.Port(firewall.FireInfo{
|
|
Family: req.Family, PortStart: req.PortStart, PortEnd: req.PortEnd, Protocol: req.Protocol, Address: req.Address, Strategy: req.Strategy, Direction: req.Direction,
|
|
}, firewall.OperationAdd); err != nil {
|
|
Error(w, http.StatusInternalServerError, "%v", err)
|
|
return
|
|
}
|
|
|
|
Success(w, nil)
|
|
}
|
|
|
|
func (s *FirewallService) DeleteRule(w http.ResponseWriter, r *http.Request) {
|
|
req, err := Bind[request.FirewallRule](r)
|
|
if err != nil {
|
|
Error(w, http.StatusUnprocessableEntity, "%v", err)
|
|
return
|
|
}
|
|
|
|
if err = s.firewall.Port(firewall.FireInfo{
|
|
Family: req.Family, PortStart: req.PortStart, PortEnd: req.PortEnd, Protocol: req.Protocol, Address: req.Address, Strategy: req.Strategy, Direction: req.Direction,
|
|
}, firewall.OperationRemove); err != nil {
|
|
Error(w, http.StatusInternalServerError, "%v", err)
|
|
return
|
|
}
|
|
|
|
Success(w, nil)
|
|
}
|