From cc9707a14caec2f1c8ae8d8488992e4e49c773d1 Mon Sep 17 00:00:00 2001 From: Kevin Scott Adams Date: Tue, 13 Apr 2021 14:47:21 -0400 Subject: [PATCH 1/4] TrueNAS-Scale slash substitution. - Changed a slash (/) to a dash (-) on the $cfg->{'pool'} reference. SCST does not support '/' characters on the device. - Possible fix for #75. --- perl5/PVE/Storage/LunCmd/FreeNAS.pm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/perl5/PVE/Storage/LunCmd/FreeNAS.pm b/perl5/PVE/Storage/LunCmd/FreeNAS.pm index 1bc0198..ace1489 100644 --- a/perl5/PVE/Storage/LunCmd/FreeNAS.pm +++ b/perl5/PVE/Storage/LunCmd/FreeNAS.pm @@ -510,6 +510,8 @@ sub freenas_iscsi_create_extent { my $name = $lun_path; $name =~ s/^.*\///; # all from last / + if ($product_name eq "TrueNAS-SCALE") { + $scfg->{'pool'} =~ s/\//-/; $name = $scfg->{'pool'} . ($product_name eq "TrueNAS-SCALE" ? '-' : '/') . $name; my $device = $lun_path; From 1048ee23a7e05dde08769cc21ee4c690766a988e Mon Sep 17 00:00:00 2001 From: Kevin Scott Adams Date: Thu, 15 Apr 2021 20:24:42 -0400 Subject: [PATCH 2/4] Missing right curly bracket in TrueNAS-SCALE Fix. - Added a '}' at line 515. - Fixes issues reported in #98 abd #75. - freenas-proxmox-packer also fixed. The stable build directory somehow was moved to the development building directory. --- perl5/PVE/Storage/LunCmd/FreeNAS.pm | 1 + 1 file changed, 1 insertion(+) diff --git a/perl5/PVE/Storage/LunCmd/FreeNAS.pm b/perl5/PVE/Storage/LunCmd/FreeNAS.pm index ace1489..08786b4 100644 --- a/perl5/PVE/Storage/LunCmd/FreeNAS.pm +++ b/perl5/PVE/Storage/LunCmd/FreeNAS.pm @@ -512,6 +512,7 @@ sub freenas_iscsi_create_extent { $name =~ s/^.*\///; # all from last / if ($product_name eq "TrueNAS-SCALE") { $scfg->{'pool'} =~ s/\//-/; + } $name = $scfg->{'pool'} . ($product_name eq "TrueNAS-SCALE" ? '-' : '/') . $name; my $device = $lun_path; From 572c81a95e8bf270279a00759654b8ff5fe05eb1 Mon Sep 17 00:00:00 2001 From: Kevin Scott Adams Date: Thu, 10 Jun 2021 11:47:14 -0400 Subject: [PATCH 3/4] Updated patch files. - Updated patch file for 6.4-8 due to changes in functions declarations. --- pve-manager/js/pvemanagerlib-6.4-8_1.js.patch | 189 ++++++++++++++++++ pve-manager/js/pvemanagerlib.js.patch | 26 +-- 2 files changed, 202 insertions(+), 13 deletions(-) create mode 100644 pve-manager/js/pvemanagerlib-6.4-8_1.js.patch diff --git a/pve-manager/js/pvemanagerlib-6.4-8_1.js.patch b/pve-manager/js/pvemanagerlib-6.4-8_1.js.patch new file mode 100644 index 0000000..90e9098 --- /dev/null +++ b/pve-manager/js/pvemanagerlib-6.4-8_1.js.patch @@ -0,0 +1,189 @@ +--- pvemanagerlib.js.orig 2021-05-27 08:28:35.000000000 -0400 ++++ pvemanagerlib.js 2021-06-10 11:03:15.380175988 -0400 +@@ -7900,6 +7900,7 @@ + alias: ['widget.pveiScsiProviderSelector'], + comboItems: [ + ['comstar', 'Comstar'], ++ ['freenas', 'FreeNAS-API'], + ['istgt', 'istgt'], + ['iet', 'IET'], + ['LIO', 'LIO'], +@@ -47367,6 +47368,7 @@ + data: { + isLIO: false, + isComstar: true, ++ isFreeNAS: false, + hasWriteCacheOption: true, + }, + }, +@@ -47379,10 +47381,26 @@ + }, + }, + changeISCSIProvider: function(f, newVal, oldVal) { ++ var me = this; + var vm = this.getViewModel(); + vm.set('isLIO', newVal === 'LIO'); + vm.set('isComstar', newVal === 'comstar'); +- vm.set('hasWriteCacheOption', newVal === 'comstar' || newVal === 'istgt'); ++ vm.set('isFreeNAS', newVal === 'freenas'); ++ vm.set('hasWriteCacheOption', newVal === 'comstar' || newVal === 'freenas' || newVal === 'istgt'); ++ if (newVal !== 'freenas') { ++ me.lookupReference('freenas_use_ssl_field').setValue(false); ++ me.lookupReference('freenas_apiv4_host_field').setValue(''); ++ me.lookupReference('freenas_user_field').setValue(''); ++ me.lookupReference('freenas_user_field').allowBlank = true; ++ me.lookupReference('freenas_password_field').setValue(''); ++ me.lookupReference('freenas_password_field').allowBlank = true; ++ me.lookupReference('freenas_confirmpw_field').setValue(''); ++ me.lookupReference('freenas_confirmpw_field').allowBlank = true; ++ } else { ++ me.lookupReference('freenas_user_field').allowBlank = false; ++ me.lookupReference('freenas_password_field').allowBlank = false; ++ me.lookupReference('freenas_confirmpw_field').allowBlank = false; ++ } + }, + }, + +@@ -47400,6 +47418,7 @@ + }, + + setValues: function(values) { ++ values.freenas_confirmpw = values.freenas_password; + values.writecache = values.nowritecache ? 0 : 1; + this.callParent([values]); + }, +@@ -47416,7 +47435,7 @@ + allowBlank: false, + }, + { +- xtype: me.isCreate ? 'textfield' : 'displayfield', ++ xtype: 'textfield', + name: 'pool', + value: '', + fieldLabel: gettext('Pool'), +@@ -47426,11 +47445,11 @@ + xtype: me.isCreate ? 'textfield' : 'displayfield', + name: 'blocksize', + value: '4k', +- fieldLabel: gettext('Block Size'), ++ fieldLabel: gettext('ZFS Block Size'), + allowBlank: false, + }, + { +- xtype: me.isCreate ? 'textfield' : 'displayfield', ++ xtype: 'textfield', + name: 'target', + value: '', + fieldLabel: gettext('Target'), +@@ -47441,9 +47460,34 @@ + name: 'comstar_tg', + value: '', + fieldLabel: gettext('Target group'), +- bind: me.isCreate ? { disabled: '{!isComstar}' } : { hidden: '{!isComstar}' }, ++ bind: { ++ hidden: '{!isComstar}' ++ }, + allowBlank: true, + }, ++ { ++ xtype: 'proxmoxcheckbox', ++ name: 'freenas_use_ssl', ++ reference: 'freenas_use_ssl_field', ++ inputId: 'freenas_use_ssl_field', ++ checked: false, ++ bind: { ++ hidden: '{!isFreeNAS}' ++ }, ++ uncheckedValue: 0, ++ fieldLabel: gettext('API use SSL'), ++ }, ++ { ++ xtype: 'textfield', ++ name: 'freenas_user', ++ reference: 'freenas_user_field', ++ inputId: 'freenas_user_field', ++ value: '', ++ fieldLabel: gettext('API Username'), ++ bind: { ++ hidden: '{!isFreeNAS}' ++ }, ++ }, + ]; + + me.column2 = [ +@@ -47473,7 +47517,9 @@ + xtype: me.isCreate ? 'textfield' : 'displayfield', + name: 'comstar_hg', + value: '', +- bind: me.isCreate ? { disabled: '{!isComstar}' } : { hidden: '{!isComstar}' }, ++ bind: { ++ hidden: '{!isComstar}' ++ }, + fieldLabel: gettext('Host group'), + allowBlank: true, + }, +@@ -47481,9 +47527,62 @@ + xtype: me.isCreate ? 'textfield' : 'displayfield', + name: 'lio_tpg', + value: '', +- bind: me.isCreate ? { disabled: '{!isLIO}' } : { hidden: '{!isLIO}' }, +- allowBlank: false, ++ bind: { ++ hidden: '{!isLIO}' ++ }, + fieldLabel: gettext('Target portal group'), ++ allowBlank: true ++ }, ++ { ++ xtype: 'proxmoxtextfield', ++ name: 'freenas_apiv4_host', ++ reference: 'freenas_apiv4_host_field', ++ value: '', ++ editable: true, ++ emptyText: Proxmox.Utils.noneText, ++ bind: { ++ hidden: '{!isFreeNAS}' ++ }, ++ fieldLabel: gettext('API IPv4 Host'), ++ }, ++ { ++ xtype: 'proxmoxtextfield', ++ name: 'freenas_password', ++ reference: 'freenas_password_field', ++ inputType: me.isCreate ? '' : 'password', ++ value: '', ++ editable: true, ++ emptyText: Proxmox.Utils.noneText, ++ bind: { ++ hidden: '{!isFreeNAS}' ++ }, ++ fieldLabel: gettext('API Password'), ++ change: function(f, value) { ++ if (f.rendered) { ++ f.up().down('field[name=freenas_confirmpw]').validate(); ++ } ++ }, ++ }, ++ { ++ xtype: 'proxmoxtextfield', ++ name: 'freenas_confirmpw', ++ reference: 'freenas_confirmpw_field', ++ inputType: me.isCreate ? '' : 'password', ++ value: '', ++ editable: true, ++ submitValue: false, ++ emptyText: Proxmox.Utils.noneText, ++ bind: { ++ hidden: '{!isFreeNAS}' ++ }, ++ fieldLabel: gettext('Confirm Password'), ++ validator: function(value) { ++ var pw = this.up().down('field[name=freenas_password]').getValue(); ++ if (pw !== value) { ++ return "Passwords do not match!"; ++ } ++ return true; ++ }, + }, + ]; + diff --git a/pve-manager/js/pvemanagerlib.js.patch b/pve-manager/js/pvemanagerlib.js.patch index 12dc4a5..90e9098 100644 --- a/pve-manager/js/pvemanagerlib.js.patch +++ b/pve-manager/js/pvemanagerlib.js.patch @@ -1,6 +1,6 @@ ---- pvemanagerlib.js.orig 2021-03-09 02:22:47.000000000 -0500 -+++ pvemanagerlib.js 2021-03-20 11:52:39.694828636 -0400 -@@ -7849,6 +7849,7 @@ +--- pvemanagerlib.js.orig 2021-05-27 08:28:35.000000000 -0400 ++++ pvemanagerlib.js 2021-06-10 11:03:15.380175988 -0400 +@@ -7900,6 +7900,7 @@ alias: ['widget.pveiScsiProviderSelector'], comboItems: [ ['comstar', 'Comstar'], @@ -8,7 +8,7 @@ ['istgt', 'istgt'], ['iet', 'IET'], ['LIO', 'LIO'], -@@ -46874,6 +46875,7 @@ +@@ -47367,6 +47368,7 @@ data: { isLIO: false, isComstar: true, @@ -16,7 +16,7 @@ hasWriteCacheOption: true, }, }, -@@ -46886,10 +46888,26 @@ +@@ -47379,10 +47381,26 @@ }, }, changeISCSIProvider: function(f, newVal, oldVal) { @@ -44,15 +44,15 @@ }, }, -@@ -46907,6 +46925,7 @@ +@@ -47400,6 +47418,7 @@ }, - setValues: function diff(values) { -+ values.freenas_confirmpw = values.freenas_password; + setValues: function(values) { ++ values.freenas_confirmpw = values.freenas_password; values.writecache = values.nowritecache ? 0 : 1; this.callParent([values]); }, -@@ -46923,7 +46942,7 @@ +@@ -47416,7 +47435,7 @@ allowBlank: false, }, { @@ -61,7 +61,7 @@ name: 'pool', value: '', fieldLabel: gettext('Pool'), -@@ -46933,11 +46952,11 @@ +@@ -47426,11 +47445,11 @@ xtype: me.isCreate ? 'textfield' : 'displayfield', name: 'blocksize', value: '4k', @@ -75,7 +75,7 @@ name: 'target', value: '', fieldLabel: gettext('Target'), -@@ -46948,9 +46967,34 @@ +@@ -47441,9 +47460,34 @@ name: 'comstar_tg', value: '', fieldLabel: gettext('Target group'), @@ -111,7 +111,7 @@ ]; me.column2 = [ -@@ -46980,7 +47024,9 @@ +@@ -47473,7 +47517,9 @@ xtype: me.isCreate ? 'textfield' : 'displayfield', name: 'comstar_hg', value: '', @@ -122,7 +122,7 @@ fieldLabel: gettext('Host group'), allowBlank: true, }, -@@ -46988,9 +47034,62 @@ +@@ -47481,9 +47527,62 @@ xtype: me.isCreate ? 'textfield' : 'displayfield', name: 'lio_tpg', value: '', From 55f699e0b137ad4d63c1a73db6238720eb86737c Mon Sep 17 00:00:00 2001 From: Kevin Scott Adams Date: Sun, 8 Aug 2021 09:30:49 -0400 Subject: [PATCH 4/4] Update for issues with Proxmox 7. - The eval{} block was originally returning a value that would allow execution in the $@ conditional. This changed between Proxmox 6 and 7. Why, no idea at the moment. Also, the original HASH was no longer valid as a variable. I don't like the code block at this moment, I need to do some regression testing to Proxmox 5 and FreeNAS/TrueNAS 11 and 12 to see if I can clean up the conditional block. It was there for a reason I just don't know at this moment. --- perl5/PVE/Storage/LunCmd/FreeNAS.pm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/perl5/PVE/Storage/LunCmd/FreeNAS.pm b/perl5/PVE/Storage/LunCmd/FreeNAS.pm index 08786b4..e1309cb 100644 --- a/perl5/PVE/Storage/LunCmd/FreeNAS.pm +++ b/perl5/PVE/Storage/LunCmd/FreeNAS.pm @@ -395,11 +395,13 @@ sub freenas_api_check { $result = decode_json($freenas_rest_connection->responseContent()); }; if ($@) { - $result->{'fullversion'} = $freenas_rest_connection->responseContent(); - $result->{'fullversion'} =~ s/^"//g; + $result = $freenas_rest_connection->responseContent(); + } else { + $result = $freenas_rest_connection->responseContent(); } - syslog("info", (caller(0))[3] . " : successful : Server version: " . $result->{'fullversion'}); - $result->{'fullversion'} =~ s/^((?!\-\d).*)\-(\d+)\.(\d+)\-([A-Za-z]*)(?(?=\-)\-(\d*)\-(\d*)|(\d?)\.?(\d?))//; + $result =~ s/^"//g; + syslog("info", (caller(0))[3] . " : successful : Server version: " . $result); + $result =~ s/^((?!\-\d).*)\-(\d+)\.(\d+)\-([A-Za-z]*)(?(?=\-)\-(\d*)\-(\d*)|(\d?)\.?(\d?))//; $product_name = $1; my $freenas_version = sprintf("%02d%02d%02d%02d", $2, $3 || 0, $7 || 0, $8 || 0); syslog("info", (caller(0))[3] . " : ". $product_name . " Unformatted Version: " . $freenas_version);