diff --git a/rvpn/genericlistener/api_collect_domains.go b/rvpn/genericlistener/api_collect_domains.go new file mode 100644 index 0000000..9529d0f --- /dev/null +++ b/rvpn/genericlistener/api_collect_domains.go @@ -0,0 +1,52 @@ +package genericlistener + +//DomainsAPI -- Structure to support the server API +type DomainsAPI struct { + DomainName string `json:"domain_name"` + ServerID int64 `json:"server_id"` + BytesIn int64 `json:"bytes_in"` + BytesOut int64 `json:"bytes_out"` +} + +//NewDomainsAPI - Constructor +func NewDomainsAPI(c *Connection, d *DomainTrack) (s *DomainsAPI) { + s = new(DomainsAPI) + s.DomainName = d.DomainName + s.ServerID = c.ConnectionID() + s.BytesIn = d.BytesIn() + s.BytesOut = d.BytesOut() + + return +} + +//DomainsAPIContainer -- Holder for all the Servers +type DomainsAPIContainer struct { + Domains []*DomainsAPI `json:"domains"` +} + +//NewDomainsAPIContainer -- Constructor +func NewDomainsAPIContainer() (p *DomainsAPIContainer) { + p = new(DomainsAPIContainer) + p.Domains = make([]*DomainsAPI, 0) + return p +} + +//DomainAPI -- Structure to support the server API +type DomainAPI struct { + DomainName string `json:"domain_name"` + ServerID int64 `json:"server_id"` + BytesIn int64 `json:"bytes_in"` + BytesOut int64 `json:"bytes_out"` + Source string `json:"source_addr"` +} + +//NewDomainsAPI - Constructor +func NewDomainAPI(c *Connection, d *DomainTrack) (s *DomainAPI) { + s = new(DomainAPI) + s.DomainName = d.DomainName + s.ServerID = c.ConnectionID() + s.BytesIn = d.BytesIn() + s.BytesOut = d.BytesOut() + s.Source = c.Source() + return +} diff --git a/rvpn/genericlistener/api_collect_server.go b/rvpn/genericlistener/api_collect_server.go index 813fb8d..ad775b7 100644 --- a/rvpn/genericlistener/api_collect_server.go +++ b/rvpn/genericlistener/api_collect_server.go @@ -27,5 +27,10 @@ func NewServerAPI(c *Connection) (s *ServerAPI) { s.BytesOut = c.BytesOut() s.Source = c.source + for domainName := range c.DomainTrack { + + domainAPI := NewDomainAPI(c, c.DomainTrack[domainName]) + s.Domains = append(s.Domains, domainAPI) + } return } diff --git a/rvpn/genericlistener/api_collect_servers.go b/rvpn/genericlistener/api_collect_servers.go index 152322e..63c9746 100644 --- a/rvpn/genericlistener/api_collect_servers.go +++ b/rvpn/genericlistener/api_collect_servers.go @@ -29,7 +29,7 @@ func NewServersAPI(c *Connection) (s *ServersAPI) { for d := range c.DomainTrack { dt := c.DomainTrack[d] - domainAPI := NewDomainAPI(dt.DomainName, dt.BytesIn(), dt.BytesOut()) + domainAPI := NewDomainAPI(c, dt) s.Domains = append(s.Domains, domainAPI) } return diff --git a/rvpn/genericlistener/api_interface.go b/rvpn/genericlistener/api_interface.go index 688b9ff..9c450b1 100644 --- a/rvpn/genericlistener/api_interface.go +++ b/rvpn/genericlistener/api_interface.go @@ -43,7 +43,9 @@ func handleAdminClient(ctx context.Context, oneConn *oneConnListener) { w.Header().Set("Content-Type", "text/html; charset=utf-8") fmt.Fprintln(w, "Welcome..press Servers to access stats") }) - + router.HandleFunc(endPointPrefix+"domains", getDomainsEndpoint).Methods("GET") + router.HandleFunc(endPointPrefix+"domain/", getDomainEndpoint).Methods("GET") + router.HandleFunc(endPointPrefix+"domain/{domain-name}", getDomainEndpoint).Methods("GET") router.HandleFunc(endPointPrefix+"servers", getServersEndpoint).Methods("GET") router.HandleFunc(endPointPrefix+"server/", getServerEndpoint).Methods("GET") router.HandleFunc(endPointPrefix+"server/{server-id}", getServerEndpoint).Methods("GET") @@ -65,6 +67,54 @@ func handleAdminClient(ctx context.Context, oneConn *oneConnListener) { } } +func getDomainsEndpoint(w http.ResponseWriter, r *http.Request) { + pc, _, _, _ := runtime.Caller(0) + loginfo.Println(runtime.FuncForPC(pc).Name()) + + domainsContainer := NewDomainsAPIContainer() + + for domain := range connectionTable.domains { + conn := connectionTable.domains[domain] + domainAPI := NewDomainsAPI(conn, conn.DomainTrack[domain]) + domainsContainer.Domains = append(domainsContainer.Domains, domainAPI) + + } + + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + + env := envelope.NewEnvelope("domains/GET") + env.Result = domainsContainer + env.GenerateWriter(w) + +} + +func getDomainEndpoint(w http.ResponseWriter, r *http.Request) { + pc, _, _, _ := runtime.Caller(0) + loginfo.Println(runtime.FuncForPC(pc).Name()) + + env := envelope.NewEnvelope("domain/GET") + + params := mux.Vars(r) + if id, ok := params["domain-name"]; !ok { + env.Error = "domain-name is missing" + env.ErrorURI = r.RequestURI + env.ErrorDescription = "domain API requires a domain-name" + } else { + domainName := id + if conn, ok := connectionTable.domains[domainName]; !ok { + env.Error = "domain-name was not found" + env.ErrorURI = r.RequestURI + env.ErrorDescription = "domain-name not found" + } else { + + domainAPI := NewDomainAPI(conn, conn.DomainTrack[domainName]) + env.Result = domainAPI + } + } + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + env.GenerateWriter(w) +} + func getServersEndpoint(w http.ResponseWriter, r *http.Request) { pc, _, _, _ := runtime.Caller(0) loginfo.Println(runtime.FuncForPC(pc).Name()) @@ -82,9 +132,6 @@ func getServersEndpoint(w http.ResponseWriter, r *http.Request) { env := envelope.NewEnvelope("servers/GET") env.Result = serverContainer env.GenerateWriter(w) - - //json.NewEncoder(w).Encode(serverContainer) - } func getServerEndpoint(w http.ResponseWriter, r *http.Request) { diff --git a/rvpn/genericlistener/domain_api.go b/rvpn/genericlistener/domain_api.go index bcbf522..542aa68 100644 --- a/rvpn/genericlistener/domain_api.go +++ b/rvpn/genericlistener/domain_api.go @@ -1,20 +1,20 @@ package genericlistener //DomainAPI -- Structure to hold the domain tracking for JSON -type DomainAPI struct { - Domain string `json:"domain"` - BytesIn int64 `json:"bytes_in"` - BytesOut int64 `json:"bytes_out"` -} +// type DomainAPI struct { +// Domain string `json:"domain"` +// BytesIn int64 `json:"bytes_in"` +// BytesOut int64 `json:"bytes_out"` +// } -//NewDomainAPI - Constructor -func NewDomainAPI(domain string, bytesin int64, bytesout int64) (d *DomainAPI) { - d = new(DomainAPI) - d.Domain = domain - d.BytesIn = bytesin - d.BytesOut = bytesout - return -} +// //NewDomainAPI - Constructor +// func NewDomainAPI(domain string, bytesin int64, bytesout int64) (d *DomainAPI) { +// d = new(DomainAPI) +// d.Domain = domain +// d.BytesIn = bytesin +// d.BytesOut = bytesout +// return +// } // //DomainAPIContainer -- // type DomainAPIContainer struct {