using CommandLine;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using RedisManager.Utils;
namespace RedisManager.Commands
{
///
/// Contains command line options and implementations for Redis connection management operations.
/// Provides functionality for AUTH, QUIT, CLIENT LIST, CLIENT KILL, CLIENT GETNAME, and CLIENT SETNAME commands.
///
[Verb("auth", HelpText = "Authenticate to the server.")]
public class AuthOptions
{
[Option('i', "instance", Required = true, HelpText = "Instance name.")]
public string Instance { get; set; }
[Value(0, MetaName = "password", Required = true, HelpText = "Password.")]
public string Password { get; set; }
}
[Verb("quit", HelpText = "Close the connection.")]
public class QuitOptions
{
[Option('i', "instance", Required = true, HelpText = "Instance name.")]
public string Instance { get; set; }
}
[Verb("clientlist", HelpText = "Get the list of client connections.")]
public class ClientListOptions
{
[Option('i', "instance", Required = true, HelpText = "Instance name.")]
public string Instance { get; set; }
}
[Verb("clientkill", HelpText = "Kill a client connection.")]
public class ClientKillOptions
{
[Option('i', "instance", Required = true, HelpText = "Instance name.")]
public string Instance { get; set; }
[Value(0, MetaName = "client_id", Required = true, HelpText = "Client ID.")]
public string ClientId { get; set; }
}
[Verb("clientgetname", HelpText = "Get the current connection name.")]
public class ClientGetNameOptions
{
[Option('i', "instance", Required = true, HelpText = "Instance name.")]
public string Instance { get; set; }
}
[Verb("clientsetname", HelpText = "Set the current connection name.")]
public class ClientSetNameOptions
{
[Option('i', "instance", Required = true, HelpText = "Instance name.")]
public string Instance { get; set; }
[Value(0, MetaName = "name", Required = true, HelpText = "Connection name.")]
public string Name { get; set; }
}
public static class ConnectionCommands
{
///
/// Executes the AUTH command to authenticate to the server.
///
/// The AuthOptions containing instance and password.
/// The RedisManager configuration.
/// Exit code (0 for success, non-zero for failure).
public static int RunAuth(AuthOptions opts, Config config)
{
var instance = RedisUtils.GetInstance(config, opts.Instance);
using var redis = RedisUtils.ConnectRedis(instance);
var db = redis.GetDatabase();
db.Execute("AUTH", opts.Password);
Console.WriteLine(Output.Green("OK"));
return 0;
}
///
/// Executes the QUIT command to close the connection.
///
/// The QuitOptions containing instance.
/// The RedisManager configuration.
/// Exit code (0 for success, non-zero for failure).
public static int RunQuit(QuitOptions opts, Config config)
{
var instance = RedisUtils.GetInstance(config, opts.Instance);
using var redis = RedisUtils.ConnectRedis(instance);
var db = redis.GetDatabase();
db.Execute("QUIT");
Console.WriteLine(Output.Green("OK"));
return 0;
}
///
/// Executes the CLIENT LIST command to get the list of client connections.
///
/// The ClientListOptions containing instance.
/// The RedisManager configuration.
/// Exit code (0 for success, non-zero for failure).
public static int RunClientList(ClientListOptions opts, Config config)
{
var instance = RedisUtils.GetInstance(config, opts.Instance);
using var redis = RedisUtils.ConnectRedis(instance);
var db = redis.GetDatabase();
var result = db.Execute("CLIENT", "LIST");
Console.WriteLine(Output.Green(result.ToString()));
return 0;
}
///
/// Executes the CLIENT KILL command to kill a client connection.
///
/// The ClientKillOptions containing instance and client ID.
/// The RedisManager configuration.
/// Exit code (0 for success, non-zero for failure).
public static int RunClientKill(ClientKillOptions opts, Config config)
{
var instance = RedisUtils.GetInstance(config, opts.Instance);
using var redis = RedisUtils.ConnectRedis(instance);
var db = redis.GetDatabase();
db.Execute("CLIENT", "KILL", opts.ClientId);
Console.WriteLine(Output.Green("OK"));
return 0;
}
///
/// Executes the CLIENT GETNAME command to get the current connection name.
///
/// The ClientGetNameOptions containing instance.
/// The RedisManager configuration.
/// Exit code (0 for success, non-zero for failure).
public static int RunClientGetName(ClientGetNameOptions opts, Config config)
{
var instance = RedisUtils.GetInstance(config, opts.Instance);
using var redis = RedisUtils.ConnectRedis(instance);
var db = redis.GetDatabase();
var result = db.Execute("CLIENT", "GETNAME");
Console.WriteLine(Output.Green(result.ToString()));
return 0;
}
///
/// Executes the CLIENT SETNAME command to set the current connection name.
///
/// The ClientSetNameOptions containing instance and name.
/// The RedisManager configuration.
/// Exit code (0 for success, non-zero for failure).
public static int RunClientSetName(ClientSetNameOptions opts, Config config)
{
var instance = RedisUtils.GetInstance(config, opts.Instance);
using var redis = RedisUtils.ConnectRedis(instance);
var db = redis.GetDatabase();
db.Execute("CLIENT", "SETNAME", opts.Name);
Console.WriteLine(Output.Green("OK"));
return 0;
}
}
}