소스 검색

merge thurdata & 3.4.0

andre 4 년 전
부모
커밋
00e4766780
67개의 변경된 파일2699개의 추가작업 그리고 248개의 파일을 삭제
  1. 11 1
      app/Http/Actions/CreateAccount.php
  2. 10 2
      app/Http/Client/VirtualNetwork.php
  3. 0 10
      app/Http/Client/Vms.php
  4. 0 10
      app/UI/Admin/Product/Sections/Qemu/ClientAreaSection.php
  5. 0 1
      app/UI/Admin/Product/Sections/Qemu/ConfigurationSection.php
  6. 6 0
      app/UI/Backup/Forms/CreateForm.php
  7. 1 1
      app/UI/Backup/Pages/BackupDataTable.php
  8. 0 2
      app/UI/BackupJob/Forms/CreateForm.php
  9. BIN
      app/UI/Client/Templates/assets/img/buttons/cloneButton.png
  10. 191 0
      app/UI/Client/Templates/assets/js/vm/clone.js
  11. 1 1
      app/UI/Client/Templates/assets/js/vm/create.js
  12. 11 5
      app/UI/Client/Templates/assets/js/vm/index.js
  13. 1 0
      app/UI/Disk/Buttons/UpdateButton.php
  14. 1 1
      app/UI/Disk/Providers/DiskProvider.php
  15. 42 0
      app/UI/Home/Buttons/CloneVmButton.php
  16. 42 0
      app/UI/Home/Forms/CloneVmForm.php
  17. 37 0
      app/UI/Home/Modals/CloneVmModal.php
  18. 12 0
      app/UI/Home/Pages/ServiceActions.php
  19. 12 0
      app/UI/Home/Providers/StatusProvider.php
  20. 1 1
      app/UI/Home/Templates/pages/serviceActions.tpl
  21. 0 1
      app/UI/Snapshot/Pages/SnapshotTrait.php
  22. 1 3
      app/UI/Snapshot/Providers/JobProvider.php
  23. 16 18
      app/UI/Vm/Pages/VmTabs.php
  24. 50 0
      app/UI/VmClone/Fields/IsoImageSelect.php
  25. 96 0
      app/UI/VmClone/Fields/OsTemplateSelect.php
  26. 50 0
      app/UI/VmClone/Fields/SecondaryIsoImageSelect.php
  27. 50 0
      app/UI/VmClone/Forms/VmCloneForm.php
  28. 378 0
      app/UI/VmClone/Providers/VmCloneProvider.php
  29. 34 0
      app/UI/VmClone/Sections/AccountSummary.php
  30. 81 0
      app/UI/VmClone/Sections/AdditionalDiskSection.php
  31. 48 0
      app/UI/VmClone/Sections/DnsSection.php
  32. 173 0
      app/UI/VmClone/Sections/Lxc/GeneralSection.php
  33. 200 0
      app/UI/VmClone/Sections/Qemu/GeneralSection.php
  34. 50 0
      app/UI/VmClone/Sections/TopSection.php
  35. 66 0
      app/UI/VmClone/Sections/VirtualNetworkSection.php
  36. 43 0
      app/UI/VmClone/Templates/sections/DnsSection.tpl
  37. 28 0
      app/UI/VmClone/Templates/sections/accountSummary.tpl
  38. 70 0
      app/UI/VmClone/Templates/sections/additionalDiskSection.tpl
  39. 43 0
      app/UI/VmClone/Templates/sections/lxc/generalSection.tpl
  40. 43 0
      app/UI/VmClone/Templates/sections/qemu/generalSection.tpl
  41. 65 0
      app/UI/VmClone/Templates/sections/topSection.tpl
  42. 81 0
      app/UI/VmClone/Templates/sections/virtualNetworkSection.tpl
  43. 95 0
      app/UI/VmClone/Validators/DiskSizeValidator.php
  44. 31 0
      app/UI/VmClone/Validators/IsoImageValidator.php
  45. 42 0
      app/UI/VmClone/Validators/NameserverValidator.php
  46. 62 0
      app/UI/VmClone/Validators/PasswordValidator.php
  47. 28 0
      app/UI/VmClone/Validators/SearchdomainValidator.php
  48. 60 0
      app/UI/VmClone/Validators/SshPublicKeyValidator.php
  49. 31 0
      app/UI/VmClone/Validators/UserValidator.php
  50. 5 7
      app/UI/VmCreate/Fields/OsTemplateSelect.php
  51. 3 1
      app/UI/VmCreate/Providers/VmCreateProvider.php
  52. 5 3
      app/UI/VmCreate/Sections/Qemu/GeneralSection.php
  53. 0 1
      app/UI/VmUpdate/Forms/VmUpdateForm.php
  54. 70 2
      app/UI/VmUpdate/Providers/VmUpdateProvider.php
  55. 2 1
      app/UI/VmUpdate/Sections/Lxc/GeneralCombinedSection.php
  56. 13 23
      app/UI/VmUpdate/Sections/Lxc/GeneralSection.php
  57. 5 0
      app/UI/VmUpdate/Sections/Qemu/GeneralSection.php
  58. 6 6
      app/UI/Vms/Buttons/ConsoleButton.php
  59. 1 1
      core/App/Controllers/Instances/Addon/ConfigOptions.php
  60. 0 1
      core/Http/Response.php
  61. 20 9
      core/UI/Widget/Sidebar/SidebarAjax.php
  62. 65 49
      langs/english.php
  63. 89 64
      langs/german.php
  64. 18 1
      templates/client/default/assets/css/layers-ui.css
  65. 1 1
      templates/client/default/assets/js/defaultComponents/dataTable.js
  66. 0 3
      templates/client/default/assets/js/layers-ui.js
  67. 2 18
      templates/client/default/controlers/main.tpl

+ 11 - 1
app/Http/Actions/CreateAccount.php

@@ -68,9 +68,19 @@ class CreateAccount extends AddonController
                 if($this->configuration()->isOrderPublicIp()){
                     list($ip4, $ip6) = $this->networkService->getIpAddressesRequest();
                     $bridge = $this->configuration()->getBridge();
-                    $this->networkService->addIp($ip4, $ip6, $this->getDefaultNodeIfSet(), $bridge);
+                    $this->networkService->addIp($ip4, $ip6, $this->getDefaultNodeIfSet(),$bridge);
                 }
             }
+            //update hostname
+            if($params['customfields']['VDCName']){
+                $this->hosting()->domain = $params['customfields']['VDCName'];
+                $this->hosting()->save();
+            }
+            //throw errors
+            if ($this->errors)
+            {
+                throw new \Exception(implode(", ", $this->errors));
+            }
             if( $this->isUser()){
                 return "success";
             }

+ 10 - 2
app/Http/Client/VirtualNetwork.php

@@ -3,7 +3,6 @@
 
 namespace ModulesGarden\Servers\ProxmoxCloudVps\App\Http\Client;
 
-
 use MGProvision\Proxmox\v2\repository\FirewallRulesRepository;
 use ModulesGarden\ProxmoxAddon\App\Services\ApiService;
 use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
@@ -18,6 +17,7 @@ use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Pages\ServiceDetails;
 use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Vm\Pages\VmTabs;
 use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmCreate\Forms\VmCreateForm;
 use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmUpdate\Forms\VmUpdateForm;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Forms\VmCloneForm;
 use ModulesGarden\Servers\ProxmoxCloudVps\Core\Http\AbstractClientController;
 use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Traits\WhmcsParams;
 use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ResourceManager;
@@ -101,5 +101,13 @@ class Vm extends AbstractClientController
         });
         $response->send();
     }
+    
+    public function clone()
+    {
+        (new AppParams())->initFromWhmcsParams();
+        $view = view();
+        $view->initCustomAssetFiles();
+        return $view->addElement(VmCloneForm::class);
+    }
 
-}
+}

+ 0 - 10
app/Http/Client/Vms.php

@@ -91,16 +91,6 @@ class ClientAreaSection extends TwiceColumnSection implements AdminArea
         $field->setDefaultValue("on");
         $field->setDescription('tip');
         $this->addField($field);
-        //Snapshot Jobs
-        $field = new Switcher('customconfigoption[permissionSnapshotJob]');
-        $field->setDescription('tip');
-        $field->setDefaultValue("on");
-        $this->leftSection->addField($field);
-        //How Often
-        $field = new Select('customconfigoption[permissionSnapshotJobPeriod][]');
-        $field->setDescription('tip');
-        $field->enableMultiple();
-        $this->rightSection->addField($field);
         //Firewall
         $field = new Switcher('customconfigoption[permissionFirewall]');
         $field->setDefaultValue("on");

+ 0 - 10
app/UI/Admin/Product/Sections/Qemu/ClientAreaSection.php

@@ -108,16 +108,6 @@ class ClientAreaSection extends TwiceColumnSection implements AdminArea
         $field->setDescription('tip');
         $field->setDefaultValue("on");
         $this->addField($field);
-        //Snapshot Jobs
-        $field = new Switcher('customconfigoption[permissionSnapshotJob]');
-        $field->setDescription('tip');
-        $field->setDefaultValue("on");
-        $this->leftSection->addField($field);
-        //How Often
-        $field = new Select('customconfigoption[permissionSnapshotJobPeriod][]');
-        $field->setDescription('tip');
-        $field->enableMultiple();
-        $this->rightSection->addField($field);
         //Firewall
         $field = new Switcher('customconfigoption[permissionFirewall]');
         $field->setDescription('tip');

+ 0 - 1
app/UI/Admin/Product/Sections/Qemu/ConfigurationSection.php

@@ -171,7 +171,6 @@ class ConfigurationSection extends BoxSection implements AdminArea
         $field = new Text('customconfigoption[vgaMemory]');
         $field->setDescription('tip');
         $this->leftSection->addField($field);
-
     }
 
 }

+ 6 - 0
app/UI/Backup/Forms/CreateForm.php

