Add base logic to start implementing support for mounted filesystems
This commit is contained in:
committed by
DaneEveritt
parent
058f643e65
commit
957257ecc3
102
cmd/migrate_vhd.go
Normal file
102
cmd/migrate_vhd.go
Normal file
@@ -0,0 +1,102 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"emperror.dev/errors"
|
||||
"github.com/apex/log"
|
||||
"github.com/pterodactyl/wings/config"
|
||||
"github.com/pterodactyl/wings/internal/vhd"
|
||||
"github.com/pterodactyl/wings/loggers/cli"
|
||||
"github.com/pterodactyl/wings/remote"
|
||||
"github.com/pterodactyl/wings/server"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
type MigrateVHDCommand struct {
|
||||
manager *server.Manager
|
||||
}
|
||||
|
||||
func newMigrateVHDCommand() *cobra.Command {
|
||||
return &cobra.Command{
|
||||
Use: "migrate-vhd",
|
||||
Short: "migrates existing data from a directory tree into virtual hard-disks",
|
||||
PreRun: func(cmd *cobra.Command, args []string) {
|
||||
log.SetLevel(log.DebugLevel)
|
||||
log.SetHandler(cli.Default)
|
||||
},
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
client := remote.NewFromConfig(config.Get())
|
||||
manager, err := server.NewManager(cmd.Context(), client)
|
||||
if err != nil {
|
||||
log.WithField("error", err).Fatal("failed to create new server manager")
|
||||
}
|
||||
c := &MigrateVHDCommand{
|
||||
manager: manager,
|
||||
}
|
||||
if err := c.Run(cmd.Context()); err != nil {
|
||||
log.WithField("error", err).Fatal("failed to execute command")
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// Run executes the migration command.
|
||||
func (m *MigrateVHDCommand) Run(ctx context.Context) error {
|
||||
root := filepath.Join(config.Get().System.Data, ".disks")
|
||||
if err := os.MkdirAll(root, 0600); err != nil {
|
||||
return errors.Wrap(err, "failed to create root directory for virtual disks")
|
||||
}
|
||||
|
||||
for _, s := range m.manager.All() {
|
||||
s.Log().Debug("starting migration of server contents to virtual disk...")
|
||||
|
||||
v := s.Filesystem().NewVHD()
|
||||
if err := v.Allocate(ctx); err != nil {
|
||||
return errors.WithStackIf(err)
|
||||
}
|
||||
|
||||
if err := v.MakeFilesystem(ctx); err != nil {
|
||||
// If the filesystem already exists no worries, just move on with our
|
||||
// day here.
|
||||
if !errors.Is(err, vhd.ErrFilesystemExists) {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
}
|
||||
|
||||
bak := strings.TrimSuffix(s.Filesystem().Path(), "/") + "_bak"
|
||||
// Create a backup directory of the server files if one does not already exist
|
||||
// at that location. If one does exists we'll just assume it is good to go and
|
||||
// rely on it to provide the files we'll need.
|
||||
if _, err := os.Lstat(bak); os.IsNotExist(err) {
|
||||
if err := os.Rename(s.Filesystem().Path(), bak); err != nil {
|
||||
return errors.Wrap(err, "failed to rename existing data directory for backup")
|
||||
}
|
||||
} else if err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
if err := os.RemoveAll(s.Filesystem().Path()); err != nil && !os.IsNotExist(err) {
|
||||
return errors.Wrap(err, "failed to remove base server files path")
|
||||
}
|
||||
|
||||
// Attempt to mount the disk at the expected path now that we've created
|
||||
// a backup of the server files.
|
||||
if err := v.Mount(ctx); err != nil && !errors.Is(err, vhd.ErrFilesystemMounted) {
|
||||
return errors.WithStackIf(err)
|
||||
}
|
||||
|
||||
// Copy over the files from the backup for this server.
|
||||
cmd := exec.CommandContext(ctx, "cp", "-a", bak + "/.", s.Filesystem().Path())
|
||||
if err := cmd.Run(); err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
s.Log().Info("finished migration to virtual disk...")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
20
cmd/root.go
20
cmd/root.go
@@ -47,8 +47,16 @@ var (
|
||||
var rootCommand = &cobra.Command{
|
||||
Use: "wings",
|
||||
Short: "Runs the API server allowing programmatic control of game servers for Pterodactyl Panel.",
|
||||
PreRun: func(cmd *cobra.Command, args []string) {
|
||||
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
||||
initConfig()
|
||||
if ok, _ := cmd.Flags().GetBool("ignore-certificate-errors"); ok {
|
||||
log.Warn("running with --ignore-certificate-errors: TLS certificate host chains and name will not be verified")
|
||||
http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{
|
||||
InsecureSkipVerify: true,
|
||||
}
|
||||
}
|
||||
},
|
||||
PreRun: func(cmd *cobra.Command, args []string) {
|
||||
initLogging()
|
||||
if tls, _ := cmd.Flags().GetBool("auto-tls"); tls {
|
||||
if host, _ := cmd.Flags().GetString("tls-hostname"); host == "" {
|
||||
@@ -77,6 +85,7 @@ func Execute() {
|
||||
func init() {
|
||||
rootCommand.PersistentFlags().StringVar(&configPath, "config", config.DefaultLocation, "set the location for the configuration file")
|
||||
rootCommand.PersistentFlags().BoolVar(&debug, "debug", false, "pass in order to run wings in debug mode")
|
||||
rootCommand.PersistentFlags().Bool("ignore-certificate-errors", false, "ignore certificate verification errors when executing API calls")
|
||||
|
||||
// Flags specifically used when running the API.
|
||||
rootCommand.Flags().Bool("pprof", false, "if the pprof profiler should be enabled. The profiler will bind to localhost:6060 by default")
|
||||
@@ -84,11 +93,11 @@ func init() {
|
||||
rootCommand.Flags().Int("pprof-port", 6060, "If provided with --pprof, the port it will run on")
|
||||
rootCommand.Flags().Bool("auto-tls", false, "pass in order to have wings generate and manage its own SSL certificates using Let's Encrypt")
|
||||
rootCommand.Flags().String("tls-hostname", "", "required with --auto-tls, the FQDN for the generated SSL certificate")
|
||||
rootCommand.Flags().Bool("ignore-certificate-errors", false, "ignore certificate verification errors when executing API calls")
|
||||
|
||||
rootCommand.AddCommand(versionCommand)
|
||||
rootCommand.AddCommand(configureCmd)
|
||||
rootCommand.AddCommand(newDiagnosticsCommand())
|
||||
rootCommand.AddCommand(newMigrateVHDCommand())
|
||||
}
|
||||
|
||||
func rootCmdRun(cmd *cobra.Command, _ []string) {
|
||||
@@ -96,13 +105,6 @@ func rootCmdRun(cmd *cobra.Command, _ []string) {
|
||||
log.Debug("running in debug mode")
|
||||
log.WithField("config_file", configPath).Info("loading configuration from file")
|
||||
|
||||
if ok, _ := cmd.Flags().GetBool("ignore-certificate-errors"); ok {
|
||||
log.Warn("running with --ignore-certificate-errors: TLS certificate host chains and name will not be verified")
|
||||
http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{
|
||||
InsecureSkipVerify: true,
|
||||
}
|
||||
}
|
||||
|
||||
if err := config.ConfigureTimezone(); err != nil {
|
||||
log.WithField("error", err).Fatal("failed to detect system timezone or use supplied configuration value")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user