Beispiel #1
0
        public static string GetTableFromResource(PveClient client, string resource)
        {
            var result = client.Get(resource);
            var ret    = "";

            if (!result.IsSuccessStatusCode)
            {
                ret = result.ReasonPhrase;
            }
            else
            {
                var returnParameters = GetClassApiReturnParameters(resource);

                if (returnParameters == null || returnParameters.Count == 0)
                {
                    ret = TableHelper.CreateTable(result.Response.data);
                }
                else
                {
                    var keys = returnParameters.OrderBy(a => a.Optional)
                               .ThenBy(a => a.Name)
                               .Select(a => a.Name)
                               .ToArray();

                    ret = TableHelper.CreateTable(result.Response.data, keys, returnParameters);
                }
            }

            return(ret);
        }
Beispiel #2
0
 /// <summary>
 /// Return all nodes info.
 /// </summary>
 /// <param name="client"></param>
 /// <returns></returns>
 public static IReadOnlyList <NodeInfo> GetNodes(this PveClient client)
 => client.Nodes.GetRest()
 .ToEnumerable()
 .Select(a => new NodeInfo(client, a))
 .OrderBy(a => a.Node)
 .ToList()
 .AsReadOnly();
Beispiel #3
0
 /// <summary>
 /// List structure
 /// </summary>
 /// <param name="client"></param>
 /// <param name="classApiRoot"></param>
 /// <param name="resource"></param>
 /// <returns></returns>
 public static string List(PveClient client, ClassApi classApiRoot, string resource)
 {
     var(Values, Error) = ListValues(client, classApiRoot, resource);
     return(string.Join(Environment.NewLine, Values.Select(a => $"{a.Attribute}        {a.Value}")) +
            (string.IsNullOrWhiteSpace(Error) ? "" : Environment.NewLine + Error) +
            Environment.NewLine);
 }
Beispiel #4
0
        public static PveClient GetClient()
        {
            var client = new PveClient(Host, Port);

            client.Login(Username, Password);
            return(client);
        }
Beispiel #5
0
        /// <summary>
        /// Create file for SPICE client
        /// </summary>
        /// <param name="client"></param>
        /// <param name="vmIdOrName"></param>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static bool CreateFileSpaceClient(this PveClient client, string vmIdOrName, string fileName)
        {
            var ret = false;

            var vm = client.GetVM(vmIdOrName);

            if (vm != null && vm.Type == VMTypeEnum.Qemu)
            {
                var response = vm.QemuApi.Spiceproxy.Spiceproxy(client.Hostname);
                if (response.IsSuccessStatusCode)
                {
                    var data = response.Response.data;

                    var contests = $@"[virt-viewer]
host={data.host}
delete-this-file={DynamicHelper.GetValue(data, "delete-this-file")}
password={data.password}
title={data.title}
secure-attention={DynamicHelper.GetValue(data, "secure-attention")}
toggle-fullscreen={DynamicHelper.GetValue(data, "toggle-fullscreen")}
tls-port={DynamicHelper.GetValue(data, "tls-port")}
type={data.type}
release-cursor={DynamicHelper.GetValue(data, "release-cursor")}
host-subject={DynamicHelper.GetValue(data, "host-subject")}
proxy={data.proxy}
ca={data.ca}
";
                    File.WriteAllText(fileName, contests);
                    ret = true;
                }
            }

            return(ret);
        }
