Skip to content

Commit

Permalink
Feature/docs (#36)
Browse files Browse the repository at this point in the history
* [ADD] - added structure info via README, also, realized Makefile for easy to build/test and etc.;

* [UPD] - security patches for harden-runner;
  • Loading branch information
atlet99 authored Nov 19, 2024
1 parent 785ab68 commit f6d4d50
Show file tree
Hide file tree
Showing 5 changed files with 186 additions and 29 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-20.04
steps:
- name: Harden Runner
uses: step-security/harden-runner@v2.10.1
uses: step-security/harden-runner@v2.10.2
with:
egress-policy: audit

Expand Down
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,7 @@
#.vscode

.idea
yed
yed

# Commented binary directory
bin
102 changes: 102 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# Project-specific variables
BINARY_NAME := yed
OUTPUT_DIR := bin
CMD_DIR := cmd/yaml-encrypter-decrypter
TAG_NAME ?= $(shell head -n 1 .release-version 2>/dev/null || echo "v0.0.0")
VERSION_RAW ?= $(shell tail -n 1 .release-version 2>/dev/null | sed 's/ /_/g' || echo "dev")
VERSION ?= $(VERSION_RAW)

# Ensure the output directory exists
$(OUTPUT_DIR):
@mkdir -p $(OUTPUT_DIR)

# Default target
.PHONY: default
default: fmt vet lint build quicktest

# Build and run the application locally
.PHONY: run
run:
@echo "Running $(BINARY_NAME)..."
go run main.go

# Install project dependencies
.PHONY: install-deps
install-deps:
@echo "Installing dependencies..."
go mod tidy
go mod vendor

# Clean up dependencies
.PHONY: clean-deps
clean-deps:
@echo "Cleaning up vendor dependencies..."
rm -rf vendor

# Build the project for the current OS/architecture
.PHONY: build
build: $(OUTPUT_DIR)
@echo "Building $(BINARY_NAME) with version $(VERSION)..."
GOOS=$(GOOS) GOARCH=$(GOARCH) go build -ldflags="-X main.Version=$(VERSION)" -o $(OUTPUT_DIR)/$(BINARY_NAME) $(CMD_DIR)/main.go

# Build binaries for multiple platforms
.PHONY: build-cross
build-cross: $(OUTPUT_DIR)
@echo "Building cross-platform binaries..."
GOOS=linux GOARCH=amd64 go build -ldflags="-X main.Version=$(VERSION)" -o $(OUTPUT_DIR)/$(BINARY_NAME)-linux-amd64 $(CMD_DIR)/main.go
GOOS=darwin GOARCH=arm64 go build -ldflags="-X main.Version=$(VERSION)" -o $(OUTPUT_DIR)/$(BINARY_NAME)-darwin-arm64 $(CMD_DIR)/main.go
GOOS=windows GOARCH=amd64 go build -ldflags="-X main.Version=$(VERSION)" -o $(OUTPUT_DIR)/$(BINARY_NAME)-windows-amd64.exe $(CMD_DIR)/main.go
@echo "Cross-platform binaries are available in $(OUTPUT_DIR):"
@ls -1 $(OUTPUT_DIR)

# Clean build artifacts
.PHONY: clean
clean:
@echo "Cleaning build artifacts..."
rm -rf $(OUTPUT_DIR)

# Run tests with race detection and coverage
.PHONY: test
test:
@echo "Running tests with race detection..."
go test -v -race -cover ./...

# Run quick tests without additional checks
.PHONY: quicktest
quicktest:
@echo "Running quick tests..."
go test ./...

# Check formatting of Go code
.PHONY: fmt
fmt:
@echo "Checking code formatting..."
@OUTPUT=`gofmt -l . 2>&1`; \
if [ "$$OUTPUT" ]; then \
echo "gofmt must be run on the following files:"; \
echo "$$OUTPUT"; \
exit 1; \
fi

# Run go vet to analyze code
.PHONY: vet
vet:
@echo "Running go vet..."
go vet ./...

# Display help information
.PHONY: help
help:
@echo "Available targets:"
@echo " default - Run formatting, vetting, linting, build, and quick tests"
@echo " run - Run the application locally"
@echo " install-deps - Install project dependencies"
@echo " clean-deps - Clean up vendor dependencies"
@echo " build - Build the application for the current OS/architecture"
@echo " build-cross - Build binaries for multiple platforms"
@echo " clean - Clean build artifacts"
@echo " test - Run tests with race detection and coverage"
@echo " quicktest - Run quick tests without additional checks"
@echo " fmt - Check code formatting"
@echo " vet - Analyze code with go vet"
@echo " help - Display this help message"
34 changes: 7 additions & 27 deletions cmd/yaml-encrypter-decrypter/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,13 @@ type Config struct {
} `yaml:"logging"`
}

// Version is read from the .release-version file
var Version = getVersionFromFile(".release-version")
// Version is set during build time using -ldflags
var Version = "dev" // Default version if not overridden by -ldflags

