diff --git a/go.mod b/go.mod index 23da8e7..eb69429 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/gogo/protobuf v1.0.0 // indirect github.com/google/go-cmp v0.2.0 // indirect github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect + github.com/julienschmidt/httprouter v1.2.0 github.com/kr/pretty v0.1.0 // indirect github.com/onsi/ginkgo v1.8.0 // indirect github.com/onsi/gomega v1.5.0 // indirect diff --git a/go.sum b/go.sum index c7127ac..7db1f02 100644 --- a/go.sum +++ b/go.sum @@ -28,6 +28,8 @@ github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQ github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/julienschmidt/httprouter v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+9HbQbYf7g= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= diff --git a/http.go b/http.go new file mode 100644 index 0000000..95de6c5 --- /dev/null +++ b/http.go @@ -0,0 +1,33 @@ +package main + +import ( + "encoding/json" + "fmt" + "github.com/julienschmidt/httprouter" + "github.com/pterodactyl/wings/server" + "net/http" +) + +type Router struct { + Servers []*server.Server +} + +func (r *Router) routeIndex(w http.ResponseWriter, _ *http.Request, _ httprouter.Params) { + fmt.Fprint(w, "Welcome!\n") +} + +func (r *Router) routeAllServers(w http.ResponseWriter, _ *http.Request, _ httprouter.Params) { + enc := json.NewEncoder(w) + enc.Encode(r.Servers) +} + +func (r *Router) ConfigureRouter() *httprouter.Router { + router := httprouter.New() + + router.GET("/", r.routeIndex) + + router.GET("/api/servers", r.routeAllServers) + // router.GET("/api/servers/:server", r.routeServer) + + return router +} \ No newline at end of file diff --git a/server/server.go b/server/server.go index 11ebcee..56111e4 100644 --- a/server/server.go +++ b/server/server.go @@ -15,29 +15,29 @@ type Server struct { // The unique identifier for the server that should be used when referencing // it aganist the Panel API (and internally). This will be used when naming // docker containers as well as in log output. - Uuid string + Uuid string `json:"uuid"` // Wether or not the server is in a suspended state. Suspended servers cannot // be started or modified except in certain scenarios by an admin user. - Suspended bool + Suspended bool `json:"suspended"` // The power state of the server. - State int + State int `json:"state"` // The command that should be used when booting up the server instance. - Invocation string + Invocation string `json:"invocation"` // An array of environment variables that should be passed along to the running // server process. - EnvVars map[string]string `yaml:"env"` + EnvVars map[string]string `json:"environment" yaml:"env"` - Build *BuildSettings - Allocations *Allocations + Build *BuildSettings `json:"build"` + Allocations *Allocations `json:"allocations"` Container struct { // Defines the Docker image that will be used for this server - Image string - } + Image string `json:"image,omitempty"` + } `json:"container,omitempty"` environment Environment @@ -49,22 +49,22 @@ type Server struct { type BuildSettings struct { // The total amount of memory in megabytes that this server is allowed to // use on the host system. - MemoryLimit int64 `yaml:"memory"` + MemoryLimit int64 `json:"memory_limit" yaml:"memory"` // The amount of additional swap space to be provided to a container instance. - Swap int64 + Swap int64 `json:"swap"` // The relative weight for IO operations in a container. This is relative to other // containers on the system and should be a value between 10 and 1000. - IoWeight uint16 `yaml:"io"` + IoWeight uint16 `json:"io_weight" yaml:"io"` // The percentage of CPU that this instance is allowed to consume relative to // the host. A value of 200% represents complete utilization of two cores. This // should be a value between 1 and THREAD_COUNT * 100. - CpuLimit int64 `yaml:"cpu"` + CpuLimit int64 `json:"cpu_limit" yaml:"cpu"` // The amount of disk space in megabytes that a server is allowed to use. - DiskSpace int64 `yaml:"disk"` + DiskSpace int64 `json:"disk_space" yaml:"disk"` } // Converts the CPU limit for a server build into a number that can be better understood @@ -96,13 +96,13 @@ type Allocations struct { // what will be used for {SERVER_IP} and {SERVER_PORT} when modifying configuration // files or the startup arguments for a server. DefaultMapping struct { - Ip string - Port int - } `yaml:"default"` + Ip string `json:"ip"` + Port int `json:"port"` + } `json:"default" yaml:"default"` // Mappings contains all of the ports that should be assigned to a given server // attached to the IP they correspond to. - Mappings map[string][]int + Mappings map[string][]int `json:"mappings"` } // Iterates over a given directory and loads all of the servers listed before returning @@ -184,7 +184,7 @@ func FromConfiguration(data []byte, cfg DockerConfiguration) (*Server, error) { s.fs = &Filesystem{ // @todo adjust this to be configuration provided! - Root: "/srv/daemon-data", + Root: "/srv/daemon-data", Server: s, } @@ -205,4 +205,4 @@ func (s *Server) IsBootable() bool { // for the server is setup, and that all of the necessary files are created. func (s *Server) CreateEnvironment() error { return s.environment.Create() -} \ No newline at end of file +} diff --git a/wings.go b/wings.go index 514215e..1a5ca78 100644 --- a/wings.go +++ b/wings.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/pterodactyl/wings/server" "go.uber.org/zap" + "net/http" ) // Entrypoint for the Wings application. Configures the logger and checks any @@ -50,6 +51,16 @@ func main() { zap.S().Errorw("failed to create an environment for server", zap.String("server", s.Uuid), zap.Error(err)) } } + + r := &Router{ + Servers: servers, + } + + router := r.ConfigureRouter() + zap.S().Infow("configuring webserver", zap.String("host", c.Api.Host), zap.Int("port", c.Api.Port)) + if err := http.ListenAndServe(fmt.Sprintf("%s:%d", c.Api.Host, c.Api.Port), router); err != nil { + zap.S().Fatalw("failed to configure HTTP server", zap.Error(err)) + } } // Configures the global logger for Zap so that we can call it from any location