Repository: DigiLabsru/alkir-rahc
Pull request #7: Ядро для cli-операций
Author: login: nixel2007
Created: 2025-03-26T19:46:36Z | Merged: 2025-03-26T19:50:57Z



<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - The application now starts in CLI mode by default, streamlining command-line operations.
  - New subcommands have been added for managing clusters and sessions, allowing users to list and view detailed information.
  - Enhanced help display and command formatting improve overall usability.
  - New command-line options for cluster administration and common settings have been introduced.

- **Refactor**
  - CLI options and connection handling have been reorganized to provide a more consistent and reliable user experience.
  - Method chaining has been enabled for the `ConnectionDTO` class, enhancing the interface for setting properties.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/build.gradle.kts b/build.gradle.kts
index c90634f..78d66b9 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,183 +1,186 @@
-plugins {
-	java
-	jacoco
-	`maven-publish`
-	id("org.springframework.boot") version "3.4.3"
-	id("io.spring.dependency-management") version "1.1.7"
-	id("io.freefair.javadoc-links") version "8.13"
-	id("io.freefair.javadoc-utf-8") version "8.13"
-	id("io.freefair.lombok")        version "8.13"
-	id("com.github.ben-manes.versions") version "0.52.0"
-	id("me.qoomon.git-versioning") version "6.4.4"
-}
-
-group = "ru.digilabs.alkir"
-
-gitVersioning.apply {
-	refs {
-		considerTagsOnBranches = true
-		tag("v(?<tagVersion>[0-9].*)") {
-			version = "\${ref.tagVersion}\${dirty:-SNAPSHOT}"
-		}
-		branch(".+") {
-			version = "\${ref}-\${commit.short}\${dirty:-SNAPSHOT}"
-		}
-	}
-
-	rev {
-		version = "\${commit.short}\${dirty:-SNAPSHOT}"
-	}
-}
-
-java {
-	sourceCompatibility = JavaVersion.VERSION_17
-}
-
-tasks.withType<JavaCompile> {
-	options.encoding = "UTF-8"
-	options.compilerArgs.add("-Xlint:unchecked")
-	options.compilerArgs.add("-Xlint:deprecation")
-	options.compilerArgs.add("-parameters")
-}
-
-tasks.jar {
-	enabled = false
-}
-
-configurations {
-	compileOnly {
-		extendsFrom(annotationProcessor.get())
-	}
-}
-
-repositories {
-	mavenLocal()
-	mavenCentral()
-	maven("https://jitpack.io")
-}
-
-extra["springBootAdminVersion"] = "3.4.5"
-
-dependencies {
-	implementation("org.springframework.boot:spring-boot-starter-actuator")
-	implementation("org.springframework.boot:spring-boot-starter-aop")
-	implementation("org.springframework.boot:spring-boot-starter-web")
-	implementation("org.springframework.boot:spring-boot-starter-validation")
-	implementation("org.springframework.boot:spring-boot-starter-security")
-	implementation("org.springframework.security:spring-security-oauth2-resource-server")
-	implementation("org.springframework.retry:spring-retry")
-
-	implementation("de.codecentric:spring-boot-admin-starter-server")
-	implementation("de.codecentric:spring-boot-admin-starter-client")
-
-	implementation("info.picocli:picocli-spring-boot-starter:4.7.6")
-
-	implementation("com.github.LimeChain:jsonrpc4j:1.7.0")
-	implementation("javax.jws:javax.jws-api:1.1")
-
-	implementation("org.springdoc", "springdoc-openapi-starter-webmvc-ui", "2.8.5")
-	implementation("org.springdoc", "springdoc-openapi-starter-webmvc-api", "2.8.5")
-
-	implementation("org.jboss.netty", "netty", "3.2.10.Final")
-
-	implementation("com._1c.v8", "core", "1.0.2")
-	implementation("com._1c.v8", "ibis.admin", "1.6.8")
-	implementation("com._1c.v8", "ibis", "1.1.1")
-	implementation("com._1c.v8", "ibis.swp", "1.1.1")
-	implementation("com._1c.v8", "swp", "1.0.2")
-	implementation("com._1c.v8", "swp.netty", "1.0.2")
-
-	implementation("org.awaitility", "awaitility", "4.3.0")
-
-	annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
-
-	testImplementation("org.springframework.boot:spring-boot-starter-test")
-}
-
-dependencyManagement {
-	imports {
-		mavenBom("de.codecentric:spring-boot-admin-dependencies:${property("springBootAdminVersion")}")
-	}
-}
-
-tasks.test {
-	useJUnitPlatform()
-
-	testLogging {
-		events("passed", "skipped", "failed", "standard_error")
-	}
-
-	reports {
-		html.required.set(true)
-	}
-}
-
-tasks.check {
-	dependsOn(tasks.jacocoTestReport)
-}
-
-tasks.jacocoTestReport {
-	reports {
-		xml.required.set(true)
-		xml.outputLocation.set(File("${layout.buildDirectory.get()}/reports/jacoco/test/jacoco.xml"))
-	}
-}
-
-publishing {
-	publications {
-		create<MavenPublication>("ibis-core") {
-			artifact(file("ibis/lib/com._1c.v8.core-1.0.2.jar")) {
-				groupId = "com._1c.v8"
-				artifactId = "core"
-				version = "1.0.2"
-			}
-		}
-		create<MavenPublication>("ibis-admin") {
-			artifact(file("ibis/lib/com._1c.v8.ibis.admin-1.6.8.jar")) {
-				groupId = "com._1c.v8"
-				artifactId = "ibis.admin"
-				version = "1.6.8"
-			}
-		}
-		create<MavenPublication>("ibis-swp") {
-			artifact(file("ibis/lib/com._1c.v8.ibis.swp-1.1.1.jar")) {
-				groupId = "com._1c.v8"
-				artifactId = "ibis.swp"
-				version = "1.1.1"
-			}
-		}
-		create<MavenPublication>("ibis") {
-			artifact(file("ibis/lib/com._1c.v8.ibis-1.1.1.jar")) {
-				groupId = "com._1c.v8"
-				artifactId = "ibis"
-				version = "1.1.1"
-			}
-		}
-		create<MavenPublication>("swp-netty") {
-			artifact(file("ibis/lib/com._1c.v8.swp.netty-1.0.2.jar")) {
-				groupId = "com._1c.v8"
-				artifactId = "swp.netty"
-				version = "1.0.2"
-			}
-		}
-		create<MavenPublication>("swp") {
-			artifact(file("ibis/lib/com._1c.v8.swp-1.0.2.jar")) {
-				groupId = "com._1c.v8"
-				artifactId = "swp"
-				version = "1.0.2"
-			}
-		}
-	}
-}
-
-tasks.register<GradleBuild>("publishIbisToMavenLocal") {
-	group = "publishing"
-	tasks = listOf(
-		"publishIbis-adminPublicationToMavenLocal",
-		"publishIbis-corePublicationToMavenLocal",
-		"publishIbis-swpPublicationToMavenLocal",
-		"publishIbisPublicationToMavenLocal",
-		"publishSwp-nettyPublicationToMavenLocal",
-		"publishSwpPublicationToMavenLocal"
-	)
-}
+plugins {
+	java
+	jacoco
+	`maven-publish`
+	id("org.springframework.boot") version "3.4.4"
+	id("io.spring.dependency-management") version "1.1.7"
+	id("io.freefair.javadoc-links") version "8.13"
+	id("io.freefair.javadoc-utf-8") version "8.13"
+	id("io.freefair.lombok")        version "8.13"
+	id("com.github.ben-manes.versions") version "0.52.0"
+	id("me.qoomon.git-versioning") version "6.4.4"
+}
+
+group = "ru.digilabs.alkir"
+
+gitVersioning.apply {
+	refs {
+		considerTagsOnBranches = true
+		tag("v(?<tagVersion>[0-9].*)") {
+			version = "\${ref.tagVersion}\${dirty:-SNAPSHOT}"
+		}
+		branch(".+") {
+			version = "\${ref}-\${commit.short}\${dirty:-SNAPSHOT}"
+		}
+	}
+
+	rev {
+		version = "\${commit.short}\${dirty:-SNAPSHOT}"
+	}
+}
+
+java {
+	sourceCompatibility = JavaVersion.VERSION_17
+}
+
+tasks.withType<JavaCompile> {
+	options.encoding = "UTF-8"
+	options.compilerArgs.add("-Xlint:unchecked")
+	options.compilerArgs.add("-Xlint:deprecation")
+	options.compilerArgs.add("-parameters")
+}
+
+tasks.jar {
+	enabled = false
+}
+
+configurations {
+	compileOnly {
+		extendsFrom(annotationProcessor.get())
+	}
+}
+
+repositories {
+	mavenLocal()
+	mavenCentral()
+	maven("https://jitpack.io")
+}
+
+extra["springBootAdminVersion"] = "3.4.5"
+extra["springDocVersion"] = "2.8.5"
+extra["picocliVersion"] = "4.7.6"
+
+dependencies {
+	implementation("org.springframework.boot:spring-boot-starter-actuator")
+	implementation("org.springframework.boot:spring-boot-starter-aop")
+	implementation("org.springframework.boot:spring-boot-starter-web")
+	implementation("org.springframework.boot:spring-boot-starter-validation")
+	implementation("org.springframework.boot:spring-boot-starter-security")
+	implementation("org.springframework.security:spring-security-oauth2-resource-server")
+	implementation("org.springframework.retry:spring-retry")
+
+	annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
+
+	implementation("de.codecentric:spring-boot-admin-starter-server")
+	implementation("de.codecentric:spring-boot-admin-starter-client")
+
+	implementation("info.picocli:picocli-spring-boot-starter:${property("picocliVersion")}")
+	annotationProcessor("info.picocli:picocli-codegen:${property("picocliVersion")}")
+
+	implementation("com.github.LimeChain:jsonrpc4j:1.7.0")
+	implementation("javax.jws:javax.jws-api:1.1")
+
+	implementation("org.springdoc", "springdoc-openapi-starter-webmvc-ui", "${property("springDocVersion")}")
+	implementation("org.springdoc", "springdoc-openapi-starter-webmvc-api", "${property("springDocVersion")}")
+
+	implementation("org.jboss.netty", "netty", "3.2.10.Final")
+
+	implementation("com._1c.v8", "core", "1.0.2")
+	implementation("com._1c.v8", "ibis.admin", "1.6.8")
+	implementation("com._1c.v8", "ibis", "1.1.1")
+	implementation("com._1c.v8", "ibis.swp", "1.1.1")
+	implementation("com._1c.v8", "swp", "1.0.2")
+	implementation("com._1c.v8", "swp.netty", "1.0.2")
+
+	implementation("org.awaitility", "awaitility", "4.3.0")
+
+	testImplementation("org.springframework.boot:spring-boot-starter-test")
+}
+
+dependencyManagement {
+	imports {
+		mavenBom("de.codecentric:spring-boot-admin-dependencies:${property("springBootAdminVersion")}")
+	}
+}
+
+tasks.test {
+	useJUnitPlatform()
+
+	testLogging {
+		events("passed", "skipped", "failed", "standard_error")
+	}
+
+	reports {
+		html.required.set(true)
+	}
+}
+
+tasks.check {
+	dependsOn(tasks.jacocoTestReport)
+}
+
+tasks.jacocoTestReport {
+	reports {
+		xml.required.set(true)
+		xml.outputLocation.set(File("${layout.buildDirectory.get()}/reports/jacoco/test/jacoco.xml"))
+	}
+}
+
+publishing {
+	publications {
+		create<MavenPublication>("ibis-core") {
+			artifact(file("ibis/lib/com._1c.v8.core-1.0.2.jar")) {
+				groupId = "com._1c.v8"
+				artifactId = "core"
+				version = "1.0.2"
+			}
+		}
+		create<MavenPublication>("ibis-admin") {
+			artifact(file("ibis/lib/com._1c.v8.ibis.admin-1.6.8.jar")) {
+				groupId = "com._1c.v8"
+				artifactId = "ibis.admin"
+				version = "1.6.8"
+			}
+		}
+		create<MavenPublication>("ibis-swp") {
+			artifact(file("ibis/lib/com._1c.v8.ibis.swp-1.1.1.jar")) {
+				groupId = "com._1c.v8"
+				artifactId = "ibis.swp"
+				version = "1.1.1"
+			}
+		}
+		create<MavenPublication>("ibis") {
+			artifact(file("ibis/lib/com._1c.v8.ibis-1.1.1.jar")) {
+				groupId = "com._1c.v8"
+				artifactId = "ibis"
+				version = "1.1.1"
+			}
+		}
+		create<MavenPublication>("swp-netty") {
+			artifact(file("ibis/lib/com._1c.v8.swp.netty-1.0.2.jar")) {
+				groupId = "com._1c.v8"
+				artifactId = "swp.netty"
+				version = "1.0.2"
+			}
+		}
+		create<MavenPublication>("swp") {
+			artifact(file("ibis/lib/com._1c.v8.swp-1.0.2.jar")) {
+				groupId = "com._1c.v8"
+				artifactId = "swp"
+				version = "1.0.2"
+			}
+		}
+	}
+}
+
+tasks.register<GradleBuild>("publishIbisToMavenLocal") {
+	group = "publishing"
+	tasks = listOf(
+		"publishIbis-adminPublicationToMavenLocal",
+		"publishIbis-corePublicationToMavenLocal",
+		"publishIbis-swpPublicationToMavenLocal",
+		"publishIbisPublicationToMavenLocal",
+		"publishSwp-nettyPublicationToMavenLocal",
+		"publishSwpPublicationToMavenLocal"
+	)
+}
diff --git a/src/main/java/ru/digilabs/alkir/rahc/RahcApplication.java b/src/main/java/ru/digilabs/alkir/rahc/RahcApplication.java
index c50e990..db77778 100644
--- a/src/main/java/ru/digilabs/alkir/rahc/RahcApplication.java
+++ b/src/main/java/ru/digilabs/alkir/rahc/RahcApplication.java
@@ -37,7 +37,7 @@
     header = "@|green Alkir RAHC|@")
 public class RahcApplication implements ExitCodeGenerator {
 
-    private static final String DEFAULT_COMMAND = "web";
+    private static final String DEFAULT_COMMAND = "cli";
 
     private final CommandLine.IFactory picocliFactory;
 
diff --git a/src/main/java/ru/digilabs/alkir/rahc/command/CliCommand.java b/src/main/java/ru/digilabs/alkir/rahc/command/CliCommand.java
index 6c08eb2..329b5aa 100644
--- a/src/main/java/ru/digilabs/alkir/rahc/command/CliCommand.java
+++ b/src/main/java/ru/digilabs/alkir/rahc/command/CliCommand.java
@@ -3,32 +3,30 @@
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Component;
-import picocli.CommandLine;
 import picocli.CommandLine.Command;
 import picocli.CommandLine.Mixin;
-import picocli.CommandLine.Option;
-import picocli.CommandLine.Parameters;
-import picocli.CommandLine.ScopeType;
+import ru.digilabs.alkir.rahc.command.cli.ClusterManagerSubcommand;
 import ru.digilabs.alkir.rahc.command.cli.ClusterSubcommand;
-import ru.digilabs.alkir.rahc.command.cli.RasLocation;
-import ru.digilabs.alkir.rahc.dto.ConnectionDTO;
-
-import java.util.concurrent.Callable;
-
-import static picocli.CommandLine.Help.Visibility.ALWAYS;
+import ru.digilabs.alkir.rahc.command.cli.SessionSubcommand;
+import ru.digilabs.alkir.rahc.command.cli.options.CommonRasOptions;
 
 @Command(
     name = "cli",
     subcommands = {
         ClusterSubcommand.class,
+        ClusterManagerSubcommand.class,
+        SessionSubcommand.class,
     },
     description = "Run RAHC CLI",
     usageHelpAutoWidth = true,
+    mixinStandardHelpOptions = true,
+    sortOptions = false,
     footer = "@|green Copyright(c) 2022-2025|@"
 )
 @Component
 @RequiredArgsConstructor
 public class CliCommand {
     @Mixin
-    private RasLocation rasLocation;
+    @Getter
+    private CommonRasOptions commonRasOptions;
 }
diff --git a/src/main/java/ru/digilabs/alkir/rahc/command/WebCommand.java b/src/main/java/ru/digilabs/alkir/rahc/command/WebCommand.java
index c157e3c..b604065 100644
--- a/src/main/java/ru/digilabs/alkir/rahc/command/WebCommand.java
+++ b/src/main/java/ru/digilabs/alkir/rahc/command/WebCommand.java
@@ -2,9 +2,7 @@
 
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Component;
-import picocli.CommandLine;
 import picocli.CommandLine.Command;
-import picocli.CommandLine.Option;
 
 import java.util.concurrent.Callable;
 
@@ -12,6 +10,8 @@
     name = "web",
     description = "Run RAHC Web server",
     usageHelpAutoWidth = true,
+    mixinStandardHelpOptions = true,
+    sortOptions = false,
     footer = "@|green Copyright(c) 2022-2025|@"
 )
 @Component