Beispiel #6
0
        internal StorageInfo(PveClient client, object apiData, StorageTypeEnum type) : base(client, apiData)
        {
            Type = type;
            DynamicHelper.CheckKeyOrCreate(apiData, "disable", "0");

            DynamicHelper.CheckKeyOrCreate(apiData, "nodes", "All");
            Nodes = ApiData.nodes.Split(',');
        }
        /// <summary>
        /// Get all vms info.
        /// </summary>
        /// <param name="client"></param>
        /// <returns></returns>
        public static VMInfo[] GetVMs(this PveClient client)
        {
            var vms = new List <VMInfo>();

            foreach (var vm in client.Cluster.Resources.GetRest("vm").Response.data)
            {
                vms.Add(new VMInfo(client, vm));
            }
            return(vms.OrderBy(a => a.Node).ThenBy(a => a.Id).ToArray());
        }
        /// <summary>
        /// Get vm info from id or name.
        /// </summary>
        /// <param name="client"></param>
        /// <param name="idOrName"></param>
        /// <returns></returns>
        public static VMInfo GetVM(this PveClient client, string idOrName)
        {
            var vm = GetVMs(client).Where(a => CheckIdOrName(a, idOrName)).FirstOrDefault();

            if (vm == null)
            {
                throw new ArgumentException($"VM/CT {idOrName} not found!");
            }
            return(vm);
        }
Beispiel #9
0
        /// <summary>
        /// Return node info from id.
        /// </summary>
        /// <param name="client"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        public static NodeInfo GetNode(this PveClient client, string name)
        {
            var node = GetNodes(client).Where(a => a.Node == name).FirstOrDefault();

            if (node == null)
            {
                throw new ArgumentException($"Node {name} not found!");
            }
            return(node);
        }
Beispiel #10
0
        /// <summary>
        /// Return all nodes info.
        /// </summary>
        /// <param name="client"></param>
        /// <returns></returns>
        public static IReadOnlyList <NodeInfo> GetNodes(this PveClient client)
        {
            var nodes = new List <NodeInfo>();

            foreach (var node in client.Nodes.GetRest().Response.data)
            {
                nodes.Add(new NodeInfo(client, node));
            }
            return(nodes.OrderBy(a => a.Node).ToList().AsReadOnly());
        }
Beispiel #11
0
        /// <summary>
        /// Sub commands
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="client"></param>
        /// <param name="classApiRoot"></param>
        internal static void SumCommands(CommandLineApplication parent,
                                         PveClient client,
                                         ClassApi classApiRoot)
        {
            Execute(parent, MethodType.Get, "Get (GET) from resource", client, classApiRoot);
            Execute(parent, MethodType.Set, "Set (PUT) from resource", client, classApiRoot);
            Execute(parent, MethodType.Create, "Create (POST) from resource", client, classApiRoot);
            Execute(parent, MethodType.Delete, "Delete (DELETE) from resource", client, classApiRoot);

            Usage(parent, classApiRoot);
            List(parent, client, classApiRoot);
        }
