mirror of
https://github.com/luscis/openlan.git
synced 2025-10-06 00:57:03 +08:00
fix: save for acl
This commit is contained in:
@@ -42,7 +42,7 @@ func (u ACLRule) Add(c *cli.Context) error {
|
|||||||
DstIp: c.String("destination"),
|
DstIp: c.String("destination"),
|
||||||
SrcPort: c.Int("sport"),
|
SrcPort: c.Int("sport"),
|
||||||
DstPort: c.Int("dport"),
|
DstPort: c.Int("dport"),
|
||||||
Action: "DROP",
|
Action: "drop",
|
||||||
}
|
}
|
||||||
|
|
||||||
clt := u.NewHttp(c.String("token"))
|
clt := u.NewHttp(c.String("token"))
|
||||||
@@ -63,7 +63,7 @@ func (u ACLRule) Remove(c *cli.Context) error {
|
|||||||
DstIp: c.String("destination"),
|
DstIp: c.String("destination"),
|
||||||
SrcPort: c.Int("sport"),
|
SrcPort: c.Int("sport"),
|
||||||
DstPort: c.Int("dport"),
|
DstPort: c.Int("dport"),
|
||||||
Action: "DROP",
|
Action: "drop",
|
||||||
}
|
}
|
||||||
|
|
||||||
clt := u.NewHttp(c.String("token"))
|
clt := u.NewHttp(c.String("token"))
|
||||||
@@ -97,6 +97,18 @@ func (u ACLRule) List(c *cli.Context) error {
|
|||||||
return u.Out(items, c.String("format"), u.Tmpl())
|
return u.Out(items, c.String("format"), u.Tmpl())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (u ACLRule) Save(c *cli.Context) error {
|
||||||
|
name := c.String("name")
|
||||||
|
url := u.Url(c.String("url"), name)
|
||||||
|
|
||||||
|
clt := u.NewHttp(c.String("token"))
|
||||||
|
if err := clt.PutJSON(url, nil, nil); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (u ACLRule) Commands() *cli.Command {
|
func (u ACLRule) Commands() *cli.Command {
|
||||||
return &cli.Command{
|
return &cli.Command{
|
||||||
Name: "rule",
|
Name: "rule",
|
||||||
@@ -133,6 +145,12 @@ func (u ACLRule) Commands() *cli.Command {
|
|||||||
Aliases: []string{"ls"},
|
Aliases: []string{"ls"},
|
||||||
Action: u.List,
|
Action: u.List,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "save",
|
||||||
|
Usage: "Save all acl rules",
|
||||||
|
Aliases: []string{"sa"},
|
||||||
|
Action: u.Save,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -15,6 +15,7 @@ func (h ACL) Router(router *mux.Router) {
|
|||||||
router.HandleFunc("/api/network/{id}/acl", h.List).Methods("GET")
|
router.HandleFunc("/api/network/{id}/acl", h.List).Methods("GET")
|
||||||
router.HandleFunc("/api/network/{id}/acl", h.Add).Methods("POST")
|
router.HandleFunc("/api/network/{id}/acl", h.Add).Methods("POST")
|
||||||
router.HandleFunc("/api/network/{id}/acl", h.Del).Methods("DELETE")
|
router.HandleFunc("/api/network/{id}/acl", h.Del).Methods("DELETE")
|
||||||
|
router.HandleFunc("/api/network/{id}/acl", h.Save).Methods("PUT")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h ACL) List(w http.ResponseWriter, r *http.Request) {
|
func (h ACL) List(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -85,3 +86,18 @@ func (h ACL) Del(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h ACL) Save(w http.ResponseWriter, r *http.Request) {
|
||||||
|
vars := mux.Vars(r)
|
||||||
|
id := vars["id"]
|
||||||
|
|
||||||
|
worker := GetWorker(id)
|
||||||
|
if worker == nil {
|
||||||
|
http.Error(w, "Network not found", http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
acl := worker.ACLer()
|
||||||
|
acl.Save()
|
||||||
|
|
||||||
|
ResponseJson(w, "success")
|
||||||
|
}
|
||||||
|
@@ -36,6 +36,7 @@ type ACLer interface {
|
|||||||
AddRule(rule *schema.ACLRule) error
|
AddRule(rule *schema.ACLRule) error
|
||||||
DelRule(rule *schema.ACLRule) error
|
DelRule(rule *schema.ACLRule) error
|
||||||
ListRules(call func(obj schema.ACLRule))
|
ListRules(call func(obj schema.ACLRule))
|
||||||
|
Save()
|
||||||
}
|
}
|
||||||
|
|
||||||
type ZTruster interface {
|
type ZTruster interface {
|
||||||
|
@@ -14,6 +14,15 @@ func (ru *ACL) Save() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ru *ACL) Correct(sw *Switch) {
|
||||||
|
for _, rule := range ru.Rules {
|
||||||
|
rule.Correct()
|
||||||
|
}
|
||||||
|
if ru.File == "" {
|
||||||
|
ru.File = sw.Dir("acl", ru.Name+".json")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type ACLRule struct {
|
type ACLRule struct {
|
||||||
Name string `json:"name,omitempty"`
|
Name string `json:"name,omitempty"`
|
||||||
SrcIp string `json:"source,omitempty"`
|
SrcIp string `json:"source,omitempty"`
|
||||||
@@ -25,4 +34,7 @@ type ACLRule struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ru *ACLRule) Correct() {
|
func (ru *ACLRule) Correct() {
|
||||||
|
if ru.Action == "" {
|
||||||
|
ru.Action = "drop"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -196,6 +196,13 @@ func (s *Switch) LoadNetwork() {
|
|||||||
if obj.File == "" {
|
if obj.File == "" {
|
||||||
obj.File = s.Dir("network", obj.Name+".json")
|
obj.File = s.Dir("network", obj.Name+".json")
|
||||||
}
|
}
|
||||||
|
if _, ok := s.Acl[obj.Name]; !ok {
|
||||||
|
obj := &ACL{
|
||||||
|
Name: obj.Name,
|
||||||
|
}
|
||||||
|
obj.Correct(s)
|
||||||
|
s.Acl[obj.Name] = obj
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,16 +219,9 @@ func (s *Switch) LoadAcl() {
|
|||||||
libol.Error("Switch.LoadAcl %s", err)
|
libol.Error("Switch.LoadAcl %s", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
obj.Correct(s)
|
||||||
s.Acl[obj.Name] = obj
|
s.Acl[obj.Name] = obj
|
||||||
}
|
}
|
||||||
for _, obj := range s.Acl {
|
|
||||||
for _, rule := range obj.Rules {
|
|
||||||
rule.Correct()
|
|
||||||
}
|
|
||||||
if obj.File == "" {
|
|
||||||
obj.File = s.Dir("acl", obj.Name+".json")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Switch) Load() error {
|
func (s *Switch) Load() error {
|
||||||
@@ -246,9 +246,6 @@ func (s *Switch) SaveAcl() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Switch) SaveNetwork() {
|
func (s *Switch) SaveNetwork() {
|
||||||
if s.Network == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, obj := range s.Network {
|
for _, obj := range s.Network {
|
||||||
obj.Save()
|
obj.Save()
|
||||||
}
|
}
|
||||||
|
@@ -162,3 +162,20 @@ func (a *ACL) ListRules(call func(obj schema.ACLRule)) {
|
|||||||
call(obj)
|
call(obj)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *ACL) Save() {
|
||||||
|
cfg := co.GetAcl(a.Name)
|
||||||
|
cfg.Rules = nil
|
||||||
|
for _, rule := range a.Rules {
|
||||||
|
cr := &co.ACLRule{
|
||||||
|
DstIp: rule.DstIp,
|
||||||
|
SrcIp: rule.SrcIp,
|
||||||
|
Proto: rule.Proto,
|
||||||
|
DstPort: rule.DstPort,
|
||||||
|
SrcPort: rule.SrcPort,
|
||||||
|
Action: rule.Action,
|
||||||
|
}
|
||||||
|
cfg.Rules = append(cfg.Rules, cr)
|
||||||
|
}
|
||||||
|
cfg.Save()
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user