From 800593dc99e486e828b3894671363be4db97cfed Mon Sep 17 00:00:00 2001 From: Erik Kristensen Date: Mon, 11 Nov 2024 16:56:19 -0700 Subject: [PATCH] refactor: bring signals package in house --- go.mod | 1 - go.sum | 2 - main.go | 2 +- pkg/signals/signals.go | 72 ++++++++++++++++++++++++++++++++++ pkg/signals/signals_posix.go | 26 ++++++++++++ pkg/signals/signals_windows.go | 23 +++++++++++ 6 files changed, 122 insertions(+), 4 deletions(-) create mode 100644 pkg/signals/signals.go create mode 100644 pkg/signals/signals_posix.go create mode 100644 pkg/signals/signals_windows.go diff --git a/go.mod b/go.mod index bbdf643..244cb81 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,6 @@ require ( github.com/h2non/filetype v1.1.3 github.com/krolaw/zipstream v0.0.0-20180621105154-0a2661891f94 github.com/pelletier/go-toml/v2 v2.2.3 - github.com/rancher/wrangler v1.1.2 github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.9.0 github.com/ulikunitz/xz v0.5.12 diff --git a/go.sum b/go.sum index 0266e64..2d1bed6 100644 --- a/go.sum +++ b/go.sum @@ -85,8 +85,6 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rancher/wrangler v1.1.2 h1:oXbXo9k7y/H4drUpb4RM1c++vT9O3rpoNEfyusGykiU= -github.com/rancher/wrangler v1.1.2/go.mod h1:2k9MyhlBdjcutcBGoOJSUAz0HgDAXnMjv81d3n/AaQc= github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= diff --git a/main.go b/main.go index 06f46eb..921dc05 100644 --- a/main.go +++ b/main.go @@ -5,11 +5,11 @@ import ( "path" "github.com/apex/log" - "github.com/rancher/wrangler/pkg/signals" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" "github.com/ekristen/distillery/pkg/common" + "github.com/ekristen/distillery/pkg/signals" _ "github.com/ekristen/distillery/pkg/commands/clean" _ "github.com/ekristen/distillery/pkg/commands/completion" diff --git a/pkg/signals/signals.go b/pkg/signals/signals.go new file mode 100644 index 0000000..2714a4c --- /dev/null +++ b/pkg/signals/signals.go @@ -0,0 +1,72 @@ +/* +Copyright 2017 The Kubernetes Authors. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package signals + +import ( + "context" + "os" + "os/signal" + + "github.com/sirupsen/logrus" +) + +var onlyOneSignalHandler = make(chan struct{}) +var shutdownHandler chan os.Signal + +// SetupSignalHandler registered for SIGTERM and SIGINT. A stop channel is returned +// which is closed on one of these signals. If a second signal is caught, the program +// is terminated with exit code 1. +// Only one of SetupSignalContext and SetupSignalHandler should be called, and only can +// be called once. +func SetupSignalHandler() <-chan struct{} { + return SetupSignalContext().Done() +} + +// SetupSignalContext is same as SetupSignalHandler, but a context.Context is returned. +// Only one of SetupSignalContext and SetupSignalHandler should be called, and only can +// be called once. +func SetupSignalContext() context.Context { + close(onlyOneSignalHandler) // panics when called twice + + shutdownHandler = make(chan os.Signal, 2) + + ctx, cancel := context.WithCancel(context.Background()) + signal.Notify(shutdownHandler, shutdownSignals...) + go func() { + s := <-shutdownHandler + logrus.Warnf("signal received: %q, canceling context...", s) + cancel() + s = <-shutdownHandler + logrus.Warnf("second signal received: %q, exiting...", s) + os.Exit(1) // second signal. Exit directly. + }() + + return ctx +} + +// RequestShutdown emulates a received event that is considered as shutdown signal (SIGTERM/SIGINT) +// This returns whether a handler was notified +func RequestShutdown() bool { + if shutdownHandler != nil { + select { + case shutdownHandler <- shutdownSignals[0]: + return true + default: + } + } + + return false +} diff --git a/pkg/signals/signals_posix.go b/pkg/signals/signals_posix.go new file mode 100644 index 0000000..2b24faa --- /dev/null +++ b/pkg/signals/signals_posix.go @@ -0,0 +1,26 @@ +//go:build !windows + +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package signals + +import ( + "os" + "syscall" +) + +var shutdownSignals = []os.Signal{os.Interrupt, syscall.SIGTERM} diff --git a/pkg/signals/signals_windows.go b/pkg/signals/signals_windows.go new file mode 100644 index 0000000..4907d57 --- /dev/null +++ b/pkg/signals/signals_windows.go @@ -0,0 +1,23 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package signals + +import ( + "os" +) + +var shutdownSignals = []os.Signal{os.Interrupt}