Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b5b42ec58 | ||
|
|
e13b6d3cb0 | ||
|
|
e79694d6d2 | ||
|
|
12b6b64086 |
2
.github/workflows/build-test.yml
vendored
2
.github/workflows/build-test.yml
vendored
@@ -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 }}
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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
114
rpm/ptero-wings.spec
Normal 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.
|
||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user