Added API Host

- This change allows the API traffic to be on a different interface then
the iSCSI Provider interface. This allows the selection of the FreeNAS
WebGUI address for HTTP/HTTPS to be on a specific interface instead of
"ALL" (0.0.0.0) interfaces.  If the API Host is not defined then the API
traffic will default to the iSCSI Provider interface.
This commit is contained in:
Kevin Scott Adams 2018-08-19 15:28:39 -04:00
parent 3f6059e75f
commit 94d897f7d1
4 changed files with 77 additions and 36 deletions

View File

@ -230,10 +230,11 @@ sub freenas_api_call {
my ($scfg, $method, $path, $data) = @_; my ($scfg, $method, $path, $data) = @_;
my $client = undef; my $client = undef;
my $scheme = $scfg->{freenas_use_ssl} ? "https" : "http"; my $scheme = $scfg->{freenas_use_ssl} ? "https" : "http";
my $apihost = defined($scfg->{freenas_apiv4_host}) ? $scfg->{freenas_apiv4_host} : $scfg->{portal};
my $apiping = '/api/v1.0/system/version/'; my $apiping = '/api/v1.0/system/version/';
$client = REST::Client->new(); $client = REST::Client->new();
$client->setHost($scheme . '://' . $scfg->{portal}); $client->setHost($scheme . '://' . $apihost);
$client->addHeader('Content-Type' , 'application/json'); $client->addHeader('Content-Type' , 'application/json');
$client->addHeader('Authorization' , 'Basic ' . encode_base64($scfg->{freenas_user} . ':' . $scfg->{freenas_password})); $client->addHeader('Authorization' , 'Basic ' . encode_base64($scfg->{freenas_user} . ':' . $scfg->{freenas_password}));
# If using SSL, don't verify SSL certs # If using SSL, don't verify SSL certs
@ -241,12 +242,13 @@ sub freenas_api_call {
$client->getUseragent()->ssl_opts(verify_hostname => 0); $client->getUseragent()->ssl_opts(verify_hostname => 0);
$client->getUseragent()->ssl_opts(SSL_verify_mode => SSL_VERIFY_NONE); $client->getUseragent()->ssl_opts(SSL_verify_mode => SSL_VERIFY_NONE);
} }
# Check if the API is working via the selected scheme # Check if the APIs are accessable via the selected host and scheme
my $code = $client->request('GET', $apiping)->responseCode(); my $code = $client->request('GET', $apiping)->responseCode();
if ($code != 200) { if ($code != 200) {
freenas_api_log_error($client, "freenas_api_call"); freenas_api_log_error($client, "freenas_api_call");
die "Unable to connect to the FreeNAS API service at '" . $scfg->{portal} . "' using '" . $scheme . "' protocol"; die "Unable to connect to the FreeNAS API service at '" . $apihost . "' using the '" . $scheme . "' protocol";
} }
syslog("info","FreeNAS::api_call : setup : sucessfull");
if ($method eq 'GET') { if ($method eq 'GET') {
$client->GET($path); $client->GET($path);
} }

View File

@ -1,5 +1,5 @@
--- /usr/share/perl5/PVE/Storage/ZFSPlugin.pm.orig 2018-06-04 11:59:59.851426278 +0800 --- ZFSPlugin.pm.orig 2018-05-16 04:06:14.000000000 -0400
+++ /usr/share/perl5/PVE/Storage/ZFSPlugin.pm 2018-06-04 12:04:56.781049166 +0800 +++ ZFSPlugin.pm 2018-08-19 09:34:25.169349056 -0400
@@ -10,6 +10,7 @@ @@ -10,6 +10,7 @@
use base qw(PVE::Storage::ZFSPoolPlugin); use base qw(PVE::Storage::ZFSPoolPlugin);
@ -35,7 +35,7 @@
} elsif ($scfg->{iscsiprovider} eq 'istgt') { } elsif ($scfg->{iscsiprovider} eq 'istgt') {
$msg = PVE::Storage::LunCmd::Istgt::run_lun_command($scfg, $timeout, $method, @params); $msg = PVE::Storage::LunCmd::Istgt::run_lun_command($scfg, $timeout, $method, @params);
} elsif ($scfg->{iscsiprovider} eq 'iet') { } elsif ($scfg->{iscsiprovider} eq 'iet') {
@@ -173,6 +178,18 @@ @@ -173,6 +178,22 @@
description => "iscsi provider", description => "iscsi provider",
type => 'string', type => 'string',
}, },
@ -50,17 +50,22 @@
+ freenas_use_ssl => { + freenas_use_ssl => {
+ description => "FreeNAS API access via SSL", + description => "FreeNAS API access via SSL",
+ type => 'boolean', + type => 'boolean',
+ },
+ freenas_apiv4_host => {
+ description => "FreeNAS API Host",
+ type => 'string',
+ }, + },
# this will disable write caching on comstar and istgt. # this will disable write caching on comstar and istgt.
# it is not implemented for iet. iet blockio always operates with # it is not implemented for iet. iet blockio always operates with
# writethrough caching when not in readonly mode # writethrough caching when not in readonly mode
@@ -204,6 +221,9 @@ @@ -204,6 +225,10 @@
sparse => { optional => 1 }, sparse => { optional => 1 },
comstar_hg => { optional => 1 }, comstar_hg => { optional => 1 },
comstar_tg => { optional => 1 }, comstar_tg => { optional => 1 },
+ freenas_user => { optional => 1 }, + freenas_user => { optional => 1 },
+ freenas_password => { optional => 1 }, + freenas_password => { optional => 1 },
+ freenas_use_ssl => { optional => 1 }, + freenas_use_ssl => { optional => 1 },
+ freenas_apiv4_host => { optional => 1 },
content => { optional => 1 }, content => { optional => 1 },
bwlimit => { optional => 1 }, bwlimit => { optional => 1 },
}; };

