mirror of
https://github.com/ultravioletrs/cocos.git
synced 2026-06-23 04:10:25 +00:00
6169766666
CI / lint (push) Has been cancelled
CI / test (agent) (push) Has been cancelled
CI / test (cli) (push) Has been cancelled
CI / test (cmd) (push) Has been cancelled
CI / test (internal) (push) Has been cancelled
CI / test (manager, true) (push) Has been cancelled
CI / test (pkg) (push) Has been cancelled
CI / upload-coverage (push) Has been cancelled
* Update attestationFromCert function to include ccPlatform parameter for enhanced attestation processing Signed-off-by: Sammy Oina <sammyoina@gmail.com> * chore: migrate dependencies from supermq to magistrala and update build configurations Signed-off-by: Sammy Oina <sammyoina@gmail.com> * chore: update project dependencies, repository source, and support TDX QuoteV5 attestation Signed-off-by: Sammy Oina <sammyoina@gmail.com> --------- Signed-off-by: Sammy Oina <sammyoina@gmail.com>
154 lines
3.8 KiB
Go
154 lines
3.8 KiB
Go
// Copyright (c) Ultraviolet
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log/slog"
|
|
"net"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
mglog "github.com/absmach/magistrala/logger"
|
|
"github.com/caarlos0/env/v11"
|
|
"github.com/ultravioletrs/cocos/agent/cvms"
|
|
logpb "github.com/ultravioletrs/cocos/agent/log"
|
|
pb "github.com/ultravioletrs/cocos/agent/runner"
|
|
runnerevents "github.com/ultravioletrs/cocos/agent/runner/events"
|
|
"github.com/ultravioletrs/cocos/agent/runner/service"
|
|
agentlogger "github.com/ultravioletrs/cocos/internal/logger"
|
|
logclient "github.com/ultravioletrs/cocos/pkg/clients/grpc/log"
|
|
"golang.org/x/sync/errgroup"
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
const (
|
|
svcName = "computation-runner"
|
|
socketPath = "/run/cocos/runner.sock"
|
|
)
|
|
|
|
type config struct {
|
|
LogLevel string `env:"RUNNER_LOG_LEVEL" envAlternate:"AGENT_LOG_LEVEL" envDefault:"debug"`
|
|
LogForwarder string `env:"LOG_FORWARDER_SOCKET" envDefault:"/run/cocos/log.sock"`
|
|
}
|
|
|
|
func main() {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
g, ctx := errgroup.WithContext(ctx)
|
|
|
|
var cfg config
|
|
if err := env.Parse(&cfg); err != nil {
|
|
fmt.Printf("failed to load %s configuration : %s\n", svcName, err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
var exitCode int
|
|
defer mglog.ExitWithError(&exitCode)
|
|
|
|
var level slog.Level
|
|
if err := level.UnmarshalText([]byte(cfg.LogLevel)); err != nil {
|
|
fmt.Println(err)
|
|
exitCode = 1
|
|
return
|
|
}
|
|
|
|
logQueue := make(chan *cvms.ClientStreamMessage, 1000)
|
|
handler := agentlogger.NewProtoHandler(os.Stdout, &slog.HandlerOptions{Level: level}, logQueue)
|
|
logger := slog.New(handler)
|
|
|
|
// Connect to Log Forwarder
|
|
logClient, err := logclient.NewClient(cfg.LogForwarder)
|
|
if err != nil {
|
|
logger.Warn(fmt.Sprintf("failed to connect to log-forwarder: %s. Logs and events will not be forwarded.", err))
|
|
} else {
|
|
defer logClient.Close()
|
|
}
|
|
|
|
g.Go(func() error {
|
|
for {
|
|
select {
|
|
case <-ctx.Done():
|
|
return nil
|
|
case msg := <-logQueue:
|
|
if logClient == nil {
|
|
continue
|
|
}
|
|
switch m := msg.Message.(type) {
|
|
case *cvms.ClientStreamMessage_AgentLog:
|
|
err := logClient.SendLog(ctx, &logpb.LogEntry{
|
|
Message: m.AgentLog.Message,
|
|
ComputationId: m.AgentLog.ComputationId,
|
|
Level: m.AgentLog.Level,
|
|
Timestamp: m.AgentLog.Timestamp,
|
|
})
|
|
if err != nil {
|
|
logger.Error("failed to send log", "error", err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
eventSvc := runnerevents.NewAdapter(logClient, svcName)
|
|
|
|
// Remove existing socket if it exists
|
|
if _, err := os.Stat(socketPath); err == nil {
|
|
if err := os.Remove(socketPath); err != nil {
|
|
logger.Error(fmt.Sprintf("failed to remove existing socket: %s", err))
|
|
exitCode = 1
|
|
return
|
|
}
|
|
}
|
|
|
|
dir := socketPath[:len(socketPath)-len("/runner.sock")]
|
|
if err := os.MkdirAll(dir, 0o755); err != nil {
|
|
logger.Error(fmt.Sprintf("failed to create socket directory: %s", err))
|
|
exitCode = 1
|
|
return
|
|
}
|
|
|
|
lis, err := net.Listen("unix", socketPath)
|
|
if err != nil {
|
|
logger.Error(fmt.Sprintf("failed to listen on socket: %s", err))
|
|
exitCode = 1
|
|
return
|
|
}
|
|
|
|
if err := os.Chmod(socketPath, 0o777); err != nil {
|
|
logger.Error(fmt.Sprintf("failed to chmod socket: %s", err))
|
|
exitCode = 1
|
|
return
|
|
}
|
|
|
|
grpcServer := grpc.NewServer()
|
|
svc := service.New(logger, eventSvc)
|
|
pb.RegisterComputationRunnerServer(grpcServer, svc)
|
|
|
|
g.Go(func() error {
|
|
ch := make(chan os.Signal, 1)
|
|
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
|
|
defer signal.Stop(ch)
|
|
|
|
select {
|
|
case <-ch:
|
|
logger.Info("Received signal, shutting down...")
|
|
cancel()
|
|
grpcServer.GracefulStop()
|
|
return nil
|
|
case <-ctx.Done():
|
|
return ctx.Err()
|
|
}
|
|
})
|
|
|
|
g.Go(func() error {
|
|
logger.Info(fmt.Sprintf("%s started on %s", svcName, socketPath))
|
|
return grpcServer.Serve(lis)
|
|
})
|
|
|
|
if err := g.Wait(); err != nil {
|
|
logger.Error(fmt.Sprintf("%s terminated: %s", svcName, err))
|
|
}
|
|
}
|