package admin import ( "log" casbin "github.com/casbin/casbin/v2" ) // Servicer container for dependencies and functions type Servicer struct { *casbin.SyncedEnforcer Conf *ServerRepos serverConfigPath string reposDir string mgmtRepo bool } // Reload reoload server config and sync policies func (s *Servicer) Reload() { tmpConfig, err := loadServerConfig(s.mgmtRepo, s.reposDir, s.serverConfigPath) if err != nil { // log.error log.Printf("failed to load config %s", err) log.Print("refusing to reload config") return } s.Conf = tmpConfig s.InitServer() } // InitServer initialize a git server and configure func (s *Servicer) InitServer() { policies := s.Conf.ServerPolicies() log.Print("policies generated") numAdded := 0 for _, policy := range policies { added, err := s.AddPolicy(policy[0], policy[1], policy[2]) if err != nil { // log.error log.Printf("error adding policy %s %s %s error %s", policy[0], policy[1], policy[2], err) continue } if added { numAdded++ } } log.Printf("policies added %d", numAdded) if err := s.SavePolicy(); err != nil { log.Print("couldn't save policy") } log.Printf("policies saved") if err := s.LoadPolicy(); err != nil { log.Print("cloudn't load policy") } log.Print("policies loaded") s.Conf.ConfigureRepos() log.Print("configured repos") } // NewService create a new admin service, load config, and generate policies func NewService(modelPath, policyPath, serverConfigPath, reposDir string, mgmtRepo bool) *Servicer { enf, err := casbin.NewSyncedEnforcer(modelPath, policyPath) if err != nil { log.Fatalf("Couldn't load the enforcer encountered the following error: %s", err) } conf, err := loadServerConfig(mgmtRepo, reposDir, serverConfigPath) if err != nil { // log.error log.Fatalf("Coudln't load server config %s", err) } conf.basePath = reposDir svc := &Servicer{ enf, conf, serverConfigPath, reposDir, mgmtRepo, } svc.InitServer() return svc }