Skip to content

Commit

Permalink
Consolidate down to single engine, no more 5656 port
Browse files Browse the repository at this point in the history
  • Loading branch information
LordRalex committed Apr 7, 2020
1 parent 7885755 commit 4426c12
Show file tree
Hide file tree
Showing 33 changed files with 222 additions and 442 deletions.
5 changes: 2 additions & 3 deletions Dockerfile
Expand Up @@ -27,25 +27,24 @@ RUN go build -v -tags $tags -o /pufferpanel/pufferpanel github.com/pufferpanel/p
FROM alpine
COPY --from=builder /pufferpanel /pufferpanel

EXPOSE 8080 5656 5657
EXPOSE 8080 5657
VOLUME /etc/pufferpanel

ENV PUFFER_LOGS=/etc/pufferpanel/logs \
PUFFER_WEB_HOST=0.0.0.0:8080 \
PUFFER_PANEL_DATABASE_SESSION=60 \
PUFFER_PANEL_DATABASE_DIALECT=sqlite3 \
PUFFER_PANEL_DATABASE_URL="file:/etc/pufferpanel/pufferpanel.db?cache=shared" \
PUFFER_PANEL_DATABASE_LOG=false \
PUFFER_PANEL_TOKEN_PRIVATE=/etc/pufferpanel/private.pem \
PUFFER_PANEL_TOKEN_PUBLIC=/etc/pufferpanel/public.pem \
PUFFER_PANEL_WEB_HOST=0.0.0.0:8080 \
PUFFER_PANEL_WEB_FILES=/pufferpanel/www \
PUFFER_PANEL_EMAIL_TEMPLATES=/pufferpanel/email/emails.json \
PUFFER_PANEL_EMAIL_PROVIDER=debug \
PUFFER_PANEL_SETTINGS_COMPANYNAME=PufferPanel \
PUFFER_PANEL_SETTINGS_MASTERURL=http://localhost:8080 \
PUFFER_DAEMON_CONSOLE_BUFFER=50 \
PUFFER_DAEMON_CONSOLE_FORWARD=false \
PUFFER_DAEMON_WEB_HOST=0.0.0.0:5656 \
PUFFER_DAEMON_SFTP_HOST=0.0.0.0:5657 \
PUFFER_DAEMON_SFTP_KEY=/etc/pufferpanel/sftp.key \
PUFFER_DAEMON_AUTH_URL=http://localhost:8080 \
Expand Down
4 changes: 2 additions & 2 deletions claims.go
Expand Up @@ -24,7 +24,7 @@ type Claim struct {
}

type PanelClaims struct {
Scopes map[string][]Scope `json:"scopes"`
Scopes map[string][]Scope `json:"scopes,omitempty"`
}