Beispiel #12
0
        private static void CreateCommandFromAlias(TextWriter output,
                                                   CommandLineApplication parent,
                                                   PveClient client,
                                                   ClassApi classApiRoot,
                                                   AliasManager aliasManager,
                                                   bool onlyResult)
        {
            foreach (var item in aliasManager.Alias)
            {
                parent.Command(item.Names[0], cmd =>
                {
                    foreach (var name in item.Names)
                    {
                        cmd.AddName(name);
                    }
                    cmd.Description      = item.Description;
                    cmd.ShowInHelpText   = false;
                    cmd.ExtendedHelpText = Environment.NewLine + "Alias command: " + item.Command;

                    //create argument
                    foreach (var arg in StringHelper.GetArgumentTags(item.Command))
                    {
                        cmd.Argument(arg, arg, false).IsRequired();
                    }

                    cmd.OnExecute(() =>
                    {
                        var title   = item.Description;
                        var command = item.Command;

                        //replace value into argument
                        foreach (var arg in cmd.Arguments)
                        {
                            title  += $" {arg.Name}: {arg.Value}";
                            command = command.Replace(StringHelper.CreateArgumentTag(arg.Name), arg.Value);
                        }

                        if (!onlyResult)
                        {
                            output.WriteLine(title);
                            output.WriteLine("Command: " + command);
                        }

                        ParseLine(output,
                                  command,
                                  client,
                                  classApiRoot,
                                  aliasManager,
                                  onlyResult);
                    });
                });
            }
        }
        /// <summary>
        /// Get vms from jolly.
        /// </summary>
        /// <param name="client"></param>
        /// <param name="jolly">all for all vm,
        /// <para>all-nodename all vm in host,</para>
        /// <para>vmid id vm</para>
        /// <para>Range 100:104 return vm with id in range</para>
        /// <para>start with '-' exclude vm</para>
        /// <para>comma reparated</para>
        /// </param>
        /// <returns></returns>
        public static VMInfo[] GetVMs(this PveClient client, string jolly)
        {
            var allVms = GetVMs(client);
            var ret    = new List <VMInfo>();

            foreach (var id in jolly.Split(','))
            {
                if (id == "all" || id == "@all")
                {
                    //all nodes
                    ret.AddRange(allVms);
                }
                else if (id.StartsWith("all-") || id.StartsWith("@all-"))
                {
                    //all in specific node
                    var idx = id.StartsWith("all-") ? 4 : 5;
                    ret.AddRange(allVms.Where(a => a.Node.ToLower() == id.ToLower().Substring(idx)));
                }
                else if (id.StartsWith("@pool-"))
                {
                    //all in specific pool
                    var poolName = id.ToLower().Substring(6);
                    var result   = client.Pools[poolName].GetRest();
                    if (result.IsSuccessStatusCode)
                    {
                        foreach (var item in result.Response.data.members)
                        {
                            if (item.type == "qemu" || item.type == "lxc")
                            {
                                ret.Add(allVms.Where(a => a.Id == item.vmid + "").SingleOrDefault());
                            }
                        }
                    }
                }
                else
                {
                    ret.AddRange(allVms.Where(a => VmCheckIdOrName(a, id)));
                }
            }

            ret = ret.Distinct().ToList();

            //exclude data
            foreach (var id in jolly.Split(',').Where(a => a.StartsWith("-")).Select(a => a.Substring(1)))
            {
                foreach (var item in allVms.Where(a => VmCheckIdOrName(a, id)))
                {
                    ret.Remove(item);
                }
            }

            return(ret.ToArray());
        }
Beispiel #14
0
        private static void List(CommandLineApplication parent, PveClient client, ClassApi classApiRoot)
        {
            parent.Command("ls", cmd =>
            {
                cmd.Description = "List child objects on <api_path>.";
                cmd.AddFullNameLogo();

                var argResource = CreateResourceArgument(cmd);
                cmd.OnExecute(() => Console.Out.Write(ApiExplorer.List(client ?? cmd.ClientTryLogin(),
                                                                       classApiRoot ?? GetClassApiRoot(parent),
                                                                       argResource.Value)));
            });
        }
Beispiel #15
0
        internal Disk(PveClient client, string id, string definition)
        {
            Client     = client;
            Id         = id;
            Definition = definition;
            Backup     = true;

            var data = definition.Split(':');

            Storage = data[0];

            data = data[1].Split(',');
            Name = data[0];
            Size = data.Where(a => a.StartsWith("size=")).Select(a => a.Substring(5)).FirstOrDefault();
        }
Beispiel #16
0
        /// <summary>
        /// Try login client api
        /// </summary>
        /// <param name="command"></param>
        /// <returns></returns>
        public static PveClient ClientTryLogin(this CommandLineApplication command)
        {
            var error = "Problem connection!";

            foreach (var host in GetHostAndPort(command))
            {
                using (var ping = new Ping())
                {
                    if (ping.Send(host.Host).Status != IPStatus.Success)
                    {
                        if (command.DebugIsActive())
                        {
                            command.Out.WriteLine($"Error: try login unknown host {host.Host}");
                        }
                        continue;
                    }
                }

                try
                {
                    var client = new PveClient(host.Host, host.Port);

                    //check enable debug
                    if (command.DebugIsActive())
                    {
                        client.DebugLevel = 99;
                    }

                    //try login
                    if (client.Login(command.GetOption(USERNAME_OPTION_NAME, true).Value(),
                                     GetPasswordFromOption(command)))
                    {
                        return(client);
                    }

                    if (!client.LastResult.IsSuccessStatusCode)
                    {
                        error += " " + client.LastResult.ReasonPhrase;
                    }
                }
                catch { }
            }

            throw new ApplicationException(error);
        }
