just_for_fun/code/go/agent_code/py_agent.go
2025-06-18 00:00:08 +03:00

166 lines
4.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"encoding/base64"
"encoding/json"
"fmt"
"log"
"os"
"os/exec"
"github.com/streadway/amqp"
)
func main() {
type Code struct {
IDTask string `json:"id_task"`
TpRunner string `json:"tp_runner"`
Code string `json:"code"`
Test string `json:"test"`
}
// Define RabbitMQ server URL.
amqpServerURL := os.Getenv("AMQP_SERVER_URL")
if amqpServerURL == "" {
amqpServerURL = "amqp://guest:guest@localhost:5672/" // Default URL if not set
}
// Create a new RabbitMQ connection.
connectRabbitMQ, err := amqp.Dial(amqpServerURL)
if err != nil {
panic(err)
}
defer connectRabbitMQ.Close()
// Opening a channel to our RabbitMQ instance over
// the connection we have already established.
channelRabbitMQ, err := connectRabbitMQ.Channel()
if err != nil {
panic(err)
}
defer channelRabbitMQ.Close()
// Subscribing to QueueService1 for getting messages.
messages, err := channelRabbitMQ.Consume(
"QueueService1", // queue name
"", // consumer
true, // auto-ack
false, // exclusive
false, // no local
false, // no wait
nil, // arguments
)
if err != nil {
log.Println(err)
}
// Build a welcome message.
log.Println("Successfully connected to RabbitMQ")
log.Println("Waiting for messages")
// Make a channel to receive messages into infinite loop.
forever := make(chan bool)
go func() {
for message := range messages {
// For example, show received message in a console.
log.Printf(" > Received message: %s\n", message.Body)
// Создание экземпляра структуры Task
var code_obj Code
// Разбор JSON строки в структуру
err := json.Unmarshal([]byte(message.Body), &code_obj)
if err != nil {
log.Fatalf("Ошибка при разборе JSON: %v", err)
}
mkdir(code_obj.IDTask)
mkfile(code_obj.IDTask, code_obj.Code, "main.py")
mkfile(code_obj.IDTask, code_obj.Test, "test_hello.py")
run(code_obj.IDTask)
fmt.Println(code_obj.Code)
}
}()
<-forever
}
func mkdir(dirName string) {
// Имя директории, которую нужно создать
// Права доступа к директории (0755 - чтение, запись, выполнение для владельца, чтение и выполнение для группы и остальных)
permissions := os.ModeDir | 0755
// Создание директории
err := os.Mkdir(dirName, permissions)
if err != nil {
log.Printf("Ошибка при создании директории: %v", err)
}
fmt.Printf("Директория '%s' успешно создана.\n", dirName)
}
func mkfile(dirName string, base64String string, fName string) {
// Декодирование Base64 строки
decodedBytes, er := base64.StdEncoding.DecodeString(base64String)
if er != nil {
log.Fatalf("Ошибка при декодировании Base64: %v", er)
}
// Преобразование байтов в строку
fileContent := string(decodedBytes)
// Права доступа к файлу (0644 - чтение и запись для владельца, чтение для группы и остальных)
fileName := "./" + dirName + "/" + fName
permissions := 0644
// Преобразование содержимого в слайс байтов
data := []byte(fileContent)
// Создание файла и запись содержимого
err := os.WriteFile(fileName, data, os.FileMode(permissions))
if err != nil {
log.Fatalf("Ошибка при создании файла: %v", err)
}
fmt.Printf("Файл '%s' успешно создан с содержимым.\n", fileName)
}
func run(idTask string) {
// Получение текущей рабочей директории
currentDir, err := os.Getwd()
if err != nil {
log.Fatalf("Ошибка при получении текущей директории: %v", err)
}
dir := currentDir + "/" + idTask
// Изменение текущей рабочей директории
err = os.Chdir(dir)
if err != nil {
log.Fatalf("Ошибка при изменении директории: %v", err)
}
// Команда для запуска Python с кодом
fileName := "test_hello.py"
cmd := exec.Command("python", "-m", "unittest", fileName)
// Запуск команды и получение вывода
output, err := cmd.CombinedOutput()
if err != nil {
log.Fatalf("Ошибка при выполнении Python кода: %v\nВывод: %s", err, string(output))
}
// Вывод результата
fmt.Printf("Вывод Python:\n%s\n", string(output))
}