diff --git a/src/main/java/ru/digilabs/alkir/rahc/command/cli/ClusterManagerSubcommand.java b/src/main/java/ru/digilabs/alkir/rahc/command/cli/ClusterManagerSubcommand.java
new file mode 100644
index 0000000..eb809ce
--- /dev/null
+++ b/src/main/java/ru/digilabs/alkir/rahc/command/cli/ClusterManagerSubcommand.java
@@ -0,0 +1,65 @@
+package ru.digilabs.alkir.rahc.command.cli;
+
+import com._1c.v8.ibis.admin.IClusterManagerInfo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+import picocli.CommandLine.Command;
+import picocli.CommandLine.Mixin;
+import picocli.CommandLine.Option;
+import ru.digilabs.alkir.rahc.command.cli.options.ClusterAdminOptions;
+import ru.digilabs.alkir.rahc.service.RacServiceProvider;
+
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.UUID;
+
+@Command(
+    name = "cluster-manager",
+    description = "Cluster manager administration"
+)
+@Component
+@RequiredArgsConstructor
+public class ClusterManagerSubcommand extends RasCliCommand {
+
+    private @Mixin ClusterAdminOptions clusterAdminOptions;
+
+    private final RacServiceProvider racServiceProvider;
+    private final PrintWriter printWriter;
+
+    @Command(
+        description = "get the cluster manager information list",
+        usageHelpAutoWidth = true,
+        mixinStandardHelpOptions = true,
+        sortOptions = false
+    )
+    public void list() {
+        var connection = getCommonRasOptions().toConnectionDTO(clusterAdminOptions);
+
+        try (var racService = racServiceProvider.getRacService(connection)) {
+            List<IClusterManagerInfo> clusterManagers = racService.getClusterManagers(clusterAdminOptions.getClusterId());
+            printWriter.println(clusterManagers);
+        }
+    }
+
+    @Command(
+        description = "get the cluster manager information",
+        usageHelpAutoWidth = true,
+        mixinStandardHelpOptions = true,
+        sortOptions = false
+    )
+    public void info(
+        @Option(
+            names = "--cluster-manager-id",
+            description = "server cluster manager identifier (UUID)",
+            required = true
+        ) UUID clusterManagerId
+    ) {
+        var connection = getCommonRasOptions().toConnectionDTO(clusterAdminOptions);
+
+        try (var racService = racServiceProvider.getRacService(connection)) {
+            IClusterManagerInfo clusterManagerInfo = racService.getClusterManagerInfo(clusterAdminOptions.getClusterId(), clusterManagerId);
+            printWriter.println(clusterManagerInfo);
+        }
+    }
+
+}
diff --git a/src/main/java/ru/digilabs/alkir/rahc/command/cli/ClusterSubcommand.java b/src/main/java/ru/digilabs/alkir/rahc/command/cli/ClusterSubcommand.java
index be1b127..c15cbc9 100644
--- a/src/main/java/ru/digilabs/alkir/rahc/command/cli/ClusterSubcommand.java
+++ b/src/main/java/ru/digilabs/alkir/rahc/command/cli/ClusterSubcommand.java
@@ -1,51 +1,60 @@
 package ru.digilabs.alkir.rahc.command.cli;
 
 import com._1c.v8.ibis.admin.IClusterInfo;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.RequiredArgsConstructor;