Beispiel #17
0
        /// <summary>
        /// Get vms from jolly.
        /// </summary>
        /// <param name="client"></param>
        /// <param name="jolly">all for all vm,
        /// <para>all-nodename all vm in host,</para>
        /// <para>vmid id vm</para>
        /// <para>start with '-' exclude vm</para>
        /// <para>comma reparated</para></param>
        /// <returns></returns>
        public static VMInfo[] GetVMs(this PveClient client, string jolly)
        {
            var allVms = GetVMs(client);
            var ret    = new List <VMInfo>();

            foreach (var id in jolly.Split(','))
            {
                if (id == "all")
                {
                    //all nodes
                    ret.AddRange(allVms);
                }
                else if (id.StartsWith("all-"))
                {
                    //all in specific node
                    ret.AddRange(allVms.Where(a => a.Node.ToLower() == id.ToLower().Substring(4)));
                }
                else
                {
                    //specific id
                    var vm = allVms.Where(a => VmCheckIdOrName(a, id)).FirstOrDefault();
                    if (vm != null)
                    {
                        ret.Add(vm);
                    }
                }
            }

            //exclude data
            foreach (var id in jolly.Split(',').Where(a => a.StartsWith("-")).Select(a => a.Substring(1)))
            {
                var vm = allVms.Where(a => VmCheckIdOrName(a, id)).FirstOrDefault();
                if (vm != null)
                {
                    ret.Remove(vm);
                }
            }

            return(ret.Distinct().ToArray());
        }
Beispiel #18
0
        private static void Run(Options option)
        {
            var builder = new HostBuilder()
                          .UseConsoleLifetime();

            var host = builder.Build();

            using var serviceScope = host.Services.CreateScope();
            {
                var services = serviceScope.ServiceProvider;
                try
                {
                    var client = new PveClient(option.Host, option.Port);
                    if (!client.Login(option.Username, option.Password))
                    {
                        return;
                    }

                    if (option.isDebugger)
                    {
                        Console.WriteLine($"Connect to PVE[{option.Host}] with {option.Username}");
                    }

                    foreach (var vm in client.GetVMs())
                    {
                        vm.LxcApi.Vncproxy.CreateRest();
                        if (option.isDebugger)
                        {
                            Console.WriteLine($"Connect to [{vm.Node}]'s VM {vm.Name} ...{vm.Status}");
                        }
                    }
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService <ILogger <Program> >();
                    logger.LogError(ex, "An error occurred.");
                }
            }
        }
