diff --git a/bazunov_andrew_lab_2/FileCreator/Dockerfile b/bazunov_andrew_lab_2/FileCreator/Dockerfile new file mode 100644 index 0000000..424cd7b --- /dev/null +++ b/bazunov_andrew_lab_2/FileCreator/Dockerfile @@ -0,0 +1,14 @@ +# Используем официальный образ Go в качестве базового +FROM golang:1.23 + +# Устанавливаем рабочую директорию +WORKDIR /app + +# Копируем файлы модуля +COPY . . + +# Сборка модуля +RUN go build -o /bin/FileCreator + +# Запуск модуля +CMD ["/bin/FileCreator"] \ No newline at end of file diff --git a/bazunov_andrew_lab_2/FileCreator/go.mod b/bazunov_andrew_lab_2/FileCreator/go.mod new file mode 100644 index 0000000..4246e15 --- /dev/null +++ b/bazunov_andrew_lab_2/FileCreator/go.mod @@ -0,0 +1 @@ +module FileCreator diff --git a/bazunov_andrew_lab_2/FileCreator/main.go b/bazunov_andrew_lab_2/FileCreator/main.go new file mode 100644 index 0000000..d98b3cc --- /dev/null +++ b/bazunov_andrew_lab_2/FileCreator/main.go @@ -0,0 +1,92 @@ +package main + +import ( + "crypto/md5" + "encoding/hex" + "fmt" + "math/rand" + "os" + "path/filepath" +) + +const DIR = "/var/data" + +func Exists(name string) (bool, error) { + _, err := os.Stat(name) + if os.IsNotExist(err) { + return false, nil + } + return err != nil, err +} + +func CreateDirectory(dirs string) error { + if _, err := os.Stat(dirs); os.IsNotExist(err) { + err := os.MkdirAll(dirs, 0664) + if err != nil { + return err + } + } + return nil +} + +func CreateFileOrOpenIfExist(name string) (*os.File, error) { + err := CreateDirectory(filepath.Dir(name)) + if err != nil { + return nil, err + } + exists, err := Exists(name) + if err != nil { + return nil, err + } + if exists { + return os.OpenFile(name, os.O_WRONLY|os.O_CREATE, 0664) + } + return os.Create(name) +} + +func CreateFileAndWriteData(filename string) error { + file, err := CreateFileOrOpenIfExist(filename) + if err != nil { + return err + } + lines := rand.Intn(1000) + 100 + + for i := 0; i < lines; i++ { + randomValueForLine := rand.Intn(1_000_000) + _, err = fmt.Fprintf(file, "%d\r\n", randomValueForLine) + if err != nil { + return err + } + } + + err = file.Close() + if err != nil { + return err + } + + return nil +} + +func GetMD5Hash(text string) string { + hash := md5.Sum([]byte(text)) + return hex.EncodeToString(hash[:]) +} + +func main() { + for i := 0; i < 10; i++ { + filename := fmt.Sprintf("%s/%s.txt", DIR, GetMD5Hash(fmt.Sprintf("%d", i))) + err := CreateFileAndWriteData(filename) + if err != nil { + fmt.Println(err) + } else { + fmt.Printf("Created file %s\n", filename) + } + } + + err := CreateFileAndWriteData(DIR + "/data.txt") + if err != nil { + fmt.Println(err) + } else { + fmt.Printf("Created file %s\n", DIR+"/data.txt") + } +} diff --git a/bazunov_andrew_lab_2/FirstService/Dockerfile b/bazunov_andrew_lab_2/FirstService/Dockerfile new file mode 100644 index 0000000..141607e --- /dev/null +++ b/bazunov_andrew_lab_2/FirstService/Dockerfile @@ -0,0 +1,14 @@ +# Используем официальный образ Go в качестве базового +FROM golang:1.23 + +# Устанавливаем рабочую директорию +WORKDIR /app + +# Копируем файлы модуля +COPY . . + +# Сборка модуля +RUN go build -o /bin/FirstService + +# Запуск модуля +CMD ["/bin/FirstService"] \ No newline at end of file diff --git a/bazunov_andrew_lab_2/FirstService/go.mod b/bazunov_andrew_lab_2/FirstService/go.mod new file mode 100644 index 0000000..2cc6a38 --- /dev/null +++ b/bazunov_andrew_lab_2/FirstService/go.mod @@ -0,0 +1 @@ +module RVIP2 diff --git a/bazunov_andrew_lab_2/FirstService/main.go b/bazunov_andrew_lab_2/FirstService/main.go new file mode 100644 index 0000000..a1e0b87 --- /dev/null +++ b/bazunov_andrew_lab_2/FirstService/main.go @@ -0,0 +1,94 @@ +package main + +import ( + "fmt" + "os" +) + +// Формирует файл /var/result/data.txt так, +// что каждая строка файла - количество символов в именах файлов из каталога /var/data. + +const INPUT = "/var/data" +const OUTPUT = "/data/result" + +func GetListFilesInDirectory(directory string) ([]string, error) { + f, err := os.Open(directory) + if err != nil { + fmt.Println(err) + return nil, err + } + files, err := f.Readdir(0) + if err != nil { + fmt.Println(err) + return nil, err + } + + var fileNames []string + for _, file := range files { + fileName := file.Name() + fileNames = append(fileNames, fileName) + } + return fileNames, nil +} + +func Exists(name string) (bool, error) { + _, err := os.Stat(name) + if os.IsNotExist(err) { + return false, nil + } + return err != nil, err +} + +func CreateFileOrOpenIfExist(name string) (*os.File, error) { + exists, err := Exists(name) + if err != nil { + return nil, err + } + if exists { + return os.OpenFile(name, os.O_WRONLY|os.O_CREATE, 0664) + } + return os.Create(name) +} + +func CreateFileAndWriteData(filename string, lines []string) error { + file, err := CreateFileOrOpenIfExist(filename) + if err != nil { + return err + } + + for _, line := range lines { + _, err = fmt.Fprintf(file, line) + if err != nil { + return err + } + } + + err = file.Close() + if err != nil { + return err + } + + return nil +} + +func main() { + filenames, err := GetListFilesInDirectory(INPUT) + + if err != nil { + fmt.Println(err) + return + } + + var lenghtOfFilenames []string + for _, filename := range filenames { + fmt.Println(filename) + lenghtOfFilenames = append(lenghtOfFilenames, fmt.Sprintf("%d", len(filename))) + } + + err = CreateFileAndWriteData(OUTPUT+"/data.txt", filenames) + if err != nil { + return + } + + fmt.Println("First Service is end.") +} diff --git a/bazunov_andrew_lab_2/README.md b/bazunov_andrew_lab_2/README.md new file mode 100644 index 0000000..650ebf0 --- /dev/null +++ b/bazunov_andrew_lab_2/README.md @@ -0,0 +1,30 @@ +# Распределенные вычисления и приложения Л2 +## _Автор Базунов Андрей Игревич ПИбд-42_ + +Сервисы ( _порядок исполнения сервисов соблюден_ ): +- 1.FileCreator - (_Создание тестовых данных_) +- 2.FirstService - (_Выполнение 1.4 варианта задания_) +- 3.SecondService - (_Выполнение 2.2 варианта задания_) + +В качестве основного языка был выбран GoLang. Для каждого сервиса был создан DOCKERFILE где были прописаны условия и действия для сборки каждого из модулей + +# Docker + +>Перед исполнением вполняем установку docker и проверяем версию + +```sh +docker-compose --version +``` + +>Далее производим настройку файла docker-compose.yaml и запускаем контейнер с сборкой образов + +```sh +docker-compose up -d --build +``` + +>Для завершения работы контейнера используем команду +```sh +docker-compose down +``` + +[Демонстрация работы](https://vk.com/video236673313_456239575) diff --git a/bazunov_andrew_lab_2/SecondService/Dockerfile b/bazunov_andrew_lab_2/SecondService/Dockerfile new file mode 100644 index 0000000..97e31f3 --- /dev/null +++ b/bazunov_andrew_lab_2/SecondService/Dockerfile @@ -0,0 +1,14 @@ +# Используем официальный образ Go в качестве базового +FROM golang:1.23 + +# Устанавливаем рабочую директорию +WORKDIR /app + +# Копируем файлы модуля +COPY . . + +# Сборка модуля +RUN go build -o /bin/SecondService + +# Запуск модуля +CMD ["/bin/SecondService"] \ No newline at end of file diff --git a/bazunov_andrew_lab_2/SecondService/go.mod b/bazunov_andrew_lab_2/SecondService/go.mod new file mode 100644 index 0000000..5543e02 --- /dev/null +++ b/bazunov_andrew_lab_2/SecondService/go.mod @@ -0,0 +1 @@ +module SecondService diff --git a/bazunov_andrew_lab_2/SecondService/main.go b/bazunov_andrew_lab_2/SecondService/main.go new file mode 100644 index 0000000..4f70d57 --- /dev/null +++ b/bazunov_andrew_lab_2/SecondService/main.go @@ -0,0 +1,79 @@ +package main + +import ( + "bufio" + "fmt" + "os" +) + +//Ищет наименьшее число из файла /var/data/data.txt и сохраняет его третью степень в /var/result/result.txt. + +const INPUT = "/var/data/data.txt" +const OUTPUT = "/var/result/result.txt" + +func ReadlinesFromFile(filename string) ([]string, error) { + file, err := os.Open(filename) + if err != nil { + return nil, err + } + + var output []string + scanner := bufio.NewScanner(file) + for scanner.Scan() { + output = append(output, scanner.Text()) + } + + err = file.Close() + if err != nil { + return nil, err + } + + return output, nil +} + +func WriteIntToFile(filename string, i int) error { + file, err := os.Create(filename) + if err != nil { + return err + } + + defer func(file *os.File) { + err := file.Close() + if err != nil { + + } + }(file) + + _, err = file.WriteString(fmt.Sprintf("%d\n", i)) + if err != nil { + return err + } + return nil +} + +func main() { + lines, err := ReadlinesFromFile(INPUT) + if err != nil { + fmt.Println(err) + } + + minValue := 0 + + for _, line := range lines { + if intValue, err := fmt.Sscanf(line, "%d", &minValue); err != nil { + fmt.Println(err) + } else { + if minValue >= intValue { + minValue = intValue + } + } + } + + if err = WriteIntToFile(OUTPUT, minValue); err != nil { + return + } else { + fmt.Printf("Write %d to %s\n", minValue, OUTPUT) + } + + fmt.Println("Second Service is end.") +} diff --git a/bazunov_andrew_lab_2/docker-compose.yaml b/bazunov_andrew_lab_2/docker-compose.yaml new file mode 100644 index 0000000..e1fd19f --- /dev/null +++ b/bazunov_andrew_lab_2/docker-compose.yaml @@ -0,0 +1,27 @@ +services: + file_generate: + build: + context: ./FileCreator + dockerfile: Dockerfile + volumes: + - ./data:/var/data # Монтирование локальной папки data в /var/data в контейнере + + first_service: + build: + context: ./FirstService + dockerfile: Dockerfile + volumes: + - ./data:/var/data + - ./data:/var/result + depends_on: + - file_generate + + second_service: + build: + context: ./SecondService + dockerfile: Dockerfile + volumes: + - ./data:/var/data + - ./data:/var/result + depends_on: + - first_service \ No newline at end of file