View File

@ -1,6 +1,6 @@
--- apidoc.js 2018-07-10 06:05:33.000000000 -0400 --- apidoc.js.orig 2018-08-19 10:18:11.715767285 -0400
+++ apidoc.js.new 2018-07-30 22:21:11.479045222 -0400 +++ apidoc.js.new 2018-08-19 10:17:09.364282178 -0400
@@ -27584,6 +27584,24 @@ @@ -27584,6 +27584,31 @@
"type" : "string", "type" : "string",
"typetext" : "<string>" "typetext" : "<string>"
}, },
@ -21,14 +21,22 @@
+ "optional" : 1, + "optional" : 1,
+ "type" : "boolean", + "type" : "boolean",
+ "typetext" : "<boolean>" + "typetext" : "<boolean>"
+ },
+ "freenas_apiv4_host" : {
+ "description" : "FreeNAS API Host via IPv4",
+ "format" : "address",
+ "optional" : 1,
+ "type" : "string",
+ "typetext" : "<string>"
+ }, + },
"content" : { "content" : {
"description" : "Allowed content types.\n\nNOTE: the value 'rootdir' is used for Containers, and value 'images' for VMs.\n", "description" : "Allowed content types.\n\nNOTE: the value 'rootdir' is used for Containers, and value 'images' for VMs.\n",
"format" : "pve-storage-content-list", "format" : "pve-storage-content-list",
@@ -27949,6 +27967,24 @@ @@ -27948,6 +27973,31 @@
"optional" : 1,
"type" : "string", "type" : "string",
"typetext" : "<string>" "typetext" : "<string>"
}, + },
+ "freenas_user" : { + "freenas_user" : {
+ "description" : "FreeNAS user for API access", + "description" : "FreeNAS user for API access",
+ "optional" : 1, + "optional" : 1,
@ -47,6 +55,12 @@
+ "type" : "boolean", + "type" : "boolean",
+ "typetext" : "<boolean>" + "typetext" : "<boolean>"
+ }, + },
+ "freenas_apiv4_host" : {
+ "description" : "FreeNAS API Host via IPv4",
+ "format" : "address",
+ "optional" : 1,
+ "type" : "string",
+ "typetext" : "<string>"
},
"content" : { "content" : {
"description" : "Allowed content types.\n\nNOTE: the value 'rootdir' is used for Containers, and value 'images' for VMs.\n", "description" : "Allowed content types.\n\nNOTE: the value 'rootdir' is used for Containers, and value 'images' for VMs.\n",
"format" : "pve-storage-content-list",

View File

@ -1,5 +1,5 @@
--- pvemanagerlib.js 2018-07-10 08:46:32.000000000 -0400 --- pvemanagerlib.js.orig 2018-07-30 23:13:28.045035059 -0400
+++ pvemanagerlib.js.new 2018-07-30 22:19:23.207915760 -0400 +++ pvemanagerlib.js.new 2018-08-19 10:42:58.494724196 -0400
@@ -5379,6 +5379,7 @@ @@ -5379,6 +5379,7 @@
alias: ['widget.pveiScsiProviderSelector'], alias: ['widget.pveiScsiProviderSelector'],
comboItems: [ comboItems: [
@ -8,10 +8,19 @@
[ 'istgt', 'istgt'], [ 'istgt', 'istgt'],
[ 'iet', 'IET'] [ 'iet', 'IET']
] ]
@@ -27361,6 +27362,30 @@ @@ -27361,7 +27362,23 @@
value: '', value: '',
fieldLabel: gettext('Target group'), fieldLabel: gettext('Target group'),
allowBlank: true allowBlank: true
- }
+ },
+ {
+ xtype: 'proxmoxcheckbox',
+ name: 'freenas_use_ssl',
+ checked: false,
+ uncheckedValue: 0,
+ hidden: me.iscsiprovider !== "freenas",
+ fieldLabel: gettext('FreeNAS API use SSL')
+ }, + },
+ { + {
+ xtype: me.isCreate ? 'textfield' : 'displayfield', + xtype: me.isCreate ? 'textfield' : 'displayfield',
@ -21,25 +30,10 @@
+ fieldLabel: gettext('FreeNAS User'), + fieldLabel: gettext('FreeNAS User'),
+ allowBlank: true + allowBlank: true
+ }, + },
+ {
+ xtype: me.isCreate ? 'textfield' : 'displayfield',
+ name: 'freenas_password',
+ value: '',
+ hidden: me.iscsiprovider !== "freenas",
+ fieldLabel: gettext('FreeNAS Password'),
+ allowBlank: true
+ },
+ {
+ xtype: 'proxmoxcheckbox',
+ name: 'freenas_use_ssl',
+ checked: false,
+ uncheckedValue: 0,
+ hidden: me.iscsiprovider !== "freenas",
+ fieldLabel: gettext('FreeNAS API use SSL')
}
]; ];
@@ -27370,7 +27395,23 @@ me.column2 = [
@@ -27370,7 +27387,26 @@
name: 'iscsiprovider', name: 'iscsiprovider',
value: 'comstar', value: 'comstar',
fieldLabel: gettext('iSCSI Provider'), fieldLabel: gettext('iSCSI Provider'),
@ -48,19 +42,45 @@
+ listeners: { + listeners: {
+ change: function(f, value) { + change: function(f, value) {
+ if (value === "freenas") { + if (value === "freenas") {
+ me.down('field[name=freenas_use_ssl]').setHidden(false);
+ me.down('field[name=freenas_apiv4_host]').setHidden(false);
+ me.down('field[name=freenas_user]').setHidden(false); + me.down('field[name=freenas_user]').setHidden(false);
+ me.down('field[name=freenas_password]').setHidden(false); + me.down('field[name=freenas_password]').setHidden(false);
+ me.down('field[name=freenas_use_ssl]').setHidden(false);
+ } else { + } else {
+ me.down('field[name=freenas_use_ssl]').setHidden(true);
+ me.down('field[name=freenas_use_ssl]').setValue(false);
+ me.down('field[name=freenas_apiv4_host]').setHidden(true);
+ me.down('field[name=freenas_apiv4_host]').setValue(false);
+ me.down('field[name=freenas_user]').setHidden(true); + me.down('field[name=freenas_user]').setHidden(true);
+ me.down('field[name=freenas_user]').setValue(''); + me.down('field[name=freenas_user]').setValue('');
+ me.down('field[name=freenas_password]').setHidden(true); + me.down('field[name=freenas_password]').setHidden(true);
+ me.down('field[name=freenas_password]').setValue(''); + me.down('field[name=freenas_password]').setValue('');
+ me.down('field[name=freenas_use_ssl]').setHidden(true);
+ me.down('field[name=freenas_use_ssl]').setValue(false);
+ } + }
+ } + }
+ } + }
}, },
{ {
xtype: 'proxmoxcheckbox', xtype: 'proxmoxcheckbox',
@@ -27392,6 +27428,22 @@
value: '',
fieldLabel: gettext('Host group'),
allowBlank: true
+ },
+ {
+ xtype: me.isCreate ? 'textfield' : 'displayfield',
+ name: 'freenas_apiv4_host',
+ value: '',
+ hidden: me.iscsiprovider !== "freenas",
+ fieldLabel: gettext('API IPv4 Host'),
+ allowBlank: true
+ },
+ {
+ xtype: me.isCreate ? 'textfield' : 'displayfield',
+ name: 'freenas_password',
+ value: '',
+ hidden: me.iscsiprovider !== "freenas",
+ fieldLabel: gettext('FreeNAS Password'),
+ allowBlank: true
}
];