// Package main демонстрирует использование библиотеки benadis-rac // для управления сервисным режимом 1C package main import ( "context" "fmt" "log" "os" "time" benadisrac "git.benadis.ru/gitops/benadis-rac" ) // ExampleConfig содержит примеры конфигурации для демонстрации type ExampleConfig struct { ConfigPath string SecretPath string ProjectPath string LogLevel string } // getDefaultConfig возвращает конфигурацию по умолчанию func getDefaultConfig() ExampleConfig { return ExampleConfig{ ConfigPath: "../config.yaml", SecretPath: "../secret.yaml", ProjectPath: "../project.yaml", LogLevel: "Info", } } // demonstrateBasicUsage демонстрирует базовое использование библиотеки func demonstrateBasicUsage() error { fmt.Println("=== Демонстрация базового использования библиотеки GitOps RAC ===") // Получаем конфигурацию cfg := getDefaultConfig() // Создаем клиент fmt.Println("Создание клиента...") client, err := benadisrac.NewClient(benadisrac.Config{ ConfigPath: cfg.ConfigPath, SecretPath: cfg.SecretPath, ProjectPath: cfg.ProjectPath, LogLevel: cfg.LogLevel, }) if err != nil { return fmt.Errorf("ошибка создания клиента: %w", err) } fmt.Println("✓ Клиент успешно создан") // Создаем контекст с таймаутом ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Получаем текущий статус fmt.Println("\nПроверка текущего статуса сервисного режима...") status, err := client.GetServiceModeStatus(ctx) if err != nil { return fmt.Errorf("ошибка получения статуса: %w", err) } fmt.Printf("✓ Текущий статус сервисного режима: %t\n", status) return nil } // demonstrateServiceModeOperations демонстрирует операции с сервисным режимом func demonstrateServiceModeOperations() error { fmt.Println("\n=== Демонстрация операций с сервисным режимом ===") // Создаем клиент cfg := getDefaultConfig() client, err := benadisrac.NewClient(benadisrac.Config{ ConfigPath: cfg.ConfigPath, SecretPath: cfg.SecretPath, ProjectPath: cfg.ProjectPath, LogLevel: "Debug", // Используем Debug для подробного логирования }) if err != nil { return fmt.Errorf("ошибка создания клиента: %w", err) } ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() // Получаем начальный статус initialStatus, err := client.GetServiceModeStatus(ctx) if err != nil { return fmt.Errorf("ошибка получения начального статуса: %w", err) } fmt.Printf("Начальный статус: %t\n", initialStatus) // Если сервисный режим выключен, включаем его if !initialStatus { fmt.Println("\nВключение сервисного режима...") if err := client.EnableServiceMode(ctx); err != nil { return fmt.Errorf("ошибка включения сервисного режима: %w", err) } fmt.Println("✓ Сервисный режим включен") // Проверяем статус после включения status, err := client.GetServiceModeStatus(ctx) if err != nil { return fmt.Errorf("ошибка проверки статуса после включения: %w", err) } fmt.Printf("✓ Статус после включения: %t\n", status) // Ждем немного time.Sleep(2 * time.Second) // Выключаем сервисный режим fmt.Println("\nВыключение сервисного режима...") if err := client.DisableServiceMode(ctx); err != nil { return fmt.Errorf("ошибка выключения сервисного режима: %w", err) } fmt.Println("✓ Сервисный режим выключен") } else { fmt.Println("\nВыключение сервисного режима...") if err := client.DisableServiceMode(ctx); err != nil { return fmt.Errorf("ошибка выключения сервисного режима: %w", err) } fmt.Println("✓ Сервисный режим выключен") // Проверяем статус после выключения status, err := client.GetServiceModeStatus(ctx) if err != nil { return fmt.Errorf("ошибка проверки статуса после выключения: %w", err) } fmt.Printf("✓ Статус после выключения: %t\n", status) // Ждем немного time.Sleep(2 * time.Second) // Включаем сервисный режим обратно fmt.Println("\nВключение сервисного режима обратно...") if err := client.EnableServiceMode(ctx); err != nil { return fmt.Errorf("ошибка включения сервисного режима: %w", err) } fmt.Println("✓ Сервисный режим включен обратно") } // Финальная проверка статуса finalStatus, err := client.GetServiceModeStatus(ctx) if err != nil { return fmt.Errorf("ошибка получения финального статуса: %w", err) } fmt.Printf("\n✓ Финальный статус: %t\n", finalStatus) return nil } // demonstrateErrorHandling демонстрирует обработку ошибок func demonstrateErrorHandling() { fmt.Println("\n=== Демонстрация обработки ошибок ===") // Попытка создать клиент с неверными путями fmt.Println("Попытка создания клиента с неверными путями...") _, err := benadisrac.NewClient(benadisrac.Config{ ConfigPath: "nonexistent-config.yaml", SecretPath: "nonexistent-secret.yaml", ProjectPath: "nonexistent-project.yaml", LogLevel: "Info", }) if err != nil { fmt.Printf("✓ Ожидаемая ошибка: %v\n", err) } else { fmt.Println("⚠ Неожиданно: ошибка не возникла") } // Попытка создать клиент с неверным уровнем логирования fmt.Println("\nПопытка создания клиента с неверным уровнем логирования...") cfg := getDefaultConfig() cfg.LogLevel = "InvalidLevel" client, err := benadisrac.NewClient(benadisrac.Config{ ConfigPath: cfg.ConfigPath, SecretPath: cfg.SecretPath, ProjectPath: cfg.ProjectPath, LogLevel: cfg.LogLevel, }) if err != nil { fmt.Printf("✓ Ошибка при неверном уровне логирования: %v\n", err) } else if client != nil { fmt.Println("✓ Клиент создан, но может использовать уровень логирования по умолчанию") } } // printUsageInstructions выводит инструкции по использованию func printUsageInstructions() { fmt.Println("\n=== Инструкции по использованию библиотеки GitOps RAC ===") fmt.Println("\n1. Импортируйте библиотеку:") fmt.Println(` import benadisrac "git.benadis.ru/gitops/benadis-rac/"`) fmt.Println("\n2. Создайте конфигурацию:") fmt.Println(` cfg := benadisrac.Config{`) fmt.Println(` ConfigPath: "config.yaml",`) fmt.Println(` SecretPath: "secret.yaml",`) fmt.Println(` ProjectPath: "project.yaml",`) fmt.Println(` LogLevel: "Info",`) fmt.Println(` }`) fmt.Println("\n3. Создайте клиент:") fmt.Println(` client, err := benadisrac.NewClient(cfg)`) fmt.Println(` if err != nil {`) fmt.Println(` log.Fatal(err)`) fmt.Println(` }`) fmt.Println("\n4. Используйте методы клиента:") fmt.Println(` ctx := context.Background()`) fmt.Println(` status, err := client.GetServiceModeStatus(ctx)`) fmt.Println(` err = client.EnableServiceMode(ctx)`) fmt.Println(` err = client.DisableServiceMode(ctx)`) fmt.Println("\n5. Доступные уровни логирования: Debug, Info, Warn, Error") fmt.Println("\n6. Все операции поддерживают context.Context для управления таймаутами") } func main() { fmt.Println("GitOps RAC Library Example") fmt.Println("==========================") // Проверяем аргументы командной строки if len(os.Args) > 1 { switch os.Args[1] { case "--help", "-h": printUsageInstructions() return case "--basic": if err := demonstrateBasicUsage(); err != nil { log.Printf("Ошибка в базовой демонстрации: %v", err) } return case "--operations": if err := demonstrateServiceModeOperations(); err != nil { log.Printf("Ошибка в демонстрации операций: %v", err) } return case "--errors": demonstrateErrorHandling() return } } // Выполняем все демонстрации по умолчанию fmt.Println("Запуск всех демонстраций...") fmt.Println("Используйте флаги: --basic, --operations, --errors, --help") fmt.Println() // Базовое использование if err := demonstrateBasicUsage(); err != nil { log.Printf("Ошибка в базовой демонстрации: %v", err) } // Операции с сервисным режимом (только если базовая демонстрация прошла успешно) if err := demonstrateServiceModeOperations(); err != nil { log.Printf("Ошибка в демонстрации операций: %v", err) } // Обработка ошибок demonstrateErrorHandling() // Инструкции printUsageInstructions() fmt.Println("\n=== Демонстрация завершена ===") }