diff --git a/.vscode/launch.json b/.vscode/launch.json
index f90b1d3..ca27743 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -10,9 +10,9 @@
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
- "program": "${workspaceFolder}/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/bin/Debug/netcoreapp2.2/cv4pve-autosnap.dll",
+ "program": "${workspaceFolder}/src/Corsinvest.ProxmoxVE.AutoSnap/bin/Debug/netcoreapp3.0/cv4pve-autosnap.dll",
"args": [],
- "cwd": "${workspaceFolder}/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap",
+ "cwd": "${workspaceFolder}/src/Corsinvest.ProxmoxVE.AutoSnap",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
"console": "internalConsole",
"stopAtEntry": false
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 8774b9d..2cdd071 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -7,9 +7,11 @@
"type": "process",
"args": [
"build",
- "${workspaceFolder}/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/Corsinvest.ProxmoxVE.AutoSnap.csproj"
+ "${workspaceFolder}/src/Corsinvest.ProxmoxVE.AutoSnap/Corsinvest.ProxmoxVE.AutoSnap.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
],
- "problemMatcher": "$tsc"
+ "problemMatcher": "$msCompile"
},
{
"label": "publish",
@@ -17,9 +19,11 @@
"type": "process",
"args": [
"publish",
- "${workspaceFolder}/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/Corsinvest.ProxmoxVE.AutoSnap.csproj"
+ "${workspaceFolder}/src/Corsinvest.ProxmoxVE.AutoSnap/Corsinvest.ProxmoxVE.AutoSnap.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
],
- "problemMatcher": "$tsc"
+ "problemMatcher": "$msCompile"
},
{
"label": "watch",
@@ -28,9 +32,11 @@
"args": [
"watch",
"run",
- "${workspaceFolder}/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/Corsinvest.ProxmoxVE.AutoSnap.csproj"
+ "${workspaceFolder}/src/Corsinvest.ProxmoxVE.AutoSnap/Corsinvest.ProxmoxVE.AutoSnap.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
],
- "problemMatcher": "$tsc"
+ "problemMatcher": "$msCompile"
}
]
}
\ No newline at end of file
diff --git a/Corsinvest.ProxmoxVE.AutoSnap.sln b/Corsinvest.ProxmoxVE.AutoSnap.sln
new file mode 100644
index 0000000..6c84828
--- /dev/null
+++ b/Corsinvest.ProxmoxVE.AutoSnap.sln
@@ -0,0 +1,39 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26124.0
+MinimumVisualStudioVersion = 15.0.26124.0
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{C6B0694C-362C-4BEE-8EBA-28ECF5780D57}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Corsinvest.ProxmoxVE.AutoSnap", "src\Corsinvest.ProxmoxVE.AutoSnap\Corsinvest.ProxmoxVE.AutoSnap.csproj", "{6D4D450B-25C7-4CC8-AFB5-3EFCBD32EC37}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6D4D450B-25C7-4CC8-AFB5-3EFCBD32EC37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6D4D450B-25C7-4CC8-AFB5-3EFCBD32EC37}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6D4D450B-25C7-4CC8-AFB5-3EFCBD32EC37}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6D4D450B-25C7-4CC8-AFB5-3EFCBD32EC37}.Debug|x64.Build.0 = Debug|Any CPU
+ {6D4D450B-25C7-4CC8-AFB5-3EFCBD32EC37}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6D4D450B-25C7-4CC8-AFB5-3EFCBD32EC37}.Debug|x86.Build.0 = Debug|Any CPU
+ {6D4D450B-25C7-4CC8-AFB5-3EFCBD32EC37}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6D4D450B-25C7-4CC8-AFB5-3EFCBD32EC37}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6D4D450B-25C7-4CC8-AFB5-3EFCBD32EC37}.Release|x64.ActiveCfg = Release|Any CPU
+ {6D4D450B-25C7-4CC8-AFB5-3EFCBD32EC37}.Release|x64.Build.0 = Release|Any CPU
+ {6D4D450B-25C7-4CC8-AFB5-3EFCBD32EC37}.Release|x86.ActiveCfg = Release|Any CPU
+ {6D4D450B-25C7-4CC8-AFB5-3EFCBD32EC37}.Release|x86.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {6D4D450B-25C7-4CC8-AFB5-3EFCBD32EC37} = {C6B0694C-362C-4BEE-8EBA-28ECF5780D57}
+ EndGlobalSection
+EndGlobal
diff --git a/README.md b/README.md
index 9e06574..565202a 100644
--- a/README.md
+++ b/README.md
@@ -74,9 +74,7 @@ For the planning process using an external machine:
* Completely rewritten in C#
* Use native api REST Proxmox VE (library C#)
* Independent os (Windows, Linux, Macosx)
-* Installation
- * Portable all files request are included
- * Native installation (deb, rpm, zip)
+* Installation unzip file extract binary
* Not require installation in Proxmox VE
* Execute out side Proxmox VE
* For KVM and LXC
@@ -94,12 +92,12 @@ For the planning process using an external machine:
## Configuration and use
-E.g. install on debian package
+E.g. install on linux 64
-Download last package e.g. Debian cv4pve-autosnap_?.?.?-?_all.deb, on your os and install:
+Download last package e.g. Debian cv4pve-autosnap-linux-x64.zip, on your os and install:
```sh
-root@debian:~# dpkg -i cv4pve-autosnap_?.?.?-?_all.deb
+root@debian:~# unzip cv4pve-autosnap-linux-x64.zip
```
This tool need basically no configuration.
@@ -164,5 +162,9 @@ CV4PVE_AUTOSNAP_VMTYPE
CV4PVE_AUTOSNAP_LABEL
CV4PVE_AUTOSNAP_KEEP
CV4PVE_AUTOSNAP_SNAP_NAME
-CV4PVE_AUTOSNAP_VMSTATE
+CV4PVE_AUTOSNAP_VMSTATE #1/0
+CV4PVE_AUTOSNAP_DEBUG #1/0
+CV4PVE_AUTOSNAP_DRY_RUN #1/0
```
+
+See example hook file script-hook.bat, script-hook.sh
diff --git a/script-hook.bat b/script-hook.bat
new file mode 100644
index 0000000..5341e44
--- /dev/null
+++ b/script-hook.bat
@@ -0,0 +1,39 @@
+@ECHO OFF
+
+REM Corsinvest automatic snapshot for Proxmox VE cv4pve-autosnap hook script.
+REM Process environment variables as received from and set by cv4pve-autosnap.
+
+ECHO CV4PVE_AUTOSNAP_PHASE: %CV4PVE_AUTOSNAP_PHASE%
+ECHO CV4PVE_AUTOSNAP_VMID: %CV4PVE_AUTOSNAP_VMID%
+ECHO CV4PVE_AUTOSNAP_VMTECHNOLOGY: %CV4PVE_AUTOSNAP_VMTECHNOLOGY%
+ECHO CV4PVE_AUTOSNAP_LABEL: %CV4PVE_AUTOSNAP_LABEL%
+ECHO CV4PVE_AUTOSNAP_KEEP: %CV4PVE_AUTOSNAP_KEEP%
+ECHO CV4PVE_AUTOSNAP_VMSTATE: %CV4PVE_AUTOSNAP_VMSTATE%
+ECHO CV4PVE_AUTOSNAP_SNAP_NAME: %CV4PVE_AUTOSNAP_SNAP_NAME%
+ECHO CV4PVE_AUTOSNAP_DEBUG: %CV4PVE_AUTOSNAP_DEBUG%
+ECHO CV4PVE_AUTOSNAP_DRY_RUN: %CV4PVE_AUTOSNAP_DRYRUN%
+
+IF "%CV4PVE_AUTOSNAP_PHASE%"=="clean-job-start" (
+ REM
+) ELSE IF "%CV4PVE_AUTOSNAP_PHASE%"=="clean-job-end" (
+ REM
+) ELSE IF "%CV4PVE_AUTOSNAP_PHASE%"=="snap-job-start" (
+ REM
+) ELSE IF "%CV4PVE_AUTOSNAP_PHASE%"=="snap-job-end" (
+ REM
+) ELSE IF "%CV4PVE_AUTOSNAP_PHASE%"=="snap-create-pre" (
+ REM
+) ELSE IF "%CV4PVE_AUTOSNAP_PHASE%"=="snap-create-post" (
+ REM
+) ELSE IF "%CV4PVE_AUTOSNAP_PHASE%"=="snap-create-abort" (
+ REM
+) ELSE IF "%CV4PVE_AUTOSNAP_PHASE%"=="snap-remove-pre" (
+ REM
+) ELSE IF "%CV4PVE_AUTOSNAP_PHASE%"=="snap-remove-post" (
+ REM
+) ELSE IF "%CV4PVE_AUTOSNAP_PHASE%"=="snap-remove-abort" (
+ REM
+) ELSE (
+ ECHO "unknown phase '$CV4PVE_BARC_PHASE'"
+ EXIT 1
+)
\ No newline at end of file
diff --git a/src/bash/script-hook.sh b/script-hook.sh
old mode 100755
new mode 100644
similarity index 77%
rename from src/bash/script-hook.sh
rename to script-hook.sh
index fef6647..6479fef
--- a/src/bash/script-hook.sh
+++ b/script-hook.sh
@@ -4,14 +4,16 @@
# Process environment variables as received from and set by cv4pve-autosnap.
hook() {
- echo "CV4PVE_AUTOSNAP_PHASE: $CV4PVE_AUTOSNAP_PHASE"
- echo "CV4PVE_AUTOSNAP_VMID: $CV4PVE_AUTOSNAP_VMID"
- echo "CV4PVE_AUTOSNAP_VMTECHNOLOGY: $CV4PVE_AUTOSNAP_VMTECHNOLOGY"
- echo "CV4PVE_AUTOSNAP_LABEL: $CV4PVE_AUTOSNAP_LABEL"
- echo "CV4PVE_AUTOSNAP_KEEP: $CV4PVE_AUTOSNAP_KEEP"
- echo "CV4PVE_AUTOSNAP_VMSTATE: $CV4PVE_AUTOSNAP_VMSTATE"
- echo "CV4PVE_AUTOSNAP_SNAP_NAME: $CV4PVE_AUTOSNAP_SNAP_NAME"
-
+ echo "CV4PVE_AUTOSNAP_PHASE: $CV4PVE_AUTOSNAP_PHASE"
+ echo "CV4PVE_AUTOSNAP_VMID: $CV4PVE_AUTOSNAP_VMID"
+ echo "CV4PVE_AUTOSNAP_VMTECHNOLOGY: $CV4PVE_AUTOSNAP_VMTECHNOLOGY"
+ echo "CV4PVE_AUTOSNAP_LABEL: $CV4PVE_AUTOSNAP_LABEL"
+ echo "CV4PVE_AUTOSNAP_KEEP: $CV4PVE_AUTOSNAP_KEEP"
+ echo "CV4PVE_AUTOSNAP_VMSTATE: $CV4PVE_AUTOSNAP_VMSTATE"
+ echo "CV4PVE_AUTOSNAP_SNAP_NAME: $CV4PVE_AUTOSNAP_SNAP_NAME"
+ echo "CV4PVE_AUTOSNAP_DEBUG: $CV4PVE_AUTOSNAP_DEBUG"
+ echo "CV4PVE_AUTOSNAP_DRY_RUN: $CV4PVE_AUTOSNAP_DRY_RUN"
+
case "$CV4PVE_AUTOSNAP_PHASE" in
#clean job status
clean-job-start);;
diff --git a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/.gitignore b/src/Corsinvest.ProxmoxVE.AutoSnap/.gitignore
similarity index 100%
rename from src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/.gitignore
rename to src/Corsinvest.ProxmoxVE.AutoSnap/.gitignore
diff --git a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/Commands.cs b/src/Corsinvest.ProxmoxVE.AutoSnap/Commands.cs
similarity index 73%
rename from src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/Commands.cs
rename to src/Corsinvest.ProxmoxVE.AutoSnap/Commands.cs
index f138080..90a5fc0 100644
--- a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/Commands.cs
+++ b/src/Corsinvest.ProxmoxVE.AutoSnap/Commands.cs
@@ -1,4 +1,22 @@
-using System;
+/*
+ * This file is part of the cv4pve-autosnap https://github.com/Corsinvest/cv4pve-autosnap,
+ * Copyright (C) 2016 Corsinvest Srl
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -14,21 +32,21 @@ namespace Corsinvest.ProxmoxVE.AutoSnap
///
public class Commands
{
- private const string PREFIX = "auto";
+ private static readonly string PREFIX = "auto";
- private const string TIMESTAMP_FORMAT = "yyMMddHHmmss";
+ private static readonly string TIMESTAMP_FORMAT = "yyMMddHHmmss";
///
/// Application name
///
- public const string APPLICATION_NAME = "cv4pve-autosnap";
+ public static readonly string APPLICATION_NAME = "cv4pve-autosnap";
///
/// Old application name
///
- private const string OLD_APPLICATION_NAME = "eve4pve-autosnap";
+ private static readonly string OLD_APPLICATION_NAME = "eve4pve-autosnap";
- private readonly Client _client;
+ private readonly PveClient _client;
private readonly TextWriter _stdOut;
private readonly bool _dryRun;
private readonly bool _debug;
@@ -40,7 +58,7 @@ public class Commands
///
///
///
- public Commands(Client client, TextWriter stdOut, bool dryRun, bool debug)
+ public Commands(PveClient client, TextWriter stdOut, bool dryRun, bool debug)
=> (_client, _stdOut, _dryRun, _debug) = (client, stdOut, dryRun, debug);
///
@@ -68,10 +86,21 @@ public void Status(string vmIdsOrNames, string label = null, OutputType outputTy
switch (outputType)
{
- case OutputType.Text: _stdOut.Write(snapshots.Info(true)); break;
- case OutputType.Json: _stdOut.Write(JsonConvert.SerializeObject((snapshots.Select(a => a.GetRowInfo(true))))); break;
- case OutputType.JsonPretty: _stdOut.Write(JsonConvert.SerializeObject((snapshots.Select(a => a.GetRowInfo(true))), Formatting.Indented)); break;
- default: _stdOut.Write(snapshots.Info(true)); break;
+ case OutputType.Text:
+ _stdOut.Write(snapshots.Info(true));
+ break;
+
+ case OutputType.Json:
+ _stdOut.Write(JsonConvert.SerializeObject((snapshots.Select(a => a.GetRowInfo(true)))));
+ break;
+
+ case OutputType.JsonPretty:
+ _stdOut.Write(JsonConvert.SerializeObject((snapshots.Select(a => a.GetRowInfo(true))), Formatting.Indented));
+ break;
+
+ default:
+ _stdOut.Write(snapshots.Info(true));
+ break;
}
}
@@ -134,7 +163,17 @@ public bool Snap(string vmIdsOrNames, string label, int keep, bool state)
var oldWaitTimeout = ResultExtension.WaitTimeout;
ResultExtension.WaitTimeout = 30000;
- inError = vm.Snapshots.Create(snapName, APPLICATION_NAME, state, true).LogInError(_stdOut);
+ var result = vm.Snapshots.Create(snapName, APPLICATION_NAME, state, true);
+ inError = result.LogInError(_stdOut);
+
+ //check error in task
+ var task = _client.Nodes[vm.Node].Tasks[(result.Response.data as string)];
+ var data = task.Status.ReadTaskStatus().Response.data;
+ if (data.exitstatus != "OK")
+ {
+ _stdOut.WriteLine($"Error in task: {data.exitstatus}");
+ inError = true;
+ }
ResultExtension.WaitTimeout = oldWaitTimeout;
}
@@ -159,6 +198,8 @@ public bool Snap(string vmIdsOrNames, string label, int keep, bool state)
CallPhaseEvent("snap-job-end", null, label, keep, null, state);
+ if (_debug) { _stdOut.WriteLine($"Snap Exit: {ret}"); }
+
return ret;
}
@@ -211,6 +252,8 @@ private bool SnapshotsRemove(VMInfo vm, string label, int keep)
if (inError)
{
+ if (_debug) { _stdOut.WriteLine($"Snap remove: problem in remove "); }
+
CallPhaseEvent("snap-remove-abort", vm, label, keep, snapshot.Name, false);
return false;
}
diff --git a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/Corsinvest.ProxmoxVE.AutoSnap.csproj b/src/Corsinvest.ProxmoxVE.AutoSnap/Corsinvest.ProxmoxVE.AutoSnap.csproj
similarity index 53%
rename from src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/Corsinvest.ProxmoxVE.AutoSnap.csproj
rename to src/Corsinvest.ProxmoxVE.AutoSnap/Corsinvest.ProxmoxVE.AutoSnap.csproj
index c6af6ce..6384d6b 100644
--- a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/Corsinvest.ProxmoxVE.AutoSnap.csproj
+++ b/src/Corsinvest.ProxmoxVE.AutoSnap/Corsinvest.ProxmoxVE.AutoSnap.csproj
@@ -1,35 +1,24 @@
-
-
- Exe
- 1.2.0
- netcoreapp2.2
- cv4pve-autosnap
- Corsinvest Srl
- Daniele Corsini
- Corsinvest Srl
- Corsinvest for Proxmox VE Auto Snapshot
- Corsinvest for Proxmox VE Auto Snapshot
- Corsinvest for Proxmox VE Auto Snapshot
- true
-
-
-
-
-
- /usr/sbin/cv4pve-autosnap
- 775
-
-
-
-
-
-
-
-
+
+
+ Exe
+ 1.3.0
+ netcoreapp3.0
+ cv4pve-autosnap
+ Corsinvest Srl
+ Daniele Corsini
+ Corsinvest Srl
+ Corsinvest for Proxmox VE Auto Snapshot
+ Corsinvest for Proxmox VE Auto Snapshot
+ Corsinvest for Proxmox VE Auto Snapshot
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Corsinvest.ProxmoxVE.AutoSnap/OutputType.cs b/src/Corsinvest.ProxmoxVE.AutoSnap/OutputType.cs
new file mode 100644
index 0000000..1d7ccfe
--- /dev/null
+++ b/src/Corsinvest.ProxmoxVE.AutoSnap/OutputType.cs
@@ -0,0 +1,41 @@
+/*
+ * This file is part of the cv4pve-autosnap https://github.com/Corsinvest/cv4pve-autosnap,
+ * Copyright (C) 2016 Corsinvest Srl
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+namespace Corsinvest.ProxmoxVE.AutoSnap
+{
+ ///
+ /// Output type
+ ///
+ public enum OutputType
+ {
+ ///
+ /// Text
+ ///
+ Text,
+
+ ///
+ /// Json
+ ///
+ Json,
+
+ ///
+ /// Json pretty
+ ///
+ JsonPretty,
+ }
+}
\ No newline at end of file
diff --git a/src/Corsinvest.ProxmoxVE.AutoSnap/Program.cs b/src/Corsinvest.ProxmoxVE.AutoSnap/Program.cs
new file mode 100644
index 0000000..81b6841
--- /dev/null
+++ b/src/Corsinvest.ProxmoxVE.AutoSnap/Program.cs
@@ -0,0 +1,33 @@
+/*
+ * This file is part of the cv4pve-autosnap https://github.com/Corsinvest/cv4pve-autosnap,
+ * Copyright (C) 2016 Corsinvest Srl
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+using System;
+using Corsinvest.ProxmoxVE.Api.Extension.Helpers.Shell;
+
+namespace Corsinvest.ProxmoxVE.AutoSnap
+{
+ class Program
+ {
+ public static int Main(string[] args)
+ {
+ var app = ShellHelper.CreateConsoleApp(Commands.APPLICATION_NAME, "Automatic snapshot VM/CT with retention");
+ new ShellCommands(app);
+ return app.ExecuteConsoleApp(Console.Out, args);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/ShellCommands.cs b/src/Corsinvest.ProxmoxVE.AutoSnap/ShellCommands.cs
similarity index 53%
rename from src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/ShellCommands.cs
rename to src/Corsinvest.ProxmoxVE.AutoSnap/ShellCommands.cs
index 79a3691..a50ec6f 100644
--- a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/ShellCommands.cs
+++ b/src/Corsinvest.ProxmoxVE.AutoSnap/ShellCommands.cs
@@ -1,7 +1,25 @@
-using System;
+/*
+ * This file is part of the cv4pve-autosnap https://github.com/Corsinvest/cv4pve-autosnap,
+ * Copyright (C) 2016 Corsinvest Srl
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+using System;
using System.Collections.Generic;
using System.IO;
-using Corsinvest.ProxmoxVE.Api.Extension.Utils.Shell;
+using Corsinvest.ProxmoxVE.Api.Extension.Helpers.Shell;
using Corsinvest.ProxmoxVE.Api.Extension.VM;
using McMaster.Extensions.CommandLineUtils;
@@ -29,31 +47,54 @@ public ShellCommands(CommandLineApplication parent)
private Commands CreateApp(CommandLineApplication parent)
{
- var app = new Commands(parent.ClientTryLogin(), Console.Out, parent.DryRunIsActive(), parent.DebugIsActive());
+ var app = new Commands(parent.ClientTryLogin(),
+ Console.Out,
+ parent.DryRunIsActive(),
+ parent.DebugIsActive());
app.PhaseEvent += App_PhaseEvent;
return app;
}
private void App_PhaseEvent(object sender,
- (string phase, VMInfo vm, string label, int keep, string snapName, bool state, TextWriter stdOut, bool dryRun, bool debug) e)
+ (string phase,
+ VMInfo vm,
+ string label,
+ int keep,
+ string snapName,
+ bool state,
+ TextWriter stdOut,
+ bool dryRun,
+ bool debug) e)
{
if (!File.Exists(_scriptHook)) { return; }
- ShellHelper.Execute(_scriptHook,
- e.debug,
- new Dictionary()
- {
- {"CV4PVE_AUTOSNAP_PHASE", e.phase},
- {"CV4PVE_AUTOSNAP_VMID", e.vm?.Id + ""},
- {"CV4PVE_AUTOSNAP_VMTYPE", e.vm?.Type + ""},
- {"CV4PVE_AUTOSNAP_LABEL", e.label},
- {"CV4PVE_AUTOSNAP_KEEP", e.keep + ""},
- {"CV4PVE_AUTOSNAP_SNAP_NAME", e.snapName},
- {"CV4PVE_AUTOSNAP_VMSTATE", e.state ? "1" :"0"},
- },
- e.stdOut,
- e.dryRun,
- e.debug);
+ var ret = ShellHelper.Execute(_scriptHook,
+ true,
+ new Dictionary()
+ {
+ {"CV4PVE_AUTOSNAP_PHASE", e.phase},
+ {"CV4PVE_AUTOSNAP_VMID", e.vm?.Id + ""},
+ {"CV4PVE_AUTOSNAP_VMTYPE", e.vm?.Type + ""},
+ {"CV4PVE_AUTOSNAP_LABEL", e.label},
+ {"CV4PVE_AUTOSNAP_KEEP", e.keep + ""},
+ {"CV4PVE_AUTOSNAP_SNAP_NAME", e.snapName},
+ {"CV4PVE_AUTOSNAP_VMSTATE", e.state ? "1" :"0"},
+ {"CV4PVE_AUTOSNAP_DEBUG", e.debug ? "1" :"0"},
+ {"CV4PVE_AUTOSNAP_DRY_RUN", e.dryRun ? "1" :"0"},
+ },
+ e.stdOut,
+ e.dryRun,
+ e.debug);
+
+ if (ret.ExitCode != 0)
+ {
+ e.stdOut.WriteLine($"Script resturn code: {ret.ExitCode}");
+ }
+
+ if (!string.IsNullOrWhiteSpace(ret.StandardOutput))
+ {
+ e.stdOut.Write(ret.StandardOutput);
+ }
}
private void Status(CommandLineApplication parent, CommandOption optVmIds)
diff --git a/src/Corsinvest.ProxmoxVE.AutoSnap/build.ps1 b/src/Corsinvest.ProxmoxVE.AutoSnap/build.ps1
new file mode 100644
index 0000000..8a8e691
--- /dev/null
+++ b/src/Corsinvest.ProxmoxVE.AutoSnap/build.ps1
@@ -0,0 +1,40 @@
+# This file is part of the cv4pve-autosnap https://github.com/Corsinvest/cv4pve-autosnap,
+# Copyright (C) 2016 Corsinvest Srl
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+[System.Console]::Clear();
+
+Write-Output "
+ ______ _ __
+ / ____/___ __________(_)___ _ _____ _____/ /_
+ / / / __ \/ ___/ ___/ / __ \ | / / _ \/ ___/ __/
+ / /___/ /_/ / / (__ ) / / / / |/ / __(__ ) /_
+ \____/\____/_/ /____/_/_/ /_/|___/\___/____/\__/
+
+ (Made in Italy)
+
+ =========================================================
+ == Build System
+ ========================================================="
+
+$rids = @("linux-x64", "linux-arm", "linux-arm64", "osx-x64", "win-x86", "win-x64", "win-arm", "win-arm64")
+foreach ($rid in $rids) {
+ dotnet publish -r $rid -c Release /p:PublishSingleFile=true /p:PublishTrimmed=true
+ $path = "bin\Release\netcoreapp3.0\$rid\publish\"
+ $fileName = Get-ChildItem $path -Exclude *.pdb -name
+ $fileDest = "bin\Release\netcoreapp3.0\$fileName-$rid.zip"
+ Remove-Item $fileDest -ErrorAction SilentlyContinue
+ Compress-Archive $path\$fileName $fileDest
+}
\ No newline at end of file
diff --git a/src/bash/.gitignore b/src/bash/.gitignore
deleted file mode 100644
index c776bdf..0000000
--- a/src/bash/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.deb
\ No newline at end of file
diff --git a/src/bash/LICENSE b/src/bash/LICENSE
deleted file mode 100644
index 9cecc1d..0000000
--- a/src/bash/LICENSE
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- {one line to give the program's name and a brief idea of what it does.}
- Copyright (C) {year} {name of author}
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- {project} Copyright (C) {year} {fullname}
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-.
diff --git a/src/bash/Makefile b/src/bash/Makefile
deleted file mode 100644
index 922c9d6..0000000
--- a/src/bash/Makefile
+++ /dev/null
@@ -1,67 +0,0 @@
-PACKAGE=cv4pve-autosnap
-VERSION=$(shell ./${PACKAGE} version)
-DATE=$(shell LANG=en_us_8859_1; date '+%b %d, %Y')
-DESTDIR=
-PREFIX=/usr
-SBINDIR=${PREFIX}/sbin
-MANDIR=${PREFIX}/share/man
-DOCDIR=${PREFIX}/share/doc/${PACKAGE}
-MAN8DIR=${MANDIR}/man8
-EXAMPLE=${DOCDIR}/examples
-
-DEB=${PACKAGE}_${VERSION}_inside_pve.deb
-
-all: ${DEB}
-
-.PHONY: dinstall
-dinstall: deb
- dpkg -i ${DEB}
-
-.PHONY: install
-install:
- install -d ${DESTDIR}${SBINDIR}
- install -m 0755 ${PACKAGE} ${DESTDIR}${SBINDIR}
-
- install -d ${DESTDIR}${MAN8DIR}
- install -m 0644 ${PACKAGE}.8 ${DESTDIR}${MAN8DIR}
- gzip -n -9 ${DESTDIR}${MAN8DIR}/${PACKAGE}.8
-
- install -d ${DESTDIR}${EXAMPLE}
- install -m 0755 script-hook.sh ${DESTDIR}${EXAMPLE}
-
-
-.PHONY: deb ${DEB}
-deb ${DEB}:
- rm -rf debian
- mkdir debian
-
- $(shell ./${PACKAGE} help --no-logo > help.tmp)
- sed '/@@COPYRIGHT@@/r copyright' ${PACKAGE}.8.template | \
- sed "/@@COPYRIGHT@@/d" | \
- sed '/@@SYNOPSIS@@/r help.tmp' | \
- sed /@@SYNOPSIS@@/d | \
- sed s/@@PACKAGE@@/${PACKAGE}/ | \
- sed s/@@PACKAGE@@/${PACKAGE}/ | \
- sed "s/@@DATE@@/${DATE}/" \
- > ${PACKAGE}.8
-
- make DESTDIR=${CURDIR}/debian install
- install -d -m 0755 debian/DEBIAN
- sed -e s/@@VERSION@@/${VERSION}/ -e s/@@PACKAGE@@/${PACKAGE}/ debian/DEBIAN/control
- install -D -m 0644 copyright debian/${DOCDIR}/copyright
- install -m 0644 changelog debian/${DOCDIR}/
- gzip -n -9 debian/${DOCDIR}/changelog
- dpkg-deb --build debian
- mv debian.deb ${DEB}
- #lintian ${DEB}
- rm -rf debian
- rm ${PACKAGE}.8
- rm help.tmp
-
-.PHONY: clean
-clean:
- rm -rf debian *.deb ${PACKAGE}-*.tar.gz dist *.8.man *.8.gz *.tmp
- find . -name '*~' -exec rm {} ';'
-
-.PHONY: distclean
-distclean: clean
\ No newline at end of file
diff --git a/src/bash/README.md b/src/bash/README.md
deleted file mode 100644
index 8f09508..0000000
--- a/src/bash/README.md
+++ /dev/null
@@ -1,147 +0,0 @@
-# cv4pve-autosnap
-
-[![License](https://img.shields.io/github/license/Corsinvest/cv4pve-autosnap.svg)](https://www.gnu.org/licenses/gpl-3.0.en.html)
-[![Gitter](https://badges.gitter.im/Corsinvest/cv4pve-autosnap.svg)](https://gitter.im/Corsinvest/cv4pve-autosnap)
-[![Release](https://img.shields.io/github/release/Corsinvest/cv4pve-autosnap.svg)](https://github.com/Corsinvest/cv4pve-autosnap/releases/latest)
-![GitHub All Releases](https://img.shields.io/github/downloads/Corsinvest/cv4pve-autosnap/total.svg)
-
-Proxmox VE automatic snapshot tool
-
-[More information about cv4pve-autosnap](http://www.corsinvest.it/protezione-continua-dei-dati-proxmox-ve/)
-
-[More information about Qemu guest agent](https://pve.proxmox.com/wiki/Qemu-guest-agent)
-
-```text
- ______ _ __
- / ____/___ __________(_)___ _ _____ _____/ /_
- / / / __ \/ ___/ ___/ / __ \ | / / _ \/ ___/ __/
- / /___/ /_/ / / (__ ) / / / / |/ / __(__ ) /_
- \____/\____/_/ /____/_/_/ /_/|___/\___/____/\__/
-
-Corsinvest automatic snapshot for Proxmox VE (Made in Italy)
-
-Usage:
- cv4pve-autosnap [ARGS] [OPTIONS]
- cv4pve-autosnap help
- cv4pve-autosnap version
-
- cv4pve-autosnap create --vmid= --label= --keep=
- --vmstate --script= --syslog
- --exclude-vmid= --quiet
- cv4pve-autosnap destroy --vmid= --label=
- cv4pve-autosnap enable --vmid= --label=
- cv4pve-autosnap disable --vmid= --label=
-
- cv4pve-autosnap status
- cv4pve-autosnap clean --vmid= --label= --keep=
-
- cv4pve-autosnap snap --vmid= --label= --keep=
- --vmstate --script= --syslog
- --exclude-vmid= --quiet
-
-Commands:
- version Show version program.
- help Show help program.
- create Create snap job from scheduler.
- destroy Remove snap job from scheduler.
- enable Enable snap job from scheduler.
- disable Disable snap job from scheduler.
- status Get list of all auto snapshots.
- clean Remove all auto snapshots.
- snap Will snap one time.
-
-Options:
- --vmid=string The ID of the VM/CT, comma separated (es. 100,101,102),
- 'all' for all VM/CT in node.
- --exclude-vmid Exclude ID of the VM/CT, comma separated (es. 100,101,102).
- --vmstate Save the vmstate only qemu.
- --label=string Is usually 'hourly', 'daily', 'weekly', or 'monthly'.
- --keep=integer Specify the number of snapshots which should will keep. Default 1.
- --script=string Use specified hook script.
- Es. /usr/share/doc/cv4pve-autosnap/examples/script-hook.sh
- --syslog Write messages into the system log.
- --quiet Only output errors.
-
-Report bugs to .
-```
-
-## Introduction
-
-Automatic snapshot for Proxmox VE with retention.
-
-## Main features
-
-* For KVM and LXC
-* Work for single node or cluster
-* Cluster cron in /etc/pve/cv/autosnap/autosnap.cron unique for all
-* Can keep multiple snapshots
-* Syslog integration
-* Clean all snapshots
-* Multiple schedule VM using --label (es. daily,monthly)
-* Hook script
-* Multiple VM (100,102 or all) single execution
-* Exclude VM parameter
-
-## Limit
-
-The vm run in same machine on Proxmox VE.
-
-## Configuration and use
-
-Download package cv4pve-autosnap_?.?.?-?_all.deb, on your Proxmox VE host and install:
-
-```sh
-wget https://github.com/$(wget -qO- https://github.com/Corsinvest/cv4pve-autosnap/releases/latest | grep -Po '(?<="/).*\.deb(?=")')
-
-dpkg -i cv4pve-autosnap_?.?.?-?_all.deb
-```
-
-This tool need basically no configuration.
-
-## Snap a VM one time
-
-```sh
-root@pve1:~# cv4pve-autosnap snap --vmid=111 --label='daily' --keep=2
-```
-
-This command snap VM 111. The --keep tells that it should be kept 2 snapshots, if there are more than 2 snapshots, the 3 one will be erased (sorted by creation time).
-
-## Create a recurring snap job
-
-```sh
-root@pve1:~# cv4pve-autosnap create --vmid=111 --label='daily' --keep=5
-```
-
-## Delete a recurring snap job
-
-```sh
-root@pve1:~# cv4pve-autosnap destroy --vmid=111 --label='daily' --keep=5
-```
-
-## Pause a snap job
-
-```sh
-root@pve1:~# cv4pve-autosnap disable --vmid=111 --label='daily' --keep=5
-```
-
-## Reactivate a snap job
-
-```sh
-root@pve1:~# cv4pve-autosnap enable --vmid=111 --label='daily' --keep=5
-```
-
-## Status snap
-
-```sh
-root@pve1:~# cv4pve-autosnap status
-
-VM SNAPSHOTS LABEL
-101 17-01-14 17:30:56 hourly
-102 17-01-14 17:30:56 hourly
-105 17-01-14 17:30:56 hourly
-111 17-01-14 17:30:56 hourly
-```
-
-## Changing parameters
-
-You can edit the configuration in /etc/pve/cv/autosnap/cv4pve-autosnap.cron or destroy the job and create it new.
diff --git a/src/bash/changelog b/src/bash/changelog
deleted file mode 100644
index 220a0c4..0000000
--- a/src/bash/changelog
+++ /dev/null
@@ -1,5 +0,0 @@
- cv4pve-autosnap (0.1.11)
-
- * Transfer ownership Corsinvest
-
- -- Corsinvest Support Team 04 Jul 2019 11:50:01 +0100
\ No newline at end of file
diff --git a/src/bash/control.in b/src/bash/control.in
deleted file mode 100644
index c800194..0000000
--- a/src/bash/control.in
+++ /dev/null
@@ -1,9 +0,0 @@
-Package: @@PACKAGE@@
-Section: utils
-Version: @@VERSION@@
-Priority: optional
-Architecture: all
-Homepage: http://www.corsinvest.it/
-Maintainer: Corsinvest Support Team
-Description: Corsinvest autosnap management library
- This package contains the Corsinvest autosnap Tool for Proxmox VE.
diff --git a/src/bash/copyright b/src/bash/copyright
deleted file mode 100644
index 71be806..0000000
--- a/src/bash/copyright
+++ /dev/null
@@ -1,16 +0,0 @@
-Copyright (C) 2016 Corsinvest
-
-This software is written by Corsinvest
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see .
\ No newline at end of file
diff --git a/src/bash/cv4pve-autosnap b/src/bash/cv4pve-autosnap
deleted file mode 100755
index 3e173bd..0000000
--- a/src/bash/cv4pve-autosnap
+++ /dev/null
@@ -1,479 +0,0 @@
-#!/bin/bash
-
-# Automatically create, rotate, and destroy periodic Proxmox VE snapshots.
-# Author: Daniele Corsini
-
-declare -r VERSION=0.1.11
-declare -r NAME=$(basename "$0")
-declare -r PROGNAME=${NAME%.*}
-
-declare -r QEMU_CMD='qm'
-declare -r LXC_CMD='pct'
-
-declare opt_vm_ids=''
-declare opt_exclude_vm_ids=''
-declare -i opt_vm_state=0
-declare -i opt_keep=1
-declare -i opt_syslog=0
-declare -i opt_debug=0
-declare -i opt_dry_run=0
-declare -i opt_quiet=0
-declare opt_label=''
-declare opt_script=''
-
-declare snap_name_prefix=''
-declare -i vm_id=0
-declare vm_tecnology=''
-declare vm_ids
-declare -r cron_file="/etc/pve/cv/autosnap/$PROGNAME.cron"
-
-function usage(){
- shift
-
- if [ "$1" != "--no-logo" ]; then
- cat << EOF
- ______ __ _ _ ________
- / ____/___ / /____ _________ _____(_)_______ | | / / ____/
- / __/ / __ \/ __/ _ \/ ___/ __ \/ ___/ / ___/ _ \ | | / / __/
- / /___/ / / / /_/ __/ / / /_/ / / / (__ ) __/ | |/ / /___
-/_____/_/ /_/\__/\___/_/ / .___/_/ /_/____/\___/ |___/_____/
- /_/
-
-EOF
- fi
-
- cat << EOF
-Corsinvest automatic snapshot for Proxmox VE (Made in Italy)
-
-Usage:
- $PROGNAME [ARGS] [OPTIONS]
- $PROGNAME help
- $PROGNAME version
-
- $PROGNAME create --vmid= --label= --keep=
- --vmstate --script= --syslog
- --exclude-vmid= --quiet
- $PROGNAME destroy --vmid= --label=
- $PROGNAME enable --vmid= --label=
- $PROGNAME disable --vmid= --label=
-
- $PROGNAME status
- $PROGNAME clean --vmid= --label= --keep=
-
- $PROGNAME snap --vmid= --label= --keep=
- --vmstate --script= --syslog
- --exclude-vmid= --quiet
-
-Commands:
- version Show version program.
- help Show help program.
- create Create snap job from scheduler.
- destroy Remove snap job from scheduler.
- enable Enable snap job from scheduler.
- disable Disable snap job from scheduler.
- status Get list of all auto snapshots.
- clean Remove all auto snapshots.
- snap Will snap one time.
-
-Options:
- --vmid=string The ID of the VM/CT, comma separated (es. 100,101,102),
- 'all' for all VM/CT in node.
- --exclude-vmid Exclude ID of the VM/CT, comma separated (es. 100,101,102).
- --vmstate Save the vmstate only qemu.
- --label=string Is usually 'hourly', 'daily', 'weekly', or 'monthly'.
- --keep=integer Specify the number of snapshots which should will keep. Default 1.
- --script=string Use specified hook script.
- Es. /usr/share/doc/$PROGNAME/examples/script-hook.sh
- --syslog Write messages into the system log.
- --quiet Only output errors.
-
-Report bugs to .
-EOF
-
- exit 1
-}
-
-function log(){
- local level=$1
- shift 1
- local message=$*
-
- case $level in
- debug) [ $opt_debug -eq 1 ] && echo -e "$(date "+%F %T") DEBUG: $message";;
-
- info)
- [ $opt_quiet -eq 0 ] && echo -e "$message";
- [ $opt_quiet -eq 0 ] && [ $opt_syslog -eq 1 ] && logger -t "$PROGNAME" "$message"
- ;;
-
- error)
- echo "ERROR: $message" 1>&2
- [ $opt_syslog -eq 1 ] && logger -t "$PROGNAME" -p daemon.err "$message"
- ;;
-
- *)
- echo "$message" 1>&2
- [ $opt_syslog -eq 1 ] && logger -t "$PROGNAME" "$message"
- ;;
- esac
-}
-
-function parse_opts(){
- shift
-
- local args
- args=$(getopt \
- --options '' \
- --longoptions=vmstate,all,vmid:,label:,keep:,exclude-vmid: \
- --longoptions=script:,syslog,debug,dry-run,quiet \
- --name "$PROGNAME" \
- -- "$@") \
- || exit 128
-
- eval set -- "$args"
-
- while true; do
- case "$1" in
- --vmid) opt_vm_ids=$2; shift 2;;
- --exclude-vmid) opt_exclude_vm_ids=$2; shift 2;;
- --vmstate) opt_vm_state=1; shift;;
- --label) opt_label="$2"; shift 2;;
- --keep) opt_keep=$2; shift 2;;
- --script) opt_script="$2"; shift 2;;
- --syslog) opt_syslog=1; shift;;
- --debug) opt_debug=1; shift;;
- --dry-run) opt_dry_run=1; shift;;
- --quiet) opt_quiet=1; shift;;
- --) shift; break;;
- *) break;;
- esac
- done
-
- [ -z "$opt_vm_ids" ] && { log error "VM id is not set."; exit 1; }
- if [ "$opt_vm_ids" = "all" ]; then
- #all VM/CT
- vm_ids=$(echo "$(qm list | awk '{print $1}' | sed 1d) $(pct list | awk '{print $1}' | sed 1d)" | tr ' ' '\n')
- else
- #comma separated
- vm_ids=$(echo "$opt_vm_ids" | tr ',' '\n')
- fi
-
- #exclude id comma separated
- local exclude_vm_ids; exclude_vm_ids=$(echo "$opt_exclude_vm_ids" | tr ',' '\n')
-
- #VM/CT local host
- local all_vms
- all_vms=$(echo "$(qm list | awk '{print $1}' | sed 1d) $(pct list | awk '{print $1}' | sed 1d)" | tr ' ' '\n')
-
- local vm_ids_tmp=""
- for vm_id in $vm_ids; do
- local vm_id_tmp
- local skip_id=0
-
- #exclude id if exists in array
- for vm_id_tmp in $exclude_vm_ids; do
- if [ "$vm_id_tmp" == "$vm_id" ]; then
- skip_id=1
- break
- fi
- done
-
- [ $skip_id -eq 1 ] && continue;
-
- #check valid id
- for vm_id_tmp in $all_vms; do
- if [ "$vm_id_tmp" == "$vm_id" ]; then
- [ ! -z "$vm_ids_tmp" ] && vm_ids_tmp="$vm_ids_tmp,"
- vm_ids_tmp="$vm_ids_tmp$vm_id"
- break
- fi
- done
- done
- vm_ids=$(echo "$vm_ids_tmp" | tr ',' '\n')
-
- [ -z "$opt_label" ] && { log error "Label is not set correctly."; exit 1; }
- [ "$opt_keep" -le 0 ] && { log error "Keep is not set correctly. Value > 0."; exit 1; }
-
- snap_name_prefix="auto$opt_label"
-}
-
-function get_technology(){
- if $QEMU_CMD list | awk '{print $1}' | grep -q $vm_id; then
- vm_tecnology=$QEMU_CMD
- elif $LXC_CMD list | awk '{print $1}' | grep -q $vm_id; then
- vm_tecnology=$LXC_CMD
- else
- log error "VM $vm_id - Unknown tecnology"
- vm_tecnology=''
- fi
-}
-
-function fix_cron(){
- #create directory
- mkdir -p /etc/pve/cv/autosnap
-
- local -r cron_d="/etc/cron.d/$PROGNAME"
-
- if [[ ! -h "$cron_d" && ! -e "$cron_file" ]]; then
- #create cron file if not exist
- cat > "$cron_file" << EOL
-#Cron file for $PROGNAME automatically generated
-SHELL=/bin/sh
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
-
-EOL
-
- elif [[ ! -h "$cron_d" ]]; then
- #not a symbolic link
- if [[ -e "$cron_file" ]]; then
- #exist configuration
- #archive old configuration
- mv "$cron_d" "$cron_file.old.$(hostname)"
- else
- mv "$cron_d" "$cron_file"
- fi
- fi
-
- #symplic link
- ln -s "$cron_file" "$cron_d" 2>/dev/null
-}
-
-function cron_action_job(){
- local action=$1
- parse_opts "$@"
-
- local -r job_key_cron="snap --vmid=$opt_vm_ids --label='$opt_label'"
- local -i check=0; [ "$action" = "create" ] && check=1
- if grep -h "$job_key_cron" "$cron_file"; then
- [ $check -eq 1 ] && { log error "Job already exists in cron file '$cron_file'"; exit 1; }
- else
- [ $check -eq 0 ] && { log error "Job not exists in cron file '$cron_file'"; exit 1; }
- fi
-
- #action
- case $action in
- create)
- local cron_scheduling="0 0 * * *" #Default run once a day at midnight
-
- case "$opt_label" in
- (*hourly*) cron_scheduling="0 * * * *";; #Run once an hour at the beginning of the hour
- (*daily*) cron_scheduling="0 0 * * *";; #Run once a day at midnight
- (*weekly*) cron_scheduling="0 0 * * 0";; #Run once a week at midnight on Sunday morning
- (*monthly*) cron_scheduling="0 0 1 * *";; #Run once a month at midnight of the first day of the month
- esac
-
- local job="$cron_scheduling root $PROGNAME $job_key_cron --keep=$opt_keep"
-
- [ $opt_vm_state -eq 1 ] && job="$job --vmstate"
- [ -e "$opt_script" ] && job="$job --script='$opt_script'"
- [ $opt_syslog -eq 1 ] && job="$job --syslog"
- [ $opt_quiet -eq 1 ] && job="$job --quiet"
- [ ! -z "$opt_exclude_vm_ids" ] && job="$job --exclude-vmid=$opt_exclude_vm_ids"
-
- echo -e "$job" >> "$cron_file"
- ;;
-
- destroy) sed -i "\?$job_key_cron?d" "$cron_file";;
- enable) sed -i "\?$job_key_cron?s?^#??g" "$cron_file";;
- disable) sed -i "\?$job_key_cron?s?^?#?g" "$cron_file";;
- esac
-
- echo -e "Job $action in cron file '$cron_file'";
-}
-
-function clean(){
- parse_opts "$@"
-
- local begin=$SECONDS
- log debug "$PROGNAME $VERSION"
- log debug "Command line: $*"
-
- call_hook_script "clean-job-start" "-"
-
- for vm_id in $vm_ids; do
- get_technology
- [ -z "$vm_tecnology" ] && continue;
-
- remove_old_snapshots
- done
-
- vm_tecnology=''
- vm_id=0
-
- call_hook_script "clean-job-end" "-"
-
- log debug "Execution: $((SECONDS-begin)) sec."
-}
-
-function remove_old_snapshots(){
- [ -z "$vm_tecnology" ] && return;
-
- local snapshots;
-
- snapshots=$($vm_tecnology listsnapshot $vm_id | \
- grep "$PROGNAME" | \
- sed -r 's/[^a]*(.*?)$/\1/' | \
- awk '{print $1}' | \
- grep "$snap_name_prefix" | \
- sort -r );
-
- local -i index=0
- local snap_name=''
- for snap_name in $snapshots; do
- if [ "$index" -ge "$opt_keep" ]; then
- log info "VM $vm_id - Removing snapshot $snap_name"
-
- call_hook_script "snap-remove-pre" "$snap_name"
-
- if ! do_run "$vm_tecnology delsnapshot $vm_id $snap_name"; then
- call_hook_script "snap-remove-abort" "$snap_name"
- log error "VM $vm_id - Abort remove snapshot $snap_name"
- continue;
- fi
-
- call_hook_script "snap-remove-post" "$snap_name"
- fi
-
- let index++
- done
-}
-
-function status(){
- local print_header=1
-
- local tecnology=''
- for tecnology in $QEMU_CMD $LXC_CMD; do
- local vm=''
- for vm in $($tecnology list | awk '{print $1}' | sed 1d); do
- local result;
- result=$($tecnology listsnapshot "$vm" | \
- grep "$PROGNAME" | \
- sed -r 's/[^a]*(.*?)$/\1/' | \
- sort -r | \
- awk -v vm="$vm" '{print vm,substr($1,1+length($1)-12),substr($1,5,1+length($1)-12-5)}' | \
- awk 'BEGIN {FIELDWIDTHS="6 14 10"} {printf "%s %s %s\n",$1,$2,$3}')
-
- if [ ! -z "$result" ]; then
- if [ $print_header -eq 1 ]; then
- print_header=0
- echo "VM SNAPSHOTS LABEL"
- fi
-
- echo "${result}"
- fi
- done
- done
-}
-
-function call_hook_script(){
- export CV4PVE_AUTOSNAP_PHASE="$1"
- export CV4PVE_AUTOSNAP_SNAP_NAME="$2"
- export CV4PVE_AUTOSNAP_VMID=$vm_id
- export CV4PVE_AUTOSNAP_VMTECHNOLOGY=$vm_tecnology
- export CV4PVE_AUTOSNAP_LABEL="$opt_label"
- export CV4PVE_AUTOSNAP_KEEP=$opt_keep
- export CV4PVE_AUTOSNAP_VMSTATE=$opt_vm_state
-
- log debug "------------------------------------------------------------"
- log debug "CV4PVE_AUTOSNAP_PHASE: $CV4PVE_AUTOSNAP_PHASE"
- log debug "CV4PVE_AUTOSNAP_VMID: $CV4PVE_AUTOSNAP_VMID"
- log debug "CV4PVE_AUTOSNAP_VMTECHNOLOGY: $CV4PVE_AUTOSNAP_VMTECHNOLOGY"
- log debug "CV4PVE_AUTOSNAP_LABEL: $CV4PVE_AUTOSNAP_LABEL"
- log debug "CV4PVE_AUTOSNAP_KEEP: $CV4PVE_AUTOSNAP_KEEP"
- log debug "CV4PVE_AUTOSNAP_VMSTATE: $CV4PVE_AUTOSNAP_VMSTATE"
- log debug "CV4PVE_AUTOSNAP_SNAP_NAME: $CV4PVE_AUTOSNAP_SNAP_NAME"
- log debug "------------------------------------------------------------"
-
- if [ -e "$opt_script" ]; then
- log debug "VM $vm_id - Script hook: $opt_script"
- do_run "$opt_script"
- fi
-}
-
-function snap(){
- parse_opts "$@"
-
- log debug "$PROGNAME $VERSION"
- log debug "Command line: $*"
-
- local begin=$SECONDS
- local snap_name; snap_name="$snap_name_prefix$(date +%y%m%d%H%M%S)"
-
- call_hook_script "snap-job-start" "-"
-
- for vm_id in $vm_ids; do
- get_technology
- [ -z "$vm_tecnology" ] && continue;
-
- local vm_state='';
- if [ $vm_tecnology = $QEMU_CMD ]; then
- #memory status
- [ $opt_vm_state -eq 1 ] && vm_state="--vmstate"
-
- #agent enabled optimize freeze the guest file system
- if ! $vm_tecnology config "$vm_id" --current | grep 'agent: 1' 1>/dev/null; then
- log info "VM $vm_id consider enabling QEMU agent see https://pve.proxmox.com/wiki/Qemu-guest-agent"
- fi
- fi
-
- #create snapshot
- call_hook_script "snap-create-pre" "$snap_name"
-
- log info "VM $vm_id - Creating snapshot $snap_name"
- if ! do_run "$vm_tecnology snapshot $vm_id $snap_name -description '$PROGNAME' $vm_state"; then
- call_hook_script "snap-create-abort" "$snap_name"
- log error "VM $vm_id - Create snapshot $snap_name"
- continue;
- fi
-
- call_hook_script "snap-create-post" "$snap_name"
-
- #remove old snapshot
- remove_old_snapshots
- done
-
- vm_tecnology=''
- vm_id=0
-
- call_hook_script "snap-job-end" "-"
-
- log debug "Execution: $((SECONDS-begin)) sec."
-}
-
-function do_run(){
- local cmd=$*;
- local -i rc=0;
-
- if [ $opt_dry_run -eq 1 ]; then
- echo "$cmd"
- rc=$?
- else
- log debug "$cmd"
- eval "$cmd"
- rc=$?
- [ $rc != 0 ] && log error "$cmd"
- log debug "return $rc"
- fi
-
- return $rc
-}
-
-function main(){
- [ $# = 0 ] && usage;
-
- fix_cron
-
- case "$1" in
- version) echo "$VERSION";;
- help) usage "$@";;
- create|destroy|enable|disable) cron_action_job "$@";;
- clean) clean "$@";;
- status) status;;
- snap) snap "$@";;
- *) usage;;
- esac
-
- exit 0;
-}
-
-main "$@"
diff --git a/src/bash/cv4pve-autosnap.8.template b/src/bash/cv4pve-autosnap.8.template
deleted file mode 100644
index ae68949..0000000
--- a/src/bash/cv4pve-autosnap.8.template
+++ /dev/null
@@ -1,25 +0,0 @@
-.TH @@PACKAGE@@ "8" "@@DATE@@" "@@PACKAGE@@" "Corsinvest Documentation"
-.SH NAME
-@@PACKAGE@@ \- Corsinvest automatic snapshot for Proxmox VE
-.SH SYNOPSIS
-@@SYNOPSIS@@
-
-.SH DESCRIPTION
-This tool create automatic snapshot using Proxmox VE command.
-This tool also has the capability to add jobs to cron so the execute will be automatically done.
-The default execution interval is set daily, if you want to change this value you can do this in /etc/cron.d/@@PACKAGE@@.
-To config cron see man crontab.
-
-.SH HOOK SCRIPTS
-You can specify a hook script with option --script.
-This script is called at various phases of the autosnap process, with parameters accordingly set. You can find an example in the documentation directory /usr/share/doc/@@PACKAGE@@/examples/script-hook.sh
-
-Environment variables:
-
-CV4PVE_AUTOSNAP_PHASE, CV4PVE_AUTOSNAP_VMID, CV4PVE_AUTOSNAP_VMTECHNOLOGY, CV4PVE_AUTOSNAP_LABEL, CV4PVE_AUTOSNAP_KEEP, CV4PVE_AUTOSNAP_VMSTATE, CV4PVE_AUTOSNAP_SNAP_NAME
-
-.SH IMPORTANT FILES
-Cron jobs and config are stored at /etc/pve/cv/autosnap/@@PACKAGE@@.cron
-
-.SH COPYRIGHT AND DISCLAIMER
-@@COPYRIGHT@@
\ No newline at end of file
diff --git a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/OutputType.cs b/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/OutputType.cs
deleted file mode 100644
index 196506b..0000000
--- a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/OutputType.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-namespace Corsinvest.ProxmoxVE.AutoSnap
-{
- ///
- /// Output type
- ///
- public enum OutputType
- {
- ///
- /// Text
- ///
- Text,
-
- ///
- /// Json
- ///
- Json,
-
- ///
- /// Json pretty
- ///
- JsonPretty,
- }
-}
\ No newline at end of file
diff --git a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/Program.cs b/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/Program.cs
deleted file mode 100644
index 3df95ab..0000000
--- a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/Program.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-using Corsinvest.ProxmoxVE.Api.Extension.Utils.Shell;
-
-namespace Corsinvest.ProxmoxVE.AutoSnap
-{
- class Program
- {
- public static int Main(string[] args)
- {
- var app = ShellHelper.CreateConsoleApp(Commands.APPLICATION_NAME, "Automatic snapshot VM/CT with retention");
- new ShellCommands(app);
- return app.ExecuteConsoleApp(Console.Out, args);
- }
- }
-}
\ No newline at end of file
diff --git a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/build.ps1 b/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/build.ps1
deleted file mode 100644
index ee62ef0..0000000
--- a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/build.ps1
+++ /dev/null
@@ -1,62 +0,0 @@
-[System.Console]::Clear();
-
-Write-Output "
- ______ _ __
- / ____/___ __________(_)___ _ _____ _____/ /_
- / / / __ \/ ___/ ___/ / __ \ | / / _ \/ ___/ __/
- / /___/ /_/ / / (__ ) / / / / |/ / __(__ ) /_
- \____/\____/_/ /____/_/_/ /_/|___/\___/____/\__/
-
- Corsinvest for Proxmox VE Auto Snapshot (Made in Italy)
-
- =========================================================
- == Build System
- =========================================================
- "
-
-# function Build($rids, $arch, $exec) {
-# $warpExec = "$HOME\.dotnet\tools\.store\dotnet-warp\1.0.9\dotnet-warp\1.0.9\tools\netcoreapp2.1\any\warp\windows-x64.warp-packer.exe";
-
-# For ($i = 0; $i -lt $rids.Length; $i++) {
-# $rid = $rids[$i]
-# $binDir = "bin\Upload\$rid"
-
-# "======= Build $rid ======= "
-# "Publishing"
-# dotnet publish -c Release -r $rid -o $binDir | Out-Null
-
-# & $warpExec --arch $arch --input_dir $binDir --exec $exec --output "bin\Upload\$rid-$exec"
-# Remove-Item -Path bin\upload\$rid -Recurse -Force
-# }
-# }
-
-# #Build @("osx-x64") "macos-x64" "cv4pve-autosnap"
-# Build @("linux-x64", "linux-arm", "linux-arm64") "linux-x64" "cv4pve-autosnap"
-# #Build @("win-x64", "win-x86", "win-arm", "win-arm64") "windows-x64" "cv4pve-autosnap.exe"
-
-#linux
-$rids = @("linux-x64", "linux-arm", "linux-arm64")
-For ($i = 0; $i -lt $rids.Length; $i++) {
- $rid = $rids[$i]
-
- dotnet publish -r $rid -c Release
- dotnet tarball -f netcoreapp2.2 -r $rid -c Release
- dotnet rpm -f netcoreapp2.2 -r $rid -c Release
- dotnet zip -f netcoreapp2.2 -r $rid -c Release
-}
-
-#debian
-$rids = @("debian-x64", "debian-arm", "debian-arm64")
-For ($i = 0; $i -lt $rids.Length; $i++) {
- $rid = $rids[$i]
- dotnet publish -r $rid -c Release
- dotnet deb -f netcoreapp2.2 -r $rid -c Release
-}
-
-#other
-$rids = @("osx-x64", "win-x86", "win-x64", "win-arm", "win-arm64")
-For ($i = 0; $i -lt $rids.Length; $i++) {
- $rid = $rids[$i]
- dotnet publish -r $rid -c Release
- dotnet zip -f netcoreapp2.2 -r $rid -c Release
-}
\ No newline at end of file
diff --git a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/cv4pve-autosnap.sh b/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/cv4pve-autosnap.sh
deleted file mode 100644
index a95c86c..0000000
--- a/src/dotnet/Corsinvest.ProxmoxVE.AutoSnap/cv4pve-autosnap.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-# ______ _ __
-# / ____/___ __________(_)___ _ _____ _____/ /_
-# / / / __ \/ ___/ ___/ / __ \ | / / _ \/ ___/ __/
-# / /___/ /_/ / / (__ ) / / / / |/ / __(__ ) /_
-# \____/\____/_/ /____/_/_/ /_/|___/\___/____/\__/
-#
-# Corsinvest for Proxmox VE Auto Snapshot (Made in Italy)
-
-exec /usr/share/cv4pve-autosnap/cv4pve-autosnap $@
\ No newline at end of file