mirror of
https://github.com/ultravioletrs/cocos.git
synced 2026-08-07 23:31:55 +00:00
67d01e39be
* * feat(algorithm.go): add support for algorithm type context * feat(python.go): implement Python algorithm runtime * fix(cocos_defconfig): add IPTABLES package Signed-off-by: SammyOina <sammyoina@gmail.com> * update proto Signed-off-by: Sammy Oina <sammyoina@gmail.com> * small fixes Signed-off-by: Sammy Oina <sammyoina@gmail.com> * add metadata Signed-off-by: Sammy Oina <sammyoina@gmail.com> * debug Signed-off-by: Sammy Oina <sammyoina@gmail.com> * debug Signed-off-by: Sammy Oina <sammyoina@gmail.com> * chunk logger Signed-off-by: Sammy Oina <sammyoina@gmail.com> * debug logger Signed-off-by: Sammy Oina <sammyoina@gmail.com> * test lock Signed-off-by: Sammy Oina <sammyoina@gmail.com> * add req file Signed-off-by: SammyOina <sammyoina@gmail.com> * stream result Signed-off-by: SammyOina <sammyoina@gmail.com> * test with venv Signed-off-by: Sammy Oina <sammyoina@gmail.com> * fix missing requirements file Signed-off-by: Sammy Oina <sammyoina@gmail.com> * result stream Signed-off-by: Sammy Oina <sammyoina@gmail.com> * modify test server Signed-off-by: Sammy Oina <sammyoina@gmail.com> * remove debugging and cleaning up Signed-off-by: Sammy Oina <sammyoina@gmail.com> * original repo Signed-off-by: Sammy Oina <sammyoina@gmail.com> * add missing header Signed-off-by: Sammy Oina <sammyoina@gmail.com> * downgrade protoc Signed-off-by: Sammy Oina <sammyoina@gmail.com> --------- Signed-off-by: SammyOina <sammyoina@gmail.com> Signed-off-by: Sammy Oina <sammyoina@gmail.com>
83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
// Copyright (c) Ultraviolet
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
package binary
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"log/slog"
|
|
"os"
|
|
"os/exec"
|
|
|
|
"github.com/ultravioletrs/cocos/agent/algorithm"
|
|
"github.com/ultravioletrs/cocos/agent/events"
|
|
"github.com/ultravioletrs/cocos/pkg/socket"
|
|
)
|
|
|
|
const socketPath = "unix_socket"
|
|
|
|
var _ algorithm.Algorithm = (*binary)(nil)
|
|
|
|
type binary struct {
|
|
algoFile string
|
|
datasets []string
|
|
logger *slog.Logger
|
|
stderr io.Writer
|
|
stdout io.Writer
|
|
}
|
|
|
|
func New(logger *slog.Logger, eventsSvc events.Service, algoFile string) algorithm.Algorithm {
|
|
return &binary{
|
|
algoFile: algoFile,
|
|
logger: logger,
|
|
stderr: &algorithm.Stderr{Logger: logger, EventSvc: eventsSvc},
|
|
stdout: &algorithm.Stdout{Logger: logger},
|
|
}
|
|
}
|
|
|
|
func (b *binary) AddDataset(dataset string) {
|
|
b.datasets = append(b.datasets, dataset)
|
|
}
|
|
|
|
func (b *binary) Run() ([]byte, error) {
|
|
defer os.Remove(b.algoFile)
|
|
defer func() {
|
|
for _, file := range b.datasets {
|
|
os.Remove(file)
|
|
}
|
|
}()
|
|
listener, err := socket.StartUnixSocketServer(socketPath)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error creating stdout pipe: %v", err)
|
|
}
|
|
defer listener.Close()
|
|
|
|
// Create channels for received data and errors
|
|
dataChannel := make(chan []byte)
|
|
errorChannel := make(chan error)
|
|
|
|
var result []byte
|
|
|
|
go socket.AcceptConnection(listener, dataChannel, errorChannel)
|
|
|
|
args := append([]string{socketPath}, b.datasets...)
|
|
cmd := exec.Command(b.algoFile, args...)
|
|
cmd.Stderr = b.stderr
|
|
cmd.Stdout = b.stdout
|
|
|
|
if err := cmd.Start(); err != nil {
|
|
return nil, fmt.Errorf("error starting algorithm: %v", err)
|
|
}
|
|
|
|
if err := cmd.Wait(); err != nil {
|
|
return nil, fmt.Errorf("algorithm execution error: %v", err)
|
|
}
|
|
|
|
select {
|
|
case result = <-dataChannel:
|
|
return result, nil
|
|
case err = <-errorChannel:
|
|
return nil, fmt.Errorf("error receiving data: %v", err)
|
|
}
|
|
}
|