-import lombok.SneakyThrows;
 import org.springframework.stereotype.Component;
 import picocli.CommandLine.Command;
-import picocli.CommandLine.Mixin;
-import ru.digilabs.alkir.rahc.dto.ConnectionDTO;
+import picocli.CommandLine.Option;
 import ru.digilabs.alkir.rahc.service.RacServiceProvider;
 
+import java.io.PrintWriter;
 import java.util.List;
+import java.util.UUID;
 
 @Command(
     name = "cluster",
-    description = "cluster command",
-    usageHelpAutoWidth = true,
-    mixinStandardHelpOptions = true,
-    sortOptions = false,
-    footer = "@|green Copyright(c) 2022-2025|@"
+    description = "Cluster administration"
 )
 @Component
 @RequiredArgsConstructor
-public class ClusterSubcommand {
-
-    @Mixin
-    private RasLocation rasLocation;
+public class ClusterSubcommand extends RasCliCommand {
 
     private final RacServiceProvider racServiceProvider;
-    private final ObjectMapper objectMapper;
+    private final PrintWriter printWriter;
 
     @Command(
+        description = "get the cluster information list",
         usageHelpAutoWidth = true,
         mixinStandardHelpOptions = true,
         sortOptions = false
     )
-    @SneakyThrows
-    public void list(@Mixin RasLocation rasLocation) {
-        var connection = new ConnectionDTO();
-        connection.setAddress(rasLocation.getAddress());
-        connection.setPort(rasLocation.getPort());
-        connection.setCentralServerAdminUsername(rasLocation.getCentralServerAdminUsername());
-        connection.setCentralServerAdminPassword(rasLocation.getCentralServerAdminPassword());
+    public void list() {
+        var connection = getCommonRasOptions().toConnectionDTO();
 
         try (var racService = racServiceProvider.getRacService(connection)) {
             List<IClusterInfo> clusters = racService.getClusters();
-            System.out.println(objectMapper.writeValueAsString(clusters));
+            printWriter.println(clusters);
+        }
+    }
+
+    @Command(
+        description = "get the cluster information",
+        usageHelpAutoWidth = true,
+        mixinStandardHelpOptions = true,
+        sortOptions = false
+    )
+    public void info(
+        @Option(
+            names = "--cluster-id",
+            description = "server cluster identifier (UUID)",
+            required = true
+        ) UUID clusterId
+    ) {
+        var connection = getCommonRasOptions().toConnectionDTO();
+
+        try (var racService = racServiceProvider.getRacService(connection)) {
+            IClusterInfo clusterInfo = racService.getClusterInfo(clusterId);
+            printWriter.println(clusterInfo);
         }
     }
 
diff --git a/src/main/java/ru/digilabs/alkir/rahc/command/cli/RacCliSubCommand.java b/src/main/java/ru/digilabs/alkir/rahc/command/cli/RacCliSubCommand.java
new file mode 100644
index 0000000..91d09a9
--- /dev/null
+++ b/src/main/java/ru/digilabs/alkir/rahc/command/cli/RacCliSubCommand.java
@@ -0,0 +1,36 @@
+package ru.digilabs.alkir.rahc.command.cli;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.SneakyThrows;
+import org.springframework.stereotype.Component;
+import picocli.CommandLine.Command;
+
+import java.io.PrintWriter;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Command(
+    usageHelpAutoWidth = true,
+    mixinStandardHelpOptions = true,
+    sortOptions = false
+)
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+public @interface RacCliSubCommand {
+    @Component
+    class ConsolePrintWriter extends PrintWriter {
+        private final ObjectMapper objectMapper;
+
+        public ConsolePrintWriter(ObjectMapper objectMapper) {
+            super(System.out);
+            this.objectMapper = objectMapper;
+        }
+
+        @Override
+        @SneakyThrows
+        public void println(Object object) {
+            super.println(objectMapper.writeValueAsString(object));
+        }
+    }
+}
diff --git a/src/main/java/ru/digilabs/alkir/rahc/command/cli/RasCliCommand.java b/src/main/java/ru/digilabs/alkir/rahc/command/cli/RasCliCommand.java
new file mode 100644
index 0000000..211ff95
--- /dev/null
+++ b/src/main/java/ru/digilabs/alkir/rahc/command/cli/RasCliCommand.java
@@ -0,0 +1,22 @@
+package ru.digilabs.alkir.rahc.command.cli;
+
+import picocli.CommandLine.Command;
+import picocli.CommandLine.ParentCommand;
+import ru.digilabs.alkir.rahc.command.CliCommand;
+import ru.digilabs.alkir.rahc.command.cli.options.CommonRasOptions;
+
+@Command(
+    usageHelpAutoWidth = true,
+    mixinStandardHelpOptions = true,
+    sortOptions = false,
+    footer = "@|green Copyright(c) 2022-2025|@"
+)
+public abstract class RasCliCommand {
+
+    @ParentCommand
+    CliCommand parentCommand;
+
+    protected CommonRasOptions getCommonRasOptions() {
+        return parentCommand.getCommonRasOptions();
+    }
+}
diff --git a/src/main/java/ru/digilabs/alkir/rahc/command/cli/RasLocation.java b/src/main/java/ru/digilabs/alkir/rahc/command/cli/RasLocation.java
deleted file mode 100644
index c9d285c..0000000
--- a/src/main/java/ru/digilabs/alkir/rahc/command/cli/RasLocation.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package ru.digilabs.alkir.rahc.command.cli;
-
-import lombok.Getter;
-import picocli.CommandLine.Option;
-
-import java.util.Optional;
-
-import static picocli.CommandLine.Help.Visibility.ALWAYS;
-
-public class RasLocation {
-
-    @Option(
-        names = {"--address"},
-        order = 0,
-        showDefaultValue = ALWAYS
-    )
-    @Getter
-    private static String address = "localhost";
-
-    @Option(
-        names = {"--port"},
-        order = 1,
-        showDefaultValue = ALWAYS
-    )
-    @Getter
-    private static int port = 1545;
-
-    @Option(
-        names = {"--central-server-usr"},
-        order = 10
-    )
-    @Getter
-    private static Optional<String> centralServerAdminUsername;
-
-    @Option(
-        names = {"--central-server-pwd"},
-        order = 20
-    )
-    @Getter
-    private static Optional<String> centralServerAdminPassword;
-
-}
diff --git a/src/main/java/ru/digilabs/alkir/rahc/command/cli/SessionSubcommand.java b/src/main/java/ru/digilabs/alkir/rahc/command/cli/SessionSubcommand.java
new file mode 100644
index 0000000..d2c4bce
--- /dev/null
+++ b/src/main/java/ru/digilabs/alkir/rahc/command/cli/SessionSubcommand.java
@@ -0,0 +1,42 @@
+package ru.digilabs.alkir.rahc.command.cli;
+
+import com._1c.v8.ibis.admin.ISessionInfo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+import picocli.CommandLine.Command;
+import picocli.CommandLine.Mixin;
+import ru.digilabs.alkir.rahc.command.cli.options.ClusterAdminOptions;
+import ru.digilabs.alkir.rahc.service.RacServiceProvider;
+
+import java.io.PrintWriter;
+import java.util.List;
+
+@Command(
+    name = "session",
+    description = "Infobase session administration"
+)
+@Component
+@RequiredArgsConstructor
+public class SessionSubcommand extends RasCliCommand {
+
+    private @Mixin ClusterAdminOptions clusterAdminOptions;
+
+    private final RacServiceProvider racServiceProvider;
+    private final PrintWriter printWriter;
+
+    @Command(
+        description = "get the session list",
+        usageHelpAutoWidth = true,
+        mixinStandardHelpOptions = true,
+        sortOptions = false
+    )
+    public void list() {
+        var connection = getCommonRasOptions().toConnectionDTO(clusterAdminOptions);
+
+        try (var racService = racServiceProvider.getRacService(connection)) {
+            List<ISessionInfo> clusterManagers = racService.getSessions(clusterAdminOptions.getClusterId());
+            printWriter.println(clusterManagers);
+        }
+    }
+
+}
diff --git a/src/main/java/ru/digilabs/alkir/rahc/command/cli/options/ClusterAdminOptions.java b/src/main/java/ru/digilabs/alkir/rahc/command/cli/options/ClusterAdminOptions.java
new file mode 100644
index 0000000..9777f91
--- /dev/null
+++ b/src/main/java/ru/digilabs/alkir/rahc/command/cli/options/ClusterAdminOptions.java
@@ -0,0 +1,46 @@
+package ru.digilabs.alkir.rahc.command.cli.options;
+
+import picocli.CommandLine;
+import picocli.CommandLine.Option;
+
+import java.util.Optional;
+import java.util.UUID;
+
+public class ClusterAdminOptions {
+
+    @Option(
+        names = "--cluster-id",
+        description = "server cluster identifier (UUID)",
+        // TODO: required = true does not work with @MixIn
+        required = true,
+        order = -90,
+        scope = CommandLine.ScopeType.INHERIT
+    )
+    private static UUID clusterId;
+
+    @Option(
+        names = {"--cluster-usr"},
+        order = -89,
+        scope = CommandLine.ScopeType.INHERIT
+    )
+    private static Optional<String> clusterAdminUsername = Optional.empty();
+
+    @Option(
+        names = {"--cluster-pwd"},
+        order = -88,
+        scope = CommandLine.ScopeType.INHERIT
+    )
+    private static Optional<String> clusterAdminPassword = Optional.empty();
+
+    public UUID getClusterId() {
+        return clusterId;
+    }
+
+    public Optional<String> getClusterAdminUsername() {
+        return clusterAdminUsername;
+    }
+
+    public Optional<String> getClusterAdminPassword() {
+        return clusterAdminPassword;
+    }
+}
diff --git a/src/main/java/ru/digilabs/alkir/rahc/command/cli/options/CommonRasOptions.java b/src/main/java/ru/digilabs/alkir/rahc/command/cli/options/CommonRasOptions.java
new file mode 100644
index 0000000..cfed7f9
--- /dev/null
+++ b/src/main/java/ru/digilabs/alkir/rahc/command/cli/options/CommonRasOptions.java
@@ -0,0 +1,78 @@
+package ru.digilabs.alkir.rahc.command.cli.options;
+
+import picocli.CommandLine;
+import picocli.CommandLine.Option;
+import ru.digilabs.alkir.rahc.dto.ConnectionDTO;
+
+import java.util.Optional;
+
+import static picocli.CommandLine.Help.Visibility.ALWAYS;
+
+public class CommonRasOptions {
+
+    @Option(
+        names = {"--address"},
+        order = -110,
+        showDefaultValue = ALWAYS,
+        scope = CommandLine.ScopeType.INHERIT
+    )
+    private static String address = "localhost";
+
+    @Option(
+        names = {"--port"},
+        order = -109,
+        showDefaultValue = ALWAYS,
+        scope = CommandLine.ScopeType.INHERIT
+    )
+    private static int port = 1545;
+
+    @Option(
+        names = {"--central-server-usr"},
+        order = -100,
+        scope = CommandLine.ScopeType.INHERIT
+    )
+    private static Optional<String> centralServerAdminUsername = Optional.empty();
+
+    @Option(
+        names = {"--central-server-pwd"},
+        order = -99,
+        scope = CommandLine.ScopeType.INHERIT
+    )
+    private static Optional<String> centralServerAdminPassword = Optional.empty();
+
+    public String getAddress() {
+        return address;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public Optional<String> getCentralServerAdminUsername() {
+        return centralServerAdminUsername;
+    }
+
+    public Optional<String> getCentralServerAdminPassword() {
+        return centralServerAdminPassword;
+    }
+
+    public ConnectionDTO toConnectionDTO() {
+        var connectionDTO = new ConnectionDTO();
+        connectionDTO
+            .setAddress(getAddress())
+            .setPort(getPort())
+            .setCentralServerAdminUsername(getCentralServerAdminUsername())
+            .setCentralServerAdminPassword(getCentralServerAdminPassword());
+
+        return connectionDTO;
+    }
+
+    public ConnectionDTO toConnectionDTO(ClusterAdminOptions clusterAdminOptions) {
+        var connectionDTO = toConnectionDTO();
+        connectionDTO
+            .setClusterAdminUsername(clusterAdminOptions.getClusterAdminUsername())
+            .setClusterAdminPassword(clusterAdminOptions.getClusterAdminPassword());
+
+        return connectionDTO;
+    }
+}
diff --git a/src/main/java/ru/digilabs/alkir/rahc/dto/ConnectionDTO.java b/src/main/java/ru/digilabs/alkir/rahc/dto/ConnectionDTO.java
index 78245e6..c6835e5 100644
--- a/src/main/java/ru/digilabs/alkir/rahc/dto/ConnectionDTO.java
+++ b/src/main/java/ru/digilabs/alkir/rahc/dto/ConnectionDTO.java
@@ -4,11 +4,13 @@
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Positive;
 import lombok.Data;
+import lombok.experimental.Accessors;
 import ru.digilabs.alkir.rahc.configuration.RasConfigurationProperties;
 
 import java.util.Optional;
 
 @Data
+@Accessors(chain = true)
 public class ConnectionDTO {
     @NotBlank
     String address;
diff --git a/src/main/java/ru/digilabs/alkir/rahc/service/RacService.java b/src/main/java/ru/digilabs/alkir/rahc/service/RacService.java
index 40d0582..7da5894 100644
--- a/src/main/java/ru/digilabs/alkir/rahc/service/RacService.java
+++ b/src/main/java/ru/digilabs/alkir/rahc/service/RacService.java
@@ -98,6 +98,12 @@ public List<IClusterInfo> getClusters() {
         return connection.getClusters();
     }
 
+    @RetryableRacMethod
+    public IClusterInfo getClusterInfo(UUID clusterId) {
+        checkConnection();
+        return connection.getClusterInfo(clusterId);
+    }
+
     @RetryableRacMethod
     public UUID editCluster(IClusterInfo clusterInfo) {
         checkConnection();


Reviews:
user: login: nixel2007
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-26T19:51:06Z
user: login: nixel2007
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-26T19:54:30Z
user: login: nixel2007
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-26T20:38:39Z
user: login: nixel2007
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-26T20:47:19Z

Review comments:
diff_hunk: @@ -37,7 +37,7 @@
     header = "@|green Alkir RAHC|@")
 public class RahcApplication implements ExitCodeGenerator {
 
-    private static final String DEFAULT_COMMAND = "web";
+    private static final String DEFAULT_COMMAND = "cli";
path: src/main/java/ru/digilabs/alkir/rahc/RahcApplication.java
user: login: nixel2007
body: todo: откатить
created_at: 2025-03-26T19:51:06Z
author_association: COLLABORATOR
diff_hunk: @@ -37,7 +37,7 @@
     header = "@|green Alkir RAHC|@")
 public class RahcApplication implements ExitCodeGenerator {
 
-    private static final String DEFAULT_COMMAND = "web";
+    private static final String DEFAULT_COMMAND = "cli";
path: src/main/java/ru/digilabs/alkir/rahc/RahcApplication.java
user: login: nixel2007
body: ```suggestion
    private static final String DEFAULT_COMMAND = "web";
```
created_at: 2025-03-26T19:54:29Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,36 @@
+package ru.digilabs.alkir.rahc.command.cli;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.SneakyThrows;
+import org.springframework.stereotype.Component;
+import picocli.CommandLine.Command;
+
+import java.io.PrintWriter;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Command(
+    usageHelpAutoWidth = true,
+    mixinStandardHelpOptions = true,
+    sortOptions = false
+)
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+public @interface RacCliSubCommand {
+    @Component
+    class ConsolePrintWriter extends PrintWriter {
path: src/main/java/ru/digilabs/alkir/rahc/command/cli/RacCliSubCommand.java
user: login: nixel2007
body: Todo: промахнулся при переносе класса, надо вынести в отдельный файл 
created_at: 2025-03-26T20:38:39Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,46 @@
+package ru.digilabs.alkir.rahc.command.cli.options;
+
+import picocli.CommandLine;
+import picocli.CommandLine.Option;
+
+import java.util.Optional;
+import java.util.UUID;
+
+public class ClusterAdminOptions {
+
+    @Option(
+        names = "--cluster-id",
+        description = "server cluster identifier (UUID)",
+        // TODO: required = true does not work with @MixIn
+        required = true,
+        order = -90,
+        scope = CommandLine.ScopeType.INHERIT
+    )
+    private static UUID clusterId;
path: src/main/java/ru/digilabs/alkir/rahc/command/cli/options/ClusterAdminOptions.java
user: login: nixel2007
body: Todo: @mixin на поле ClusterId тут и в ClusterSubCommand#info
created_at: 2025-03-26T20:47:19Z
author_association: COLLABORATOR

PR comments:
user: login: nixel2007
created_at: 2025-03-26T20:09:55Z
body: @coderabbitai full review
author_association: COLLABORATOR
user: login: coderabbitai[bot]
created_at: 2025-03-26T20:10:03Z
body: <!-- This is an auto-generated reply by CodeRabbit -->
<details>
<summary>:white_check_mark: Actions performed</summary>

Full review triggered.

</details>
author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-03-26T20:10:06Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- This is an auto-generated comment: failure by coderabbit.ai -->

> [!CAUTION]
> ## Review failed
> 
> The pull request is closed.

<!-- end of auto-generated comment: failure by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough
This update revises the build script and refines the application's CLI functionality. The build file now uses updated version properties for Spring Boot and additional libraries. The default command in the main application has been switched from "web" to "cli", effectively disabling web mode. Several CLI subcommands and support classes have been introduced or refactored (including the removal of an obsolete options class), along with new options classes and enhancements to output formatting and service calls, such as retrieving cluster information with retry logic.

## Changes

| File(s) | Change Summary |
|---------|----------------|
| `build.gradle.kts` | Updated Spring Boot from 3.4.3 to 3.4.4; added properties `springDocVersion` and `picocliVersion`; updated dependencies to reference new version properties and added an annotationProcessor for `picocli-codegen`. |
| `src/.../RahcApplication.java` | Changed `DEFAULT_COMMAND` from `"web"` to `"cli"`, altering application startup to disable web mode. |
| `src/.../command/{CliCommand.java, WebCommand.java}` | Adjusted CLI configurations: in `CliCommand`, replaced `RasLocation` with `CommonRasOptions`; in `WebCommand`, added `mixinStandardHelpOptions` and `sortOptions` adjustments. |
| `src/.../command/cli/{ClusterManagerSubcommand.java, ClusterSubcommand.java, RacCliSubCommand.java, RasCliCommand.java, SessionSubcommand.java, RasLocation.java}` | Introduced new CLI subcommands (`ClusterManagerSubcommand`, `SessionSubcommand`), updated `ClusterSubcommand` (now extends `RasCliCommand` with an added `info` method), added abstract base class `RasCliCommand` and CLI annotation interface `RacCliSubCommand`, and removed the obsolete `RasLocation` class. |
| `src/.../command/cli/options/{ClusterAdminOptions.java, CommonRasOptions.java}` | Added new options classes: `ClusterAdminOptions` for administering clusters and `CommonRasOptions` for shared connection properties, including methods to generate a `ConnectionDTO`. |
| `src/.../dto/ConnectionDTO.java`, `src/.../service/RacService.java` | Enhanced `ConnectionDTO` with chained setters via `@Accessors(chain = true)` and added a new retry-enabled method `getClusterInfo(UUID)` in `RacService` to fetch cluster information. |

## Sequence Diagram(s)
```mermaid
sequenceDiagram
  participant App as RahcApplication
  participant CLI as CliCommand
  participant Sub as CLI Subcommand
  participant Options as CommonRasOptions
  participant Service as RacService

  App->>CLI: Start application (default "cli")
  CLI->>Sub: Route command based on user input
  Sub->>Options: Retrieve connection options
  Sub->>Service: Invoke service method (e.g., list/info)
  Service-->>Sub: Return cluster/session info
  Sub->>CLI: Output results via PrintWriter
```

## Poem
> I'm a hopping rabbit full of cheer,  
> Leaping through CLI commands without fear.  
> From build scripts to subcommands new,  
> My little paws dance at each breakthrough.  
> With carrots and code, I celebrate this day!  
> (\_/)(•‿•)   Happy hops all the way!

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->

---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between b3f798f562aa5b434dcf848398305e753bb33315 and 9c913676be5d8fa85442b799c29fe22dc33f32a8.

</details>

<details>
<summary>📒 Files selected for processing (14)</summary>

* `build.gradle.kts` (1 hunks)
* `src/main/java/ru/digilabs/alkir/rahc/RahcApplication.java` (1 hunks)
* `src/main/java/ru/digilabs/alkir/rahc/command/CliCommand.java` (1 hunks)
* `src/main/java/ru/digilabs/alkir/rahc/command/WebCommand.java` (1 hunks)
* `src/main/java/ru/digilabs/alkir/rahc/command/cli/ClusterManagerSubcommand.java` (1 hunks)
* `src/main/java/ru/digilabs/alkir/rahc/command/cli/ClusterSubcommand.java` (1 hunks)
* `src/main/java/ru/digilabs/alkir/rahc/command/cli/RacCliSubCommand.java` (1 hunks)
* `src/main/java/ru/digilabs/alkir/rahc/command/cli/RasCliCommand.java` (1 hunks)
* `src/main/java/ru/digilabs/alkir/rahc/command/cli/RasLocation.java` (0 hunks)
* `src/main/java/ru/digilabs/alkir/rahc/command/cli/SessionSubcommand.java` (1 hunks)
* `src/main/java/ru/digilabs/alkir/rahc/command/cli/options/ClusterAdminOptions.java` (1 hunks)
* `src/main/java/ru/digilabs/alkir/rahc/command/cli/options/CommonRasOptions.java` (1 hunks)
* `src/main/java/ru/digilabs/alkir/rahc/dto/ConnectionDTO.java` (1 hunks)
* `src/main/java/ru/digilabs/alkir/rahc/service/RacService.java` (1 hunks)

</details>

</details>
<!-- finishing_touch_checkbox_start -->

<details>
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Docstrings were successfully generated. (🔄  Check again to generate docstrings again)

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=DigiLabsru/alkir-rahc&utm_content=7):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai plan` to trigger planning for file edits and PR creation.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE
user: login: nixel2007
created_at: 2025-03-26T20:10:34Z
body: @coderabbitai summary 
author_association: COLLABORATOR
user: login: coderabbitai[bot]
created_at: 2025-03-26T20:10:43Z
body: <!-- This is an auto-generated reply by CodeRabbit -->
<details>
<summary>:white_check_mark: Actions performed</summary>

Summary regeneration triggered.

</details>
author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-03-26T20:18:02Z
body: > [!NOTE]
> Generated docstrings for this pull request at https://github.com/DigiLabsru/alkir-rahc/pull/8
author_association: NONE