Compare commits

..

4 Commits

Author SHA1 Message Date
Matthew Penner
6b5b42ec58 Update CHANGELOG.md 2021-09-16 17:53:50 -06:00
Matthew Penner
e13b6d3cb0 actions(build-test): fix artifacts not being uploaded 2021-09-13 22:48:50 -06:00
Matthew Penner
e79694d6d2 config: add ability to enable/disable server crash detection
fixes https://github.com/pterodactyl/panel/issues/3617

Co-authored-by: Alex <admin@softwarenoob.com>
2021-09-13 15:04:28 -06:00
Chance Callahan
12b6b64086 Adding RPM specfile. (#103)
* Adding RPM specfile.

* Added systemd service and some scripting to make things nicer

* Updated systemd service.

* Updated for 1.5.0 and fixed mistake with license.
2021-09-13 12:59:45 -07:00
5 changed files with 140 additions and 14 deletions

View File

@@ -60,7 +60,7 @@ jobs:
run: go test ./... run: go test ./...
- name: Upload Artifact - name: Upload Artifact
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v2
if: ${{ matrix.go == '^1.16' && (github.ref == 'refs/heads/develop' || github.event_name == 'pull_request') }} if: ${{ github.ref == 'refs/heads/develop' || github.event_name == 'pull_request' }}
with: with:
name: wings_${{ matrix.goos }}_${{ matrix.goarch }} name: wings_${{ matrix.goos }}_${{ matrix.goarch }}
path: build/wings_${{ matrix.goos }}_${{ matrix.goarch }} path: build/wings_${{ matrix.goos }}_${{ matrix.goarch }}

View File

@@ -1,5 +1,10 @@
# Changelog # Changelog
## v1.5.1
### Added
* Global configuration option for toggling server crash detection (`system.crash_detection.enabled`)
* RPM specfile
## v1.5.0 ## v1.5.0
### Fixed ### Fixed
* Fixes a race condition when setting the application name in the console output for a server. * Fixes a race condition when setting the application name in the console output for a server.

View File

@@ -48,10 +48,12 @@ var DefaultTLSConfig = &tls.Config{
CurvePreferences: []tls.CurveID{tls.X25519, tls.CurveP256}, CurvePreferences: []tls.CurveID{tls.X25519, tls.CurveP256},
} }
var mu sync.RWMutex var (
var _config *Configuration mu sync.RWMutex
var _jwtAlgo *jwt.HMACSHA _config *Configuration
var _debugViaFlag bool _jwtAlgo *jwt.HMACSHA
_debugViaFlag bool
)
// Locker specific to writing the configuration to the disk, this happens // Locker specific to writing the configuration to the disk, this happens
// in areas that might already be locked, so we don't want to crash the process. // in areas that might already be locked, so we don't want to crash the process.
@@ -181,6 +183,9 @@ type SystemConfiguration struct {
} }
type CrashDetection struct { type CrashDetection struct {
// CrashDetectionEnabled sets if crash detection is enabled globally for all servers on this node.
CrashDetectionEnabled bool `default:"true" yaml:"enabled"`
// Determines if Wings should detect a server that stops with a normal exit code of // Determines if Wings should detect a server that stops with a normal exit code of
// "0" as being crashed if the process stopped without any Wings interaction. E.g. // "0" as being crashed if the process stopped without any Wings interaction. E.g.
// the user did not press the stop button, but the process stopped cleanly. // the user did not press the stop button, but the process stopped cleanly.
@@ -375,7 +380,7 @@ func WriteToDisk(c *Configuration) error {
if err != nil { if err != nil {
return err return err
} }
if err := ioutil.WriteFile(c.path, b, 0600); err != nil { if err := ioutil.WriteFile(c.path, b, 0o600); err != nil {
return err return err
} }
return nil return nil
@@ -470,7 +475,7 @@ func FromFile(path string) error {
func ConfigureDirectories() error { func ConfigureDirectories() error {
root := _config.System.RootDirectory root := _config.System.RootDirectory
log.WithField("path", root).Debug("ensuring root data directory exists") log.WithField("path", root).Debug("ensuring root data directory exists")
if err := os.MkdirAll(root, 0700); err != nil { if err := os.MkdirAll(root, 0o700); err != nil {
return err return err
} }
@@ -491,17 +496,17 @@ func ConfigureDirectories() error {
} }
log.WithField("path", _config.System.Data).Debug("ensuring server data directory exists") log.WithField("path", _config.System.Data).Debug("ensuring server data directory exists")
if err := os.MkdirAll(_config.System.Data, 0700); err != nil { if err := os.MkdirAll(_config.System.Data, 0o700); err != nil {
return err return err
} }
log.WithField("path", _config.System.ArchiveDirectory).Debug("ensuring archive data directory exists") log.WithField("path", _config.System.ArchiveDirectory).Debug("ensuring archive data directory exists")
if err := os.MkdirAll(_config.System.ArchiveDirectory, 0700); err != nil { if err := os.MkdirAll(_config.System.ArchiveDirectory, 0o700); err != nil {
return err return err
} }
log.WithField("path", _config.System.BackupDirectory).Debug("ensuring backup data directory exists") log.WithField("path", _config.System.BackupDirectory).Debug("ensuring backup data directory exists")
if err := os.MkdirAll(_config.System.BackupDirectory, 0700); err != nil { if err := os.MkdirAll(_config.System.BackupDirectory, 0o700); err != nil {
return err return err
} }

114
rpm/ptero-wings.spec Normal file
View File

@@ -0,0 +1,114 @@
Name: ptero-wings
Version: 1.5.0
Release: 1%{?dist}
Summary: The server control plane for Pterodactyl Panel. Written from the ground-up with security, speed, and stability in mind.
BuildArch: x86_64
License: MIT
URL: https://github.com/pterodactyl/wings
Source0: https://github.com/pterodactyl/wings/releases/download/v%{version}/wings_linux_amd64
%if 0%{?rhel} && 0%{?rhel} <= 8
BuildRequires: systemd
%else
BuildRequires: systemd-rpm-macros
%endif
%description
Wings is Pterodactyl's server control plane, built for the rapidly
changing gaming industry and designed to be highly performant and
secure. Wings provides an HTTP API allowing you to interface directly
with running server instances, fetch server logs, generate backups,
and control all aspects of the server lifecycle.
In addition, Wings ships with a built-in SFTP server allowing your
system to remain free of Pterodactyl specific dependencies, and
allowing users to authenticate with the same credentials they would
normally use to access the Panel.
%prep
%build
#nothing required
%install
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}%{_unitdir}
cp %{_sourcedir}/wings_linux_amd64 %{buildroot}%{_bindir}/wings
cat > %{buildroot}%{_unitdir}/wings.service << EOF
[Unit]
Description=Pterodactyl Wings Daemon
After=docker.service
Requires=docker.service
PartOf=docker.service
StartLimitIntervalSec=600
[Service]
WorkingDirectory=/etc/pterodactyl
ExecStart=/usr/bin/wings
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
StartLimitInterval=180
StartLimitBurst=30
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
%files
%attr(0755, root, root) %{_prefix}/bin/wings
%attr(0644, root, root) %{_unitdir}/wings.service
%post
# Reload systemd
systemctl daemon-reload
# Create the required directory structure
mkdir -p /etc/pterodactyl
mkdir -p /var/lib/pterodactyl/{archives,backups,volumes}
mkdir -p /var/log/pterodactyl/install
%preun
systemctl is-active %{name} >/dev/null 2>&1
if [ $? -eq 0 ]; then
systemctl stop %{name}
fi
systemctl is-enabled %{name} >/dev/null 2>&1
if [ $? -eq 0 ]; then
systemctl disable %{name}
fi
%postun
rm -rf /var/log/pterodactyl
%verifyscript
wings --version
%changelog
* Sun Sep 12 2021 Capitol Hosting Solutions Systems Engineering <syseng@chs.gg> - 1.5.0-1
- specfile by Capitol Hosting Solutions, Upstream by Pterodactyl
- Rebased for https://github.com/pterodactyl/wings/releases/tag/v1.5.0
- Fixes a race condition when setting the application name in the console output for a server.
- Fixes a server being reinstalled causing the file_denylist parameter for an Egg to be ignored until Wings is restarted.
- Fixes YAML file parser not correctly setting boolean values.
- Fixes potential issue where the underlying websocket connection is closed but the parent request context is not yet canceled causing a write over a closed connection.
- Fixes race condition when closing all active websocket connections when a server is deleted.
- Fixes logic to determine if a server's context is closed out and send a websocket close message to connected clients. Previously this fired off whenever the request itself was closed, and not when the server context was closed.
- Exposes 8080 in the wings Dockerfile to better support reverse proxy tools.
- Releases are now built using Go 1.17 the minimum version required to build Wings remains Go 1.16.
- Simplifed the logic powering server updates to only pull information from the Panel rather than trying to accept updated values. All parts of Wings needing the most up-to-date server details should call Server#Sync() to fetch the latest stored build information.
- Installer#New() no longer requires passing all of the server data as a byte slice, rather a new Installer#ServerDetails struct is exposed which can be passed and accepts a UUID and if the server should be started after the installer finishes.
- Removes complicated (and unused) logic during the server installation process that was a hold-over from legacy Wings architectures.
- Removes the PATCH /api/servers/:server endpoint if you were previously using this API call it should be replaced with POST /api/servers/:server/sync.
* Wed Aug 25 2021 Capitol Hosting Solutions Systems Engineering <syseng@chs.gg> - 1.4.7-1
- specfile by Capitol Hosting Solutions, Upstream by Pterodactyl
- Rebased for https://github.com/pterodactyl/wings/releases/tag/v1.4.7
- SFTP access is now properly denied if a server is suspended.
- Correctly uses start_on_completion and crash_detection_enabled for servers.

View File

@@ -188,7 +188,9 @@ func (s *Server) Sync() error {
// can be called from scoped where the server may not be fully initialized, // can be called from scoped where the server may not be fully initialized,
// therefore other things like the filesystem and environment may not exist yet. // therefore other things like the filesystem and environment may not exist yet.
func (s *Server) SyncWithConfiguration(cfg remote.ServerConfigurationResponse) error { func (s *Server) SyncWithConfiguration(cfg remote.ServerConfigurationResponse) error {
c := Configuration{} c := Configuration{
CrashDetectionEnabled: config.Get().System.CrashDetection.CrashDetectionEnabled,
}
if err := json.Unmarshal(cfg.Settings, &c); err != nil { if err := json.Unmarshal(cfg.Settings, &c); err != nil {
return errors.WithStackIf(err) return errors.WithStackIf(err)
} }
@@ -196,9 +198,9 @@ func (s *Server) SyncWithConfiguration(cfg remote.ServerConfigurationResponse) e
s.cfg.mu.Lock() s.cfg.mu.Lock()
defer s.cfg.mu.Unlock() defer s.cfg.mu.Unlock()
// Lock the new configuration. Since we have the defered Unlock above we need // Lock the new configuration. Since we have the deferred Unlock above we need
// to make sure that the NEW configuration object is already locked since that // to make sure that the NEW configuration object is already locked since that
// defer is running on the memory address for "s.cfg.mu" which we're explcitly // defer is running on the memory address for "s.cfg.mu" which we're explicitly
// changing on the next line. // changing on the next line.
c.mu.Lock() c.mu.Lock()
@@ -259,7 +261,7 @@ func (s *Server) EnsureDataDirectoryExists() error {
if _, err := os.Lstat(s.fs.Path()); err != nil { if _, err := os.Lstat(s.fs.Path()); err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {
s.Log().Debug("server: creating root directory and setting permissions") s.Log().Debug("server: creating root directory and setting permissions")
if err := os.MkdirAll(s.fs.Path(), 0700); err != nil { if err := os.MkdirAll(s.fs.Path(), 0o700); err != nil {
return errors.WithStack(err) return errors.WithStack(err)
} }
if err := s.fs.Chown("/"); err != nil { if err := s.fs.Chown("/"); err != nil {