type Token struct {
Expand All @@ -33,7 +33,7 @@ type Token struct {
}

func ParseToken(publicKey *ecdsa.PublicKey, token string) (*Token, error) {
claim, err := jwt.ParseWithClaims(token, &Claim{}, func(token *jwt.Token) (interface{}, error) {
claim, err := jwt.ParseWithClaims(token, &Claim{PanelClaims: PanelClaims{Scopes: make(map[string][]Scope)}}, func(token *jwt.Token) (interface{}, error) {
return publicKey, nil
})

Expand Down
8 changes: 4 additions & 4 deletions client/src/components/server/files.vue
Expand Up @@ -296,7 +296,7 @@ export default {
path += '/' + item.name
}
const ctx = this
this.$http.get(`/daemon/server/${this.server.id}/file/${path}`).then(response => {
this.$http.get(`/proxy/daemon/server/${this.server.id}/file/${path}`).then(response => {
ctx.currentFile = item.name
ctx.fileContents = response.data
ctx.editOpen = true
Expand All @@ -319,7 +319,7 @@ export default {
const formData = new FormData()
formData.append('file', file)
const ctx = this
this.$http.put(`/daemon/server/${this.server.id}/file/${path}`, formData, { headers: { 'Content-Type': 'multipart/form-data' } }).then(response => {
this.$http.put(`/proxy/daemon/server/${this.server.id}/file/${path}`, formData, { headers: { 'Content-Type': 'multipart/form-data' } }).then(response => {
ctx.editOpen = false
ctx.currentFile = ''
ctx.fileContents = ''
Expand Down Expand Up @@ -361,7 +361,7 @@ export default {
} else {
path += '/' + item.name
}
return '/daemon/server/' + this.server.id + '/file' + path
return '/proxy/daemon/server/' + this.server.id + '/file' + path
},
cancelFolderCreate () {
this.createFolder = false
Expand Down Expand Up @@ -407,7 +407,7 @@ export default {
const ctx = this
return this.$http({
method: 'put',
url: '/daemon/server/' + this.server.id + '/file' + path,
url: '/proxy/daemon/server/' + this.server.id + '/file' + path,
data: item,
onUploadProgress: event => {
ctx.uploadCurrent = event.loaded
Expand Down
4 changes: 2 additions & 2 deletions client/src/components/server/settings.vue
Expand Up @@ -99,7 +99,7 @@ export default {
methods: {
loadData () {
const ctx = this
this.$http.get(`/daemon/server/${this.server.id}/data`).then(response => {
this.$http.get(`/proxy/daemon/server/${this.server.id}/data`).then(response => {
const data = response.data.data
const items = {}
Object.keys(data).forEach(k => {
Expand All @@ -110,7 +110,7 @@ export default {
},
save () {
const ctx = this
this.$http.post(`/daemon/server/${this.server.id}/data`, { data: this.items }).then(response => {
this.$http.post(`/proxy/daemon/server/${this.server.id}/data`, { data: this.items }).then(response => {
ctx.$toast.success(ctx.$t('common.Saved'))
}).catch(handleError(ctx))
}
Expand Down
2 changes: 1 addition & 1 deletion client/src/plugins/axios.js
Expand Up @@ -7,7 +7,7 @@ Vue.prototype.$http = axios.create()
Vue.prototype.axios = Vue.prototype.$http

Vue.prototype.$http.interceptors.request.use(request => {
if (request.url.startsWith('/api') || request.url.startsWith('/daemon')) {
if (request.url.startsWith('/api') || request.url.startsWith('/daemon') || request.url.startsWith('/proxy')) {
request.headers[request.method].Authorization = 'Bearer ' + Cookies.get('puffer_auth') || ''
}
return request
Expand Down
2 changes: 1 addition & 1 deletion client/src/views/Server.vue
Expand Up @@ -43,7 +43,7 @@ export default {
this.$http.get(`/api/servers/${this.$route.params.id}?perms`).then(response => {
ctx.server = response.data.server
ctx.server.permissions = response.data.permissions
const url = `${window.location.protocol === 'http:' ? 'ws' : 'wss'}://${window.location.host}/daemon/socket/${ctx.server.id}`
const url = `${window.location.protocol === 'http:' ? 'ws' : 'wss'}://${window.location.host}/proxy/daemon/socket/${ctx.server.id}`
ctx.$connect(url)
ctx.statRequest = setInterval(ctx.callStats, 3000)
}).catch(handleError(ctx))
Expand Down
2 changes: 1 addition & 1 deletion client/src/views/Servers.vue
Expand Up @@ -179,7 +179,7 @@ export default {
pollServerStatus () {
for (const i in this.servers) {
const server = this.servers[i]
this.$http.get('/daemon/server/' + server.id + '/status').then(response => {
this.$http.get('/proxy/daemon/server/' + server.id + '/status').then(response => {
if (response.data) {
if (response.data.running) {
server.online = true
Expand Down
217 changes: 127 additions & 90 deletions cmd/run.go
Expand Up @@ -14,19 +14,22 @@
package main

import (
"github.com/braintree/manners"
"github.com/gin-gonic/gin"
"github.com/pufferpanel/pufferpanel/v2"
"github.com/pufferpanel/pufferpanel/v2/daemon"
"github.com/pufferpanel/pufferpanel/v2/database"
"github.com/pufferpanel/pufferpanel/v2/environments"
"github.com/pufferpanel/pufferpanel/v2/logging"
"github.com/pufferpanel/pufferpanel/v2/models"
"github.com/pufferpanel/pufferpanel/v2/panel/web"
"github.com/pufferpanel/pufferpanel/v2/programs"
"github.com/pufferpanel/pufferpanel/v2/services"
"github.com/pufferpanel/pufferpanel/v2/sftp"
"github.com/pufferpanel/pufferpanel/v2/web"
uuid "github.com/satori/go.uuid"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"log"
"net"
"net/http"
"os"
"os/signal"
Expand All @@ -49,13 +52,14 @@ func executeRun(cmd *cobra.Command, args []string) {
}

func internalRun(cmd *cobra.Command, args []string) error {
err := pufferpanel.LoadConfig("")
if err != nil {
if err := pufferpanel.LoadConfig(""); err != nil {
return err
}

logging.Initialize()

defer logging.Close()
defer database.Close()

c := make(chan error)

Expand All @@ -68,111 +72,144 @@ func internalRun(cmd *cobra.Command, args []string) error {
// kill -9 is syscall.SIGKILL but can"t be catch, so don't need add it
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("Shutting down web server ...")
log.Println("Shutting down...")
c <- nil
}()

router := gin.New()
router.Use(gin.Recovery())
router.Use(gin.LoggerWithWriter(logging.Debug().Writer()))
pufferpanel.Engine = router

web.RegisterRoutes(router)

if viper.GetBool("panel.enable") {
services.ValidateTokenLoaded()
pufferpanel.SetPublicKey(services.GetPublicKey())
panel(c)
}

if viper.GetBool("daemon.enable") {
daemon(c)
}

go func() {
l, err := net.Listen("tcp4", viper.GetString("web.host"))
if err != nil {
c <- err
return
}

defer database.Close()
logging.Info().Printf("Listening for HTTP requests on %s", l.Addr().String())
for err = manners.Serve(l, router); err != nil && err != http.ErrServerClosed; err = manners.Serve(l, router) {
c <- err
}
}()

services.LoadEmailService()
return <-c
}

router := gin.New()
router.Use(gin.Recovery())
router.Use(gin.LoggerWithWriter(logging.Debug().Writer()))
func panel(ch chan error) {
services.ValidateTokenLoaded()
pufferpanel.SetPublicKey(services.GetPublicKey())

web.RegisterRoutes(router)
services.LoadEmailService()

srv := &http.Server{
Addr: viper.GetString("panel.web.host"),
Handler: router,
go func() {
_, err := database.GetConnection()
if err != nil {
logging.Error().Printf("Error connecting to database: %s", err.Error())
}
}()

go func() {
logging.Info().Printf("Listening for HTTP requests on %s", srv.Addr)
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
c <- err
//if we have the web, then let's use our sftp auth instead
sftp.SetAuthorization(&services.DatabaseSFTPAuthorization{})

//validate local daemon is configured in this panel
if viper.GetBool("daemon.enable") {
db, err := database.GetConnection()
if err != nil {
return
}
ns := &services.Node{DB: db}
nodes, err := ns.GetAll()
if err != nil {
logging.Error().Printf("Failed to get nodes: %s", err.Error())
return
}
exists := false
for _, n := range *nodes {
if n.IsLocal() {
exists = true
}
}
if !exists {
logging.Info().Printf("Adding local node")
create := &models.Node{
Name: "LocalNode",
PublicHost: "127.0.0.1",
PrivateHost: "127.0.0.1",
PublicPort: 8080,
PrivatePort: 8080,
SFTPPort: 5657,
Secret: strings.Replace(uuid.NewV4().String(), "-", "", -1),
}
nodeHost := viper.GetString("web.host")
sftpHost := viper.GetString("daemon.sftp.host")
hostParts := strings.SplitN(nodeHost, ":", 2)
sftpParts := strings.SplitN(sftpHost, ":", 2)

if len(hostParts) == 2 {
port, err := strconv.Atoi(hostParts[1])
if err == nil {
create.PublicPort = uint(port)
create.PrivatePort = uint(port)
}
}
if len(sftpParts) == 2 {
port, err := strconv.Atoi(sftpParts[1])
if err == nil {
create.SFTPPort = uint(port)
}
}
}()

go func() {
_, err := database.GetConnection()
//override ENV because we need our id here instead since it's new
viper.Set("PUFFER_DAEMON_AUTH_CLIENTID", create.Secret)
err = ns.Create(create)
if err != nil {
logging.Error().Printf("Error connecting to database: %s", err.Error())
logging.Error().Printf("Failed to add local node: %s", err.Error())
}
}()
}
}
}

//if we have the web, then let's use our sftp auth instead
sftp.SetAuthorization(&services.DatabaseSFTPAuthorization{})
func daemon(ch chan error) {
sftp.Run()

//validate local daemon is configured in this panel
if viper.GetBool("daemon.enable") {
go func() {
db, err := database.GetConnection()
if err != nil {
return
}
ns := &services.Node{DB: db}
nodes, err := ns.GetAll()
if err != nil {
logging.Error().Printf("Failed to get nodes: %s", err.Error())
return
}
exists := false
for _, n := range *nodes {
if n.IsLocal() {
exists = true
}
}
if !exists {
logging.Info().Printf("Adding local node")
create := &models.Node{
Name: "LocalNode",
PublicHost: "127.0.0.1",
PrivateHost: "127.0.0.1",
PublicPort: 5656,
PrivatePort: 5656,
SFTPPort: 5657,
Secret: strings.Replace(uuid.NewV4().String(), "-", "", -1),
}
nodeHost := viper.GetString("daemon.web.host")
sftpHost := viper.GetString("daemon.sftp.host")
hostParts := strings.SplitN(nodeHost, ":", 2)
sftpParts := strings.SplitN(sftpHost, ":", 2)

if len(hostParts) == 2 {
port, err := strconv.Atoi(hostParts[1])
if err == nil {
create.PublicPort = uint(port)
create.PrivatePort = uint(port)
}
}
if len(sftpParts) == 2 {
port, err := strconv.Atoi(sftpParts[1])
if err == nil {
create.SFTPPort = uint(port)
}
}

//override ENV because we need our id here instead since it's new
viper.Set("PUFFER_DAEMON_AUTH_CLIENTID", create.Secret)
err = ns.Create(create)
if err != nil {
logging.Error().Printf("Failed to add local node: %s", err.Error())
}
}
}()
environments.LoadModules()
programs.Initialize()

var err error

if _, err = os.Stat(programs.ServerFolder); os.IsNotExist(err) {
logging.Error().Printf("No server directory found, creating")
err = os.MkdirAll(programs.ServerFolder, 0755)
if err != nil && !os.IsExist(err) {
ch <- err
return
}
}

if viper.GetBool("daemon.enable") {
go func() {
c <- <-daemon.Start()
}()
}
programs.LoadFromFolder()

return <-c
programs.InitService()

for _, element := range programs.GetAll() {
if element.IsEnabled() {
element.GetEnvironment().DisplayToConsole(true, "Daemon has been started\n")
if element.IsAutoStart() {
logging.Info().Printf("Queued server %s", element.Id())
element.GetEnvironment().DisplayToConsole(true, "Server has been queued to start\n")
programs.StartViaService(element)
}
}
}
}

0 comments on commit 4426c12

Please sign in to comment.