gitops 46261f066b refactor: restructure library to expose public API directly
feat: add new helper methods for RAC operations
docs: add comprehensive library usage documentation
chore: move example to examples/library_usage directory
2025-08-04 12:03:45 +03:00
2025-08-04 11:03:25 +03:00
2025-08-04 11:03:25 +03:00
2025-08-04 11:03:25 +03:00
2025-08-04 11:03:25 +03:00
2025-08-04 11:03:25 +03:00
2025-08-04 11:03:25 +03:00
2025-08-04 11:03:25 +03:00
2025-08-04 11:03:25 +03:00
2025-08-04 11:03:25 +03:00

GitOps RAC - 1C Service Mode Management

Го-библиотека и CLI-утилита для управления сервисным режимом информационных баз 1С:Предприятие через утилиту RAC (Remote Administration Client).

Возможности

  • Включение и выключение сервисного режима 1С
  • Принудительное отключение всех пользователей при включении сервисного режима
  • Верификация операций
  • Поддержка retry-логики при сбоях
  • Маскирование паролей в логах
  • CLI интерфейс с поддержкой флагов
  • Библиотечный API для интеграции в другие проекты
  • Comprehensive logging с использованием log/slog
  • Конфигурация через YAML файлы (трехфайловая структура)
  • Поддержка контекстов для управления таймаутами
  • Полное покрытие тестами

Установка

Как CLI утилита

go build -o benadis-rac.exe ./cmd

Как библиотека

go get benadis-rac

Быстрый старт

Использование как библиотека

package main

import (
    "context"
    "fmt"
    "log"
    "time"
    
    benadisrac "git.benadis.ru/gitops/benadis-rac/"
)

func main() {
    // Создание клиента
    client, err := benadisrac.NewClient(benadisrac.Config{
        ConfigPath:  "config.yaml",
        SecretPath:  "secret.yaml",
        ProjectPath: "project.yaml",
        LogLevel:    "Info",
    })
    if err != nil {
        log.Fatal(err)
    }
    
    ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
    defer cancel()
    
    // Получение статуса
    status, err := client.GetServiceModeStatus(ctx)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Service mode status: %t\n", status)
    
    // Включение сервисного режима
    if err := client.EnableServiceMode(ctx); err != nil {
        log.Fatal(err)
    }
    
    // Выключение сервисного режима
    if err := client.DisableServiceMode(ctx); err != nil {
        log.Fatal(err)
    }
}

Использование как CLI

# Проверка статуса
./benadis-rac.exe status

# Включение сервисного режима
./benadis-rac.exe enable

# Выключение сервисного режима
./benadis-rac.exe disable

Конфигурация

Проект использует трехфайловую структуру конфигурации:

config.yaml - Основная конфигурация

# Путь к rac.exe
rac_path: "C:/Program Files/1cv8/8.3.27.1606/bin/rac.exe"

# Таймауты
connection_timeout: "30s"
command_timeout: "60s"

# Настройки повторных попыток
retry_count: 3
retry_delay: "5s"

secret.yaml - Учетные данные

# Глобальные учетные данные
cluster_admin: "admin"
cluster_admin_password: "password"
db_admin: "dbadmin"
db_admin_password: "dbpassword"

# Учетные данные для конкретных проектов
projects:
  project1:
    cluster_admin: "project1_admin"
    cluster_admin_password: "project1_password"

project.yaml - Настройки проекта

service-mode:
  server_host: "localhost"
  server_port: 1540
  rac_port: 1545
  log_level: "Info"
  server_name: "1c-server"
  base_name: "test-base"
  command: "enable"  # enable, disable, status

secret.yaml

# Настройки для аутентификации
cluster_admin: "gitops"
cluster_admin_password: "password"
db_admin: "gitops"
db_admin_password: "password"

Использование

CLI интерфейс

# Включить сервисный режим
benadis-rac -command enable

# Выключить сервисный режим
benadis-rac -command disable

# Проверить статус сервисного режима
benadis-rac -command status

# Использовать кастомные пути к конфигурации
benadis-rac -config /path/to/config.yaml -secret /path/to/secret.yaml -command enable

# Показать справку
benadis-rac -help

# Показать версию
benadis-rac -version

Библиотечный API

Основные типы

// Config конфигурация для создания клиента
type Config struct {
    ConfigPath  string // Путь к файлу конфигурации
    SecretPath  string // Путь к файлу с секретами
    ProjectPath string // Путь к файлу проекта
    LogLevel    string // Уровень логирования (Debug, Info, Warn, Error)
}

// ServiceModeManager интерфейс для управления сервисным режимом
type ServiceModeManager interface {
    EnableServiceMode(ctx context.Context) error
    DisableServiceMode(ctx context.Context) error
    GetServiceModeStatus(ctx context.Context) (bool, error)
}

Создание клиента

