Skip to content
This repository has been archived by the owner on Feb 9, 2023. It is now read-only.

Commit

Permalink
Start setting up to merge 2 projects
Browse files Browse the repository at this point in the history
  • Loading branch information
LordRalex committed Nov 8, 2019
1 parent 69ec91f commit 0b58572
Show file tree
Hide file tree
Showing 11 changed files with 244 additions and 246 deletions.
65 changes: 65 additions & 0 deletions authorization.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package pufferd

import (
"bytes"
"crypto/ecdsa"
"crypto/x509"
"encoding/pem"
"github.com/pufferpanel/apufferi/v4"
"github.com/spf13/viper"
"golang.org/x/crypto/ssh"
"io"
"os"
"sync"
)

type SFTPAuthorization interface {
Validate(username, password string) (perms *ssh.Permissions, err error)
}

var publicKey *ecdsa.PublicKey

var atLocker = &sync.RWMutex{}

func SetPublicKey(key *ecdsa.PublicKey) {
atLocker.Lock()
defer atLocker.Unlock()
publicKey = key
}

func GetPublicKey() *ecdsa.PublicKey {
atLocker.RLock()
defer atLocker.RUnlock()
return publicKey
}

func LoadPublicKey() (*ecdsa.PublicKey, error) {
publicKey := GetPublicKey()
if publicKey != nil {
return publicKey, nil
}

f, err := os.OpenFile(viper.GetString("auth.publicKey"), os.O_RDONLY, 660)
defer apufferi.Close(f)

var buf bytes.Buffer

_, _ = io.Copy(&buf, f)

block, _ := pem.Decode(buf.Bytes())
if block == nil {
return nil, ErrKeyNotPEM
}
pub, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return nil, err
}

publicKey, ok := pub.(*ecdsa.PublicKey)
if !ok {
return nil, ErrKeyNotECDSA
}

SetPublicKey(publicKey)
return publicKey, nil
}
172 changes: 7 additions & 165 deletions cmd/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,186 +18,28 @@ package main

import (
"fmt"
"github.com/braintree/manners"
"github.com/pufferpanel/apufferi/v4/logging"
"github.com/pufferpanel/pufferd/v2"
"github.com/pufferpanel/pufferd/v2/environments"
"github.com/pufferpanel/pufferd/v2/programs"
"github.com/pufferpanel/pufferd/v2/routing"
"github.com/pufferpanel/pufferd/v2/sftp"
"github.com/pufferpanel/pufferd/v2/shutdown"
"github.com/pufferpanel/pufferd/v2/entry"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"os"
"os/signal"
"runtime/debug"
"syscall"
)

var RunCmd = &cobra.Command{
Use: "run",
Short: "Runs the daemon",
Run: func(cmd *cobra.Command, args []string) {
err := runRun()
if err != nil {
logging.Exception("error running", err)
}
},
Run: runRun,
}

var runService = true

func runRun() error {
func runRun(cmd *cobra.Command, args []string) {
pufferd.SetDefaults()
_ = pufferd.LoadConfig()

var logPath = viper.GetString("data.logs")
_ = logging.WithLogDirectory(logPath, logging.DEBUG, nil)

logging.Info(pufferd.Display)

environments.LoadModules()
programs.Initialize()

var err error

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

programs.LoadFromFolder()

programs.InitService()

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

defer recoverPanic()

createHook()

for runService && err == nil {
err = runServices()
}

shutdown.Shutdown()

return err
}

func runServices() error {
router := routing.ConfigureWeb()

useHttps := false

httpsPem := viper.GetString("listen.webCert")
httpsKey := viper.GetString("listen.webKey")

if _, err := os.Stat(httpsPem); os.IsNotExist(err) {
logging.Warn("No HTTPS.PEM found in data folder, will use http instead")
} else if _, err := os.Stat(httpsKey); os.IsNotExist(err) {
logging.Warn("No HTTPS.KEY found in data folder, will use http instead")
} else {
useHttps = true
}

sftp.Run()

web := viper.GetString("listen.web")

logging.Info("Starting web access on %s", web)
var err error
if useHttps {
err = manners.ListenAndServeTLS(web, httpsPem, httpsKey, router)
} else {
err = manners.ListenAndServe(web, router)
}

/*if runtime.GOOS != "windows" {
go func() {
file := viper.GetString("listen.socket")
if file == "" || !strings.HasPrefix(file, "unix:") {
return
}
file = strings.TrimPrefix(file, "unix:")
err := os.Remove(file)
if err != nil && !os.IsNotExist(err) {
logging.Exception(fmt.Sprintf("Error deleting %s", file), err)
return
}
listener, err := net.Listen("unix", file)
defer apufferi.Close(listener)
if err != nil {
logging.Exception(fmt.Sprintf("Error listening on %s", file), err)
return
}
err = os.Chmod(file, 0777)
if err != nil {
logging.Exception(fmt.Sprintf("Error listening on %s", file), err)
return
}
logging.Info("Listening for socket requests")
err = http.Serve(listener, router)
if err != nil {
logging.Exception(fmt.Sprintf("Error listening on %s", file), err)
return
}
}()
}*/

return err
}

func createHook() {
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGPIPE)
go func() {
defer func() {
if err := recover(); err != nil {
logging.Error("%+v\n%s", err, debug.Stack())
}
}()

var sig os.Signal

for sig != syscall.SIGTERM {
sig = <-c
switch sig {
case syscall.SIGHUP:
//manners.Close()
//sftp.Stop()
_ = pufferd.LoadConfig()
case syscall.SIGPIPE:
//ignore SIGPIPEs for now, we're somehow getting them and it's causing issues
}
}

runService = false
shutdown.CompleteShutdown()
}()
}

func recoverPanic() {
if rec := recover(); rec != nil {
err := rec.(error)
fmt.Printf("CRITICAL: %s", err.Error())
logging.Critical("Unhandled error: %s", err.Error())
err := <-entry.Start()
if err != nil {
fmt.Printf("Error running: %s", err.Error())
}
}
22 changes: 3 additions & 19 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@ import (

func init() {
//env configuration
viper.SetEnvPrefix("PUFFERD")
viper.SetEnvPrefix("PUFFERPANEL")
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
viper.AutomaticEnv()
}

func SetDefaults() {
//defaults we can set at this point in time
viper.SetDefault("console.buffer", 50)
viper.SetDefault("console.forward", false)
Expand All @@ -25,24 +27,6 @@ func init() {
viper.SetDefault("auth.publicKey", "panel.pem")

viper.SetDefault("auth.url", "http://localhost:8080")
/*if runtime.GOOS == "windows" {
viper.SetDefault("auth.url", "http://localhost:8080")
} else {
pufferpanelConfig := viper.New()
pufferpanelConfig.SetEnvPrefix("PUFFERPANEL")
pufferpanelConfig.AutomaticEnv()
pufferpanelConfig.SetConfigName("config")
pufferpanelConfig.AddConfigPath("/etc/pufferpanel/")
pufferpanelConfig.AddConfigPath("/pufferpanel/")
_ = pufferpanelConfig.ReadInConfig()
panelUrl := pufferpanelConfig.GetString("web.socket")
if panelUrl != "" {
viper.SetDefault("auth.url", "unix:"+panelUrl)
} else {
viper.SetDefault("auth.url", "unix:/var/run/pufferpanel.sock")
}
}*/

viper.SetDefault("auth.clientId", "")
viper.SetDefault("auth.clientSecret", "")
Expand Down
Loading

0 comments on commit 0b58572

Please sign in to comment.