166 lines
4.6 KiB
Go
166 lines
4.6 KiB
Go
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))
|
||
|
||
}
|