kubenetworks/kubevpn

View on GitHub
pkg/dev/docker_signals.go

Summary

Maintainability
A
0 mins
Test Coverage
package dev

import (
    "context"
    "os"
    gosignal "os/signal"

    "github.com/docker/docker/client"
    "github.com/moby/sys/signal"
    log "github.com/sirupsen/logrus"
)

// ForwardAllSignals forwards signals to the container
//
// The channel you pass in must already be setup to receive any signals you want to forward.
func ForwardAllSignals(ctx context.Context, apiClient client.ContainerAPIClient, cid string, sigc <-chan os.Signal) {
    var (
        s  os.Signal
        ok bool
    )
    for {
        select {
        case s, ok = <-sigc:
            if !ok {
                return
            }
        case <-ctx.Done():
            return
        }

        if s == signal.SIGCHLD || s == signal.SIGPIPE {
            continue
        }

        // In go1.14+, the go runtime issues SIGURG as an interrupt to support pre-emptable system calls on Linux.
        // Since we can't forward that along we'll check that here.
        if isRuntimeSig(s) {
            continue
        }
        var sig string
        for sigStr, sigN := range signal.SignalMap {
            if sigN == s {
                sig = sigStr
                break
            }
        }
        if sig == "" {
            continue
        }

        if err := apiClient.ContainerKill(ctx, cid, sig); err != nil {
            log.Debugf("Error sending signal: %s", err)
        }
    }
}

func notifyAllSignals() chan os.Signal {
    sigc := make(chan os.Signal, 128)
    gosignal.Notify(sigc)
    return sigc
}