func main() {
// Transform underscores in the version string back to spaces for display
displayVersion := strings.ReplaceAll(Version, "_", " ")

// Define flags
flagVersion := flag.Bool("version", false, "Show the version and exit")
flagKey := flag.String("key", "", "AES key-password for encrypt/decrypt")
Expand All @@ -45,7 +48,7 @@ func main() {

// Override the default usage function to include the version before displaying usage info
flag.Usage = func() {
fmt.Printf("yed version: %s\nUsage:\n", Version)
fmt.Printf("yed version: %s\nUsage:\n", displayVersion)
flag.PrintDefaults()
}

Expand All @@ -54,7 +57,7 @@ func main() {

// If --version is specified, display version and exit
if *flagVersion {
fmt.Printf("yed version: %s\n", Version)
fmt.Printf("yed version: %s\n", displayVersion)
return
}

Expand Down Expand Up @@ -93,29 +96,6 @@ func main() {
processYamlFile(*flagFile, flagEnvBlocks, *flagKey, *flagOperation, *flagDryRun)
}

// getVersionFromFile reads the last line from the specified file to set the version
func getVersionFromFile(filename string) string {
file, err := os.Open(filename)
if err != nil {
log.Printf("Warning: Could not read version from %s: %v", filename, err)
return "dev" // default version if file is not available
}
defer file.Close()

var lastLine string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lastLine = scanner.Text()
}

if err := scanner.Err(); err != nil {
log.Printf("Warning: Error reading %s: %v", filename, err)
return "dev"
}

return lastLine
}

// loadConfig loads environment-specific configuration from YAML files in order
func loadConfig(env string) (*Config, error) {
baseConfigFile := "configs/values.yaml"
Expand Down
72 changes: 72 additions & 0 deletions localizations/ru-RU/docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# About YED

Этот код представляет собой приложение на Go, предназначенное для шифрования и дешифрования данных в YAML-файлах с использованием алгоритма AES. Он может работать с отдельными значениями или блоками данных из YAML, предоставляя возможности командной строки для управления.

## Основные возможности:

1. Шифрование и дешифрование данных:
• Позволяет шифровать или расшифровывать отдельные значения, используя предоставленный `AES-ключ`.
• Работает с указанными блоками данных (`YAML-блоки`, определённые в конфигурации или переданные в параметрах).

2. Работа с YAML-файлами:
• Программа читает `YAML-файлы`, определяет, какие блоки данных необходимо шифровать или дешифровать, и применяет операцию.

3. Гибкость конфигурации:
• Поддерживает конфигурационные файлы для разных сред (например, dev, test).
• Если ключ не указан в параметрах запуска, программа пытается взять его из конфигурационного файла.

4. Командный интерфейс (CLI):
- Предоставляет различные флаги для настройки:
```shell
--version – показать версию приложения.
--key – задать AES-ключ для операций шифрования/дешифрования.
--env – указать среду для выбора соответствующего конфигурационного файла.
--filename – указать YAML-файл для обработки.
--value – указать отдельное значение для шифрования или дешифрования.
--operation – указать операцию (encrypt или decrypt).
--dry-run – показать результат операций без изменения файлов.
```
5. Чтение версии:
- Версия программы считывается из файла .release-version.

### Основные компоненты:
1. Загрузка конфигурации:
Метод loadConfig загружает базовую и средовую конфигурацию YAML. Это позволяет программе использовать разные настройки для разных окружений.

2. Шифрование/дешифрование значений:
- Использует функции `encryption.Encrypt` и `encryption.Decrypt` для работы с данными.
- Обрабатывает строки с префиксом `AES256:` как зашифрованные данные.

3. Работа с YAML-файлами:
- Метод processYamlFile проходит по строкам файла, определяет блоки, которые необходимо обработать, и применяет операции шифрования или дешифрования.

4. CLI-интерфейс:
- Использует стандартный пакет flag для парсинга аргументов командной строки.
- Предоставляет кастомизированную функцию flag.Usage для отображения информации о программе.

### Пример использования:

1. Шифрование значения:
```shell
go run main.go --key "my-secret-key" --value "my-sensitive-data" --operation encrypt
```
Результат: строка будет зашифрована и возвращена с префиксом `AES256:`.

2. Расшифровка значения:
```shell
go run main.go --key "my-secret-key" --value "AES256:encrypted-data" --operation decrypt
```

3. Обработка YAML-файла:
```shell
go run main.go --key "my-secret-key" --filename "configs/values.yaml" --operation encrypt --env-blocks "dev"
```

## Для чего нужен код:

Код полезен в следующих сценариях:
- Защита конфиденциальных данных в конфигурационных файлах YAML (например, паролей, ключей API).
- Обеспечение безопасности конфигураций для разных окружений (dev, test, prod).
- Быстрая обработка данных через интерфейс командной строки для DevOps или разработчиков.

Этот инструмент может быть полезен для управления секретами в средах, где YAML используется для хранения конфигураций, например, в Kubernetes или других системах управления инфраструктурой.

0 comments on commit f6d4d50

Please sign in to comment.