// Создание клиента с конфигурацией
client, err := benadisrac.NewClient(benadisrac.Config{
    ConfigPath:  "config.yaml",
    SecretPath:  "secret.yaml",
    ProjectPath: "project.yaml",
    LogLevel:    "Info",
})
if err != nil {
    log.Fatal(err)
}

// Создание клиента из готовой конфигурации
appConfig, err := config.LoadConfig("config.yaml", "secret.yaml", "project.yaml")
if err != nil {
    log.Fatal(err)
}
client, err := benadisrac.NewClientFromConfig(appConfig, "Debug")
if err != nil {
    log.Fatal(err)
}

Методы клиента

ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()

// Получение статуса сервисного режима
status, err := client.GetServiceModeStatus(ctx)
if err != nil {
    log.Printf("Error getting status: %v", err)
} else {
    fmt.Printf("Service mode enabled: %t\n", status)
}

// Включение сервисного режима
if err := client.EnableServiceMode(ctx); err != nil {
    log.Printf("Error enabling service mode: %v", err)
} else {
    fmt.Println("Service mode enabled successfully")
}

// Выключение сервисного режима
if err := client.DisableServiceMode(ctx); err != nil {
    log.Printf("Error disabling service mode: %v", err)
} else {
    fmt.Println("Service mode disabled successfully")
}

Обработка ошибок

// Пример с обработкой различных типов ошибок
status, err := client.GetServiceModeStatus(ctx)
if err != nil {
    switch {
    case errors.Is(err, context.DeadlineExceeded):
        log.Println("Operation timed out")
    case errors.Is(err, context.Canceled):
        log.Println("Operation was canceled")
    default:
        log.Printf("Unexpected error: %v", err)
    }
    return
}

Полный пример

package main

import (
    "context"
    "fmt"
    "log"
    "time"
    
    benadisrac "git.benadis.ru/gitops/benadis-rac/"
)

func main() {
    // Создаем клиент
    client, err := benadisrac.NewClient(benadisrac.Config{
        ConfigPath:  "config.yaml",
        SecretPath:  "secret.yaml",
        ProjectPath: "project.yaml",
        LogLevel:    "Info",
    })
    if err != nil {
        log.Fatalf("Failed to create client: %v", err)
    }
    
    ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
    defer cancel()
    
    // Включаем сервисный режим
    if err := client.EnableServiceMode(ctx); err != nil {
        log.Fatalf("Failed to enable service mode: %v", err)
    }
    
    // Проверяем статус
    status, err := client.GetServiceModeStatus(ctx)
    if err != nil {
        log.Fatalf("Failed to get status: %v", err)
    }
    
    fmt.Printf("Service mode enabled: %v\n", status)
    
    // Выключаем сервисный режим
    if err := client.DisableServiceMode(ctx); err != nil {
        log.Fatalf("Failed to disable service mode: %v", err)
    }
}

Архитектура

Проект следует принципам SOLID и использует модульную архитектуру:

benadis-rac/
├── cmd/                    # CLI приложение
│   └── main.go
├── internal/               # Внутренние пакеты
│   ├── config/            # Управление конфигурацией
│   ├── constants/         # Константы
│   ├── logger/            # Логирование с маскированием паролей
│   ├── rac/              # Взаимодействие с RAC
│   └── service/          # Бизнес-логика
├── gitops_rac.go          # Публичный API
├── integration_test.go    # Интеграционные тесты
└── *_test.go             # Unit тесты

Тестирование

Unit тесты

go test ./...

Интеграционные тесты

# Запуск интеграционных тестов (требует настроенной среды)
go test -tags=integration ./...

# Запуск тестов с покрытием
go test -cover ./...

# Запуск бенчмарков
go test -bench=. ./...

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

Полный рабочий пример находится в директории example/:

cd example
go run main.go

Разработка

Требования

  • Go 1.21+
  • Доступ к кластеру 1С:Предприятие 8
  • Настроенные файлы конфигурации

Сборка

# Сборка для текущей платформы
go build -o benadis-rac ./cmd

# Кросс-компиляция для Windows
GOOS=windows GOARCH=amd64 go build -o benadis-rac.exe ./cmd

# Сборка с оптимизацией размера
go build -ldflags="-s -w" -o benadis-rac ./cmd

Линтинг

# Установка golangci-lint
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

# Запуск линтера
golangci-lint run

Лицензия

MIT License - см. файл LICENSE для подробностей.

Вклад в проект

  1. Форкните репозиторий
  2. Создайте ветку для новой функции (git checkout -b feature/amazing-feature)
  3. Зафиксируйте изменения (git commit -m 'Add amazing feature')
  4. Отправьте в ветку (git push origin feature/amazing-feature)
  5. Откройте Pull Request

Поддержка

Для вопросов и поддержки создайте issue в репозитории проекта.

Description
No description provided
Readme 82 KiB
v0.0.1 Latest
2025-08-04 12:02:48 +03:00
Languages
Go 100%