Beispiel #19
0
        private static void Execute(CommandLineApplication parent,
                                    MethodType methodType,
                                    string description,
                                    PveClient client,
                                    ClassApi classApiRoot)
        {
            parent.Command(methodType.ToString().ToLower(), cmd =>
            {
                cmd.Description = description;
                cmd.AddFullNameLogo();

                var optVerbose    = cmd.VerboseOption();
                var argResource   = CreateResourceArgument(cmd);
                var argParameters = cmd.Argument("parameters",
                                                 "Parameter for resource format key:value (Multiple)." +
                                                 " If value have space or special charapter using quote 'key:value'",
                                                 true);
                var optOutput = cmd.OptionEnum <ApiExplorer.OutputType>("--output|-o", "Type output (default: unicode)");
                var optWait   = cmd.WaitOption();

                cmd.OnExecute(() =>
                {
                    client       = client ?? parent.ClientTryLogin();
                    classApiRoot = classApiRoot ?? GetClassApiRoot(client);
                    var ret      = ApiExplorer.Execute(client,
                                                       classApiRoot,
                                                       argResource.Value,
                                                       methodType,
                                                       ApiExplorer.CreateParameterResource(argParameters.Values),
                                                       optWait.HasValue(),
                                                       optOutput.GetEnumValue <ApiExplorer.OutputType>(),
                                                       optVerbose.HasValue());

                    parent.Out.Write(ret.ResultText);
                    return(ret.ResultCode);
                });
            });
        }
        /// <summary>
        /// Get all astorage client.
        /// </summary>
        /// <param name="client"></param>
        /// <returns></returns>
        public static IReadOnlyList <StorageInfo> GetStorages(this PveClient client)
        {
            var storages = new List <StorageInfo>();

            foreach (var apiData in client.Storage.GetRest().Response.data)
            {
                switch (apiData.type)
                {
                case "rbd": storages.Add(new Rbd(client, apiData)); break;

                case "dir": storages.Add(new Dir(client, apiData)); break;

                case "nfs": storages.Add(new NFS(client, apiData)); break;

                case "zfs": storages.Add(new ZFS(client, apiData)); break;

                // cephfs cifs drbd glusterfs iscsi
                // iscsidirect lvm lvmthin zfspool

                default: storages.Add(new Unknown(client, apiData)); break;
                }
            }
            return(storages.AsReadOnly());
        }
Beispiel #21
0
 public static ClassApi GetClassApiRoot(PveClient client)
 => _classApiRoot ??= GeneretorClassApi.Generate(client.Hostname, client.Port);
Beispiel #22
0
        internal DiskQemu(PveClient client, string id, string definition) : base(client, id, definition)
        {
            var backup = definition.Split(':')[1].Split(',').Where(a => a.StartsWith("backup=")).FirstOrDefault();

            Backup = backup == null ? true : backup == "1";
        }
 /// <summary>
 /// Return node info from id.
 /// </summary>
 /// <param name="client"></param>
 /// <param name="name"></param>
 /// <returns></returns>
 public static NodeInfo GetNode(this PveClient client, string name)
 => GetNodes(client).Where(a => a.Node == name).FirstOrDefault() ??
 throw new ArgumentException($"Node '{name}' not found!");
Beispiel #24
0
 internal VMInfo(PveClient client, object apiData) : base(client, apiData)
 {
 }
