Philipp Sauter f54d907871
fix: enable orderly poweroff in hyper-v on Azure
Previously Talos would not shutdown gracefully if hyper-v issued the
'perform_shutdown' call. Said call would execute '/sbin/poweroff' which
did not exist in Talos. We hardlink machined to '/sbin/poweroff' and
make it send a shutdown API call to PID 1 machined.

Fixes #5641

Signed-off-by: Philipp Sauter <philipp.sauter@siderolabs.com>
2022-06-15 12:49:17 +02:00

40 lines
1.2 KiB
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package poweroff
import (
"context"
"fmt"
"log"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/metadata"
"github.com/talos-systems/talos/pkg/grpc/middleware/authz"
"github.com/talos-systems/talos/pkg/machinery/client"
"github.com/talos-systems/talos/pkg/machinery/constants"
"github.com/talos-systems/talos/pkg/machinery/role"
)
// Main is the entrypoint into /sbin/poweroff.
func Main() {
ctx := context.Background()
md := metadata.Pairs()
authz.SetMetadata(md, role.MakeSet(role.Admin))
adminCtx := metadata.NewOutgoingContext(ctx, md)
client, err := client.New(adminCtx, client.WithUnixSocket(constants.APISocketPath), client.WithGRPCDialOptions(grpc.WithTransportCredentials(insecure.NewCredentials())))
if err != nil {
log.Fatalf(fmt.Errorf("error while creating machinery client: %w", err).Error())
}
err = client.Shutdown(adminCtx)
if err != nil {
log.Fatalf(fmt.Errorf("error while sending shutdown command: %w", err).Error())
}
}