Andrey Smirnov ac8764702f refactor: move apid, routerd, timed and trustd to single executable
This removes container images for the aforementioned services, they are
now built into `machined` executable which launches one or another
service based on `argv[0]`.

Containers are started with rootfs directory which contains only a
single executable file for the service.

This creates rootfs on squashfs for each container in
`/opt/<container>`.

Service `networkd` is not touched as it's handled in #3350.

This removes all the image imports, snapshots and other things which
were associated with the existing way to run containers.

Signed-off-by: Andrey Smirnov <smirnov.andrey@gmail.com>
2021-03-23 09:48:11 -07:00

108 lines
2.5 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 trustd
import (
"flag"
"log"
stdlibnet "net"
"github.com/talos-systems/crypto/tls"
"github.com/talos-systems/net"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"github.com/talos-systems/talos/internal/app/trustd/internal/reg"
"github.com/talos-systems/talos/pkg/grpc/factory"
"github.com/talos-systems/talos/pkg/grpc/gen"
"github.com/talos-systems/talos/pkg/grpc/middleware/auth/basic"
"github.com/talos-systems/talos/pkg/machinery/config/configloader"
"github.com/talos-systems/talos/pkg/machinery/constants"
"github.com/talos-systems/talos/pkg/startup"
)
// Main is the entrypoint into trustd.
//
//nolint:gocyclo
func Main() {
log.SetFlags(log.Lshortfile | log.Ldate | log.Lmicroseconds | log.Ltime)
flag.Parse()
var err error
if err = startup.RandSeed(); err != nil {
log.Fatalf("startup: %s", err)
}
config, err := configloader.NewFromStdin()
if err != nil {
log.Fatal(err)
}
ips, err := net.IPAddrs()
if err != nil {
log.Fatal(err)
}
dnsNames, err := net.DNSNames()
if err != nil {
log.Fatal(err)
}
for _, san := range config.Machine().Security().CertSANs() {
if ip := stdlibnet.ParseIP(san); ip != nil {
ips = append(ips, ip)
} else {
dnsNames = append(dnsNames, san)
}
}
var generator tls.Generator
generator, err = gen.NewLocalGenerator(config.Machine().Security().CA().Key, config.Machine().Security().CA().Crt)
if err != nil {
log.Fatalln("failed to create local generator provider:", err)
}
var provider tls.CertificateProvider
provider, err = tls.NewRenewingCertificateProvider(generator, dnsNames, ips)
if err != nil {
log.Fatalln("failed to create local certificate provider:", err)
}
ca, err := provider.GetCA()
if err != nil {
log.Fatal(err)
}
tlsConfig, err := tls.New(
tls.WithClientAuthType(tls.ServerOnly),
tls.WithCACertPEM(ca),
tls.WithServerCertificateProvider(provider),
)
if err != nil {
log.Fatalf("failed to create TLS config: %v", err)
}
creds := basic.NewTokenCredentials(config.Machine().Security().Token())
err = factory.ListenAndServe(
&reg.Registrator{Config: config},
factory.Port(constants.TrustdPort),
factory.WithDefaultLog(),
factory.WithUnaryInterceptor(creds.UnaryInterceptor()),
factory.ServerOptions(
grpc.Creds(
credentials.NewTLS(tlsConfig),
),
),
)
if err != nil {
log.Fatalf("listen: %v", err)
}
}