Beispiel #25
0
 private static ClassApi GetClassApiRoot(PveClient client)
 => GeneretorClassApi.Generate(client.Hostname, client.Port);
        private static bool ParseLine(string input,
                                      PveClient client,
                                      ClassApi classApiRoot,
                                      AliasManager aliasManager,
                                      bool onlyResult)
        {
            if (string.IsNullOrWhiteSpace(input))
            {
                return(false);
            }
            input = input.Trim();

            //comment
            if (input.StartsWith("#"))
            {
                return(false);
            }

            using (var app = new CommandLineApplication())
            {
                var exit = false;

                app.Name        = "";
                app.Description = "Corsinvest Interactive Shell API for Proxmox VE";
                app.DebugOption();
                app.DryRunOption();
                app.UsePagerForHelpText = false;
                app.HelpOption(true);

                ShellCommands.SumCommands(app, client, classApiRoot);

                //fix help text
                foreach (var command in app.Commands)
                {
                    command.FullName            = app.Description;
                    command.ExtendedHelpText    = "";
                    command.UsePagerForHelpText = false;
                }

                //create command from alias
                CreateCommandFromAlias(app, client, classApiRoot, aliasManager, onlyResult);

                #region Commands base
                app.Command("quit", cmd =>
                {
                    cmd.AddName("exit");
                    cmd.Description          = "Close application";
                    cmd.OnExecute(() => exit = true);
                });

                app.Command("clear", cmd =>
                {
                    cmd.AddName("cls");
                    cmd.Description = "Clear screen";
                    cmd.OnExecute(() => Console.Clear());
                });

                app.Command("help", cmd =>
                {
                    cmd.Description = "Show help information";
                    cmd.OnExecute(() => app.ShowHelp());
                });

                CmdAlias(app, aliasManager);
                CmdHistory(app, onlyResult);
                #endregion

                app.OnExecute(() => app.ShowHint());

                //execute command
                try { app.Execute(StringHelper.TokenizeCommandLineToList(input).ToArray()); }
                catch (CommandParsingException ex) { Console.Out.WriteLine(ex.Message); }
                catch (Exception) { }

                return(exit);
            }
        }
        /// <summary>
        /// Start interactive shell
        /// </summary>
        /// <param name="client"></param>
        /// <param name="fileScript"></param>
        /// <param name="onlyResult"></param>
        public static void Start(PveClient client, string fileScript, bool onlyResult)
        {
            if (!onlyResult)
            {
                Console.Out.WriteLine($@"Corsinvest Interactive Shell for Proxmox VE ({DateTime.Now.ToLongDateString()})
Type '<TAB>' for completion word
Type 'help', 'quit' or 'CTRL+C' to close the application.");
            }

            #region ClassApi Metadata
            var watch = Stopwatch.StartNew();
            if (!onlyResult)
            {
                Console.Out.Write("Initialization metadata...");
            }

            //get api metadata
            var classApiRoot = GeneretorClassApi.Generate(client.Hostname, client.Port);

            watch.Stop();
            if (!onlyResult)
            {
                Console.Out.WriteLine($" {watch.ElapsedMilliseconds}ms");
            }
            #endregion

            if (!onlyResult)
            {
                Console.Out.WriteLine(Environment.NewLine + ShellHelper.REMEMBER_THESE_THINGS);
            }

            //Auto Completion
            ReadLine.AutoCompletionHandler = new AutoCompletionHandler()
            {
                Client       = client,
                ClassApiRoot = classApiRoot
            };

            LoadHistory();

            var aliasManager = new AliasManager()
            {
                FileName = Path.Combine(ShellHelper.GetApplicationDataDirectory(Program.APP_NAME), "alias.txt")
            };
            aliasManager.Load();

            if (File.Exists(fileScript))
            {
                //script file
                foreach (var line in File.ReadAllLines(fileScript))
                {
                    ParseLine(line, client, classApiRoot, aliasManager, onlyResult);
                }
            }
            else
            {
                //Interactive
                while (true)
                {
                    var input = ReadLine.Read(">>> ");
                    var exit  = ParseLine(input, client, classApiRoot, aliasManager, onlyResult);

                    SaveHistory();
                    aliasManager.Save();

                    if (exit)
                    {
                        break;
                    }
                }
            }
        }
Beispiel #28
0
 internal Dir(PveClient client, object apiData) : base(client, apiData, StorageTypeEnum.Dir)
 {
 }
Beispiel #29
0
 /// <summary>
 /// Get all vms info.
 /// </summary>
 /// <param name="client"></param>
 /// <returns></returns>
 public static VMInfo[] GetVMs(this PveClient client)
 => client.Cluster.Resources.GetRest("vm").ToEnumerable()
 .Select(a => new VMInfo(client, a))
 .OrderBy(a => a.Node)
 .ThenBy(a => a.Id)
 .ToArray();
Beispiel #30
0
 /// <summary>
 /// Get vm info from id or name.
 /// </summary>
 /// <param name="client"></param>
 /// <param name="idOrName"></param>
 /// <returns></returns>
 public static VMInfo GetVM(this PveClient client, string idOrName)
 => GetVMs(client).Where(a => VmCheckIdOrName(a, idOrName)).FirstOrDefault() ??
 throw new ArgumentException($"VM/CT '{idOrName}' not found!");