@@ -64,6 +64,12 @@ class CreateForm extends BaseForm implements ClientArea
     {
         //compress
         $field = new Select('compress');
+        $field->setAvailableValues([
+            "0"    => sl("lang")->tr("None"),
+            "lzo"  => sl("lang")->tr("LZO (fast)"),
+            "gzip" => sl("lang")->tr("GZIP (good)"),
+            "zstd" => sl("lang")->abtr("ZSTD (fast and good)")
+        ]);
         $field->setDefaultValue('zstd');
         $field->addClass('hidden');
         $this->addField($field);

+ 1 - 1
app/UI/Backup/Pages/BackupDataTable.php

@@ -52,7 +52,7 @@ class BackupDataTable extends DataTable implements ClientArea
         $createButton->addClass("pmCreateBackupButton");
         if (!$this->resourceGuard()->hasBackupLimit())
         {
-            $createButton->addClass("disabled");
+            $createButton->addClass("hidden");
         }
         $this->unsetShowTitle();
         if ($this->configuration()->isPermissionBackup())

+ 0 - 2
app/UI/BackupJob/Forms/CreateForm.php

@@ -96,13 +96,11 @@ class CreateForm extends BaseForm implements ClientArea
         $field = new Select('compress');
         $field->setDefaultValue('zstd');
         $field->notEmpty();
-        $field->addClass('hidden');
         $this->addField($field);
         //mode
         $field = new Select('mode');
         $field->setAvailableValues([
             "snapshot" => sl("lang")->tr("snapshot"),
-//            "suspend"  => sl("lang")->tr("suspend"),
             "stop"     => sl("lang")->tr("stop")
         ]);
         $field->notEmpty();

BIN
app/UI/Client/Templates/assets/img/buttons/cloneButton.png


+ 191 - 0
app/UI/Client/Templates/assets/js/vm/clone.js

@@ -0,0 +1,191 @@
+
+/*Create VM*/
+$(document).ready(function () {
+    //change os template
+    $("#osTemplate").change(function (e) {
+        console.log($(this).val() );
+        //show
+        if($(this).val() == "installationFromIso"){
+            if($("#isoImage").size()){
+                $("#isoImage").closest(".lu-form-group").show();
+            }
+            if($("#secondaryIsoImage").size()){
+                $("#secondaryIsoImage").closest(".lu-form-group").show();
+            }
+            // ostype
+            if($('select[name="ostype"]').size()){
+                $('select[name="ostype"]').closest(".lu-form-group").show();
+            }
+            // password
+            if($('input[name="password"]').size()){
+                $('input[name="password"]').closest(".lu-form-group").hide();
+            }
+            // sshkeys
+            if($('textarea[name="sshkeys"]').size()){
+                $('textarea[name="sshkeys"]').closest(".lu-form-group").hide();
+            }
+            // ciuser
+            if($('input[name="ciuser"]').size()){
+                $('input[name="ciuser"]').closest(".lu-form-group").hide();
+            }
+            // searchdomain
+            if($('input[name="searchdomain"]').size()){
+                $('input[name="searchdomain"]').closest(".lu-form-group").hide();
+            }
+            // nameserver
+            if($('input[name="nameserver[0]"]').size()){
+                $('input[name="nameserver[0]"]').closest(".lu-form-group").hide();
+                $('input[name="nameserver[1]"]').closest(".lu-form-group").hide();
+            }
+            //hide
+        } else {
+            if($("#isoImage").size()){
+                $("#isoImage").closest(".lu-form-group").hide();
+            }
+            if($("#secondaryIsoImage").size()){
+                $("#secondaryIsoImage").closest(".lu-form-group").hide();
+            }
+            // ostype
+            if($('select[name="ostype"]').size()){
+                $('select[name="ostype"]').closest(".lu-form-group").hide();
+            }
+            // password
+            if($('input[name="password"]').size()){
+                $('input[name="password"]').closest(".lu-form-group").show();
+            }
+            // sshkeys
+            if($('textarea[name="sshkeys"]').size()){
+                $('textarea[name="sshkeys"]').closest(".lu-form-group").show();
+            }
+            // ciuser
+            if($('input[name="ciuser"]').size()){
+                $('input[name="ciuser"]').closest(".lu-form-group").show();
+            }
+            // searchdomain
+            if($('input[name="searchdomain"]').size()){
+                $('input[name="searchdomain"]').closest(".lu-form-group").show();
+            }
+            // nameserver
+            if($('input[name="nameserver[0]"]').size()){
+                $('input[name="nameserver[0]"]').closest(".lu-form-group").show();
+                $('input[name="nameserver[1]"]').closest(".lu-form-group").show();
+            }
+        }
+    });
+    //fire event
+    $("#osTemplate").trigger("change");
+    //virtual network
+    var selectizedInstance = $('.pm-virtual-network-content-default .selectized').selectize();
+    selectizedInstance.each(function(){
+        this.selectize.destroy();
+    });
+    //create
+    $("#pm-add-new-virtual-network-button").on("click",function (e) {
+        e.preventDefault();
+        var content = $('.pm-virtual-network-content-default').clone();
+        content.removeClass("hidden");
+        content.removeClass("pm-virtual-network-content-default");
+        var index = $("#pm-add-new-virtual-network-button").closest('.lu-widget').find('.lu-widget').size();
+        content.find('select[name="virtualNetwork[id]"]').prop("name","virtualNetwork"+index+"[id]");
+        content.find('select[name="virtualNetwork[ip]"]').prop("name","virtualNetwork"+index+"[ip]");
+        $(this).closest('.lu-widget').find('.lu-widget').last().after(content);
+        $(this).closest('.lu-widget').find('.pm-vn-select').trigger("change");
+        $(this).closest('.lu-widget').find('.lu-alert').hide();
+        $(".pm-virtual-network-content-default").parent().find(".lu-alert").hide();
+    });
+    //delete
+    $(".mg-wrapper").delegate(".pm-delete-virtual-network-button","click",function (e) {
+        e.preventDefault();
+        $(this).closest('.lu-widget').remove();
+        if($(".pm-virtual-network-content-default").parent().find(".lu-widget").length <= 1)
+        {
+            $(".pm-virtual-network-content-default").parent().find(".lu-alert").show();
+        }
+    });
+    //change
+    $(".mg-wrapper").delegate(".pm-vn-select","change",function (e) {
+        var show = '.vn-ip-'+$(this).val();
+        $(this).closest('.lu-widget__content').find('.pm-vn-ip-select option').hide();
+        $(this).closest('.lu-widget__content').find(show).show();
+        var firstOption =  $(this).closest('.lu-widget__content').find('.pm-vn-ip-select '+show+':first').val();
+        $(this).closest('.lu-widget__content').find('.pm-vn-ip-select').val(firstOption);
+    });
+    //disk
+    var selectizedInstance = $('.pm-disk-content-default .selectized').selectize();
+    selectizedInstance.each(function(){
+        this.selectize.destroy();
+    });
+    //create
+    $("#pm-add-disk-button").on("click",function (e) {
+        e.preventDefault();
+        var content = $('.pm-disk-content-default').clone();
+        content.removeClass("hidden");
+        content.removeClass("pm-disk-content-default");
+        var index = $("#pm-add-disk-button").closest('.lu-widget').find('.lu-widget').size();
+        content.find('output[for="additionalDiskSize"]').prop("id","outputadditionalDiskSize"+index).prop("for","additionalDiskSize"+index);
+        content.find('input[name="additionalDiskSize"]').prop("name","additionalDiskSize"+index).attr("oninput","outputadditionalDiskSize"+index+".value=additionalDiskSize"+index+".value");
+        content.find('select[name="additionalDiskBus"]').prop("name","additionalDiskBus"+index);
+        content.find('select[name="additionalDiskFormat"]').prop("name","additionalDiskFormat"+index);
+        content.find('input[name="additionalDiskBackup"]').prop("name","additionalDiskBackup"+index);
+        content.find('input[name="additionalDiskMp"]').prop("name","additionalDiskMp"+index);
+        $(this).closest('.lu-widget').find('.lu-widget').last().after(content);
+        $(".pm-disk-content-default ").parent().find(".lu-alert").hide();
+    });
+    //delete
+    $(".mg-wrapper").delegate(".pm-delete-disk-button","click",function (e) {
+        e.preventDefault();
+        $(this).closest('.lu-widget').remove();
+        if($(".pm-disk-content-default ").parent().find(".lu-widget").length <= 1)
+        {
+            $(".pm-disk-content-default ").parent().find(".lu-alert").show();
+        }
+    });
+    //cpuPriority change
+    $(".mg-wrapper").delegate("#cpuPriority","input",function (e) {
+        e.preventDefault();
+        var label = $(this).data("label"+$(this).val());
+        $("#outputcpuPriority").html(label);
+    });
+});
+
+/* VM Create done*/
+function pcVmCreatedAjaxDone(data) {
+    if(data.htmlData.redirectUrl)
+    {
+        window.location.href = data.htmlData.redirectUrl;
+    }
+}
+
+function pcOsTemplateLoadShowIsoFields(data) {
+    if($("#isoImage").size()){
+        $("#isoImage").closest(".lu-form-group").show();
+    }
+    if($("#secondaryIsoImage").size()){
+        $("#secondaryIsoImage").closest(".lu-form-group").show();
+    }
+    // ostype
+    if($('select[name="ostype"]').size()){
+        $('select[name="ostype"]').closest(".lu-form-group").show();
+    }
+    // password
+    if($('input[name="password"]').size()){
+        $('input[name="password"]').closest(".lu-form-group").hide();
+    }
+    // sshkeys
+    if($('textarea[name="sshkeys"]').size()){
+        $('textarea[name="sshkeys"]').closest(".lu-form-group").hide();
+    }
+    // ciuser
+    if($('input[name="ciuser"]').size()){
+        $('input[name="ciuser"]').closest(".lu-form-group").hide();
+    }
+    // searchdomain
+    if($('input[name="searchdomain"]').size()){
+        $('input[name="searchdomain"]').closest(".lu-form-group").hide();
+    }
+    // nameserver
+    if($('input[name="nameserver[0]"]').size()){
+        $('input[name="nameserver[0]"]').closest(".lu-form-group").hide();
+        $('input[name="nameserver[1]"]').closest(".lu-form-group").hide();
+    }
+}

+ 1 - 1
app/UI/Client/Templates/assets/js/vm/create.js

@@ -126,7 +126,7 @@ $(document).ready(function () {
         content.find('input[name="additionalDiskSize"]').prop("name","additionalDiskSize"+index).attr("oninput","outputadditionalDiskSize"+index+".value=additionalDiskSize"+index+".value");
         content.find('select[name="additionalDiskBus"]').prop("name","additionalDiskBus"+index);
         content.find('select[name="additionalDiskFormat"]').prop("name","additionalDiskFormat"+index);
-        content.find('select[name="additionalDiskBackup"]').prop("name","additionalDiskBackup"+index);
+        content.find('input[name="additionalDiskBackup"]').prop("name","additionalDiskBackup"+index);
         content.find('input[name="additionalDiskMp"]').prop("name","additionalDiskMp"+index);
         $(this).closest('.lu-widget').find('.lu-widget').last().after(content);
         $(".pm-disk-content-default ").parent().find(".lu-alert").hide();

+ 11 - 5
app/UI/Client/Templates/assets/js/vm/index.js

@@ -66,11 +66,11 @@ function pmToggleBackupButton(data) {
     let button = $(".pmCreateBackupButton");
     if(data.htmlData.createButtonStatus)
     {
-        button.removeClass('disabled');
+        button.removeClass('hidden');
     }
     else
     {
-        button.addClass('disabled');
+        button.addClass('hidden');
     }
 }
 
@@ -103,6 +103,14 @@ function pcVmDeltedAjaxDone(data) {
     }
 }
 
+/* VM shutdown done*/
+function pcVmStoppedAjaxDone(data) {
+    if(data.htmlData.redirectUrl)
+    {
+        window.location.href = data.htmlData.redirectUrl;
+    }
+}
+
 $(document).ready(function () {
     //virtual network
     var selectizedInstance = $('.pm-virtual-network-content-default .selectized').selectize();
@@ -157,7 +165,7 @@ $(document).ready(function () {
         content.find('input[name="additionalDiskSize"]').prop("name","additionalDiskSize"+index).attr("oninput","outputadditionalDiskSize"+index+".value=additionalDiskSize"+index+".value");
         content.find('select[name="additionalDiskBus"]').prop("name","additionalDiskBus"+index);
         content.find('select[name="additionalDiskFormat"]').prop("name","additionalDiskFormat"+index);
-        content.find('select[name="additionalDiskBackup"]').prop("name","additionalDiskBackup"+index);
+        content.find('input[name="additionalDiskBackup"]').prop("name","additionalDiskBackup"+index);
         content.find('input[name="additionalDiskMp"]').prop("name","additionalDiskMp"+index);
         $(this).closest('.lu-widget').find('.lu-widget').last().after(content);
         $(".pm-disk-content-default ").parent().find(".lu-alert").hide();
@@ -223,7 +231,6 @@ var mgFile ={
         fileReader =  new FileReader();
         fileReader.onload = mgFile.pushResult;
         fileReader.readAsText(file);
-
     },
     pushResult: function(){
         $("#pmRulesJson").val(fileReader.result);
@@ -234,7 +241,6 @@ $(".mg-wrapper").on("change", "#pmFirewallRules", function () {
     mgFile.read('pmFirewallRules');
 });
 
-
 $(".mg-wrapper").on("click", ".dt-button", function (e) {
     if(!$(this).parents('#backupDataTable').length){
         return;

+ 1 - 0
app/UI/Disk/Buttons/UpdateButton.php

@@ -31,4 +31,5 @@ class UpdateButton extends ButtonDataTableModalAction implements ClientArea
         $this->initIds('updateDiskButton');
         $this->initLoadModalAction(new UpdateModal());
     }
+
 }

+ 1 - 1
app/UI/Disk/Providers/DiskProvider.php

@@ -125,7 +125,7 @@ class DiskProvider extends BaseDataProvider implements ClientArea
         }
         if($hdd->getName() == 'disk-0'){
             $vm->config(true);
-            $vmModel->disk =  $vm->getHardDiskRepostiory()->findById($hdd->getId())->getGb();
+            $vmModel->disk =  $vm->getMasterHddSize();
         }else{
             $vmModel->disks = $vm->getHardDiskRepostiory()->additionalSize();
         }

+ 42 - 0
app/UI/Home/Buttons/CloneVmButton.php

@@ -0,0 +1,42 @@
+<?php
+/* * ********************************************************************
+*  ProxmoxVPS Product developed. (27.03.19)
+* *
+*
+*  CREATED BY MODULESGARDEN       ->       http://modulesgarden.com
+*  CONTACT                        ->       contact@modulesgarden.com
+*
+*
+* This software is furnished under a license and may be used and copied
+* only  in  accordance  with  the  terms  of such  license and with the
+* inclusion of the above copyright notice.  This software  or any other
+* copies thereof may not be provided or otherwise made available to any
+* other person.  No title to and  ownership of the  software is  hereby
+* transferred.
+*
+*
+* ******************************************************************** */
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Buttons;
+
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Modals\CloneVmModal;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Modals\StopModal;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\Helper\BuildUrl;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Interfaces\AdminArea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Interfaces\ClientArea;
+
+class CloneVmButton extends AbstractActionButton implements ClientArea, AdminArea
+{
+    public function initContent()
+    {
+        $this->initIds('cloneVmButton');
+        $this->setIcon('lu-zmdi lu-zmdi-copy');
+        $this->addClass('lu-btn--danger');
+        $this->initLoadModalAction(new CloneVmModal());
+    }
+
+    public function getImageUrl()
+    {
+        return BuildUrl::getAppAssetsURL() . DS . 'img' . DS . 'buttons' . DS  . 'cloneButton.png';
+    }
+}

+ 42 - 0
app/UI/Home/Forms/CloneVmForm.php

@@ -0,0 +1,42 @@
+<?php
+/* * ********************************************************************
+*  ProxmoxVPS Product developed. (27.03.19)
+* *
+*
+*  CREATED BY MODULESGARDEN       ->       http://modulesgarden.com
+*  CONTACT                        ->       contact@modulesgarden.com
+*
+*
+* This software is furnished under a license and may be used and copied
+* only  in  accordance  with  the  terms  of such  license and with the
+* inclusion of the above copyright notice.  This software  or any other
+* copies thereof may not be provided or otherwise made available to any
+* other person.  No title to and  ownership of the  software is  hereby
+* transferred.
+*
+*
+* ******************************************************************** */
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Forms;
+
+
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Providers\StatusProvider;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\BaseForm;
+
+class CloneVmForm extends BaseForm implements ClientArea
+{
+    public function initContent()
+    {
+        $this->initIds('cloneVmForm');
+        $this->setFormType('cloneVm');
+        $this->setProvider(new StatusProvider());
+        $this->setConfirmMessage('confirmCloneVm');
+        $this->loadDataToForm();
+    }
+
+    public function getAllowedActions()
+    {
+        return ['cloneVm'];
+    }
+}

+ 37 - 0
app/UI/Home/Modals/CloneVmModal.php

@@ -0,0 +1,37 @@
+<?php
+/* * ********************************************************************
+*  ProxmoxVPS Product developed. (27.03.19)
+* *
+*
+*  CREATED BY MODULESGARDEN       ->       http://modulesgarden.com
+*  CONTACT                        ->       contact@modulesgarden.com
+*
+*
+* This software is furnished under a license and may be used and copied
+* only  in  accordance  with  the  terms  of such  license and with the
+* inclusion of the above copyright notice.  This software  or any other
+* copies thereof may not be provided or otherwise made available to any
+* other person.  No title to and  ownership of the  software is  hereby
+* transferred.
+*
+*
+* ******************************************************************** */
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Modals;
+
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Forms\CloneVmForm;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Forms\StopForm;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Modals\ModalConfirmDanger;
+
+class CloneVmModal extends ModalConfirmDanger implements ClientArea
+{
+
+    public function initContent()
+    {
+        $this->initIds('cloneVmModal');
+        $this->setModalSizeLarge();
+        $this->addForm(new CloneVmForm());
+    }
+
+}

+ 12 - 0
app/UI/Home/Pages/ServiceActions.php

@@ -26,6 +26,7 @@ use ModulesGarden\ProxmoxAddon\App\Services\ApiService;
 use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
 use ModulesGarden\Servers\ProxmoxCloudVps\App\Helpers\UrlServiceHelper;
 use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Buttons\DeleteVmButton;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Buttons\CloneVmButton;
 use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Buttons\MigrateButton;
 use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Buttons\RebootButton;
 use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Buttons\RedirectButton;
@@ -113,6 +114,17 @@ class ServiceActions extends BaseContainer implements ClientArea, AdminArea
         if( $keyPair instanceof  KeyPair){
             $this->addButton(new SshKeyButton());
         }
+        //Clone VM
+        if($vm->isRunning()) {
+            $this->addButton(new CloneVmButton('cloneVmButton'));
+        } else {
+            $cloneVmButton = new RedirectButton('cloneVmButton');
+            $cloneVmButton->setImageUrl(BuildUrl::getAppAssetsURL() . DS . 'img' . DS . 'buttons' . DS . 'cloneButton.png');
+            $url ="clientarea.php?action=productdetails&id={$this->getWhmcsParamByKey('serviceid')}&modop=custom&a=management&mg-page=vm&mg-action=clone&vm={$this->getRequestValue('vm', false)}";
+            $cloneVmButton->setHref($url);
+            $cloneVmButton->setIcon('lu-zmdi lu-zmdi-copy');
+            $this->addButton($cloneVmButton);
+        }
         //Delete VM
         $this->addButton(new DeleteVmButton('deleteVmButton'));
         $this->customTplVars['buttonSyle'] = $this->configuration()->getButtonSyle();

+ 12 - 0
app/UI/Home/Providers/StatusProvider.php

@@ -116,6 +116,18 @@ class StatusProvider extends BaseDataProvider implements ClientArea
             ->setMessageAndTranslate('The Virtual Machine has been deleted successfully');
     }
 
+    public function cloneVm()
+    {
+        $vm = \ModulesGarden\ProxmoxAddon\Core\Helper\sl('Vm')->getVm();
+        $vm->shutdown();
+        $vmModel = \ModulesGarden\ProxmoxAddon\Core\Helper\sl('Vm')->getVmModel();
+        return (new HtmlDataJsonResponse())
+            ->setStatusSuccess()
+            ->setMessageAndTranslate('Shut down the Virtual Machine')
+            ->setCallBackFunction('pcVmStoppedAjaxDone')
+            ->addData('redirectUrl' , "clientarea.php?action=productdetails&id={$vmModel->hosting_id}&modop=custom&a=management&mg-page=vm&mg-action=clone&vm={$vmModel->id}");
+    }
+
     public function read()
     {
     }

+ 1 - 1
app/UI/Home/Templates/pages/serviceActions.tpl

@@ -3,7 +3,7 @@
 <div class="lu-tiles lSu-row lu-row--eq-height">
     <hr class="lu-m-v-2x"/>
     {foreach from=$rawObject->getButtons() key=buttonId item=dataElement}
-    <div class="lu-col-sm-15p {if $buttonId == 'deleteVmButton'} lu-pull-right{/if}" style="justify-content: center;" data-button-id="{$buttonId}">
+    <div class="lu-col-sm-12p {if $buttonId == 'cloneVmButton'} lu-pull-right{/if}{if $buttonId == 'deleteVmButton'} lu-align-right{/if}" style="justify-content: center;" data-button-id="{$buttonId}">
         <a class="lu-tile lu-tile--btn" {foreach $dataElement->getHtmlAttributes() as $aValue} {$aValue@key}="{$aValue}" {/foreach}
         data-title="{$MGLANG->absoluteT('buttons','actions', $dataElement->getTitle())}">
         <div class="lu-i-c-6x">

+ 0 - 1
app/UI/Snapshot/Pages/SnapshotTrait.php

@@ -29,7 +29,6 @@ trait SnapshotTrait
 
     public function initContent()
     {
-
         //Create
         $createButton = new CreateButton();
         $createButton->addClass("pmCreateSnapshotButton");

+ 1 - 3
app/UI/Snapshot/Providers/JobProvider.php

@@ -80,8 +80,7 @@ class JobProvider  extends BaseModelDataProvider implements ClientArea
         //hosting_id
         $this->formData['hosting_id']= $this->getWhmcsParamByKey('serviceid');
         //vm_id
-        $this->model->vm_id = \ModulesGarden\ProxmoxAddon\Core\Helper\sl('Vm')->getVmModel()->id;
-        $this->formData['vmid'] = $this->model->vm_id;
+        $this->formData['vm_id']= \ModulesGarden\ProxmoxAddon\Core\Helper\sl('Vm')->getVmModel()->id;
         //fill from data
         $this->model->fill($this->formData)->save();
         sl('lang')->addReplacementConstant('name', $this->formData['name']);
@@ -116,7 +115,6 @@ class JobProvider  extends BaseModelDataProvider implements ClientArea
 
     public function delete()
     {
-
         parent::delete();
         sl('lang')->addReplacementConstant('name', $this->formData['name']);
         return (new HtmlDataJsonResponse())->setMessageAndTranslate('Snapshot Job :name: has been deleted successfully')

+ 16 - 18
app/UI/Vm/Pages/VmTabs.php

@@ -79,24 +79,22 @@ class VmTabs extends TabsWidget implements ClientArea
         /**
          * Reinstall
          */
-        if ($this->configuration()->isPermissionReinstall()) {
-            if ($this->configuration()->isQemu() && $this->configuration()->isPermissionOsTemplate() && $this->configuration()->isPermissionIsoImage())
-            {
-                $this->addElement(ReinstallTab::class);
-            }
-            elseif ($this->configuration()->isQemu() && $this->configuration()->isPermissionOsTemplate())
-            {
-                $this->addElement(TemplateDataTable::class);
-            }
-            elseif ($this->configuration()->isQemu() && $this->configuration()->isPermissionIsoImage())
-            {
-                $this->addElement(IsoDataTable::class);
-                //lxc
-            }
-            elseif ($this->configuration()->isLxc())
-            {
-                $this->addElement(TemplateDataTable::class);
-            }
+        if ($this->configuration()->isQemu() && $this->configuration()->isPermissionOsTemplate() && $this->configuration()->isPermissionIsoImage())
+        {
+            $this->addElement(ReinstallTab::class);
+        }
+        elseif ($this->configuration()->isQemu() && $this->configuration()->isPermissionOsTemplate())
+        {
+            $this->addElement(TemplateDataTable::class);
+        }
+        elseif ($this->configuration()->isQemu() && $this->configuration()->isPermissionIsoImage())
+        {
+            $this->addElement(IsoDataTable::class);
+            //lxc
+        }
+        elseif ($this->configuration()->isLxc())
+        {
+            $this->addElement(TemplateDataTable::class);
         }
     }
 }

+ 50 - 0
app/UI/VmClone/Fields/IsoImageSelect.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Fields;
+
+use MGProvision\Proxmox\v2\repository\FileRepository;
+use MGProvision\Proxmox\v2\repository\StorageRepository;
+use ModulesGarden\ProxmoxAddon\App\Services\ApiService;
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\AjaxFields\Select;
+
+class IsoImageSelect extends Select implements ClientArea
+{
+    use ProductService;
+    use ApiService;
+
+    public function prepareAjaxData()
+    {
+        session_write_close();
+        //default node
+        if($this->getRequestValue('location')){
+            $defaultNode = $this->getRequestValue('location');
+        }else{
+            $defaultNode = $this->getNode()->getNode();
+        }
+        $storageRepository = new StorageRepository();
+        $storageRepository->findByNodes([$defaultNode])
+            ->findEnabed();
+        $storages            = $storageRepository->fetchAsArray();
+        $isoRepository = new FileRepository();
+        $isoRepository->findByNodes([$defaultNode])
+            ->findByStorages($storages);
+        $isoRepository->findIso();
+
+        foreach ($isoRepository->fetch() as $entity)
+        {
+            if ($this->configuration()->isPermissionIsoImages() && !in_array($entity->getVolid(), $this->configuration()->getPermissionIsoImages()))
+            {
+                continue;
+            }
+
+            $this->availableValues[]=[
+                "key" => $entity->getVolid(),
+                "value"     => $entity->getFriendlyName(),
+            ];
+        }
+    }
+
+
+}

+ 96 - 0
app/UI/VmClone/Fields/OsTemplateSelect.php

@@ -0,0 +1,96 @@
+<?php
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Fields;
+
+use MGProvision\Proxmox\v2\repository\ClusterResourcesRepository;
+use MGProvision\Proxmox\v2\repository\FileRepository;
+use MGProvision\Proxmox\v2\repository\StorageRepository;
+use ModulesGarden\ProxmoxAddon\App\Services\ApiService;
+use ModulesGarden\ProxmoxAddon\App\Models\VmModel;
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
+use ModulesGarden\ProxmoxAddon\Core\Helper\AdvancedUserHelper;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\AjaxFields\Select;
+use function ModulesGarden\Servers\ProxmoxCloudVps\Core\Helper\sl;
+
+class OsTemplateSelect extends Select implements ClientArea {
+    use ProductService;
+    use ApiService;
+
+    public function prepareAjaxData() {
+        session_write_close();
+        $advancedUser = new AdvancedUserHelper($this->getWhmcsParamByKey('userid'));
+        if ($this->configuration()->isQemu()) {
+            $this->loadQemuTemplates();
+
+/*            if ($advancedUser->isAdvanced() || $this->configuration()->isPermissionIsoImage())
+            {
+                $this->availableValues[] = [
+                    "key"   => 'installationFromIso',
+                    "value" => sl('lang')->abtr('Installation From ISO'),
+                ];
+            }
+            if($this->availableValues[0]['key']=="installationFromIso"){
+                $this->callBackFunction = 'pcOsTemplateLoadShowIsoFields';
+            } */
+        }
+        if ($this->configuration()->isLxc())  {
+            $this->loadLxcTemplates();
+        }
+        if($this->availableValues[0]['key']){
+            $this->value = $this->availableValues[0]['key'];
+        }
+
+        $this->data['additionalData']['showItemDescription']  = true;
+    }
+
+    private function defaultNode()  {
+        if ($this->getRequestValue('location')) {
+            return $this->getRequestValue('location');
+        } else {
+            return $this->getNode()->getNode();
+        }
+    }
+
+    private function loadQemuTemplates() {
+        $vmTemplate = (new VmModel)->ofId($this->getRequestValue('vm', false))->firstOrFail();
+        $id = "{$vmTemplate->node}/{$vmTemplate->vmid}";
+        $name = $vmTemplate->name;
+        $description = $vmTemplate->description;
+        if(!$description){
+            $description = $vmTemplate->name;
+        }
+        $description = str_replace('\n','<br />', $description);
+        $desc = sl('lang')->abtr('template_desc',$description );
+        $desc = nl2br($desc);
+
+        $this->availableValues[] = [
+            "key" => $id,
+            "value" => $name,
+            'description' => $name != $desc ? $desc : null,
+        ];
+
+    }
+
+    private function loadLxcTemplates()   {
+        $defaultNode = $this->defaultNode();
+        $storageRepository = new StorageRepository();
+        $storageRepository->findByNodes([$defaultNode])->findEnabed();
+        $fileRepository = new FileRepository();
+        $fileRepository->setApi($this->api());
+        $fileRepository->findLxcTemplates();
+        $fileRepository->findByNodes([$defaultNode]);
+        $fileRepository->findByStorages($storageRepository->fetchAsArray());
+        foreach ($fileRepository->fetch() as $file) {
+            if ($this->configuration()->isPermissionOsTemplates() && !in_array($file->getVolid(), $this->configuration()->getPermissionOsTemplates())) {
+                continue;
+            }
+            $this->availableValues[] = [
+                "key" => $file->getVolid(),
+                "value" => sl('lang')->abtr('template', $file->getFriendlyName()),
+            ];
+        }
+    }
+
+
+}

+ 50 - 0
app/UI/VmClone/Fields/SecondaryIsoImageSelect.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Fields;
+
+use MGProvision\Proxmox\v2\repository\FileRepository;
+use MGProvision\Proxmox\v2\repository\StorageRepository;
+use ModulesGarden\ProxmoxAddon\App\Services\ApiService;
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\AjaxFields\Select;
+
+class SecondaryIsoImageSelect extends Select implements ClientArea
+{
+    use ProductService;
+    use ApiService;
+
+    public function prepareAjaxData()
+    {
+        session_write_close();
+        //default node
+        if($this->getRequestValue('location')){
+            $defaultNode = $this->getRequestValue('location');
+        }else{
+            $defaultNode = $this->getNode()->getNode();
+        }
+        $storageRepository = new StorageRepository();
+        $storageRepository->findByNodes([$defaultNode])
+            ->findEnabed();
+        $storages            = $storageRepository->fetchAsArray();
+        $isoRepository = new FileRepository();
+        $isoRepository->findByNodes([$defaultNode])
+            ->findByStorages($storages);
+        $isoRepository->findIso();
+
+        foreach ($isoRepository->fetch() as $entity)
+        {
+            if ($this->configuration()->isPermissionSecondaryIsoImages() && !in_array($entity->getVolid(), $this->configuration()->getPermissionSecondaryIsoImages()))
+            {
+                continue;
+            }
+
+            $this->availableValues[]=[
+                "key" => $entity->getVolid(),
+                "value"     => $entity->getFriendlyName(),
+            ];
+        }
+    }
+
+
+}

+ 50 - 0
app/UI/VmClone/Forms/VmCloneForm.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Forms;
+
+use ModulesGarden\ProxmoxAddon\App\Models\VirtualNetwork;
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Providers\VmCloneProvider;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections\AdditionalDiskSection;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections\DnsSection;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections\Lxc;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections\Qemu;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections\TopSection;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections\VirtualNetworkSection;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\BaseStandaloneFormExtSections;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Text;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\HalfPageSection;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\RawSection;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\BaseSection;
+
+class VmCloneForm extends BaseStandaloneFormExtSections implements ClientArea
+{
+    use ProductService;
+
+    public function initContent()
+    {
+        $this->setFormType('create');
+        $this->setProvider(new VmCloneProvider());
+
+        $this->addSection(new TopSection());
+
+        if ($this->configuration()->isQemu())
+        {
+            $this->addSection((new Qemu\GeneralSection())->setMainContainer($this->mainContainer));
+        }
+        if ($this->configuration()->isLxc())
+        {
+            $this->addSection((new Lxc\GeneralSection())->setMainContainer($this->mainContainer));
+        }
+
+        $net = new HalfPageSection('netdisk');
+        $net->setMainContainer($this->mainContainer);
+        $networks = (new VirtualNetworkSection())->setMainContainer($this->mainContainer);
+        $net->addSection($networks);
+        $dns = (new DnsSection())->setMainContainer($this->mainContainer);
+        $net->addSection($dns);
+        $this->addSection($net);
+        $this->loadDataToForm();
+    }
+}

+ 378 - 0
app/UI/VmClone/Providers/VmCloneProvider.php

@@ -0,0 +1,378 @@
+<?php
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Providers;
+
+
+use MGProvision\Proxmox\v2\models\Kvm;
+use ModulesGarden\ProxmoxAddon\App\Jobs\Cloud\CloneQemuJob;
+use ModulesGarden\ProxmoxAddon\App\Jobs\Cloud\CloneQemuJobNoStart;
+use ModulesGarden\ProxmoxAddon\App\Jobs\Cloud\CreateLxcJob;
+use ModulesGarden\ProxmoxAddon\App\Jobs\Cloud\CreateQemuJob;
+use ModulesGarden\ProxmoxAddon\App\Jobs\Cloud\CreateSnippet;
+use ModulesGarden\ProxmoxAddon\App\Libs\Format;
+use ModulesGarden\ProxmoxAddon\App\Models\CloudInitScript;
+use ModulesGarden\ProxmoxAddon\App\Models\VirtualInterface;
+use ModulesGarden\ProxmoxAddon\App\Models\VirtualNetwork;
+use ModulesGarden\ProxmoxAddon\App\Models\VmIpAddress;
+use ModulesGarden\ProxmoxAddon\App\Models\VmModel;
+use ModulesGarden\ProxmoxAddon\App\Services\ApiService;
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\NetworkService;
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ResourceManager;
+use ModulesGarden\ProxmoxAddon\App\Services\Ip\Ipv4Range;
+use ModulesGarden\ProxmoxAddon\App\Services\Utility;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\Helpers\BuildUrl;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\Helpers\UrlServiceHelper;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\FileReader\Reader\Json;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\ModuleConstants;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\ResponseTemplates\HtmlDataJsonResponse;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\DataProviders\BaseModelDataProvider;
+use function ModulesGarden\Servers\ProxmoxCloudVps\Core\Helper\queue;
+use function ModulesGarden\Servers\ProxmoxCloudVps\Core\Helper\sl;
+
+class VmCloneProvider extends BaseModelDataProvider implements ClientArea
+{
+    use ApiService;
+    use ProductService;
+
+    /**
+     * @var VmModel
+     */
+    protected $vmModel;
+    protected $vmTemplate;
+    /**
+     * VmUpdateProvider constructor.
+     */
+    public function __construct()
+    {
+        $this->model = VmModel::class;
+    }
+
+
+    public function read()
+    {
+        parent::read();
+        $this->vmTemplate = (new VmModel)->ofId($this->getRequestValue('vm', false))->firstOrFail();
+        $this->data['template'] = "Name: ". $this->vmTemplate->name . PHP_EOL . sl("lang")->tr("rootdisk") . ": " . $this->vmTemplate->disk . " GB" . PHP_EOL . sl("lang")->tr("adddisk") . ": " . $this->vmTemplate->disks . " GB";
+        /**
+         * virtual network ip addresses
+         * @deprecated
+        foreach (VirtualNetwork::ofHostingId($this->getWhmcsParamByKey('serviceid'))->get() as $vn){
+            $ipRange = new Ipv4Range($vn->pool, $vn->cidr);
+            $ipRange->setLimit(10);
+            $ipRange->disableIpAddresses( $vn->virtualInterfaces->pluck('ip')->toArray());
+            $this->availableValues[sprintf("ip[%s]", $vn->id)] [0] = sl('lang')->abtr('None');
+            foreach (  $ipRange->get() as $ip ){
+                $this->availableValues[sprintf("ip[%s]", $vn->id)] [$ip] = $ip;
+            }
+        }
+         */
+        //use template disk size
+        $this->data['disk'] = $this->vmTemplate->disk;
+        $this->data['disks'] = $this->vmTemplate->disks;
+        //location
+        foreach ($this->configuration()->getLocations() as $location){
+            $this->availableValues['location'] [$location] = sl('lang')->abtr('location', $location);
+        }
+        //ostype
+        $osTypes = $this->configuration()->getPermissionOstype();
+        if($osTypes){
+            $ostype = new Json('ostype.json', ModuleConstants::getFullPathWhmcs('modules', 'addons', 'proxmoxAddon', 'storage', 'app'));
+            foreach ($ostype->get() as $k => $ostype)
+            {
+                if(!in_array($k, $osTypes)){
+                    continue;
+                }
+                $this->availableValues["ostype"][$k] = sl('lang')->abtr('ostype',$ostype);
+            }
+        }
+        //cloudInitScript
+        if($this->configuration()->getCloudInitScript()){
+            $this->availableValues["cloudInitScript"] = CloudInitScript::ofIds($this->configuration()->getCloudInitScript())
+                      ->orderBy('name','asc')
+                      ->pluck('name','id')
+                      ->prepend(sl('lang')->abtr('None'),0)
+                      ->toArray();
+        }
+    }
+
+    public function create()
+    {
+        //Clone KVM check disk size
+        if($this->getJobClass() == CloneQemuJob::class && !$this->isDiskSizeValid()){
+            sl("lang")->addReplacementConstant("size", Format::convertBytes($this->vmTemplate->getMasterHardDisk()->getBytes()));
+            return (new HtmlDataJsonResponse())
+                ->setStatusError()
+                ->setMessageAndTranslate('OS Template require disk size :size:');
+        } elseif ($this->getJobClass() == CloneQemuJobNoStart::class && !$this->isDiskSizeValid()){
+            sl("lang")->addReplacementConstant("size", Format::convertBytes($this->vmTemplate->getMasterHardDisk()->getBytes()));
+            return (new HtmlDataJsonResponse())
+                ->setStatusError()
+                ->setMessageAndTranslate('OS Template require disk size :size:');
+        }
+        //check template status stopped
+        if($this->vmTemplate->status('status')['status'] !== 'stopped') {
+            return (new HtmlDataJsonResponse())
+                ->setStatusError()
+                ->setMessageAndTranslate('Template VM is not in stopped state');
+        }
+        $resurceManager = new ResourceManager();
+        //disk size validation
+        $diskResource = $resurceManager ->disk();
+        $diskResource->setTotal($diskResource ->getTotal() - $this->formData['disk']);
+        $additonalDiskSize = $this->getAdditionalDiskTotalSize();
+        if($this->vmTemplate->getSlaveHddsSize()) {
+            $additonalDiskSize += $this->vmTemplate->getSlaveHddsSize();
+        }
+        if($additonalDiskSize && $additonalDiskSize > $diskResource->freeTotal() ){
+            sl("lang")->addReplacementConstant("additional_disks_size",  $additonalDiskSize);
+            sl("lang")->addReplacementConstant("size", $diskResource->freeTotal());
+            return (new HtmlDataJsonResponse())
+                ->setStatusError()
+                ->setMessageAndTranslate('There is not enougth disk ressource to clone this VM');
+        }
+        //ipv4
+        if($this->configuration()->serverIpv4->min &&  $this->configuration()->serverIpv4->min > $this->countPublicIpv4() ){
+            return (new HtmlDataJsonResponse())
+                ->setStatusError()
+                ->setMessageAndTranslate('Select the Virtual Network with IPv4 address');
+        }
+        $this->vmModel = new VmModel();
+        $this->fillVmModel();
+        if($this->vmTemplate instanceof Kvm){
+            $this->vmModel->data = ['osTemplate'=> $this->vmTemplate->status()['name']];
+        }else{
+            $this->vmModel->data = ['osTemplate'=> $this->formData['osTemplate']];
+        }
+        $this->vmModel->disks = $this->formData['disks'];
+        $this->vmModel->setPassword($this->formData['password']);
+        $this->vmModel->hosting_id = $this->getWhmcsParamByKey('serviceid');
+        unset($this->formData['password']);
+        $this->vmModel->virtualization = $this->configuration()->getVirtualization();
+        if($this->formData['location'] && in_array($this->formData['location'], $this->configuration()->getLocations())){
+            $this->vmModel->node = $this->formData['location'];
+        }else{
+            $this->vmModel->node = $this->getNode()->getNode();
+        }
+        if($this->configuration()->isCalculateSocketsAndCores()){
+            $this->calculateSocketsAndCores();
+        };
+        //init vm
+        $this->vmModel->save();
+        \ModulesGarden\ProxmoxAddon\Core\Helper\sl('Vm')->setVmModel($this->vmModel);
+        $this->createJob();
+        //virtual interfaces
+        for($i=1; $i<=20; $i++){
+            if(!$this->formData['virtualNetwork'.$i]){
+                continue;
+            }
+            $ip = $this->formData['virtualNetwork'.$i]['ip'];
+            $virtualNetworkId = $this->formData['virtualNetwork'.$i]['id'];
+            //lock public ip
+            if(  $virtualNetworkId == 'public'){
+                VmIpAddress::ofHostingId($this->getWhmcsParamByKey('serviceid'))
+                    ->ofIp($ip)
+                    ->update(['vm_id' => $this->vmModel->id ]);
+            }
+            $vi = new VirtualInterface();
+            $vi->ip = $ip;
+            $vi->ip_long = ip2long($ip);
+            $vi->vm_id = $this->vmModel->id;
+            $vi->vn_id = $virtualNetworkId=="public"? 0 : $virtualNetworkId;
+            $vi->hosting_id = $this->getWhmcsParamByKey('serviceid');
+            $vi->save();
+        }
+
+        /**
+         * @deprecated
+         $networkService = new NetworkService();
+        //ip validation
+        $networkService->hasIp((int)$this->formData['ipv4'], (int)$this->formData['ipv6'], $this->vmModel->node);
+        //assign IPs
+        $networkService->addIp((int)$this->formData['ipv4'], (int)$this->formData['ipv6'], $this->vmModel->node);
+        foreach ($this->formData['ip'] as $virtualNetworkId =>  $ip){
+            if($ip == 0){
+                continue;
+            }
+            //request validation
+            if(!VirtualNetwork::where('id', $virtualNetworkId)
+                ->ofHostingId($this->getWhmcsParamByKey('serviceid'))->count()){
+                throw new \InvalidArgumentException(sprintf("Virtual Network %s cannot be found", $virtualNetworkId));
+            }
+        }
+         */
+        return (new  HtmlDataJsonResponse())
+            ->setMessageAndTranslate('The process of Virtual Machine creation is in progress')
+            ->setCallBackFunction('pcVmCreatedAjaxDone')
+            ->addData('redirectUrl' , (new UrlServiceHelper())->home());
+
+    }
+
+    private function getJobClass(){
+        if($this->getFormDataValues()['osTemplate']  && $this->formData['osTemplate'] !='installationFromIso' && $this->configuration()->isQemu()){
+            if($this->getFormDataValues()['start'] == 'off') {
+                return CloneQemuJobNoStart::class;
+            }
+            else {
+                return CloneQemuJob::class;
+            }
+        }elseif (  $this->configuration()->isQemu()){
+            return CreateQemuJob::class;
+        }else{
+            return CreateLxcJob::class;
+        }
+
+    }
+
+    protected function  getJobArguments(){
+        $arguments = $this->formData;
+        $arguments['hostingId'] =$this->getWhmcsParamByKey('serviceid');
+        return $arguments;
+    }
+
+    private function createJob(){
+        $jobClass = $this->getJobClass();
+        if($jobClass == CloneQemuJob::class  && $this->getFormDataValues()['cloudInitScript']){
+            $parent = queue(
+                CreateSnippet::class,
+                $this->getJobArguments(),
+                null,
+                "hosting",
+                $this->getWhmcsParamByKey("serviceid"),
+                $this->vmModel->id
+            );
+        } elseif ($jobClass == CloneQemuJobNoStart::class  && $this->getFormDataValues()['cloudInitScript']){
+            $parent = queue(
+                CreateSnippet::class,
+                $this->getJobArguments(),
+                null,
+                "hosting",
+                $this->getWhmcsParamByKey("serviceid"),
+                $this->vmModel->id
+            );
+        }
+        return queue(
+            $this->getJobClass(),
+            $this->getJobArguments(),
+            $parent->id,
+            "hosting",
+            $this->getWhmcsParamByKey("serviceid"),
+            $this->vmModel->id
+        );
+    }
+
+
+    /**
+     * @deprecated
+     */
+    protected function requestValidation(){
+        //load form data
+        $this->getFormDataValues();
+        //ipv4
+        if(!$this->configuration()->isPermissionIpv4()){
+            $this->formData['ipv4'] = $this->configuration()->serverIpv4->min;
+        }
+        //ipv6
+        if(!$this->configuration()->isPermissionIpv6){
+            $this->formData['ipv6'] = $this->configuration()->serverIpv6->min;
+        }
+    }
+
+    private function isDiskSizeValid(){
+        list($node, $vmid) = explode("/", $this->formData['osTemplate']);
+        $this->vmTemplate = new Kvm($node, $vmid);
+        $this->vmTemplate->setApi($this->api());
+        $diskSizeBytes = $this->formData['disk'];
+        Utility::unitFormat($diskSizeBytes,'gb','bytes');
+        $this->templateDiskSizeBytes = $this->vmTemplate->getMasterHardDisk()->getBytes();
+        return $diskSizeBytes >= $this->templateDiskSizeBytes;
+    }
+
+    protected function fillVmModel(){
+        $this->vmModel->fill($this->getFormDataValues());
+        //sockets
+        if( !$this->configuration()->isPermissionSockets()  && !$this->configuration()->isCalculateSocketsAndCores()){
+            $this->vmModel->sockets = $this->configuration()->serverSockets->min;
+        }
+        //cores
+        if( !$this->configuration()->isPermissionCores() && !$this->configuration()->isCalculateSocketsAndCores() ){
+            $this->vmModel->cores = $this->configuration()->serverCores->min;
+        }
+        //vcpus
+        if( !$this->configuration()->isPermissionVcpus() ){
+            $this->vmModel->vcpus = $this->configuration()->serverVcpus->min;
+        }
+        if($this->configuration()->isCalculateSocketsAndCores()){
+
+        }
+        //cpulimit
+        if( !$this->configuration()->isPermissionCpuLimit() && !$this->formData['cpuPriority']){
+//            $this->vmModel->cpulimit = $this->configuration()->serverCpulimit->min;
+            $this->vmModel->cpulimit = $this->formData['vcpu'] * 0.8;
+        }
+        //cpuunits
+        if( !$this->configuration()->isPermissionCpuunits() && !$this->formData['cpuPriority']){
+            $this->vmModel->cpuunits = $this->configuration()->serverCpuunit->min;
+        }
+        //swap
+        if( !$this->configuration()->isPermissionSwap() ){
+            $this->vmModel->swap = $this->configuration()->serverSwap->min;
+        }
+        //disks
+        $disks = (int) $this->getAdditionalDiskTotalSize();
+        if($disks || $this->configuration()->isDetailsCombinedView()){
+            $this->vmModel->disks = $disks;
+        }
+        //cpu prioryty
+        if($this->formData['cpuPriority']){
+            $this->vmModel->cpulimit = $this->configuration()->get('cpulimitPriority'.$this->formData['cpuPriority']);
+            $this->vmModel->cpuunits = $this->configuration()->get('cpuunitsPriority'.$this->formData['cpuPriority']);
+        }
+    }
+
+    private function getAdditionalDiskTotalSize()
+    {
+        $size = 0;
+        for ($i = 1; $i <= 10; $i++) {
+            $size += (int)$this->formData['additionalDiskSize' . $i];
+        }
+        return $size;
+    }
+
+    protected function calculateSocketsAndCores()
+    {
+        $cores =1;
+        $socket = 1;
+        $cpus = $this->configuration()->serverCores->max;
+        while($cpus > 0)
+        {
+            if($this->vmModel->vcpus % $cpus === 0 && $this->vmModel->vcpus / $cpus <= $this->configuration()->serverSockets->max)
+            {
+                $cores = $cpus;
+                $socket = $this->vmModel->vcpus / $cpus;
+            }
+            $cpus--;
+        }
+        $this->vmModel->cores =  $cores;
+        $this->vmModel->sockets = $socket;
+    }
+
+    public function countPublicIpv4(){
+        $total=0;
+        for($i=1; $i<=20; $i++){
+            if(!$this->formData['virtualNetwork'.$i]){
+                continue;
+            }
+            $ip = $this->formData['virtualNetwork'.$i]['ip'];
+            $virtualNetworkId = $this->formData['virtualNetwork'.$i]['id'];
+            //lock public ip
+            if($ip && !preg_match("/\:/", $ip) &&  $virtualNetworkId == 'public'){
+
+                $total++;
+            }
+        }
+        return $total;
+    }
+
+}

+ 34 - 0
app/UI/VmClone/Sections/AccountSummary.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections;
+
+use ModulesGarden\ProxmoxAddon\App\Models\VirtualNetwork;
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\AccountSummary\Providers\AccountSummaryProvider;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Providers\VmCloneProvider;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections\AdditionalDiskSection;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections\Lxc;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections\Qemu;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections\VirtualNetworkSection;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Builder\BaseContainer;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\BaseStandaloneFormExtSections;
+
+/**
+ * Class AccountSummary
+ * @package ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Forms
+ */
+class AccountSummary extends BaseContainer implements ClientArea
+{
+    use ProductService;
+
+    /**
+     *
+     */
+    public function initContent()
+    {
+        $provider = new AccountSummaryProvider();
+
+        $this->customTplVars['bars'] = $provider->read();
+    }
+}

+ 81 - 0
app/UI/VmClone/Sections/AdditionalDiskSection.php

@@ -0,0 +1,81 @@
+<?php
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections;
+
+use ModulesGarden\ProxmoxAddon\App\Models\VirtualNetwork;
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ResourceManager;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators\DiskSizeValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Select;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Switcher;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Text;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Range;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\BaseSection;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\BoxSection;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\HalfPageSection;
+use function ModulesGarden\Servers\ProxmoxCloudVps\Core\Helper\sl;
+
+class AdditionalDiskSection extends BaseSection implements ClientArea
+{
+    use ProductService;
+
+    public function initContent()
+    {
+
+        $this->initIds('additionalDiskSection');
+        $this->initFields();
+    }
+
+    public function initFields()
+    {
+        //size
+        $this->resourceManager = new ResourceManager();
+        $field = new Range('additionalDiskSize', $this->configuration()->serverDiskSize->min, $this->resourceManager->disk()->free());
+        $field->addValidator(new DiskSizeValidator('additionalDiskSize',true));
+        $field->setDefaultValue($this->configuration()->serverDiskSize->min);
+        $field->setDescription('description');
+        $field->replaceClasses(['lu-col-md-6']);
+        $this->addField($field);
+        //backup
+        if ($this->configuration()->isPermissionAdditionalDiskBackup())
+        {
+            $field = new Switcher('additionalDiskBackup');
+            $field->replaceClasses(['lu-form-check lu-m-b-2x']);
+            $field->setDefaultValue('on');
+            $field->addClass('hidden');
+            $this->addField($field);
+        }
+        //bus
+        $field = new Select('additionalDiskBus');
+        $options=[];
+        foreach( $this->configuration()->getAdditionalDiskType() as $entery){
+            $options[$entery] = sl("lang")->abtr($entery);
+        }
+        $field->setAvailableValues($options);
+        $field->replaceClasses(['lu-col-md-6']);
+        if($this->configuration()->isQemu() && count($this->configuration()->getAdditionalDiskType()) < 2){
+            $field->addClass('hidden');
+        }
+        $this->addField($field);
+        //format
+        $field = new Select('additionalDiskFormat');
+        $options=[];
+        foreach( $this->configuration()->getAdditionalDiskFormat() as $entery){
+            $options[$entery] = sl("lang")->abtr($entery);
+        }
+        $field->setAvailableValues($options);
+        $field->replaceClasses(['lu-col-md-6']);
+        if($this->configuration()->isQemu() && count($this->configuration()->getAdditionalDiskFormat()) < 2){
+            $field->addClass('hidden');
+        }
+        $this->addField($field);
+        if($this->configuration()->isLxc()){
+            //mp
+            $field = new Text('additionalDiskMp');
+            $field->setPlaceholder("/some/path");
+            $field->replaceClasses(['lu-col-md-6']);
+            $this->addField($field);
+        }
+    }
+}

+ 48 - 0
app/UI/VmClone/Sections/DnsSection.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections;
+
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\Models\Whmcs\Server;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Text;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\BaseSection;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators\SearchdomainValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators\NameserverValidator;
+
+class DnsSection extends BaseSection implements ClientArea
+{
+    use ProductService;
+
+    public function initContent()
+    {
+
+        $this->initIds('dnsSection');
+        $this->initFields();
+    }
+
+    public function initFields()
+    {
+        if($this->configuration()->isPermissionSearchdomain()){
+            $domain = new Text('searchdomain');
+            $domain->addValidator(new SearchdomainValidator(false));
+            $domain->setDescription('description');
+            $this->addField($domain);
+       }
+       if($this->configuration()->isPermissionNameservers()){
+           $server = Server::select('id', 'nameserver1ip', 'nameserver2ip')->findOrFail($this->getWhmcsParamByKey('serverid'));
+           //ns1
+           $ns1 = new Text('nameserver[0]');
+           $ns1->addValidator(new NameserverValidator());
+           $ns1->setDefaultValue(trim($server->nameserver1ip));
+           $ns1->setDescription('description');
+           $this->addField($ns1);
+           //ns2
+           $ns2 = new Text('nameserver[1]');
+           $ns2->addValidator(new NameserverValidator());
+           $ns2->setDefaultValue(trim($server->nameserver2ip));
+           $ns2->setDescription('description');
+           $this->addField($ns2);
+        }
+    }
+}

+ 173 - 0
app/UI/VmClone/Sections/Lxc/GeneralSection.php

@@ -0,0 +1,173 @@
+<?php
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections\Lxc;
+
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ResourceManager;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Validators\CpulimitValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Validators\HostnameValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Validators\IpAddressValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Validators\NumberValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Validators\PasswordValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Validators\SshPublicKeyValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Fields\OsTemplateSelect;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators\DiskSizeValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Range;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Select;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Text;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Textarea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\BaseSection;
+use function ModulesGarden\Servers\ProxmoxCloudVps\Core\Helper\sl;
+
+class GeneralSection extends BaseSection
+{
+    use ProductService;
+
+    /**
+     * @var ResourceManager
+     */
+    protected $resourceManager;
+
+    public function initContent()
+    {
+        $this->initIds('generalSection');
+        $this->resourceManager = new ResourceManager();
+        $this->initFields();
+    }
+
+    public function initFields()
+    {
+        /**
+         * @deprecated
+         *
+         *
+        //name
+        $field = new Text('name');
+        $field->addValidator(new HostnameValidator());
+        $field->setDescription('description');
+        $this->addField($field);
+        //description
+        $field = new Textarea('description');
+        $field->setDescription('tip');
+        $this->addField($field);
+        //osTemplate
+        $field = new OsTemplateSelect('osTemplate');
+        $field->notEmpty();
+        $this->addField( $field);
+        //ipv4
+        if($this->configuration()->isPermissionIpv4()){
+        $field = new Text('ipv4');
+        $field->addValidator(new NumberValidator($this->resourceManager->ipv4()->getMin(), $this->resourceManager->ipv4()->free(),false));
+        $field->setDefaultValue($this->configuration()->serverIpv4->min);
+        $field->setDescription('description');
+        $this->addField($field);
+        }
+        //ipv6
+        if($this->configuration()->isPermissionIpv6()){
+        $field = new Text('ipv6');
+        $field->addValidator(new NumberValidator($this->resourceManager->ipv6()->getMin(), $this->resourceManager->ipv6()->free(),false));
+        $field->setDefaultValue($this->configuration()->serverIpv6->min);
+        $field->setDescription('description');
+        $this->addField($field);
+        }
+         */
+        $cpuPrioryty = $this->configuration()->hasCpuPriority();
+        //location
+        if($this->configuration()->getLocations()){
+            $field = new Select('location');
+            $field->notEmpty();
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //cores
+        if($this->configuration()->isPermissionCores()){
+            $field = new Text('cores');
+            $field->addValidator(new NumberValidator($this->resourceManager->cores()->getMin(), $this->resourceManager->cores()->free(),true));
+            $field->setDefaultValue($this->configuration()->serverCores->min);
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //cpu priority
+        if($cpuPrioryty){
+            $field = new Range('cpuPriority', $this->resourceManager->cpuPriority()->getMin(), $this->resourceManager->cpuPriority()->free());
+            $field->addValidator(new NumberValidator($this->resourceManager->cpuPriority()->getMin(), $this->resourceManager->cpuPriority()->free(),true));
+            $field->setDefaultValue($this->resourceManager->cpuPriority()->free() >= 3 ? 3 : 1);
+            $field->addHtmlAttribute('data-label1', sl('lang')->abtr("Very Low"));
+            $field->addHtmlAttribute('data-label2', sl('lang')->abtr("Low"));
+            $field->addHtmlAttribute('data-label3', sl('lang')->abtr("Normal"));
+            $field->addHtmlAttribute('data-label4', sl('lang')->abtr("High"));
+            $field->addHtmlAttribute('data-label5', sl('lang')->abtr("Medium"));
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //cpulimit
+        if($this->configuration()->isPermissionCpuLimit() && !$cpuPrioryty){
+            $field = new Text('cpulimit');
+            $field->addValidator(new CpulimitValidator($this->resourceManager->cpulimit()->getMin(), $this->resourceManager->cpulimit()->free(),true));
+            $field->setDefaultValue($this->configuration()->serverCpulimit->min);
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //cpuunits
+        if($this->configuration()->isPermissionCpuunits() && !$cpuPrioryty){
+            $field = new Text('cpuunits');
+            $field->addValidator(new NumberValidator($this->resourceManager->cpuunits()->getMin(), $this->resourceManager->cpuunits()->free(),true));
+            $field->setDefaultValue($this->configuration()->serverCpuunit->min);
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //memory
+        $field = new Text('memory');
+        $field->addValidator(new NumberValidator($this->resourceManager->memory()->getMin(), $this->resourceManager->memory()->free(),true));
+        $field->setDefaultValue($this->configuration()->serverMemory->min);
+        $field->setDescription('description');
+        $this->addField($field);
+        //swap lxc only
+        if($this->configuration()->isPermissionSwap()){
+            $field = new Text('swap');
+            $field->addValidator(new NumberValidator($this->resourceManager->swap()->getMin(), $this->resourceManager->swap()->free(),true));
+            $field->setDefaultValue($this->configuration()->serverSwap->min);
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //disk
+        $field = new Text('disk');
+        $field->addValidator(new DiskSizeValidator('additionalDiskSize',true));
+        $field->setDefaultValue($this->configuration()->serverDiskSize->min);
+        $field->setDescription('description');
+        $this->addField($field);
+        //password
+        if($this->configuration()->isPermissionPassword()){
+            $field = new Text('password');
+            $field->addValidator(new PasswordValidator());
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //sshkey
+        if($this->configuration()->isPermissionSshkeys() && !$this->configuration()->isSshKeyPairs()){
+            $field = new Textarea('sshkeys');
+            $field->addValidator(new SshPublicKeyValidator(false));
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+         //dnsdomain
+        if($this->configuration()->isPermissionSearchdomain()){
+            $field = new Text('searchdomain');
+            $field->addValidator(new HostnameValidator(false));
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        if($this->configuration()->isPermissionNameservers()){
+            //ns1
+            $field = new Text('nameserver[0]');
+            $field->addValidator(new IpAddressValidator());
+            $field->setDescription('description');
+            $this->addField($field);
+            //ns2
+            $field = new Text('nameserver[1]');
+            $field->addValidator(new IpAddressValidator());
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+    }
+}

+ 200 - 0
app/UI/VmClone/Sections/Qemu/GeneralSection.php

@@ -0,0 +1,200 @@
+<?php
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections\Qemu;
+
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ResourceManager;
+use ModulesGarden\ProxmoxAddon\Core\Helper\AdvancedUserHelper;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Validators\CpulimitValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Validators\HostnameValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Validators\IpAddressValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Validators\NumberValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Validators\SshPublicKeyValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Fields\IsoImageSelect;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Fields\OsTemplateSelect;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Fields\SecondaryIsoImageSelect;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators\DiskSizeValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators\IsoImageValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators\PasswordValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators\UserValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Hidden;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Range;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Select;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Text;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Textarea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\BaseSection;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\HalfPageSection;
+use function ModulesGarden\Servers\ProxmoxCloudVps\Core\Helper\sl;
+
+class GeneralSection extends HalfPageSection
+{
+    use ProductService;
+
+    /**
+     * @var ResourceManager
+     */
+    protected $resourceManager;
+
+    public function initContent()   {
+        $this->initIds('generalSection');
+        $this->resourceManager = new ResourceManager();
+        $this->initFields();
+    }
+
+    public function initFields()  {
+        $advancedUser = new AdvancedUserHelper($this->getWhmcsParamByKey('userid'));
+        /**
+         * @deprecated
+        //name
+        $field = new Text('name');
+        $field->setDescription('description');
+        $field->addValidator(new HostnameValidator());
+        $this->addField($field);
+        //description
+        $field = new Textarea('description');
+        $field->setDescription('tip');
+        $this->addField($field);
+         //osTemplate
+        if($this->configuration()->isPermissionOsTemplate()){
+        $field =new OsTemplateSelect('osTemplate');
+        $field->notEmpty();
+        $this->addField( $field);
+        }
+         */
+        $cpuPrioryty = $this->configuration()->hasCpuPriority();
+        //location
+        if($this->configuration()->getLocations()){
+            $field = new Select('location');
+            $field->notEmpty();
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //sockets
+        if($this->configuration()->isPermissionSockets() && !$this->configuration()->isCalculateSocketsAndCores()){
+            $field = new Text('sockets');
+            $field->addValidator(new NumberValidator($this->resourceManager->sockets()->getMin(), $this->resourceManager->sockets()->free(),true));
+            $field->setDefaultValue($this->configuration()->serverSockets->min);
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //cores
+        if($this->configuration()->isPermissionCores() && !$this->configuration()->isCalculateSocketsAndCores()){
+            $field = new Text('cores');
+            $field->addValidator(new NumberValidator($this->resourceManager->cores()->getMin(), $this->resourceManager->cores()->free(),true));
+            $field->setDefaultValue($this->configuration()->serverCores->min);
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //vcpus
+        if($this->configuration()->isPermissionVcpus() || $this->configuration()->isCalculateSocketsAndCores()){
+            $field = new Range('vcpus', $this->resourceManager->vcpus()->getMin(), $this->resourceManager->vcpus()->free());
+            $field->addValidator(new NumberValidator($this->resourceManager->vcpus()->getMin(), $this->resourceManager->vcpus()->free(),true));
+            $field->setDefaultValue($this->configuration()->serverVcpus->min);
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //cpu priority
+        if($cpuPrioryty){
+            $field = new Range('cpuPriority', $this->resourceManager->cpuPriority()->getMin(), $this->resourceManager->cpuPriority()->free());
+            $field->addValidator(new NumberValidator($this->resourceManager->cpuPriority()->getMin(), $this->resourceManager->cpuPriority()->free(),true));
+            $field->setDefaultValue($this->resourceManager->cpuPriority()->free() >= 3 ? 3 : 1);
+            $field->addHtmlAttribute('data-label1', sl('lang')->abtr("Very Low"));
+            $field->addHtmlAttribute('data-label2', sl('lang')->abtr("Low"));
+            $field->addHtmlAttribute('data-label3', sl('lang')->abtr("Normal"));
+            $field->addHtmlAttribute('data-label4', sl('lang')->abtr("High"));
+            $field->addHtmlAttribute('data-label5', sl('lang')->abtr("Medium"));
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //cpulimit
+        if($this->configuration()->isPermissionCpuLimit() && !$cpuPrioryty){
+            $field = new Text('cpulimit');
+            $field->addValidator(new CpulimitValidator($this->resourceManager->cpulimit()->getMin(), $this->resourceManager->cpulimit()->free(),true));
+            $field->setDefaultValue($this->configuration()->serverCpulimit->min);
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //cpuunits
+        if($this->configuration()->isPermissionCpuunits() && !$cpuPrioryty){
+            $field = new Text('cpuunits');
+            $field->addValidator(new NumberValidator($this->resourceManager->cpuunits()->getMin(), $this->resourceManager->cpuunits()->free(),true));
+            $field->setDefaultValue($this->configuration()->serverCpuunit->min);
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //memory
+        $field = new Range('memory', $this->resourceManager->memory()->getMin(), $this->resourceManager->memory()->free());
+        $field->addValidator(new NumberValidator($this->resourceManager->memory()->getMin(), $this->resourceManager->memory()->free(),true));
+        $field->setDefaultValue($this->configuration()->serverMemory->min);
+        $field->setDescription('description');
+        $this->addField($field);
+        //disk (filled by template needs)
+        $field = new Hidden('disk');
+        $this->addField($field);
+        $field = new Hidden('disks');
+        $this->addField($field);
+        //username
+        if($this->configuration()->isPermissionUsername()){
+            $field = new Text('ciuser');
+            $field->addValidator(new UserValidator());
+            $field->setDefaultValue($this->configuration()->getCiuser());
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //password
+        if($this->configuration()->isPermissionPassword()){
+            $field = new Text('password');
+            $field->addValidator( new PasswordValidator());
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //sshkey
+        if($this->configuration()->isPermissionSshkeys()){
+            $field = new Textarea('sshkeys');
+            $field->addValidator(new SshPublicKeyValidator(false));
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //ostype
+        if(($advancedUser->isAdvanced() || $this->configuration()->isPermissionIsoImage()) && $this->configuration()->getPermissionOstype()){
+            $field = new  Select('ostype');
+            $this->addField($field);
+        }
+        //isoImage
+        if($this->configuration()->isPermissionIsoImage() && ($advancedUser->isAdvanced() || $this->configuration()->isPermissionIsoImage())){
+            $field = new IsoImageSelect('isoImage');
+            $field->addValidator(new IsoImageValidator());
+            $this->addField($field);
+        }
+        //secondaryIsoImage
+        if($this->configuration()->isPermissionSecondaryIsoImages() && $advancedUser->isAdvanced()){
+            $this->addField(new SecondaryIsoImageSelect('secondaryIsoImage'));
+
+        }
+        //cloudInitScript
+        if($this->configuration()->getCloudInitScript()){
+            $field = new Select('cloudInitScript');
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        /**
+         * @deprecated
+        //ipv4
+        if($this->configuration()->isPermissionIpv4()){
+            $field = new Text('ipv4');
+            $field->addValidator(new NumberValidator($this->resourceManager->ipv4()->getMin(), $this->resourceManager->ipv4()->free(),false));
+            $field->setDefaultValue($this->configuration()->serverIpv4->min);
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+        //ipv6
+        if($this->configuration()->isPermissionIpv6()){
+            $field = new Text('ipv6');
+            $field->addValidator(new NumberValidator($this->resourceManager->ipv6()->getMin(), $this->resourceManager->ipv6()->free(),false));
+            $field->setDefaultValue($this->configuration()->serverIpv6->min);
+            $field->setDescription('description');
+            $this->addField($field);
+        }
+         */
+    }
+}

+ 50 - 0
app/UI/VmClone/Sections/TopSection.php

@@ -0,0 +1,50 @@
+<?php
+
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections;
+
+
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\AccountSummary\Providers\AccountSummaryProvider;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Validators\HostnameValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Fields\OsTemplateSelect;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Switcher;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Text;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Textarea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\RawSection;
+use function ModulesGarden\Servers\ProxmoxCloudVps\Core\Helper\sl;
+
+class TopSection extends RawSection {
+    use ProductService;
+
+    public function initContent() {
+        //source VM
+        $field = new Textarea('template');
+        $field->setRows(3);
+        $field->addHtmlAttribute('readonly', true);
+        $this->addField($field);
+        //name
+        $field = new Text('name');
+        $field->addValidator(new HostnameValidator());
+        $this->addField($field);
+        //osTemplate
+        if($this->configuration()->isPermissionOsTemplate() || $this->configuration()->isLxc()){
+            $field =new OsTemplateSelect('osTemplate');
+            $field->notEmpty();
+            $this->addField( $field);
+        }
+        //description
+        $field = new Textarea('description');
+        //$field->unsetShowTitle();
+        //$field->setPlaceholder(sl('lang')->tr('Description'));
+        $field->setRows(2);
+        $field->replaceClasses(['lu-m-t-1x lu-m-b-0x']);
+        $this->addField($field);
+        $field = new Switcher('start');
+        $field->replaceClasses(['lu-form-check lu-m-t-4x']);
+        $field->setDefaultValue('off');
+        $this->addField($field);
+        $provider = new AccountSummaryProvider();
+        $this->customTplVars['bars'] = $provider->read();
+    }
+}

+ 66 - 0
app/UI/VmClone/Sections/VirtualNetworkSection.php

@@ -0,0 +1,66 @@
+<?php
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Sections;
+
+use ModulesGarden\ProxmoxAddon\App\Models\VirtualNetwork;
+use ModulesGarden\ProxmoxAddon\App\Models\VmIpAddress;
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
+use ModulesGarden\ProxmoxAddon\App\Services\Ip\Ipv4Range;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Interfaces\ClientArea;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Buttons\ButtonBase;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Select;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\BaseSection;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\BoxSection;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\HalfPageSection;
+use function ModulesGarden\Servers\ProxmoxCloudVps\Core\Helper\sl;
+
+class VirtualNetworkSection extends BaseSection implements ClientArea
+{
+    use ProductService;
+
+    public function initContent()
+    {
+        $this->initIds('virtualNetworkSection');
+        $this->initFields();
+    }
+
+    public function initFields()
+    {
+        //virtualNetwork
+        $this->customTplVars['virtualNetwork'] = ["public" => sl('lang')->abtr('Public')];
+        //ips
+        $this->customTplVars['ips']=[];
+        //Public
+        $this->customTplVars['ipSelected'] =null;
+        foreach (VmIpAddress::ofHostingId($this->getWhmcsParamByKey('serviceid'))->ofVmIdNull()->get() as $ip)
+        {
+            if(!$this->customTplVars['ipSelected'] ){
+                $this->customTplVars['ipSelected']  = $ip->ip;
+            }
+            $this->customTplVars['ips'][] =[
+                "networkId" => "public",
+                "ip" => $ip->ip,
+                "id" => $ip->id
+            ];
+        }
+        if(empty($this->customTplVars['ips'])){
+            unset($this->customTplVars['virtualNetwork']['public']);
+        }
+        //private
+        foreach (VirtualNetwork::ofHostingId($this->getWhmcsParamByKey('serviceid'))->get() as $vn)
+        {
+            $this->customTplVars['virtualNetwork'][$vn->id] = $vn->name;
+            $ipRange = new Ipv4Range($vn->pool, $vn->cidr);
+            $ipRange->setLimit(255);
+            $ipRange->disableIpAddresses( $vn->virtualInterfaces->pluck('ip')->toArray());
+            foreach (  $ipRange->get() as $ip ){
+                $this->customTplVars['ips'][]=[
+                    "networkId" => $vn->id,
+                    "ip" => $ip,
+                ];
+            }
+        }
+
+
+    }
+}

+ 43 - 0
app/UI/VmClone/Templates/sections/DnsSection.tpl

@@ -0,0 +1,43 @@
+{**********************************************************************
+* ProxmoxCloudVps product developed. (2017-10-06)
+* *
+*
+*  CREATED BY MODULESGARDEN       ->       http://modulesgarden.com
+*  CONTACT                        ->       contact@modulesgarden.com
+*
+*
+* This software is furnished under a license and may be used and copied
+* only  in  accordance  with  the  terms  of such  license and with the
+* inclusion of the above copyright notice.  This software  or any other
+* copies thereof may not be provided or otherwise made available to any
+* other person.  No title to and  ownership of the  software is  hereby
+* transferred.
+*
+*
+**********************************************************************}
+
+{**
+* @author Sławomir Miśkowicz <slawomir@modulesgarden.com>
+*}
+<div class="lu-col-md-6">
+<div class="lu-widget">
+    <div class="lu-widget__body">
+        {if $rawObject->isShowTitle() && (($rawObject->getRawTitle() || $rawObject->getTitle()) && $rawObject->isViewHeader())}
+            <div class="lu-widget__header">
+                <div class="lu-widget__top lu-top">
+                    <div class="lu-top__title">
+                        {if $rawObject->getIcon()}<i class="{$rawObject->getIcon()}"></i>{/if}
+                        {if $rawObject->isRawTitle()}{$rawObject->getRawTitle()}{elseif $rawObject->getTitle()}{$MGLANG->T($rawObject->getTitle())}{/if}
+                    </div>
+                </div>
+            </div>
+        {/if}
+        <div class="lu-widget__content">
+            {foreach from=$rawObject->getFields() item=field }
+                {$field->getHtml()}
+            {/foreach}
+        </div>
+
+    </div>
+</div>
+</div>

+ 28 - 0
app/UI/VmClone/Templates/sections/accountSummary.tpl

@@ -0,0 +1,28 @@
+<div class="lu-row">
+    <h4>
+        <span>{$MGLANG->absoluteT('serverCA' , 'createVM' ,'createNewVm')}</span>
+    </h4>
+    <div class="lu-widget">
+        <div class="lu-widget__header">
+            <div class="lu-widget__top lu-top">
+                <div class="lu-top__title">
+                    <span>{$MGLANG->absoluteT('serverCA' , 'createVM' ,'availableResources')}</span>
+                </div>
+            </div>
+        </div>
+        <div class="lu-widget__body">
+            <div class="lu-widget__content">
+                {foreach from=$customTplVars.bars item=bar}
+                    <div class="lu-progress lu-progress--h lu-progress--s lu-progress__label">
+                        <div class="lu-progress__label">
+                            {$bar.name} ({$bar.used}/{$bar.max}{if $bar.unit} {$bar.unit}{/if})
+                        </div>
+                        <div class="lu-progress__bar progress-bar-danger">
+                            <div class="lu-progress__fill" style="width: {$bar.value}%"></div>
+                        </div>
+                    </div>
+                {/foreach}
+            </div>
+        </div>
+    </div>
+</div>

+ 70 - 0
app/UI/VmClone/Templates/sections/additionalDiskSection.tpl

@@ -0,0 +1,70 @@
+{**********************************************************************
+* ProxmoxCloudVps product developed. (2017-10-06)
+* *
+*
+*  CREATED BY MODULESGARDEN       ->       http://modulesgarden.com
+*  CONTACT                        ->       contact@modulesgarden.com
+*
+*
+* This software is furnished under a license and may be used and copied
+* only  in  accordance  with  the  terms  of such  license and with the
+* inclusion of the above copyright notice.  This software  or any other
+* copies thereof may not be provided or otherwise made available to any
+* other person.  No title to and  ownership of the  software is  hereby
+* transferred.
+*
+*
+**********************************************************************}
+
+{**
+* @author Sławomir Miśkowicz <slawomir@modulesgarden.com>
+*}
+
+<div class="lu-widget">
+    <div class="lu-widget__body">
+        {if $rawObject->isShowTitle() && (($rawObject->getRawTitle() || $rawObject->getTitle()) && $rawObject->isViewHeader())}
+            <div class="lu-widget__header">
+                <div class="lu-widget__top lu-top">
+                    <div class="lu-top__title">
+                        {if $rawObject->getIcon()}<i class="{$rawObject->getIcon()}"></i>{/if}
+                        {if $rawObject->isRawTitle()}{$rawObject->getRawTitle()}{elseif $rawObject->getTitle()}{$MGLANG->T($rawObject->getTitle())}{/if}
+                    </div>
+                    <div class="lu-top__toolbar"><a href="#" id="pm-add-disk-button" data-toggle="lu-tooltip" class="lu-btn lu-btn--primary" data-title="{$MGLANG->T('Add New Additional Disk')}">
+                            <i class="lu-zmdi lu-zmdi-plus"></i>
+                            <span class="lu-btn__text">{$MGLANG->T('Add New Additional Disk')}</span>
+                        </a>
+                    </div>
+                </div>
+            </div>
+        {/if}
+        <div class="lu-widget__content lu-p-1x">
+            <div class="lu-alert lu-alert--outline lu-alert--icon lu-alert--info lu-alert--bordered lu-m-b-0x lu-alert--dismiss mg-message ">
+                <div class="lu-alert__body">
+                    {$MGLANG->T('additional_disk_add_info')}
+                </div>
+            </div>
+            <div class="lu-widget hidden pm-disk-content-default" >
+                <div class="lu-widget__body">
+                    <div class="lu-widget__header">
+                        <div class="lu-widget__top lu-top">
+                            <div class="lu-top__title">
+                                {$MGLANG->T('Additional Disk')}
+                            </div>
+                            <div class="lu-top__toolbar">
+                                <a href="#"
+                                        class="lu-btn lu-btn--xs lu-btn--default lu-btn--icon lu-btn--link lu-btn--plain pm-delete-disk-button">
+                                    <i class="lu-btn__icon lu-zmdi lu-zmdi-close"></i>
+                                </a>
+                            </div>
+                        </div>
+                    </div>
+                    {foreach from=$rawObject->getFields() item=field }
+                        <div class="lu-widget__content">
+                            {$field->getHtml()}
+                        </div>
+                    {/foreach}
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 43 - 0
app/UI/VmClone/Templates/sections/lxc/generalSection.tpl

@@ -0,0 +1,43 @@
+{**********************************************************************
+* ProxmoxCloudVps product developed. (2017-10-06)
+* *
+*
+*  CREATED BY MODULESGARDEN       ->       http://modulesgarden.com
+*  CONTACT                        ->       contact@modulesgarden.com
+*
+*
+* This software is furnished under a license and may be used and copied
+* only  in  accordance  with  the  terms  of such  license and with the
+* inclusion of the above copyright notice.  This software  or any other
+* copies thereof may not be provided or otherwise made available to any
+* other person.  No title to and  ownership of the  software is  hereby
+* transferred.
+*
+*
+**********************************************************************}
+
+{**
+* @author Sławomir Miśkowicz <slawomir@modulesgarden.com>
+*}
+<div class="lu-col-md-6">
+<div class="lu-widget">
+    <div class="lu-widget__body">
+        {if $rawObject->isShowTitle() && (($rawObject->getRawTitle() || $rawObject->getTitle()) && $rawObject->isViewHeader())}
+            <div class="lu-widget__header">
+                <div class="lu-widget__top lu-top">
+                    <div class="lu-top__title">
+                        {if $rawObject->getIcon()}<i class="{$rawObject->getIcon()}"></i>{/if}
+                        {if $rawObject->isRawTitle()}{$rawObject->getRawTitle()}{elseif $rawObject->getTitle()}{$MGLANG->T($rawObject->getTitle())}{/if}
+                    </div>
+                </div>
+            </div>
+        {/if}
+        <div class="lu-widget__content">
+            {foreach from=$rawObject->getFields() item=field }
+                {$field->getHtml()}
+            {/foreach}
+        </div>
+
+    </div>
+</div>
+</div>

+ 43 - 0
app/UI/VmClone/Templates/sections/qemu/generalSection.tpl

@@ -0,0 +1,43 @@
+{**********************************************************************
+* ProxmoxCloudVps product developed. (2017-10-06)
+* *
+*
+*  CREATED BY MODULESGARDEN       ->       http://modulesgarden.com
+*  CONTACT                        ->       contact@modulesgarden.com
+*
+*
+* This software is furnished under a license and may be used and copied
+* only  in  accordance  with  the  terms  of such  license and with the
+* inclusion of the above copyright notice.  This software  or any other
+* copies thereof may not be provided or otherwise made available to any
+* other person.  No title to and  ownership of the  software is  hereby
+* transferred.
+*
+*
+**********************************************************************}
+
+{**
+* @author Sławomir Miśkowicz <slawomir@modulesgarden.com>
+*}
+<div class="lu-col-md-6">
+<div class="lu-widget">
+    <div class="lu-widget__body">
+        {if $rawObject->isShowTitle() && (($rawObject->getRawTitle() || $rawObject->getTitle()) && $rawObject->isViewHeader())}
+            <div class="lu-widget__header">
+                <div class="lu-widget__top lu-top">
+                    <div class="lu-top__title">
+                        {if $rawObject->getIcon()}<i class="{$rawObject->getIcon()}"></i>{/if}
+                        {if $rawObject->isRawTitle()}{$rawObject->getRawTitle()}{elseif $rawObject->getTitle()}{$MGLANG->T($rawObject->getTitle())}{/if}
+                    </div>
+                </div>
+            </div>
+        {/if}
+        <div class="lu-widget__content">
+            {foreach from=$rawObject->getFields() item=field }
+                {$field->getHtml()}
+            {/foreach}
+        </div>
+
+    </div>
+</div>
+</div>

+ 65 - 0
app/UI/VmClone/Templates/sections/topSection.tpl

@@ -0,0 +1,65 @@
+<div class="lu-col-md-12">
+    <h3>{$MGLANG->tr('Clone New Virtual Machine')}</h3>
+</div>
+
+<div class="lu-col-md-6">
+    <div class="lu-widget">
+        <div class="lu-widget__header">
+            <div class="lu-widget__top lu-top">
+                <div class="lu-top__title">
+                    <span>{$MGLANG->tr('virtualMachineSettings')}</span>
+                </div>
+            </div>
+        </div>
+        <div style='display:none;'>
+            {*type*}
+            {$rawObject->getField('osTemplate')}
+        </div>
+        <div class="lu-widget__body">
+            <div class="lu-widget__content">
+                {$rawObject->getField('template')}
+            </div>
+            <div class="lu-widget__content">
+                {*name*}
+                {$rawObject->getField('name')}
+                {*description*}
+                {$rawObject->getField('description')}
+                {*start*}
+                {$rawObject->getField('start')}
+            </div>
+        </div>
+    </div>
+</div>
+
+<div class="lu-col-md-6">
+    <div class="lu-widget">
+        <div class="lu-widget__header">
+            <div class="lu-widget__top lu-top">
+                <div class="lu-top__title">
+                    <span>{$MGLANG->tr('availableResources')}</span>
+                </div>
+            </div>
+        </div>
+        <div class="lu-widget__body">
+            <div class="lu-widget__content">
+                {foreach from=$customTplVars.bars item=bar}
+                    <div class="lu-progress lu-progress--h lu-progress--s lu-progress__label">
+                        <div class="lu-progress__label">
+                            {$bar.name}
+                            <i data-title="{$bar.used}/{$bar.max}{if $bar.unit} {$bar.unit}{/if}" data-toggle="lu-tooltip" class="lu-i-c-2x lu-zmdi lu-zmdi-help-outline lu-form-tooltip-helper lu-tooltip "></i>
+                        </div>
+                        <div class="lu-progress__bar progress-bar-danger">
+                            <div class="lu-progress__fill" style="width: {$bar.value}%"></div>
+                        </div>
+                    </div>
+                {/foreach}
+            </div>
+        </div>
+    </div>
+</div>
+
+
+
+<div class="lu-col-md-12">
+    <hr class="lu-m-b-2x lu-m-t-1x"/>
+</div>

+ 81 - 0
app/UI/VmClone/Templates/sections/virtualNetworkSection.tpl

@@ -0,0 +1,81 @@
+{**********************************************************************
+* ProxmoxCloudVps product developed. (2017-10-06)
+* *
+*
+*  CREATED BY MODULESGARDEN       ->       http://modulesgarden.com
+*  CONTACT                        ->       contact@modulesgarden.com
+*
+*
+* This software is furnished under a license and may be used and copied
+* only  in  accordance  with  the  terms  of such  license and with the
+* inclusion of the above copyright notice.  This software  or any other
+* copies thereof may not be provided or otherwise made available to any
+* other person.  No title to and  ownership of the  software is  hereby
+* transferred.
+*
+*
+**********************************************************************}
+
+{**
+* @author Sławomir Miśkowicz <slawomir@modulesgarden.com>
+*}
+<div class="lu-widget">
+    <div class="lu-widget__body">
+        {if $rawObject->isShowTitle() && (($rawObject->getRawTitle() || $rawObject->getTitle()) && $rawObject->isViewHeader())}
+            <div class="lu-widget__header">
+                <div class="lu-widget__top lu-top">
+                    <div class="lu-top__title">
+                        {if $rawObject->getIcon()}<i class="{$rawObject->getIcon()}"></i>{/if}
+                        {if $rawObject->isRawTitle()}{$rawObject->getRawTitle()}{elseif $rawObject->getTitle()}{$MGLANG->T($rawObject->getTitle())}{/if}
+                    </div>
+                <div class="lu-top__toolbar"><a href="#" id="pm-add-new-virtual-network-button" data-toggle="lu-tooltip" class="lu-btn lu-btn--primary" data-title="{$MGLANG->T('Add New Virtual Network')}">
+                        <i class="lu-zmdi lu-zmdi-plus"></i>
+                        <span class="lu-btn__text">{$MGLANG->T('Add New Virtual Network')}</span>
+                    </a></div>
+                </div>
+            </div>
+        {/if}
+        <div class="lu-widget__content lu-p-1x">
+            <div class="lu-alert lu-alert--outline lu-alert--icon lu-alert--info lu-alert--bordered lu-m-b-0x lu-alert--dismiss mg-message">
+                <div class="lu-alert__body">
+                    {$MGLANG->T('additional_ip_add_info')}
+                </div>
+            </div>
+            <div class="lu-widget hidden pm-virtual-network-content-default" >
+                <div class="lu-widget__body">
+                    <div class="lu-widget__header">
+                        <div class="lu-widget__top lu-top">
+                            <div class="lu-top__title">
+                                {$MGLANG->T('Virtual Network')}
+                            </div>
+                            <div class="lu-top__toolbar">
+                                <a href="#"
+                                        class="lu-btn lu-btn--xs lu-btn--default lu-btn--icon lu-btn--link lu-btn--plain pm-delete-virtual-network-button">
+                                    <i class="lu-btn__icon lu-zmdi lu-zmdi-close"></i>
+                                </a>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="lu-widget__content lu-row">
+                        <div class="lu-form-group lu-col-md-6">
+                            <label class="lu-form-label">{$MGLANG->T('Select Virtual Network')}</label>
+                            <select name="virtualNetwork[id]" class="lu-form-control pm-vn-select">
+                                {foreach from=$customTplVars.virtualNetwork key=opValue item=option}
+                                    <option value="{$opValue}">{$option}</option>
+                                {/foreach}
+                            </select>
+                        </div>
+                        <div class="lu-form-group lu-col-md-6">
+                            <label class="lu-form-label">{$MGLANG->T('Select IP Address')}</label>
+                            <select name="virtualNetwork[ip]" class="lu-form-control  pm-vn-ip-select">
+                                {foreach from=$customTplVars.ips key=opValue item=option}
+                                    <option class="vn-ip-{$option.networkId}" {if $option.networkId!="public"}style="display: none;"{/if}  {if $option.ip == $customTplVars.ipSelected}selected{/if}  value="{$option.ip}">{$option.ip}</option>
+                                {/foreach}
+                            </select>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 95 - 0
app/UI/VmClone/Validators/DiskSizeValidator.php

@@ -0,0 +1,95 @@
+<?php
+
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators;
+
+
+use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ResourceManager;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Validators\BaseValidator;
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Traits\WhmcsParams;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\Enum\ConfigurableOption;
+
+class DiskSizeValidator extends BaseValidator
+{
+    use WhmcsParams;
+    protected $additionalField;
+    protected $minValue = 0;
+    protected $maxValue = 0;
+    protected $required = true;
+
+    public function __construct( $additionalField, $required = true)
+    {
+        $this->additionalField = $additionalField;
+        $this->required = $required;
+    }
+
+    protected function validate($data, $additionalData = null)
+    {
+        if (!$this->required && empty($data))
+        {
+            return true;
+        }
+        $resurceManager = new ResourceManager();
+        $additionalSize = 0;
+        if($additionalData->get('formData')[$this->additionalField] ){
+            $additionalSize = (int) $additionalData->get('formData')[$this->additionalField];
+        }
+        $diskResource =    $resurceManager ->disk();
+        $diskResource->setTotal($diskResource->getTotal()-$additionalSize);
+        if ($this->isWhmcsConfigOption(ConfigurableOption::STORAGE)) {
+            $this->maxValue = $this->getWhmcsConfigOption(ConfigurableOption::STORAGE) - $diskResource->getUsed();
+        } else {
+            $this->maxValue = $diskResource->free();
+        }
+        if ($this->maxValue > $diskResource->getMax()) {
+            $this->addValidationError('PleaseProvideANumericValueBetween', false, ['minValue' => $this->minValue, 'maxValue' => $diskResource->getMax()]);
+            return false;
+        }
+
+        $this->minValue =  $diskResource->getMin();
+        if(preg_match("/\./", $data)){
+            $this->addValidationError('PleaseProvideANumericValueBetween', false, ['minValue' => $this->minValue, 'maxValue' => $this->maxValue]);
+            return false;
+        }
+        if (is_numeric($data) && $this->minValue === 0 && $this->maxValue === 0)
+        {
+            return true;
+        }
+        //Min & Max
+        if (is_numeric($data) && $this->minValue <= ((int)$data) && ((int)$data) <= $this->maxValue)
+        {
+            return true;
+        }
+        //Min
+        else
+        {
+            if (is_numeric($data) && !is_numeric($this->maxValue) && $this->minValue <= ((int)$data))
+            {
+                return true;
+            }
+        }
+
+        if ($this->minValue === $this->maxValue)
+        {
+            $this->addValidationError('PleaseProvideANumericValue');
+
+            return false;
+        }
+
+        if (is_numeric($this->minValue) && is_numeric($this->maxValue))
+        {
+            $this->addValidationError('PleaseProvideANumericValueBetween', false, ['minValue' => $this->minValue, 'maxValue' => $this->maxValue]);
+        }
+        else
+        {
+            if (is_numeric($this->minValue) && !is_numeric($this->maxValue))
+            {
+                $this->addValidationError('PleaseProvideANumericValueFrom', false, ['minValue' => $this->minValue]);
+            }
+        }
+
+
+        return false;
+    }
+
+}

+ 31 - 0
app/UI/VmClone/Validators/IsoImageValidator.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators;
+
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Validators\BaseValidator;
+
+class IsoImageValidator extends BaseValidator
+{
+
+    protected function validate($data, $additionalData = null)
+    {
+        if($additionalData->get('formData')['osTemplate'] && $additionalData->get('formData')['osTemplate']!='installationFromIso' ){
+            return true;
+        }
+
+        if (is_array($data) && count($data) > 0)
+        {
+            return true;
+        }
+
+        if ((is_string($data) && strlen(trim($data)) > 0) || is_numeric($data))
+        {
+            return true;
+        }
+
+        $this->addValidationError('thisFieldCannotBeEmpty');
+
+        return false;
+    }
+
+}

+ 42 - 0
app/UI/VmClone/Validators/NameserverValidator.php

@@ -0,0 +1,42 @@
+<?php
+
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators;
+
+
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Validators\BaseValidator;
+
+class NameserverValidator extends BaseValidator
+{
+    protected $required = false;
+    protected $public = true;
+
+    public function __construct($required = false , $public = true)
+    {
+        $this->required = $required;
+        $this->public = $public;
+    }
+
+    protected function validate($data, $additionalData = null)
+    {
+        if($additionalData->get('formData')['osTemplate'] && $additionalData->get('formData')['osTemplate']=='installationFromIso' ){
+            return true;
+        }
+
+        if (!$this->required && empty($data))
+        {
+            return true;
+        }
+        if (!filter_var($data, FILTER_VALIDATE_IP))
+        {
+            $this->addValidationError('IP Address is not valid', false);
+            return false;
+        }
+        if (!$this->public && filter_var($data, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE))
+        {
+            $this->addValidationError('The IP Address is not private', false);
+            return false;
+        }
+        return true;
+    }
+}

+ 62 - 0
app/UI/VmClone/Validators/PasswordValidator.php

@@ -0,0 +1,62 @@
+<?php
+
+/* * ********************************************************************
+ * ProxmoxAddon product developed. (Aug 23, 2018)
+ * *
+ *
+ *  CREATED BY MODULESGARDEN       ->       http://modulesgarden.com
+ *  CONTACT                        ->       contact@modulesgarden.com
+ *
+ *
+ * This software is furnished under a license and may be used and copied
+ * only  in  accordance  with  the  terms  of such  license and with the
+ * inclusion of the above copyright notice.  This software  or any other
+ * copies thereof may not be provided or otherwise made available to any
+ * other person.  No title to and  ownership of the  software is  hereby
+ * transferred.
+ *
+ *
+ * ******************************************************************** */
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators;
+
+
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Validators\BaseValidator;
+
+/**
+ * Description of NumberValidator
+ *
+ * @author Pawel Kopec <pawelk@modulesgardne.com>
+ */
+class PasswordValidator extends BaseValidator
+{
+    protected $required = false;
+    protected $length;
+
+    public function __construct($required = true, $length = 5)
+    {
+        $this->required = $required;
+        $this->length   = $length;
+    }
+
+    protected function validate($data, $additionalData = null)
+    {
+        if($additionalData->get('formData')['osTemplate'] && $additionalData->get('formData')['osTemplate']=='installationFromIso' ){
+            return true;
+        }
+        if (!$this->required && empty($data))
+        {
+            return true;
+        }
+        else
+        {
+            if (is_numeric($this->length) && strlen($data) < $this->length)
+            {
+                $this->addValidationError('The password is too short');
+                return false;
+            }
+        }
+
+        return true;
+    }
+}

+ 28 - 0
app/UI/VmClone/Validators/SearchdomainValidator.php

@@ -0,0 +1,28 @@
+<?php
+
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators;
+
+
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Validators\BaseValidator;
+
+class SearchdomainValidator extends BaseValidator
+{
+
+    protected function validate($data, $additionalData = null)
+    {
+        if($additionalData->get('formData')['osTemplate'] && $additionalData->get('formData')['osTemplate']=='installationFromIso' ){
+            return true;
+        }
+        if (empty($data))
+        {
+            return true;
+        }
+        if (!preg_match('/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/', $data))
+        {
+            $this->addValidationError('PleaseProvideASearchdomain');
+            return false;
+        }
+        return true;
+    }
+}

+ 60 - 0
app/UI/VmClone/Validators/SshPublicKeyValidator.php

@@ -0,0 +1,60 @@
+<?php
+
+/* * ********************************************************************
+ * ProxmoxAddon product developed. (Aug 23, 2018)
+ * *
+ *
+ *  CREATED BY MODULESGARDEN       ->       http://modulesgarden.com
+ *  CONTACT                        ->       contact@modulesgarden.com
+ *
+ *
+ * This software is furnished under a license and may be used and copied
+ * only  in  accordance  with  the  terms  of such  license and with the
+ * inclusion of the above copyright notice.  This software  or any other
+ * copies thereof may not be provided or otherwise made available to any
+ * other person.  No title to and  ownership of the  software is  hereby
+ * transferred.
+ *
+ *
+ * ******************************************************************** */
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators;
+
+
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Validators\BaseValidator;
+
+/**
+ * Description of NumberValidator
+ *
+ * @author Pawel Kopec <pawelk@modulesgardne.com>
+ */
+class SshPublicKeyValidator extends BaseValidator
+{
+    protected $required = false;
+
+    public function __construct($required = true)
+    {
+        $this->required = $required;
+    }
+
+    protected function validate($data, $additionalData = null)
+    {
+        if($additionalData->get('formData')['osTemplate'] && $additionalData->get('formData')['osTemplate']=='installationFromIso' ){
+            return true;
+        }
+        if (!$this->required && empty($data))
+        {
+            return true;
+        }
+        else
+        {
+            if (!preg_match('/ssh\-/', $data))
+            {
+                $this->addValidationError('PleaseProvideASshPublicKey');
+                return false;
+            }
+        }
+
+        return true;
+    }
+}

+ 31 - 0
app/UI/VmClone/Validators/UserValidator.php

@@ -0,0 +1,31 @@
+<?php
+
+
+namespace ModulesGarden\Servers\ProxmoxCloudVps\App\UI\VmClone\Validators;
+
+
+use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Validators\BaseValidator;
+
+class UserValidator extends BaseValidator
+{
+    protected function validate($data, $additionalData = null)
+    {
+        if($additionalData->get('formData')['osTemplate'] && $additionalData->get('formData')['osTemplate']=='installationFromIso' ){
+            return true;
+        }
+
+        if (is_array($data) && count($data) > 0)
+        {
+            return true;
+        }
+
+        if ((is_string($data) && strlen(trim($data)) > 0) || is_numeric($data))
+        {
+            return true;
+        }
+
+        $this->addValidationError('thisFieldCannotBeEmpty');
+
+        return false;
+    }
+}

+ 5 - 7
app/UI/VmCreate/Fields/OsTemplateSelect.php

@@ -33,19 +33,17 @@ class OsTemplateSelect extends Select implements ClientArea {
                 $this->callBackFunction = 'pcOsTemplateLoadShowIsoFields';
             } */
         }
-        if ($this->configuration()->isLxc())  {
+        if ($this->configuration()->isLxc()) {
             $this->loadLxcTemplates();
         }
-
-        if($this->availableValues[0]['key']){
-            $this->value = $this->availableValues[0]['key'];
-        }
-        if ( $this->configuration()->isPermissionArchive())
-        {
+        if ( $this->configuration()->isPermissionArchive()) {
             $this->availableValues[] = [
                 "key"   => 'installationFromArchive',
                 "value" => sl('lang')->abtr('template','InstallationFromArchive'),
             ];
+        }        
+        if($this->availableValues[0]['key']){
+            $this->value = $this->availableValues[0]['key'];
         }
         $this->data['additionalData']['showItemDescription']  = true;
     }

+ 3 - 1
app/UI/VmCreate/Providers/VmCreateProvider.php

@@ -13,13 +13,16 @@ use ModulesGarden\ProxmoxAddon\App\Jobs\Cloud\RestoreArchiveJob;
 use ModulesGarden\ProxmoxAddon\App\Libs\Format;
 use ModulesGarden\ProxmoxAddon\App\Models\CloudInitScript;
 use ModulesGarden\ProxmoxAddon\App\Models\VirtualInterface;
+use ModulesGarden\ProxmoxAddon\App\Models\VirtualNetwork;
 use ModulesGarden\ProxmoxAddon\App\Models\VmIpAddress;
 use ModulesGarden\ProxmoxAddon\App\Models\VmModel;
 use ModulesGarden\ProxmoxAddon\App\Services\ApiService;
 use ModulesGarden\ProxmoxAddon\App\Services\Cloud\NetworkService;
 use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
 use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ResourceManager;
+use ModulesGarden\ProxmoxAddon\App\Services\Ip\Ipv4Range;
 use ModulesGarden\ProxmoxAddon\App\Services\Utility;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\Helpers\BuildUrl;
 use ModulesGarden\Servers\ProxmoxCloudVps\App\Helpers\UrlServiceHelper;
 use ModulesGarden\Servers\ProxmoxCloudVps\Core\FileReader\Reader\Json;
 use ModulesGarden\Servers\ProxmoxCloudVps\Core\ModuleConstants;
@@ -320,7 +323,6 @@ class VmCreateProvider extends BaseModelDataProvider implements ClientArea
         }
         //cpulimit
         if( !$this->configuration()->isPermissionCpuLimit() && !$this->formData['cpuPriority']){
-//            $this->vmModel->cpulimit = $this->configuration()->serverCpulimit->min;
             $this->vmModel->cpulimit = $this->formData['vcpu'] * 0.8;
         }
         //cpuunits

+ 5 - 3
app/UI/VmCreate/Sections/Qemu/GeneralSection.php

@@ -39,13 +39,15 @@ class GeneralSection extends HalfPageSection
      */
     protected $resourceManager;
 
-    public function initContent()   {
+    public function initContent()
+    {
         $this->initIds('generalSection');
         $this->resourceManager = new ResourceManager();
         $this->initFields();
     }
 
-    public function initFields()  {
+    public function initFields()
+    {
         $advancedUser = new AdvancedUserHelper($this->getWhmcsParamByKey('userid'));
         //cpuPrioryty
         $cpuPrioryty = $this->configuration()->hasCpuPriority();
@@ -122,8 +124,8 @@ class GeneralSection extends HalfPageSection
             $maxRange = $this->configuration()->serverDiskSize->max;
         }
         $field = new Range('disk', $this->configuration()->serverDiskSize->min, $maxRange);
+        $field->addValidator(new DiskSizeValidator('additionalDiskSize',true));
         $field->setDefaultValue($this->configuration()->serverDiskSize->min);
-        $field->addValidator(new DiskSizeValidator('disk',true));
         $field->setDescription('description');
         $this->addField($field);
         //username

+ 0 - 1
app/UI/VmUpdate/Forms/VmUpdateForm.php

@@ -57,7 +57,6 @@ class VmUpdateForm extends  BaseStandaloneFormExtSections implements ClientArea
             //network
             $rightSection->addSection((new VirtualInterfaceDataTable())->setMainContainer($this->mainContainer));
             //interfaces
-//            $rightSection->addSection((new NetworkQemuDataTable())->setMainContainer($this->mainContainer));
             $this->addSection($rightSection);
         }
         $this->loadDataToForm();

+ 70 - 2
app/UI/VmUpdate/Providers/VmUpdateProvider.php

@@ -52,8 +52,9 @@ class VmUpdateProvider extends VmCreateProvider
         $this->data =  $this->vmModel->toArray();
         $vm = \ModulesGarden\ProxmoxAddon\Core\Helper\sl('Vm')->getVm();
         $config = $vm->config();
+        $this->data['password'] = $this->vmModel->getPassword();
         $this->data['ciuser'] = $config['ciuser'];
-        $this->data['cipassword'] = $config['cipassword'];
+        $this->data['cipassword'] = $config['cipassword'];        
         $this->data['description'] = html_entity_decode($config['description']);
         $this->data['searchdomain'] = $config['searchdomain'];
         $ns = explode(" ",$config['nameserver']);
@@ -63,6 +64,37 @@ class VmUpdateProvider extends VmCreateProvider
             $this->data['ipv4'] = $this->vmModel->ipv4Addresses->count();
             $this->data['ipv6'] = $this->vmModel->ipv6Addresses->count();
         }
+        //Boot order
+        if($vm instanceof Kvm){
+            $bootOrder                           = $vm->getBootOrder();
+            $this->data['bootOrder0']            = $bootOrder[0];
+            $this->data['bootOrder1']            = $bootOrder[1];
+            $this->data['bootOrder2']            = $bootOrder[2];
+            $options                             = [
+                0   => sl("lang")->tr("None"),
+                "c" => sl("lang")->tr("Disk"),
+                "d" => sl("lang")->tr("CD-ROM"),
+                "n" => sl("lang")->tr("Network"),
+            ];
+            if(version_compare($this->api()->getVersion(), "6.3", '>=')
+            && !in_array("c", (array) $bootOrder )){
+                $cdrom = $vm->cdrom();
+                $nd = $vm->getNetworkDevices();
+                $options                             = [
+                    0   => sl("lang")->tr("None"),
+                    $vm->getMasterHardDisk()->getId() => sl("lang")->tr("Disk"),
+                ];
+                if($cdrom['bus']){
+                    $options[$cdrom['bus']] = sl("lang")->tr("CD-ROM");
+                }
+                if($nd[0] instanceof  NetworkDeviceKvm){
+                    $options[$nd[0]->getId()] = sl("lang")->tr("Network");
+                }
+            }
+            $this->availableValues['bootOrder0'] = $options;
+            $this->availableValues['bootOrder1'] = $options;
+            $this->availableValues['bootOrder2'] = $options;
+        }
         //sshkeys
         $this->data['sshkeys'] = rawurldecode($vm->config()['sshkeys']);
         //cpu Priority
@@ -135,6 +167,25 @@ class VmUpdateProvider extends VmCreateProvider
             {
                 $vm->updateCdrom($this->formData['iso']);
             }
+            //Boot order
+            $bootOrder = null;
+            $order = [];
+            for ($i = 0; $i <= 2; $i++)
+            {
+                if ($this->formData['bootOrder' . $i])
+                {
+                    $bootOrder .= $this->formData['bootOrder' . $i];
+                    if(!in_array($this->formData['bootOrder' . $i],["c","d","n"])){
+                        $order[] = $this->formData['bootOrder' . $i];
+                    }
+                }
+            }
+            if(version_compare($this->api()->getVersion(), "6.3", '>=') && !empty($order)){
+                //order=scsi0;ide0;ide1;net0
+                $vm->updateConfig(['boot' => "order=".implode(";", $order)]);
+            }else{
+                $vm->changeBootOrder($bootOrder);
+            }
             //sshkeys
             if($this->configuration()->isPermissionSshkeys()){
                 if ($this->formData['sshkeys'])
@@ -150,6 +201,9 @@ class VmUpdateProvider extends VmCreateProvider
             Api::beginTransaction();
             DB::beginTransaction();
             $this->fillVmModel();
+            if($this->getFormDataValues()['password']){
+                $this->vmModel->setPassword($this->getFormDataValues()['password']);
+            }
             if($this->getFormDataValues()['ciuser']){
                 $vm->updateConfig(["ciuser" => $this->formData['ciuser']]);
             }
@@ -166,6 +220,18 @@ class VmUpdateProvider extends VmCreateProvider
             if($this->configuration()->isLxc()){
                 fire(new LxcUpdateEvent($this->vmModel, $this->formData));
             }
+            if ($this->configuration()->isDetailsCombinedView()) {
+                //virtual interfaces
+                $this->virtualNetworkUpdate();
+                //IP Set
+                if ($this->configuration()->isIpsetIpFilter()){
+                    $ipSetFilterService =  new IpSetIpFilterService();
+                    $ipSetFilterService->create();
+                }
+                //disks
+                $this->disksUpdate();
+
+            }
             $agentEnabled = (new AgentService())->isEnabled();
             if($agentEnabled && $this->configuration()->isAgentConfigureNetwork()){
                 queue(ConfigureNetworkJob::class,
@@ -313,4 +379,6 @@ class VmUpdateProvider extends VmCreateProvider
         $vmModel->save();
 
     }
-}
+
+
+}

+ 2 - 1
app/UI/VmUpdate/Sections/Lxc/GeneralCombinedSection.php

@@ -17,6 +17,7 @@ use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Textarea;
 use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\BaseSection;
 use function ModulesGarden\Servers\ProxmoxCloudVps\Core\Helper\sl;
 
-class GeneralCombinedSection extends GeneralSection {
+class GeneralCombinedSection extends GeneralSection
+{
 
 }

+ 13 - 23
app/UI/VmUpdate/Sections/Lxc/GeneralSection.php

@@ -15,7 +15,6 @@ use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Range;
 use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Text;
 use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Fields\Textarea;
 use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Widget\Forms\Sections\BaseSection;
-
 use function ModulesGarden\Servers\ProxmoxCloudVps\Core\Helper\sl;
 
 class GeneralSection extends BaseSection
@@ -38,32 +37,23 @@ class GeneralSection extends BaseSection
 
     public function initFields()
     {
+        /**
+         * @deprecated
         //ipv4
-        if (!$this->configuration()->isOrderPublicIp() && $this->configuration()->isPermissionIpv4()) {
-            $field = new Text('ipv4');
-            $field->addValidator(
-                new NumberValidator(
-                    $this->resourceManager->ipv4()->getMin(),
-                    $this->resourceManager->ipv4()->free(),
-                    $this->resourceManager->ipv4()->getMin() > 0
-                )
-            );
-            $field->setDescription('description');
-            $this->addField($field);
+        if($this->configuration()->isPermissionIpv4()){
+        $field = new Text('ipv4');
+        $field->addValidator(new NumberValidator($this->resourceManager->ipv4()->getMin(), $this->resourceManager->ipv4()->free(),false));
+        $field->setDescription('description');
+        $this->addField($field);
         }
         //ipv6
-        if (!$this->configuration()->isOrderPublicIp() && $this->configuration()->isPermissionIpv6()) {
-            $field = new Text('ipv6');
-            $field->addValidator(
-                new NumberValidator(
-                    $this->resourceManager->ipv6()->getMin(),
-                    $this->resourceManager->ipv6()->free(),
-                    $this->resourceManager->ipv6()->getMin() > 0
-                )
-            );
-            $field->setDescription('description');
-            $this->addField($field);
+        if($this->configuration()->isPermissionIpv6()){
+        $field = new Text('ipv6');
+        $field->addValidator(new NumberValidator($this->resourceManager->ipv6()->getMin(), $this->resourceManager->ipv6()->free(),false));
+        $field->setDescription('description');
+        $this->addField($field);
         }
+         */
         $cpuPrioryty = $this->configuration()->hasCpuPriority();
         //name
         $field = new Text('name');

+ 5 - 0
app/UI/VmUpdate/Sections/Qemu/GeneralSection.php

@@ -141,7 +141,10 @@ class GeneralSection extends BaseSection
             $field->addValidator(new NumberValidator($vm->config()['memory'], $this->resourceManager->memory()->free(),true));
             $field->setDescription('Zur Speicherreduzierung muß die VM heruntergefahren sein!');
         }
+        $field->setDefaultValue($vm->config()['memory']);
         $this->addField($field);
+        /**
+         * @deprecated
         //ipv4
         if(!$this->configuration()->isOrderPublicIp() && $this->configuration()->isPermissionIpv4()){
             $field = new Text('ipv4');
@@ -156,6 +159,8 @@ class GeneralSection extends BaseSection
             $field->setDescription('description');
             $this->addField($field);
         }
+         *
+         */
         //dnsdomain
         if($this->configuration()->isPermissionSearchdomain()){
              $field = new Text('searchdomain');

+ 6 - 6
app/UI/Vms/Buttons/ConsoleButton.php

@@ -27,6 +27,7 @@ use ModulesGarden\ProxmoxAddon\App\Services\ApiService;
 use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
 use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Vms\Buttons\CreateButton;
 use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Vms\Buttons\DeleteButton;
+use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Vms\Buttons\EditButton;
 use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Vms\Buttons\ConsoleButton;
 use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Vms\Buttons\ManageButton;
 use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Vms\Buttons\ImportButton;
@@ -85,7 +86,7 @@ class VmsDataTable extends DataTable implements ClientArea, AdminArea
             //migrate
             $this->addActionButton(new MigrateButton());
         }
-        if (!isAdmin() && $this->configuration()->isPermissionNovnc()){
+        if (!$isAdmin && $this->configuration()->isPermissionNovnc()){
             //console
             $this->addActionButton(new ConsoleButton());
         }
@@ -94,16 +95,13 @@ class VmsDataTable extends DataTable implements ClientArea, AdminArea
             $this->addActionButton(new ManageButton());
         }
         //delete
-//        if($isAdmin){
-            $this->addActionButton(new DeleteButton());
-//        }
+        $this->addActionButton(new DeleteButton());
     }
 
     protected function loadHtml()
     {
         if(isAdmin()){
-            $this->addColumn((new Column('vmid')))
-                ->addColumn((new Column('node')));
+            $this->addColumn((new Column('vmid')))->addColumn((new Column('node')));
         }
         $this->addColumn((new Column('name'))->setOrderable('ASC'))
             ->addColumn((new Column('status')))
@@ -133,6 +131,8 @@ class VmsDataTable extends DataTable implements ClientArea, AdminArea
         }catch (\Exception $ex){
             if (substr( $ex->getMessage(), 0, 18 ) === 'Configuration file') {
                 return '<span class="lu-label lu-label--danger lu-label--status">' . sl('lang')->abtr('config') . '</span>';
+            } elseif (substr( $ex->getMessage(), 0, 5 ) === 'Field') {
+                return '<span class="lu-label lu-label--danger lu-label--status">' . sl('lang')->abtr( "Build") . '</span>';
             } else {
                 return '<span class="lu-label lu-label--danger lu-label--status">' . $ex->getMessage() . '</span>';
             }

+ 1 - 1
core/App/Controllers/Instances/Addon/ConfigOptions.php

@@ -260,7 +260,7 @@ class ConfigOptions extends \ModulesGarden\Servers\ProxmoxCloudVps\Core\App\Cont
     {
         $data = [
             'content' =>
-                '<div style="width=100%; margin-bottom: 0px;" class="alert alert-danger">' . $message . '</div>',
+                '<tr><td class="fieldlabel" style="width:0%; display:none;"></td><td style="width=100%;" class="fieldarea"><div style="width=100%; margin-bottom: 0px;" class="alert alert-danger">' . $message . '</div></td></tr>',
             'mode' => 'advanced'
         ];
 

+ 0 - 1
core/Http/Response.php

@@ -237,7 +237,6 @@ class Response extends SymfonyRespose
     
     public function returnClientProvisioning($vars, $path, $fileName)
     {
-//        $templateVarName = ($this->getRequestValue('a', false) === 'management') ? 'tabOverviewReplacementTemplate' : 'templatefile';          
         $templateVarName = 'tabOverviewReplacementTemplate';          
 
         return [

+ 20 - 9
core/UI/Widget/Sidebar/SidebarAjax.php

@@ -42,13 +42,17 @@ class SidebarAjax extends Sidebar implements \ModulesGarden\Servers\ProxmoxCloud
     /** 
      * overwrite this function, use add function to add ajax elements
      */
-    public function prepareAjaxData() {}        
+    public function prepareAjaxData()
+    {
+        
+    }        
     
     /** 
      * do not overwrite this function
      * @return type \ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\ResponseTemplates\RawDataJsonResponse
      */
-    public function returnAjaxData()   {
+    public function returnAjaxData()
+    {
         $this->prepareAjaxData();
         
         $returnData = $this->parseProvidedData();
@@ -56,11 +60,13 @@ class SidebarAjax extends Sidebar implements \ModulesGarden\Servers\ProxmoxCloud
         return (new ResponseTemplates\RawDataJsonResponse($returnData))->setCallBackFunction($this->callBackFunction);
     }
     
-    protected function parseProvidedData() {
+    protected function parseProvidedData()
+    {
         $this->loadLang();
         
         $data = [];
-        foreach ($this->ajaxMenuElements as $mItem) {
+        foreach ($this->ajaxMenuElements as $mItem)
+        {
             $data[] = [
                 'id' => $mItem->getId(),
                 'namespace' => $mItem->getNamespace(),
@@ -76,23 +82,28 @@ class SidebarAjax extends Sidebar implements \ModulesGarden\Servers\ProxmoxCloud
         return $data;
     }
     
-    public function add($sidebar) {
+    public function add($sidebar)
+    {
         $this->ajaxMenuElements[$sidebar->getId()] = $sidebar;
         
-        if (method_exists($sidebar, 'setParent')) {
+        if (method_exists($sidebar, 'setParent'))
+        {
             $sidebar->setParent($this);
         }
         
         return  $this;
     }
     
-    public function parseOnClickAction($actionString) {
-        if (stripos($actionString, '(') > 0)  {
+    public function parseOnClickAction($actionString)
+    {
+        if (stripos($actionString, '(') > 0)
+        {
             $actions = explode('(', $actionString);
             $action = $actions[0];
             $paramsString = trim(trim(trim($actions[1], ';'), ')'), "'");
             $params = explode(',', $paramsString);
-            foreach ($params as $key => $param) {
+            foreach ($params as $key => $param)
+            {
                 $params[$key] = trim(trim(trim($param), "'"), '"');
             }
             

+ 65 - 49
langs/english.php

@@ -959,7 +959,7 @@ $_LANG['template']['installationFromIso']='Installation From ISO Image';
 $_LANG['template']['InstallationFromArchive']='Installation From Archive';
 $_LANG['template_desc']['Template contains  Ubuntu Server 18.04 LTS (Bionic Beaver) daily builds'] ='Template contains  Ubuntu Server 18.04 LTS (Bionic Beaver) daily builds';
 //Virtual Machines
-$_LANG['serverAA']['home']['mainContainer']['dataTable']['table']['vmid'] = 'VmID';
+$_LANG['serverAA']['home']['mainContainer']['dataTable']['table']['vmid'] = 'VMID';
 $_LANG['serverAA']['home']['mainContainer']['dataTable']['createVmButton']['button']['createVmButton'] = 'Add New Virtual Machine';
 $_LANG['serverAA']['home']['mainContainer']['dataTable']['vmsDataTable'] = 'Virtual Machines';
 $_LANG['serverAA']['home']['mainContainer']['dataTable']['table']['name'] = 'Name';
@@ -968,9 +968,9 @@ $_LANG['serverAA']['home']['mainContainer']['dataTable']['table']['vcpus'] = 'vC
 $_LANG['serverAA']['home']['mainContainer']['dataTable']['table']['memory'] = 'Memory';
 $_LANG['serverAA']['home']['mainContainer']['dataTable']['table']['disk'] = 'Disk';
 $_LANG['serverAA']['home']['mainContainer']['dataTable']['table']['osTemplate'] = 'OS Template';
-$_LANG['serverAA']['home']['mainContainer']['dataTable']['consoleButton']['button']['consoleButton'] = 'noVNC Console';
 $_LANG['serverAA']['home']['mainContainer']['dataTable']['redirectButton']['button']['redirectButton'] = 'Manage Virtual Machine';
 $_LANG['serverAA']['home']['mainContainer']['dataTable']['deleteButton']['button']['deleteButton'] = 'Delete';
+$_LANG['serverAA']['home']['mainContainer']['dataTable']['consoleButton']['button']['consoleButton'] = 'noVNC Console';
 //
 $_LANG['serverAA']['vms']['mainContainer']['dataTable']['table']['vmid'] = 'VmID';
 $_LANG['serverAA']['vms']['mainContainer']['dataTable']['createVmButton']['button']['createVmButton'] = 'Add New Virtual Machine';
@@ -984,7 +984,6 @@ $_LANG['serverAA']['vms']['mainContainer']['dataTable']['table']['osTemplate'] =
 $_LANG['serverAA']['vms']['mainContainer']['dataTable']['consoleButton']['button']['consoleButton'] = 'noVNC Console';
 $_LANG['serverAA']['vms']['mainContainer']['dataTable']['redirectButton']['button']['redirectButton'] = 'Manage Virtual Machine';
 $_LANG['serverAA']['vms']['mainContainer']['dataTable']['deleteButton']['button']['deleteButton'] = 'Delete';
-//
 //delete
 $_LANG['serverAA']['adminServicesTabFields']['deleteVmModal']['modal']['deleteVmModal']  = 'Delete Virtual Machine';
 $_LANG['serverAA']['adminServicesTabFields']['deleteVmModal']['deleteForm']['confirmDelete']  = 'Are you sure that you want to delete this Virtual Machine?';
@@ -1041,6 +1040,7 @@ $_LANG['Rebuild VM in progress. Please try again later.'] = 'The process of VM r
 $_LANG['Upgrading VM in progress. Please try again later.'] = 'The process of VM upgrading is in progress. Please try again later.';
 $_LANG['OS Template require disk size :size:'] = 'OS Template requires the :size: disk size';
 $_LANG['You are not able to set :additional_disks_size: GB of the additional disks size. The available size is: :size: GB'] = 'You are not able to set :additional_disks_size: GB of the additional disks size. The available size is: :size: GB';
+$_LANG['There is not enougth disk ressource to clone this VM'] = 'There is not enougth disk ressource to clone this VM';
 $_LANG['The hard disk has been updated successfully'] = 'The hard disk has been updated successfully';
 $_LANG['The Virtual :name: network has been updated successfully'] = 'The Virtual :name: network has been updated successfully';
 $_LANG['Public'] = 'Internet';
@@ -1054,11 +1054,12 @@ $_LANG['Remove the snapshots before reinstallation.'] = 'Remove the snapshots be
 $_LANG['FormValidators']['PleaseProvideASshPublicKey'] = 'Please provide SSH public key in OpenSSH format';
 $_LANG['User account does not exist. Please, create an account firstly.'] = 'User account does not exist. Please, create an account firstly.';
 $_LANG['Server has been updated'] = 'Server has been updated';
+$_LANG['Template VM is not in stopped state'] = 'Template VM is not in stopped state';
 //sidebar
 $_LANG['virtualMachinesProxmoxCloudVps'] = 'Virtual Machines';
-$_LANG['vmlist'] = 'Servers';
 $_LANG['vmcreate'] = 'Add New Virtual Machine';
 $_LANG['customTemplate']= 'Templates';
+$_LANG['vmlist'] = 'Servers';
 $_LANG['virtualNetwork']= 'Networks';
 /**********************************************************************************************************************
  *                                                 Home VMs                                          *
@@ -1094,6 +1095,7 @@ $_LANG['The Virtual Machine has been booted successfully'] = 'The Virtual Machin
 $_LANG['The Virtual Machine has been deleted successfully'] = 'The Virtual Machine has been deleted successfully';
 $_LANG['The Virtual Machine cannot be deleted in an unknown state'] = 'The Virtual Machine cannot be deleted in this state';
 $_LANG['Error deleting Virtual Machine'] = 'Error deleting Virtual Machine';
+$_LANG['Shut down the Virtual Machine'] = 'Shut down the Virtual Machine';
 //Virtual Network
 $_LANG['serverCA']['home']['mainContainer']['virtualNetworkDataTable']['virtualNetworkDataTable'] = 'Virtual Networks';
 $_LANG['serverCA']['home']['mainContainer']['virtualNetworkDataTable']['createButton']['button']['createButton'] = 'Create New Virtual Network';
@@ -1103,6 +1105,7 @@ $_LANG['serverCA']['home']['mainContainer']['virtualNetworkDataTable']['table'][
 $_LANG['serverCA']['home']['mainContainer']['virtualNetworkDataTable']['table']['gateway'] = 'Gateway';
 $_LANG['serverCA']['home']['mainContainer']['virtualNetworkDataTable']['updateButton']['button']['updateButton'] = 'Edit';
 $_LANG['serverCA']['home']['mainContainer']['virtualNetworkDataTable']['deleteButton']['button']['deleteButton'] = 'Delete';
+$_LANG['cannotDeleteTheVirtualNetwork'] = 'You cannot delete a virtual network that is in use. To delete the virtual network, you need to remove the the virtual interfaces the virtual machine using it.';
 //
 $_LANG['serverCA']['virtualNetwork']['mainContainer']['virtualNetworkDataTable']['virtualNetworkDataTable'] = 'Virtual Networks';
 $_LANG['serverCA']['virtualNetwork']['mainContainer']['virtualNetworkDataTable']['createButton']['button']['createButton'] = 'Create New Virtual Network';
@@ -1112,8 +1115,6 @@ $_LANG['serverCA']['virtualNetwork']['mainContainer']['virtualNetworkDataTable']
 $_LANG['serverCA']['virtualNetwork']['mainContainer']['virtualNetworkDataTable']['table']['gateway'] = 'Gateway';
 $_LANG['serverCA']['virtualNetwork']['mainContainer']['virtualNetworkDataTable']['updateButton']['button']['updateButton'] = 'Edit';
 $_LANG['serverCA']['virtualNetwork']['mainContainer']['virtualNetworkDataTable']['deleteButton']['button']['deleteButton'] = 'Delete';
-//
-$_LANG['cannotDeleteTheVirtualNetwork'] = 'You cannot delete a virtual network that is in use. To delete the virtual network, you need to remove the the virtual interfaces the virtual machine using it.';
 //Edit Modal
 $_LANG['serverCA']['home']['virtualNetworkUpdateModal']['modal']['virtualNetworkUpdateModal'] = 'Edit Virtual Network';
 $_LANG['serverCA']['home']['virtualNetworkUpdateModal']['updateForm']['name']['name'] = 'Name';
@@ -1124,18 +1125,11 @@ $_LANG['serverCA']['virtualNetwork']['virtualNetworkUpdateModal']['modal']['virt
 $_LANG['serverCA']['virtualNetwork']['virtualNetworkUpdateModal']['updateForm']['name']['name'] = 'Name';
 $_LANG['serverCA']['virtualNetwork']['virtualNetworkUpdateModal']['baseAcceptButton']['title'] = 'Save Changes';
 $_LANG['serverCA']['virtualNetwork']['virtualNetworkUpdateModal']['baseCancelButton']['title'] = 'Cancel';
-//
 //Delete vm
 $_LANG['serverCA']['home']['deleteVmModal']['modal']['deleteVmModal'] = 'Delete Virtual Machine';
 $_LANG['serverCA']['home']['deleteVmModal']['deleteForm']['confirmDelete'] = 'Are you sure that want to delete this Virtual Machine?';
 $_LANG['serverCA']['home']['deleteVmModal']['baseAcceptButton']['title'] = 'Confirm';
 $_LANG['serverCA']['home']['deleteVmModal']['baseCancelButton']['title'] = 'Cancel';
-//
-$_LANG['serverCA']['vms']['deleteVmModal']['modal']['deleteVmModal'] = 'Delete Virtual Machine';
-$_LANG['serverCA']['vms']['deleteVmModal']['deleteForm']['confirmDelete'] = 'Are you sure that want to delete this Virtual Machine?';
-$_LANG['serverCA']['vms']['deleteVmModal']['baseAcceptButton']['title'] = 'Confirm';
-$_LANG['serverCA']['vms']['deleteVmModal']['baseCancelButton']['title'] = 'Cancel';
-//
 //Delete Modal
 $_LANG['serverCA']['home']['virtualNetworkDeleteModal']['modal']['virtualNetworkDeleteModal'] = 'Delete Virtual Network';
 $_LANG['serverCA']['home']['virtualNetworkDeleteModal']['deleteForm']['confirmDelete'] = 'Are you sure that you want to delete this Virtual Network?';
@@ -1146,7 +1140,6 @@ $_LANG['serverCA']['virtualNetwork']['virtualNetworkDeleteModal']['modal']['virt
 $_LANG['serverCA']['virtualNetwork']['virtualNetworkDeleteModal']['deleteForm']['confirmDelete'] = 'Are you sure that you want to delete this Virtual Network?';
 $_LANG['serverCA']['virtualNetwork']['virtualNetworkDeleteModal']['baseAcceptButton']['title'] = 'Confirm';
 $_LANG['serverCA']['virtualNetwork']['virtualNetworkDeleteModal']['baseCancelButton']['title'] = 'Cancel';
-//
 //Create Modal
 $_LANG['serverCA']['home']['virtualNetworkCreateModal']['modal']['virtualNetworkCreateModal'] = 'Add  New Virtual Network';
 $_LANG['serverCA']['home']['virtualNetworkCreateModal']['createForm']['name']['name'] = 'Name';
@@ -1165,15 +1158,19 @@ $_LANG['serverCA']['virtualNetwork']['virtualNetworkCreateModal']['createForm'][
 $_LANG['serverCA']['virtualNetwork']['virtualNetworkCreateModal']['createForm']['gateway']['gateway'] = 'Gateway';
 $_LANG['serverCA']['virtualNetwork']['virtualNetworkCreateModal']['baseAcceptButton']['title'] = 'Save Changes';
 $_LANG['serverCA']['virtualNetwork']['virtualNetworkCreateModal']['baseCancelButton']['title'] = 'Cancel';
-//
 //Add New Virtual Machine
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['Create New Virtual Machine'] = 'Create New Virtual Machine';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['Clone New Virtual Machine'] = 'Clone New Virtual Machine';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['Virtual datacenter resources'] = 'Your Virtual Datacenter Resources';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['name']['name'] = 'Virtual Machine Name';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['template']['template']='VM Template';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['osTemplate']['osTemplate']='Virtual Machine Type';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['virtualMachineSettings'] = 'Virtual Machine Settings';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['availableResources'] = 'Available Resources';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['start']['start'] = 'Start VM after creation';
 $_LANG['serverCA']['vm']['Description'] = 'Virtual Machine Description';
+$_LANG['serverCA']['vm']['rootdisk'] = 'Systemdisk';
+$_LANG['serverCA']['vm']['adddisk'] = 'Additional Disks';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['generalSection']='Virtual Machine Parameters ';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['isoImage']['isoImage'] = 'ISO Image';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['secondaryIsoImage']['secondaryIsoImage'] = 'Secondary ISO';
@@ -1193,13 +1190,20 @@ $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['gene
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['memory']['memory'] = 'VM RAM [MiB]';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['memory']['description'] = 'Enter the default RAM size of the VM';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['disk']['disk'] = 'Disk Size [GB]';
-$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['disk']['description'] = 'Enter the default storage size [GB], please enter integres only, without values after comma ';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['disk']['description'] = 'Enter the default storage size [GB], please enter integers only, without values after comma ';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['searchdomain']['searchdomain'] = 'Search Domain';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['searchdomain']['description'] = 'Enter a domains name for search';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['nameserver[0]']['nameserver[0]'] = 'Name Server';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['nameserver[0]']['description'] = 'Enter a server name';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['nameserver[1]']['nameserver[1]'] = 'Second Name Server';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['nameserver[1]']['description'] = 'Enter a second server name';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['dnsSection']['dnsSection'] = 'DNS Settings';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['dnsSection']['searchdomain']['searchdomain'] = 'Search Domain';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['dnsSection']['searchdomain']['description'] = 'Enter a domains name for search';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['dnsSection']['nameserver[0]']['nameserver[0]'] = 'Name Server';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['dnsSection']['nameserver[0]']['description'] = 'Enter a DNS server IP';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['dnsSection']['nameserver[1]']['nameserver[1]'] = 'Second Name Server';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['dnsSection']['nameserver[1]']['description'] = 'Enter a second DNS server IP';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['ciuser']['ciuser'] = 'Default User';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['ciuser']['description'] = 'Enter a default user name';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['sshkeys']['sshkeys'] = 'SSH Key';
@@ -1321,6 +1325,13 @@ $_LANG['serverCA']['vm']['shutdownModal']['modal']['shutdownModal'] = 'Shutdown
 $_LANG['serverCA']['vm']['shutdownModal']['shutdownForm']['conforimShutdown'] = 'Are you sure that you want to shut down the Virtual Machine?';
 $_LANG['serverCA']['vm']['shutdownModal']['baseAcceptButton']['title'] = 'Confirm';
 $_LANG['serverCA']['vm']['shutdownModal']['baseCancelButton']['title'] = 'Cancel';
+//clone
+$_LANG['buttons']['actions']['cloneVmButton'] = 'Clone Virtual Machine';
+$_LANG['serverCA']['iconTitle']['cloneVmButton'] = 'Clone Virtual Machine';
+$_LANG['serverCA']['vm']['cloneVmModal']['modal']['cloneVmModal'] = 'Shut down VM';
+$_LANG['serverCA']['vm']['cloneVmModal']['cloneVmForm']['confirmCloneVm'] = 'The VM has to be stopped for cloning!';
+$_LANG['serverCA']['vm']['cloneVmModal']['baseAcceptButton']['title']  = 'Shut down and clone';
+$_LANG['serverCA']['vm']['cloneVmModal']['baseCancelButton']['title'] = 'Cancel';
 //delete
 $_LANG['buttons']['actions']['deleteVmButton'] = 'Delete Virtual Machine';
 $_LANG['serverCA']['iconTitle']['deleteVmButton'] = 'Delete Virtual Machine';
@@ -1335,13 +1346,13 @@ $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['diskDataTableTitle'] =
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['mountPointDataTableTitle'] = 'Disks';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkQemuDataTable'] = 'Network';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotDataTableTitle'] = 'Snapshots';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabTitle'] = 'Snapshots';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['backupTab'] = 'Backups';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['firewallTabTitle'] = 'Firewall';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['taskHistoryTitle'] = 'Tasks';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['virtualInterfaceDataTable'] = 'Virtual Network';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabTitle'] = 'Network';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['backupTabTitle'] = 'Backups';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabTitle'] = 'Snapshots';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['graphsTabTitle'] = 'Graphs';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['reinstallTabTitle'] = 'Reinstall';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['templatDataTableTitle'] = 'Reinstall';
@@ -1396,7 +1407,6 @@ $_LANG['Low']='Low';
 $_LANG['Normal']='Normal';
 $_LANG['High']='High';
 $_LANG['Medium']='Very High';
-
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['diskDataTable']['diskDataTableTitle'] = 'Disks' ;
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['diskDataTable']['Adding, editing or removing disk will reboot the virtual machine.'] = 'Adding, editing or removing disk will reboot the virtual machine.';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['diskDataTable']['createDiskButton']['button']['createDiskButton']  = 'Add Hard Disk';
@@ -1407,7 +1417,6 @@ $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStanda
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['diskDataTable']['table']['bytes'] = 'Size';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['diskDataTable']['updateDiskButton']['button']['updateDiskButton'] = 'Edit';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['diskDataTable']['deleteDiskButton']['button']['deleteDiskButton'] = 'Delete';
-
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['virtualInterfaceDataTable']['virtualInterfaceDataTableTitle'] = 'Virtual Networks' ;
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['virtualInterfaceDataTable']['createVirtualInterfaceButton']['button']['createVirtualInterfaceButton'] = 'Add New Virtual Network' ;
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['virtualInterfaceDataTable']['table']['name'] = 'Name';
@@ -1416,7 +1425,7 @@ $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStanda
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['virtualInterfaceDataTable']['table']['hwaddr'] = 'Mac Address';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['virtualInterfaceDataTable']['table']['subnet_mask'] = 'Subnet Mask';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['virtualInterfaceDataTable']['table']['gateway'] = 'Gateway';
-
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['dnsSection']['dnsSection'] = 'DNS Konfiguration';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['virtualNetworkSection']['virtualNetworkSection']        = 'Virtual Networks'   ;
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['virtualNetworkSection']['Add New Virtual Network']='Add New Virtual Network';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['virtualNetworkSection']['Virtual Network']='Virtual Network';
@@ -1459,6 +1468,7 @@ $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['mountPointDataTable']['
 $_LANG['serverCA']['vm']['Root Disk'] = 'Root Disk';
 //update
 $_LANG['serverCA']['vm']['updateDiskModal']['modal']['updateDiskModal'] = 'Edit Disk';
+$_LANG['serverCA']['vm']['updateDiskModal']['updateDiskForm']['size']['size'] = 'Size [GB]';
 $_LANG['serverCA']['vm']['updateDiskModal']['updateDiskForm']['additionalDiskSize']['additionalDiskSize'] = 'Size [GB]';
 $_LANG['serverCA']['vm']['updateDiskModal']['updateDiskForm']['backup']['backup'] = 'Backup';
 $_LANG['serverCA']['vm']['updateDiskModal']['baseAcceptButton']['title'] = 'Save Changes';
@@ -1466,6 +1476,7 @@ $_LANG['serverCA']['vm']['updateDiskModal']['baseCancelButton']['title'] = 'Canc
 //add
 $_LANG['serverCA']['vm']['createDiskModal']['createDiskForm']['backup']['backup'] = 'Backup';
 $_LANG['serverCA']['vm']['createDiskModal']['modal']['createDiskModal'] = 'Add Hard Disk';
+$_LANG['serverCA']['vm']['createDiskModal']['createDiskForm']['size']['size'] = 'Size [GB]';
 $_LANG['serverCA']['vm']['createDiskModal']['createDiskForm']['additionalDiskSize']['additionalDiskSize'] = 'Size [GB]';
 $_LANG['serverCA']['vm']['createDiskModal']['createDiskForm']['bus']['bus'] = 'Bus';
 $_LANG['serverCA']['vm']['createDiskModal']['createDiskForm']['format']['format'] = 'Format';
@@ -1480,6 +1491,25 @@ $_LANG['serverCA']['vm']['deleteDiskModal']['baseAcceptButton']['title'] = 'Conf
 $_LANG['serverCA']['vm']['deleteDiskModal']['baseCancelButton']['title'] = 'Cancel';
 $_LANG['The hard disk has been deleted successfully'] = 'The hard disk has been deleted successfully';
 //Virtual interfaces
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['dataTable']['createVirtualInterfaceButton']['button']['createVirtualInterfaceButton'] = 'Add New Virtual Network';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['dataTable']['table']['name'] = 'Name';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['dataTable']['virtualInterfaceDeleteButton']['button']['virtualInterfaceDeleteButton'] = 'Delete';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['dataTable']['table']['mac_address'] = 'Mac Address';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['dataTable']['table']['hwaddr'] = 'Mac Address';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['dataTable']['table']['subnet_mask'] = 'Subnet Mask';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['dataTable']['table']['gateway'] = 'Gateway';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['networkQemuDataTable'] = 'Interfaces';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['networkLxcDataTable'] = 'Interfaces';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['virtualInterfaceDataTable'] = 'Virtual Network';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['dataTable']['table']['ip'] = 'IP';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['dataTable']['table']['id'] = 'ID';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['dataTable']['table']['firewall'] = 'Firewall';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['dataTable']['table']['macAddress'] = 'Mac Address';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['dataTable']['table']['gw'] = 'Gateway';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['dataTable']['table']['rate'] = 'Rate';
+$_LANG['serverCA']['vm']['Disabled'] = 'Disabled';
+$_LANG['Unlimited'] = 'Unlimited';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['dataTable']['infoNetworkButton']['button']['infoNetworkButton'] = 'Network Details';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['virtualInterfaceDataTable']['createVirtualInterfaceButton']['button']['createVirtualInterfaceButton'] = 'Add New Virtual Network';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['virtualInterfaceDataTable']['table']['name'] = 'Name';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['virtualInterfaceDataTable']['virtualInterfaceDeleteButton']['button']['virtualInterfaceDeleteButton'] = 'Delete';
@@ -1488,7 +1518,6 @@ $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['virtu
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['virtualInterfaceDataTable']['table']['subnet_mask'] = 'Subnet Mask';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['virtualInterfaceDataTable']['table']['gateway'] = 'Gateway';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['networkQemuDataTableTitle'] = 'Interfaces';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['networkLxcDataTable'] = 'Interfaces';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['virtualInterfaceDataTableTitle'] = 'Virtual Network';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['networkQemuDataTable']['table']['ip'] = 'IP';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['networkQemuDataTable']['table']['id'] = 'ID';
@@ -1496,8 +1525,6 @@ $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['netwo
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['networkQemuDataTable']['table']['macAddress'] = 'Mac Address';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['networkQemuDataTable']['table']['gw'] = 'Gateway';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['networkQemuDataTable']['table']['rate'] = 'Rate';
-$_LANG['serverCA']['vm']['Disabled'] = 'Disabled';
-$_LANG['Unlimited'] = 'Unlimited';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['networkTabName']['networkQemuDataTable']['infoNetworkButton']['button']['infoNetworkButton'] = 'Network Details';
 //details
 $_LANG['serverCA']['vm']['infoNetworkModal']['modal']['infoNetworkModal'] = 'Network Details';
@@ -1579,7 +1606,7 @@ $_LANG['serverCA']['vm']['deleteMassModal']['deleteMassForm']['confirmDeleteMass
 $_LANG['serverCA']['vm']['deleteMassModal']['baseAcceptButton']['title'] = 'Confirm';
 $_LANG['serverCA']['vm']['deleteMassModal']['baseCancelButton']['title']  = 'Cancel';
 $_LANG['The snapshots have been deleted successfully'] = 'The selected snapshots have been deleted successfully';
-//snapshotJobs
+//snapshot jobs
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabTitle'] = 'Snapshots';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTab']['snapshotTabTitle'] = 'Snapshots';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTab']['snapshotDataTable'] = 'Snapshots';
@@ -1604,17 +1631,6 @@ $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTab']['dataTabl
 $_LANG['serverCA']['vm']['Your snapshot limit is :snapshotFilesLimit:. When you exceed this limit, the last snapshot will be replaced with a new one.'] = 'Your snapshot limit is :snapshotFilesLimit:. When you exceed this limit, the last snapshot will be replaced with a new one.';
 $_LANG['serverCA']['vm']['hourly'] = 'Hourly';
 $_LANG['serverCA']['vm']['daily'] = 'Daily';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTableTitle'] = 'Snapshot jobs';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['createJobButton']['button']['createJobButton'] = 'New job';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['deleteJobMassButton']['button']['deleteJobMassButton'] = 'Delete';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['table']['name'] = 'Name';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['table']['vmstate'] = 'RAM';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['table']['description'] = 'Description';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['rollbackButton ']['button']['rollbackJobButton'] = 'Rollback';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['updateJobButton']['button']['updateJobButton'] = 'Update';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['deleteJobButton']['button']['deleteJobButton'] = 'Delete';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['table']['days'] = 'Time';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['table']['created_at'] = 'Created at';
 $_LANG['serverCA']['vm']['Monday'] = 'Monday';
 $_LANG['serverCA']['vm']['Tuesday'] = 'Tuesday';
 $_LANG['serverCA']['vm']['Wednesday'] = 'Wednesday';
@@ -1624,14 +1640,6 @@ $_LANG['serverCA']['vm']['Saturday'] = 'Saturday';
 $_LANG['serverCA']['vm']['Sunday'] = 'Sunday';
 $_LANG['serverCA']['vm']['createJobModal']['hourly'] = 'Hourly';
 $_LANG['serverCA']['vm']['createJobModal']['daily'] = 'Daily';
-$_LANG['serverCA']['vm']['createJobModal']['modal']['createJobModal'] = 'New snapshot job';
-$_LANG['serverCA']['vm']['createJobModal']['createJobForm']['period']['period'] = 'Period';
-$_LANG['serverCA']['vm']['createJobModal']['createJobForm']['run_every']['run_every'] = 'Run every';
-$_LANG['serverCA']['vm']['createJobModal']['createJobForm']['name']['name'] = 'Name';
-$_LANG['serverCA']['vm']['createJobModal']['createJobForm']['vmstate']['vmstate'] = 'Memory included';
-$_LANG['serverCA']['vm']['createJobModal']['createJobForm']['description']['description'] = 'Description';
-$_LANG['serverCA']['vm']['createJobModal']['baseAcceptButton']['title'] = 'Confirm';
-$_LANG['serverCA']['vm']['createJobModal']['baseCancelButton']['title'] = 'Cancel';
 $_LANG['serverCA']['vm']['createJobModal']['Monday'] = 'Monday';
 $_LANG['serverCA']['vm']['createJobModal']['Tuesday'] = 'Tuesday';
 $_LANG['serverCA']['vm']['createJobModal']['Wednesday'] = 'Wednesday';
@@ -1649,6 +1657,17 @@ $_LANG['serverCA']['vm']['createJobModal']['createJobForm']['vmstate']['vmstate'
 $_LANG['serverCA']['vm']['createJobModal']['createJobForm']['description']['description'] = 'Description';
 $_LANG['serverCA']['vm']['createJobModal']['baseAcceptButton']['title'] = 'Confirm';
 $_LANG['serverCA']['vm']['createJobModal']['baseCancelButton']['title'] = 'Cancel';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTableTitle'] = 'Snapshot jobs';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['createJobButton']['button']['createJobButton'] = 'New job';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['deleteJobMassButton']['button']['deleteJobMassButton'] = 'Delete';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['table']['name'] = 'Name';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['table']['vmstate'] = 'RAM';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['table']['description'] = 'Description';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['rollbackButton ']['button']['rollbackJobButton'] = 'Rollback';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['updateJobButton']['button']['updateJobButton'] = 'Update';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['deleteJobButton']['button']['deleteJobButton'] = 'Delete';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['table']['days'] = 'Time';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['snapshotTabName']['jobDataTable']['table']['created_at'] = 'Created at';
 //update
 $_LANG['serverCA']['vm']['updateJobModal']['modal']['updateJobModal'] = 'Edit Snapshot Job';
 $_LANG['serverCA']['vm']['updateJobModal']['updateJobForm']['days']['days'] = 'Days';
@@ -2134,10 +2153,9 @@ $_LANG['serverCA']['customTemplate']['mainContainer']['customTemplateDataTable']
 $_LANG['serverCA']['customTemplate']['mainContainer']['customTemplateDataTable']['createButton']['button']['createButton'] = 'Add Template';
 $_LANG['serverCA']['customTemplate']['mainContainer']['customTemplateDataTable']['table']['name'] = 'Name';
 $_LANG['serverCA']['customTemplate']['mainContainer']['customTemplateDataTable']['table']['description'] = 'Description';
-$_LANG['serverCA']['customTemplate']['mainContainer']['customTemplateDataTable']['table']['disk'] = 'Disk';
 $_LANG['serverCA']['customTemplate']['mainContainer']['customTemplateDataTable']['updateButton']['button']['updateButton'] = 'Edit';
 $_LANG['serverCA']['customTemplate']['mainContainer']['customTemplateDataTable']['deleteButton']['button']['deleteButton'] = 'Delete';
-//
+$_LANG['serverCA']['customTemplate']['mainContainer']['customTemplateDataTable']['table']['disk'] = 'Disk';
 $_LANG['serverCA']['home']['mainContainer']['customTemplateDataTable']['customTemplateDataTable'] = 'Templates';
 $_LANG['serverCA']['home']['mainContainer']['customTemplateDataTable']['createButton']['button']['createButton'] = 'Add Template';
 $_LANG['serverCA']['home']['mainContainer']['customTemplateDataTable']['table']['name'] = 'Name';
@@ -2145,7 +2163,6 @@ $_LANG['serverCA']['home']['mainContainer']['customTemplateDataTable']['table'][
 $_LANG['serverCA']['home']['mainContainer']['customTemplateDataTable']['table']['disk'] = 'Disk';
 $_LANG['serverCA']['home']['mainContainer']['customTemplateDataTable']['updateButton']['button']['updateButton'] = 'Edit';
 $_LANG['serverCA']['home']['mainContainer']['customTemplateDataTable']['deleteButton']['button']['deleteButton'] = 'Delete';
-//
 $_LANG['serverCA']['home']['createModal']['modal']['createModal'] = 'New Template';
 $_LANG['serverCA']['home']['createModal']['createForm']['confirmCreate'] = 'The Virtual Machine will be converted to a template';
 $_LANG['serverCA']['home']['createModal']['createForm']['vmId']['vmId'] = 'Virtual Machine';
@@ -2153,7 +2170,6 @@ $_LANG['serverCA']['home']['createModal']['createForm']['description']['descript
 $_LANG['serverCA']['home']['createModal']['baseAcceptButton']['title'] = 'Confirm';
 $_LANG['serverCA']['home']['createModal']['baseCancelButton']['title'] = 'Cancel';
 $_LANG['Virtual Machine :name: %s has been converted to template'] = 'Virtual Machine :name: %s has been converted to template';
-//Edit
 $_LANG['serverCA']['home']['updateModal']['modal']['updateModal'] = 'Edit Template';
 $_LANG['serverCA']['home']['updateModal']['updateForm']['description']['description'] = 'Description';
 $_LANG['serverCA']['home']['updateModal']['baseAcceptButton']['title'] = 'Save Changes';
@@ -2184,11 +2200,11 @@ $_LANG['serverCA']['customTemplate']['deleteModal']['modal']['deleteModal'] = 'D
 $_LANG['serverCA']['customTemplate']['deleteModal']['deleteForm']['confirmDelete'] = 'Are you sure you want to delete the selected template?';
 $_LANG['serverCA']['customTemplate']['deleteModal']['baseAcceptButton']['title'] = 'Confirm';
 $_LANG['serverCA']['customTemplate']['deleteModal']['baseCancelButton']['title'] = 'Cancel';
+$_LANG['The Template has been deleted successfully']='The selected template has been deleted successfully';
 $_LANG['VM not running']='VM not running';
 $_LANG['serverAA']['product']['mainContainer']['mainForm']['loadBalancerSection']['leftSection']['customconfigoption[serverGroup][]']['customconfigoption[serverGroup][]'] = 'Group';
 $_LANG['serverAA']['product']['mainContainer']['mainForm']['loadBalancerSection']['leftSection']['customconfigoption[serverGroup][]']['tip'] = 'Select a preferred group or groups of nodes. If you do not have any groups created, proceed to Proxmox Addon -> Servers List -> Details ->Node Groups and add a new group.';
 $_LANG['gb'] = 'GB';
 $_LANG['tb'] = 'TB';
 $_LANG['serverCA']['vm']['OpenPGP HTTP key server protocol traffic'] = 'OpenPGP HTTP key server protocol traffic';
-$_LANG['serverCA']['vm']['Ceph Storage Cluster traffic (Ceph Monitors, OSD & MDS Daemons)'] = 'Ceph Storage Cluster traffic (Ceph Monitors, OSD & MDS Daemons)';
-$_LANG['The Template has been deleted successfully'] = 'The selected template has been deleted successfully';
+$_LANG['serverCA']['vm']['Ceph Storage Cluster traffic (Ceph Monitors, OSD & MDS Daemons)'] = 'Ceph Storage Cluster traffic (Ceph Monitors, OSD & MDS Daemons)';

+ 89 - 64
langs/german.php

@@ -986,13 +986,14 @@ $_LANG["Task 'MigrateVm' already exist"] = "Task 'MigrateVm' already exist";
 $_LANG['The maximum size set for a backup has been exceeded. Please remove the old backup files.'] = 'Die für eine Sicherung festgelegte maximale Größe wurde überschritten. Bitte entfernen Sie die alten Sicherungsdateien.';
 $_LANG['Installation From ISO'] = 'Installation von ISO';
 $_LANG['FormValidators']['The password is too short'] = 'Das Passwort ist zu kurz';
-$_LANG['FormValidators']['PleaseProvideAhostname']= 'Bitte geben Sie einen gültigen Hostnamen an';
-$_LANG['The process of Virtual Machine creation is in progress']='Die VM wird gerade erstellt';
-$_LANG['The process of Virtual Machine creation is in progress.'] = 'Die VM wird gerade erstellt. Bitte versuchen Sie es später.';
-$_LANG['Rebuild VM in progress. Please try again later.'] = 'Die VM wird gerade neu erstellt. Bitte versuchen Sie es später.';
-$_LANG['Upgrading VM in progress. Please try again later.'] = 'Die VM wird gerade aktualisiert. Bitte versuchen Sie es später.';
+$_LANG['FormValidators']['PleaseProvideAhostname'] = 'Bitte geben Sie einen gültigen Hostnamen an';
+$_LANG['The process of Virtual Machine creation is in progress'] = 'Der Server wird gerade erstellt';
+$_LANG['The process of Virtual Machine creation is in progress.'] = 'Der Server wird gerade erstellt.';
+$_LANG['Rebuild VM in progress. Please try again later.'] = 'Der Server wird gerade neu erstellt. Bitte versuchen Sie es später.';
+$_LANG['Upgrading VM in progress. Please try again later.'] = 'Der Server wird gerade aktualisiert. Bitte versuchen Sie es später.';
 $_LANG['OS Template require disk size :size:'] = 'Das Template erfordert eine Festplattengröße von mindestens :size: GB';
 $_LANG['You are not able to set :additional_disks_size: GB of the additional disks size. The available size is: :size: GB'] = 'Es ist nicht möglich, eine zusätzliche Festplatte mit :additional_disks_size: GB zu erstellen. Die maximal verfügbare Größe ist :size: GB';
+$_LANG['There is not enougth disk ressource to clone this VM'] = 'Zu wenig Festplatten Ressource zum klonen dieser VM';
 $_LANG['The hard disk has been updated successfully'] = 'Die Festplatte wurde erfolgreich aktualisiert';
 $_LANG['The Virtual :name: network has been updated successfully'] = 'Das VLAN :name: wurde erfolgreich aktualisiert';
 $_LANG['Public'] = 'Internet';
@@ -1006,12 +1007,14 @@ $_LANG['Remove the snapshots before reinstallation.'] = 'Vor der Neuinstallation
 $_LANG['FormValidators']['PleaseProvideASshPublicKey'] = 'Den öffentlichen SSH Schlüssel muß OpenSSH Format haben';
 $_LANG['User account does not exist. Please, create an account firstly.'] = 'Benutzerkonto existiert nicht. Bitte erstellen Sie zuerst ein Konto.';
 $_LANG['Server has been updated'] = 'Server wurde aktualisiert';
+$_LANG['Template VM is not in stopped state'] = 'Der zu klonende Server ist nicht heruntergefahren';
 //sidebar
-$_LANG['virtualMachinesProxmoxCloudVps'] = 'Virtual Machines';
+$_LANG['virtualMachinesProxmoxCloudVps'] = 'Server';
 $_LANG['vmlist'] = 'Server';
 $_LANG['vmcreate'] = 'Neuen Server erstellen';
 $_LANG['customTemplate']= 'Templates';
 $_LANG['virtualNetwork'] = 'Netzwerke';
+$_LANG['Virtual Datacenter'] = 'Rechenzentrum';
 /**********************************************************************************************************************
  *                                                 Home VMs                                          *
  ********************************************************************************************************************* */
@@ -1035,7 +1038,7 @@ $_LANG['serverCA']['home']['mainContainer']['dataTable']['table']['memory'] = 'M
 $_LANG['serverCA']['home']['mainContainer']['dataTable']['table']['disk'] = 'Disk';
 $_LANG['serverCA']['home']['mainContainer']['dataTable']['table']['osTemplate'] = 'OS Template';
 $_LANG['serverCA']['home']['mainContainer']['dataTable']['consoleButton']['button']['consoleButton'] = 'Serverkonsole';
-$_LANG['serverCA']['home']['mainContainer']['dataTable']['redirectButton']['button']['redirectButton'] = 'VM verwalten';
+$_LANG['serverCA']['home']['mainContainer']['dataTable']['redirectButton']['button']['redirectButton'] = 'Server verwalten';
 $_LANG['serverCA']['home']['mainContainer']['dataTable']['deleteButton']['button']['deleteButton'] = 'Löschen';
 //
 $_LANG['serverAA']['vms']['mainContainer']['dataTable']['table']['vmid'] = 'VmID';
@@ -1048,20 +1051,22 @@ $_LANG['serverCA']['vms']['mainContainer']['dataTable']['table']['memory'] = 'Me
 $_LANG['serverCA']['vms']['mainContainer']['dataTable']['table']['disk'] = 'Disk';
 $_LANG['serverCA']['vms']['mainContainer']['dataTable']['table']['osTemplate'] = 'OS Template';
 $_LANG['serverCA']['vms']['mainContainer']['dataTable']['consoleButton']['button']['consoleButton'] = 'Serverkonsole';
-$_LANG['serverCA']['vms']['mainContainer']['dataTable']['redirectButton']['button']['redirectButton'] = 'VM verwalten';
+$_LANG['serverCA']['vms']['mainContainer']['dataTable']['redirectButton']['button']['redirectButton'] = 'Server verwalten';
 $_LANG['serverCA']['vms']['mainContainer']['dataTable']['deleteButton']['button']['deleteButton'] = 'Löschen';
 //
 $_LANG['stopped'] = 'gestoppt';
 $_LANG['Build'] = 'in Erstellung';
 $_LANG['running'] = 'läuft';
-$_LANG['config'] = 'Vm wird konfiguriert';
-$_LANG['The Virtual Machine has been shut down successfully'] = 'Die VM wurde heruntergefahren';
-$_LANG['The Virtual Machine has been stopped successfully'] = 'Die VM wurde gestoppt';
-$_LANG['The Virtual Machine has been rebooted successfully'] = 'Die VM wurde neu gestartet';
-$_LANG['The Virtual Machine has been booted successfully'] = 'Die VM wurde gestartet';
-$_LANG['The Virtual Machine has been deleted successfully'] = 'Die VM wurde gelöscht';
-$_LANG['The Virtual Machine cannot be deleted in an unknown state'] = 'Die VM kann in diesem Zustand nicht gelöscht werden';
-$_LANG['Error deleting Virtual Machine'] = 'Beim Löschen der VM ist ein Fehler aufgetreten';
+$_LANG['config'] = 'Server wird konfiguriert';
+$_LANG['The Virtual Machine has been shut down successfully'] = 'Der Server wurde heruntergefahren';
+$_LANG['The Virtual Machine has been stopped successfully'] = 'Der Server wurde gestoppt';
+$_LANG['The Virtual Machine has been rebooted successfully'] = 'Der Server wurde neu gestartet';
+$_LANG['The Virtual Machine has been booted successfully'] = 'Der Server wurde gestartet';
+$_LANG['The Virtual Machine has been deleted successfully'] = 'Der Server wurde gelöscht';
+$_LANG['The Virtual Machine cannot be deleted in an unknown state'] = 'Der Server kann in diesem Zustand nicht gelöscht werden';
+$_LANG['Error deleting Virtual Machine'] = 'Beim Löschen des Servers ist ein Fehler aufgetreten';
+$_LANG['Shut down the Virtual Machine'] = 'Der Server wird heruntergefahren';
+
 //Virtual Network
 $_LANG['serverCA']['home']['mainContainer']['virtualNetworkDataTable']['virtualNetworkDataTable'] = 'Netzwerke';
 $_LANG['serverCA']['home']['mainContainer']['virtualNetworkDataTable']['createButton']['button']['createButton'] = 'Neues virtuelles Netzwerk erstellen';
@@ -1094,13 +1099,13 @@ $_LANG['serverCA']['virtualNetwork']['virtualNetworkUpdateModal']['baseAcceptBut
 $_LANG['serverCA']['virtualNetwork']['virtualNetworkUpdateModal']['baseCancelButton']['title'] = 'Abbruch';
 //
 //Delete vm
-$_LANG['serverCA']['home']['deleteVmModal']['modal']['deleteVmModal'] = 'VM löschen';
-$_LANG['serverCA']['home']['deleteVmModal']['deleteForm']['confirmDelete'] = 'Möchten Sie diese VM wirklich löschen?';
+$_LANG['serverCA']['home']['deleteVmModal']['modal']['deleteVmModal'] = 'Server löschen';
+$_LANG['serverCA']['home']['deleteVmModal']['deleteForm']['confirmDelete'] = 'Möchten Sie diesen Server wirklich löschen?';
 $_LANG['serverCA']['home']['deleteVmModal']['baseAcceptButton']['title'] = 'Bestätigen';
 $_LANG['serverCA']['home']['deleteVmModal']['baseCancelButton']['title'] = 'Abbruch';
 //
-$_LANG['serverCA']['vms']['deleteVmModal']['modal']['deleteVmModal'] = 'VM löschen';
-$_LANG['serverCA']['vms']['deleteVmModal']['deleteForm']['confirmDelete'] = 'Möchten Sie diese VM wirklich löschen?';
+$_LANG['serverCA']['vms']['deleteVmModal']['modal']['deleteVmModal'] = 'Server löschen';
+$_LANG['serverCA']['vms']['deleteVmModal']['deleteForm']['confirmDelete'] = 'Möchten Sie diesen Server wirklich löschen?';
 $_LANG['serverCA']['vms']['deleteVmModal']['baseAcceptButton']['title'] = 'Bestätigen';
 $_LANG['serverCA']['vms']['deleteVmModal']['baseCancelButton']['title'] = 'Abbruch';
 //
@@ -1136,13 +1141,18 @@ $_LANG['The Virtual :name: network has been deleted successfully'] = 'Das virtue
 $_LANG['The Virtual :name: network has been created successfully'] = 'Das virtuelle Netzwerk wurde erstellt';
 //Add New Virtual Machine
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['Create New Virtual Machine'] = 'Neuen Server erstellen';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['Clone New Virtual Machine'] = 'Neuen Server klonen';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['Virtual datacenter resources'] = 'Ressourcen des virtuellen Rechenzentrums';
-$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['name']['name'] = 'VM Name';
-$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['osTemplate']['osTemplate']='VM Type';
-$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['virtualMachineSettings'] = 'VM Einstellungen';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['name']['name'] = 'Neuer Server Name';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['template']['template']='Original Server';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['osTemplate']['osTemplate']='Server Template';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['virtualMachineSettings'] = 'Server Einstellungen';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['availableResources'] = 'Verfügbare Ressourcen';
-$_LANG['serverCA']['vm']['Description'] = 'VM Beschreibung';
-$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['generalSection']='VM Parameter';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['start']['start'] = 'Neuen Server nach Erstellung starten';
+$_LANG['serverCA']['vm']['Description'] = 'Server Beschreibung';
+$_LANG['serverCA']['vm']['rootdisk'] = 'Systemfestplatte';
+$_LANG['serverCA']['vm']['adddisk'] = 'Zusätzliche Festplatten';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['generalSection']='Server Parameter';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['isoImage']['isoImage'] = 'ISO Abbild';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['secondaryIsoImage']['secondaryIsoImage'] = 'zweites ISO';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['ostype']['ostype'] = 'Os Type';
@@ -1158,8 +1168,8 @@ $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['gene
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['cpulimit']['description'] = 'Limit der CPU Nutzung. Hinweis: hat der Computer 2 CPUs, liegt das absolute Linit bei \'2\'. \'0\' für kein CPU Limit.';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['cpuunits']['cpuunits'] = 'CPU Units';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['cpuunits']['description'] = 'CPU Units eingeben';
-$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['memory']['memory'] = 'VM RAM [MB]';
-$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['memory']['description'] = 'RAM Größe der VM eingeben [MB]';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['memory']['memory'] = 'Server RAM [MB]';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['memory']['description'] = 'RAM Größe des Servers eingeben [MB]';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['disk']['disk'] = 'Festplattengröße [GB]';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['disk']['description'] = 'Größe der Festplatte eingeben [GB]';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['searchdomain']['searchdomain'] = 'Suchdomäne';
@@ -1168,11 +1178,18 @@ $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['gene
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['nameserver[0]']['description'] = 'DNS Server eingeben';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['nameserver[1]']['nameserver[1]'] = '2. DNS Server';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['nameserver[1]']['description'] = '2. DNS Server eingeben';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['dnsSection']['dnsSection'] = 'DNS Konfiguration';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['dnsSection']['searchdomain']['searchdomain'] = 'Suchdomäne';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['dnsSection']['searchdomain']['description'] = 'Domäne eingeben für automatische Suche (z.B. firma.lan)';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['dnsSection']['nameserver[0]']['nameserver[0]'] = 'DNS Server 1';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['dnsSection']['nameserver[0]']['description'] = 'DNS Server IP eingeben';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['dnsSection']['nameserver[1]']['nameserver[1]'] = 'DNS Server 2';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['dnsSection']['nameserver[1]']['description'] = '2. DNS Server IP eingeben';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['ciuser']['ciuser'] = 'Benutzername';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['ciuser']['description'] = 'Login Benutzernamen eingeben (Achtung, SSH Login mit root geht nur mit SSH-Key)';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['sshkeys']['sshkeys'] = 'SSH Key';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['sshkeys']['description'] = 'SSH key in OpenSSH Format angeben';
-$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['baseSubmitButton']['button']['submit'] = 'VM erstellen';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['baseSubmitButton']['button']['submit'] = 'Server erstellen';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['virtualNetworkSection']['virtualNetworkSection'] = 'Virtuelle Netzwerke'   ;
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['virtualNetworkSection']['Add New Virtual Network'] ='Virtuelles Netzwerk hinzufügen';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['virtualNetworkSection']['Virtual Network'] ='Netzwerke';
@@ -1193,7 +1210,7 @@ $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['gene
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['cloudInitScript']['description'] = 'Cloud-Init Script auswählen ';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['netdisk']['additionalDiskSection']['additionalDiskMp']['additionalDiskMp'] ='Path';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['password']['password'] = 'Passwort';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['password']['description'] = 'VM Passwort';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['password']['description'] = 'Server Passwort';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['swap']['swap'] = 'SWAP';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['additionalDiskSection']['Size [GB]'] = 'Größe [GB]';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['additionalDiskSection']['Backup'] = 'Backup';
@@ -1207,9 +1224,9 @@ $_LANG['Enable'] = 'Aktivieren';
 $_LANG['Disable'] = 'Deaktivieren';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['cpuPriority']['cpuPriority'] = 'CPU Priorität';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['cpuPriority']['description'] = 'CPU Priorität angeben';
-$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['description']['description'] = 'VM Beschreibung';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['rawSection']['description']['description'] = 'Server Beschreibung';
 $_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['location']['location'] = 'Standort';
-$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['location']['description']='Standort der VM auwählen.';
+$_LANG['serverCA']['vm']['mainContainer']['baseStandaloneFormExtSections']['generalSection']['location']['description']='Standort des Servers auwählen.';
 $_LANG['location']['proxmox1']='proxmox1';
 
 /* * ********************************************************************************************************************
@@ -1260,30 +1277,37 @@ $_LANG['serverCA']['iconTitle']['spice'] = 'Spice Konsole';
 $_LANG['buttons']['actions']['xtermjs'] = 'Xterm.js Konsole';
 $_LANG['serverCA']['iconTitle']['xtermjs'] = 'Xterm.js Konsole';
 //Virtual Machine Modals
-$_LANG['serverCA']['vm']['startModal']['modal']['startModal'] = 'VM starten';
-$_LANG['serverCA']['vm']['startModal']['startForm']['conforimStart'] = 'Sind Sie sicher, dass Sie die VM starten möchten?';
+$_LANG['serverCA']['vm']['startModal']['modal']['startModal'] = 'Server starten';
+$_LANG['serverCA']['vm']['startModal']['startForm']['conforimStart'] = 'Sind Sie sicher, dass Sie den Server starten möchten?';
 $_LANG['serverCA']['vm']['startModal']['baseAcceptButton']['title'] = 'Bestätigen';
 $_LANG['serverCA']['vm']['startModal']['baseCancelButton']['title'] = 'Abbruch';
 //reboot
-$_LANG['serverCA']['vm']['rebootModal']['modal']['rebootModal'] = 'VM restarten';
-$_LANG['serverCA']['vm']['rebootModal']['rebootForm']['conforimReboot'] = 'Sind Sie sicher, dass Sie die VM neu starten möchten?';
+$_LANG['serverCA']['vm']['rebootModal']['modal']['rebootModal'] = 'Server restarten';
+$_LANG['serverCA']['vm']['rebootModal']['rebootForm']['conforimReboot'] = 'Sind Sie sicher, dass Sie den Server neu starten möchten?';
 $_LANG['serverCA']['vm']['rebootModal']['baseAcceptButton']['title'] = 'Bestätigen';
 $_LANG['serverCA']['vm']['rebootModal']['baseCancelButton']['title'] = 'Abbruch';
 //stop
-$_LANG['serverCA']['vm']['stopModal']['modal']['stopModal'] = 'VM stoppen';
-$_LANG['serverCA']['vm']['stopModal']['stopForm']['conforimStop'] = 'Sind Sie sicher, dass Sie die VM anhalten möchten?';
+$_LANG['serverCA']['vm']['stopModal']['modal']['stopModal'] = 'Server stoppen';
+$_LANG['serverCA']['vm']['stopModal']['stopForm']['conforimStop'] = 'Sind Sie sicher, dass Sie den Server ausschalten möchten?';
 $_LANG['serverCA']['vm']['stopModal']['baseAcceptButton']['title'] = 'Bestätigen';
 $_LANG['serverCA']['vm']['stopModal']['baseCancelButton']['title'] = 'Abbruch';
 //shutdown
-$_LANG['serverCA']['vm']['shutdownModal']['modal']['shutdownModal'] = 'VM herunterfahren';
-$_LANG['serverCA']['vm']['shutdownModal']['shutdownForm']['conforimShutdown'] = 'Sind Sie sicher, dass Sie die virtuelle Maschine herunterfahren möchten?';
+$_LANG['serverCA']['vm']['shutdownModal']['modal']['shutdownModal'] = 'Server herunterfahren';
+$_LANG['serverCA']['vm']['shutdownModal']['shutdownForm']['conforimShutdown'] = 'Sind Sie sicher, dass Sie den Server herunterfahren möchten?';
 $_LANG['serverCA']['vm']['shutdownModal']['baseAcceptButton']['title'] = 'Bestätigen';
 $_LANG['serverCA']['vm']['shutdownModal']['baseCancelButton']['title'] = 'Abbruch';
+//clone
+$_LANG['buttons']['actions']['cloneVmButton'] = 'Server klonen';
+$_LANG['serverCA']['iconTitle']['cloneVmButton'] = 'Server klonen';
+$_LANG['serverCA']['vm']['cloneVmModal']['modal']['cloneVmModal'] = 'Server herunterfahren';
+$_LANG['serverCA']['vm']['cloneVmModal']['cloneVmForm']['confirmCloneVm'] = 'Der Server muß vor dem Klonen heruntergefahren werden!';
+$_LANG['serverCA']['vm']['cloneVmModal']['baseAcceptButton']['title']  = 'Herunterfahren und klonen';
+$_LANG['serverCA']['vm']['cloneVmModal']['baseCancelButton']['title'] = 'Abbruch';
 //delete
-$_LANG['buttons']['actions']['deleteVmButton'] = 'VM löschen';
-$_LANG['serverCA']['iconTitle']['deleteVmButton'] = 'VM löschen';
-$_LANG['serverCA']['vm']['deleteVmModal']['modal']['deleteVmModal'] = 'VM löschen';
-$_LANG['serverCA']['vm']['deleteVmModal']['deleteVmForm']['confirmDeleteVm'] = 'Sind Sie sicher, dass Sie diese virtuelle Maschine löschen möchten?';
+$_LANG['buttons']['actions']['deleteVmButton'] = 'Server löschen';
+$_LANG['serverCA']['iconTitle']['deleteVmButton'] = 'Server löschen';
+$_LANG['serverCA']['vm']['deleteVmModal']['modal']['deleteVmModal'] = 'Server löschen';
+$_LANG['serverCA']['vm']['deleteVmModal']['deleteVmForm']['confirmDeleteVm'] = 'Sind Sie sicher, dass Sie diesen Server löschen möchten?';
 $_LANG['serverCA']['vm']['deleteVmModal']['baseAcceptButton']['title']  = 'Bestätigen';
 $_LANG['serverCA']['vm']['deleteVmModal']['baseCancelButton']['title'] = 'Abbruch';
 /* * ********************************************************************************************************************
@@ -1314,7 +1338,7 @@ $_LANG['serverCA']['vm']['sshKeyModal']['sshPrivateKeyDownloadButton']['button']
 //details
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTabName'] = 'Details';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['name']['name'] = 'Name';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['name']['description'] = 'Name der VM eingeben';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['name']['description'] = 'Name des Servers eingeben';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['description']['description'] = 'Beschreibung';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['bootOrder0']['bootOrder0'] = 'Boot Device 1';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['bootOrder1']['bootOrder1'] = 'Boot Device 2';
@@ -1330,7 +1354,7 @@ $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStanda
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['cpuunits']['cpuunits'] = 'CPU Units';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['cpuunits']['description'] = 'CPU Units eingeben';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['memory']['memory'] = 'Speicher';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['memory']['description'] = 'RAM Größe der VM angeben';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['memory']['description'] = 'RAM Größe des Servers angeben';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['disk']['disk'] = 'Festplatte';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['disk']['description'] = 'Größe der Festplatte angeben [GB]';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['searchdomain']['searchdomain'] = 'Suchdomäne';
@@ -1357,7 +1381,7 @@ $_LANG['Medium']='Sehr hoch';
 
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['diskDataTable']['diskDataTableTitle'] = 'Festplatten' ;
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['diskDataTable']['createDiskButton']['button']['createDiskButton'] = 'Festplatte hinzufügen' ;
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['diskDataTable']['Adding, editing or removing disk will reboot the virtual machine.'] = 'Änderungen der Festplatte werden beim nächsten Neustart der VM übernommen.';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['diskDataTable']['Adding, editing or removing disk will reboot the virtual machine.'] = 'Änderungen der Festplatte werden beim nächsten Neustart des Servers übernommen.';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['diskDataTable']['table']['name'] = 'Name';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['diskDataTable']['table']['bus'] = 'Bus';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['diskDataTable']['table']['format'] = 'Format';
@@ -1376,6 +1400,7 @@ $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStanda
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['virtualInterfaceDataTable']['table']['gateway'] = 'Gateway';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['virtualInterfaceDataTableTitle'] = 'Netzwerke';
 
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['dnsSection']['dnsSection'] = 'DNS Konfiguration';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['virtualNetworkSection']['virtualNetworkSection'] = 'Virtuelle Netzwerke' ;
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['virtualNetworkSection']['Add New Virtual Network'] ='Virtuelles Netzwerk hinzufügen';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['virtualNetworkSection']['Virtual Network'] ='Netzwerke';
@@ -1391,7 +1416,7 @@ $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStanda
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['additionalDiskSection']['additionalDiskBackup']['additionalDiskBackup'] = 'Backup';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['rightSection']['additionalDiskSection']['additional_disk_add_info'] = 'Klicken Sie auf die blaue Schaltfläche, um eine zusätzliche Festplatte hinzuzufügen';
 //disks
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['diskDataTable']['Adding, editing or removing disk will reboot the virtual machine.'] = 'Durch Hinzufügen, Bearbeiten oder Entfernen der Festplatte wird die VM neu gestartet.';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['diskDataTable']['Adding, editing or removing disk will reboot the virtual machine.'] = 'Durch Hinzufügen, Bearbeiten oder Entfernen der Festplatte wird der Server neu gestartet.';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['diskDataTable']['createDiskButton']['button']['createDiskButton'] = 'Festplatte hinzufügen';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['diskDataTable']['table']['name'] = 'Name';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['diskDataTable']['table']['bus'] = 'Bus';
@@ -1403,7 +1428,7 @@ $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['diskDataTable']['delete
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['detailTab']['baseStandaloneFormExtSections']['generalSection']['swap']['description'] = 'swap';
 $_LANG['Disk :id:'] = 'Disk :id:';
 //MP
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['mountPointDataTable']['Adding, editing or removing disk will reboot the virtual machine.'] = 'Durch Hinzufügen, Bearbeiten oder Entfernen der Festplatte wird die VM neu gestartet.';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['mountPointDataTable']['Adding, editing or removing disk will reboot the virtual machine.'] = 'Durch Hinzufügen, Bearbeiten oder Entfernen der Festplatte wird der Server neu gestartet.';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['mountPointDataTable']['createDiskButton']['button']['createDiskButton']  = 'Festplatte hinzufügen';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['mountPointDataTable']['table']['name'] = 'Name';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['mountPointDataTable']['table']['bus'] = 'Bus';
@@ -1659,11 +1684,11 @@ $_LANG['serverCA']['vm']['Suspend'] = 'Unterbrechen';
 $_LANG['serverCA']['vm']['Stop'] = 'Anhalten';
 $_LANG['The backup creation is in progress'] = 'Die Sicherung wird erstellt';
 //Restore backup modal
-$_LANG['serverCA']['vm']['restoreBackupModal']['modal']['restoreBackupModal'] = 'VM wiederherstellen';
+$_LANG['serverCA']['vm']['restoreBackupModal']['modal']['restoreBackupModal'] = 'Server wiederherstellen';
 $_LANG['serverCA']['vm']['restoreBackupModal']['restoreBackupForm']['confirmRestore'] = 'Sind Sie sicher, dass Sie diese Sicherung wiederherstellen möchten?';
 $_LANG['serverCA']['vm']['restoreBackupModal']['baseAcceptButton']['title'] = 'Bestätigen';
 $_LANG['serverCA']['vm']['restoreBackupModal']['baseCancelButton']['title'] = 'Abbruch';
-$_LANG['The virtual machine restore is in progress'] = 'Die Wiederherstellung der VM wird ausgeführt';
+$_LANG['The virtual machine restore is in progress'] = 'Die Wiederherstellung des Servers wird ausgeführt';
 $_LANG['The backup has been deleted successfully'] = 'Die Sicherung wurde erfolgreich gelöscht';
 //Delete backups
 $_LANG['serverCA']['vm']['deleteBackupMassModal']['modal']['deleteBackupMassModal'] = 'Sicherungen löschen';
@@ -2019,32 +2044,32 @@ $_LANG['serverCA']['vm']['Disk Write'] = 'Festplatte schreiben';
 /**********************************************************************************************************************
  *                                                 VM Reinstall                                          *
  ********************************************************************************************************************* */
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['reinstallTab']['dataTable']['Select the template for reinstallation. If you proceed, all data located on the virtual machine will be lost.'] = 'Wählen Sie das Template für die Neuinstallation aus. Wenn Sie fortfahren, gehen alle Daten auf der VM verloren.';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['reinstallTab']['dataTable']['Select the template for reinstallation. If you proceed, all data located on the virtual machine will be lost.'] = 'Wählen Sie das Template für die Neuinstallation aus. Wenn Sie fortfahren, gehen alle Daten auf dem Server verloren.';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['reinstallTab']['templatDataTable'] = 'OS Template';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['reinstallTab']['isoDataTable'] = 'ISO Abbild';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['reinstallTab']['dataTable']['Select the template for reinstallation. If you proceed, all data located on the virtual machine will be lost.'] = 'Wählen Sie das Template für die Neuinstallation aus. Wenn Sie fortfahren, gehen alle Daten auf der VM verloren.';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['reinstallTab']['dataTable']['Select the template for reinstallation. If you proceed, all data located on the virtual machine will be lost.'] = 'Wählen Sie das Template für die Neuinstallation aus. Wenn Sie fortfahren, gehen alle Daten auf dem Server verloren.';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['reinstallTab']['dataTable']['table']['name'] = 'Name';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['reinstallTab']['dataTable']['templateInstallButton']['button']['templateInstallButton'] = 'Installieren';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['reinstallTab']['dataTable']['isoInstallButton']['button']['isoInstallButton'] = 'Installieren';
 //Reinstall template
-$_LANG['serverCA']['vm']['templateInstallModal']['modal']['templateInstallModal'] = 'VM neu installieren';
-$_LANG['serverCA']['vm']['templateInstallModal']['templateInstallForm']['confirmReinstall'] = 'Möchten Sie diese VM wirklich neu installieren?';
+$_LANG['serverCA']['vm']['templateInstallModal']['modal']['templateInstallModal'] = 'Server neu installieren';
+$_LANG['serverCA']['vm']['templateInstallModal']['templateInstallForm']['confirmReinstall'] = 'Möchten Sie diese Server wirklich neu installieren?';
 $_LANG['serverCA']['vm']['templateInstallModal']['templateInstallForm']['password']['password'] = 'Passwort';
 $_LANG['serverCA']['vm']['templateInstallModal']['templateInstallForm']['password']['tip'] = 'Passwort eingeben';
 $_LANG['serverCA']['vm']['templateInstallModal']['baseAcceptButton']['title'] = 'Bestätigen';
 $_LANG['serverCA']['vm']['templateInstallModal']['baseCancelButton']['title'] = 'Abbruch';
-$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['templatDataTable']['Select the template for reinstallation. If you proceed, all data located on the virtual machine will be lost.'] = 'Wählen Sie das Template für die Neuinstallation aus. Wenn Sie fortfahren, gehen alle Daten auf der VM verloren.';
+$_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['templatDataTable']['Select the template for reinstallation. If you proceed, all data located on the virtual machine will be lost.'] = 'Wählen Sie das Template für die Neuinstallation aus. Wenn Sie fortfahren, gehen alle Daten auf dem Server verloren.';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['templatDataTable']['table']['name'] = 'Name';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['templatDataTable']['templateInstallButton']['button']['templateInstallButton'] = 'Installieren';
 //Reinstall ISO
 $_LANG['None'] = 'Nichts';
-$_LANG['serverCA']['vm']['isoInstallModal']['modal']['isoInstallModal'] = 'VM neu installieren';
-$_LANG['serverCA']['vm']['isoInstallModal']['isoInstallForm']['confirmReinstall'] = 'Möchten Sie diese VM wirklich neu installieren?';
+$_LANG['serverCA']['vm']['isoInstallModal']['modal']['isoInstallModal'] = 'Server neu installieren';
+$_LANG['serverCA']['vm']['isoInstallModal']['isoInstallForm']['confirmReinstall'] = 'Möchten Sie diesen Server wirklich neu installieren?';
 $_LANG['serverCA']['vm']['isoInstallModal']['isoInstallForm']['secondaryIsoImage']['secondaryIsoImage'] = 'zweites ISO Abbild';
 $_LANG['serverCA']['vm']['isoInstallModal']['baseAcceptButton']['title'] = 'Bestätigen';
 $_LANG['serverCA']['vm']['isoInstallModal']['baseCancelButton']['title'] = 'Abbruch';
 $_LANG['Service information has been changed'] = 'Serviceinformationen wurden geändert';
-$_LANG['The virtual server is being reinstalled'] = 'Die VM wird neu installiert';
+$_LANG['The virtual server is being reinstalled'] = 'Der Server wird neu installiert';
 $_LANG['Installation is now processing. The login information will be available in the noVNC console.'] = 'Die Installation läuft gerade. Die Anmeldeinformationen sind in der noVNC-Konsole verfügbar.';
 $_LANG['serverCA']['vm']['mainContainer']['tabsWidget']['reinstallTab']['dataTable']['table']['description'] = 'Beschreibung';
 //Templates
@@ -2065,12 +2090,12 @@ $_LANG['serverCA']['home']['mainContainer']['customTemplateDataTable']['updateBu
 $_LANG['serverCA']['home']['mainContainer']['customTemplateDataTable']['deleteButton']['button']['deleteButton'] = 'Löschen';
 //
 $_LANG['serverCA']['home']['createModal']['modal']['createModal'] = 'Neues Template';
-$_LANG['serverCA']['home']['createModal']['createForm']['confirmCreate'] = 'Die VM wird in ein Template konvertiert';
-$_LANG['serverCA']['home']['createModal']['createForm']['vmId']['vmId'] = 'VM ID';
+$_LANG['serverCA']['home']['createModal']['createForm']['confirmCreate'] = 'Der Server wird in ein Template konvertiert';
+$_LANG['serverCA']['home']['createModal']['createForm']['vmId']['vmId'] = 'Server ID';
 $_LANG['serverCA']['home']['createModal']['createForm']['description']['description'] = 'Beschreibung';
 $_LANG['serverCA']['home']['createModal']['baseAcceptButton']['title'] = 'Bestätigen';
 $_LANG['serverCA']['home']['createModal']['baseCancelButton']['title'] = 'Abbruch';
-$_LANG['Virtual Machine :name: %s has been converted to template'] = 'Die VM :name: %s wurde in ein Template konvertiert';
+$_LANG['Virtual Machine :name: %s has been converted to template'] = 'Der Server :name: %s wurde in ein Template konvertiert';
 //Edit
 $_LANG['serverCA']['home']['updateModal']['modal']['updateModal'] = 'Template bearbeiten';
 $_LANG['serverCA']['home']['updateModal']['updateForm']['description']['description'] = 'Beschreibung';
@@ -2085,12 +2110,12 @@ $_LANG['serverCA']['home']['deleteModal']['baseCancelButton']['title'] = 'Abbruc
 $_LANG['The Template has been deleted successfully'] = 'Das ausgewählte Template wurde erfolgreich gelöscht';
 //New Template
 $_LANG['serverCA']['customTemplate']['createModal']['modal']['createModal'] = 'Neues Template';
-$_LANG['serverCA']['customTemplate']['createModal']['createForm']['confirmCreate'] = 'Die VM wird in ein Template konvertiert';
-$_LANG['serverCA']['customTemplate']['createModal']['createForm']['vmId']['vmId'] = 'VM ID';
+$_LANG['serverCA']['customTemplate']['createModal']['createForm']['confirmCreate'] = 'Der Server wird in ein Template konvertiert';
+$_LANG['serverCA']['customTemplate']['createModal']['createForm']['vmId']['vmId'] = 'Server ID';
 $_LANG['serverCA']['customTemplate']['createModal']['createForm']['description']['description'] = 'Beschreibung';
 $_LANG['serverCA']['customTemplate']['createModal']['baseAcceptButton']['title'] = 'Bestätigen';
 $_LANG['serverCA']['customTemplate']['createModal']['baseCancelButton']['title'] = 'Abbruch';
-$_LANG['Virtual Machine :name: %s has been converted to template'] = 'Die VM :name: %s wurde in ein Template konvertiert';
+$_LANG['Virtual Machine :name: %s has been converted to template'] = 'Der Server :name: %s wurde in ein Template konvertiert';
 //Edit
 $_LANG['serverCA']['customTemplate']['updateModal']['modal']['updateModal'] = 'Template bearbeiten';
 $_LANG['serverCA']['customTemplate']['updateModal']['updateForm']['description']['description'] = 'Beschreibung';

+ 18 - 1
templates/client/default/assets/css/layers-ui.css

@@ -1167,6 +1167,13 @@
     padding-right: 8px;
     padding-left: 8px;
   }
+  .lu-col-sm-12p {
+    -webkit-box-flex: 0;
+    flex: 0 0 12%;
+    max-width: 12%;
+    padding-right: 8px;
+    padding-left: 8px;
+  }
 }
 
 .lu-col-sm-15p {
@@ -1176,7 +1183,13 @@
     padding-right: 8px;
     padding-left: 8px;
 }
-
+.lu-col-sm-12p {
+    -webkit-box-flex: 0;
+    flex: 0 0 12%;
+    max-width: 12%;
+    padding-right: 8px;
+    padding-left: 8px;
+}
 
 @media (min-width: 752px) {
   .lu-col-md-20p {
@@ -15278,6 +15291,10 @@ Rail
 }
 
 #layers .lu-is-right,
+#layers .lu-align-right {
+  -webkit-box-pack: end;
+  justify-content: end;
+}
 #layers .lu-pull-right {
   -webkit-box-pack: end;
   justify-content: end;

+ 1 - 1
templates/client/default/assets/js/defaultComponents/dataTable.js

@@ -307,7 +307,7 @@ mgJsComponentHandler.addDefaultComponent('mg-datatable', {
         },
         getFilters: function () {
             return this.$store.getters.getComponentData(this.component_id, 'filters');
-        },
+            },
         buttonAction: function(event, targetId){
             mgPageControler.vueLoader.ajaxAction(event, targetId, getItemNamespace(targetId), getItemIndex(targetId),null,true);
         }

+ 0 - 3
templates/client/default/assets/js/layers-ui.js

@@ -11697,7 +11697,6 @@ var DIACRITICS = {
 	                        	return '<div class="option">'
         	                	+ '<div class="title" style="font-size: 16px;">'+escape(data[field_label])+'</div>'
                 	    		+ '<div class="desc">'
-                        		//+ escape(data['description'])
                         		+ data['description']
                         		+ '</div>'
                         	        + '</div>';
@@ -11706,11 +11705,9 @@ var DIACRITICS = {
 				},
 				'item': function item(data, escape) {
                     if(data.description)  {
-                	console.log("DESCRIPTION 2: " + data['description']);
                         return '<div class="item">'
                             + '<div class="title" style="font-size: 16px;">'+escape(data[field_label])+'</div>'
                             + '<div class="desc">'                            
-                            //+ escape(data['description'])
                             + data['description']
                             + '</div>'
                             + '</div>';

+ 2 - 18
templates/client/default/controlers/main.tpl

@@ -35,7 +35,7 @@
                                             <img src="/templates/croster/thurdata/logoVDC-color.svg" class="img-fluid" style="height:100px;">
                                         </div>
                                     </div>
-                                    <h4>{$product}</h4>
+                                    <h4>{$domain}</h4>
                                     <div class="status-sticker-wrapper">
                                         <div class="status-sticker product-status-{$rawstatus|strtolower}">
                                             {$status}
@@ -76,7 +76,7 @@
             			        <tr>
 		                            <td class="list-heading" style="font-size: 85%;"><strong>Trial Account</strong></td>
 		                            {if ($smarty.now - ($regdate|@strtotime)) > 950400} {* wenn Heute - RegisterDatum > 11 Tage *}
-		                                <td class="list-text" style="color:yellow;font-size:85%;">Endet in {(14 - (($smarty.now - ($regdate|@strtotime)) / 86400)|round)} Tagen</td>
+		                                <td class="list-text" style="color:orange;font-size:85%;">Endet in {(14 - (($smarty.now - ($regdate|@strtotime)) / 86400)|round)} Tagen</td>
             			            {elseif ($smarty.now - ($regdate|@strtotime)) > 1123200} {* wenn Heute - RegisterDatum > 13 Tage *}
                             			<td class="list-text" style="color:red;font-size:85%;">Letzter Tag der Trial Periode</td>
 		                            {else}
@@ -146,11 +146,6 @@
                                             <a href="#metrics" data-toggle="tab" class="nav-link{if !$domain && !$content && !$configurableoptions} active{/if}"><i class="fas fa-chart-line fa-fw"></i> {lang key='metrics.title'}</a>
                                         </li>
                                     {/if}
-                                    {if $customfields}
-                                        <li class="nav-item">
-                                            <a href="#additionalinfo" data-toggle="tab" class="nav-link{if !$domain && !$content && !$metricStats && !$configurableoptions} active{/if}"><i class="fas fa-info fa-fw"></i>Zugangsdaten</a>
-                                        </li>
-                                    {/if}
                                     {if $lastupdate}
                                 	<!--
                                         <li class="nav-item">
@@ -237,13 +232,6 @@
                                     {if $domain}
                                         <div class="tab-pane fade show active" role="tabpanel" id="domain">
                                             <table width="100%" cellspacing="0" cellpadding="0" class="frame">
-                                                <tr>
-                                                    <td align='left'>Maildomain</td>
-                                                    <td align="left">{$domain}</td>
-                                                </tr>
-                                                <tr>
-                                                    <td colspan=2 align='left'><hr></td>
-                                                </tr>
                                                 <tr>
                                                     <td colspan=2 align='center'>
                                                         <div class="mg-wrapper body" data-target=".body" data-spy="scroll" data-twttr-rendered="true">
@@ -280,10 +268,6 @@
                                             </div>
                                         </div>
                                     {/if}
-                                    {if $customfields}
-                                        <div class="tab-pane fade{if !$domain && !$content && !$moduleParams['configoptions'] && !$metricStats} show active{/if}" role="tabpanel" id="additionalinfo">
-                                        </div>
-                                    {/if}
                                     {if $lastupdate}
                                         <div class="tab-pane fade" role="tabpanel" id="resourceusage" align="center">
                                             <table width="100%" cellspacing="0" cellpadding="0" class="frame">