diff --git a/server/src/uds/REST/methods/services_pools.py b/server/src/uds/REST/methods/services_pools.py index 8de6bf355..fe12887f4 100644 --- a/server/src/uds/REST/methods/services_pools.py +++ b/server/src/uds/REST/methods/services_pools.py @@ -152,6 +152,7 @@ class ServicesPools(ModelHandler): 'tooltip': ugettext('Image assocciated with this service'), 'type': gui.InputField.IMAGECHOICE_TYPE, 'order': 102, + 'tab': ugettext('Display'), }, { 'name': 'servicesPoolGroup_id', 'values': [gui.choiceImage(-1, _('Default'), DEFAULT_THUMB_BASE64)] + gui.sortedChoices([gui.choiceImage(v.uuid, v.name, v.image.thumb64) for v in ServicesPoolGroup.objects.all()]), @@ -159,6 +160,7 @@ class ServicesPools(ModelHandler): 'tooltip': ugettext('Pool group for this pool (for pool clasify on display)'), 'type': gui.InputField.IMAGECHOICE_TYPE, 'order': 103, + 'tab': ugettext('Display'), }, { 'name': 'initial_srvs', 'value': '0', @@ -167,6 +169,7 @@ class ServicesPools(ModelHandler): 'tooltip': ugettext('Services created initially for this service pool'), 'type': gui.InputField.NUMERIC_TYPE, 'order': 110, + 'tab': ugettext('Availability'), }, { 'name': 'cache_l1_srvs', 'value': '0', @@ -175,6 +178,7 @@ class ServicesPools(ModelHandler): 'tooltip': ugettext('Services kept in cache for improved user service assignation'), 'type': gui.InputField.NUMERIC_TYPE, 'order': 111, + 'tab': ugettext('Availability'), }, { 'name': 'cache_l2_srvs', 'value': '0', @@ -183,6 +187,7 @@ class ServicesPools(ModelHandler): 'tooltip': ugettext('Services kept in cache of level2 for improved service generation'), 'type': gui.InputField.NUMERIC_TYPE, 'order': 112, + 'tab': ugettext('Availability'), }, { 'name': 'max_srvs', 'value': '0', @@ -191,6 +196,7 @@ class ServicesPools(ModelHandler): 'tooltip': ugettext('Maximum number of service (assigned and L1 cache) that can be created for this service'), 'type': gui.InputField.NUMERIC_TYPE, 'order': 113, + 'tab': ugettext('Availability'), }, { 'name': 'show_transports', 'value': True, diff --git a/server/src/uds/REST/model.py b/server/src/uds/REST/model.py index bd07607dc..5df223afc 100644 --- a/server/src/uds/REST/model.py +++ b/server/src/uds/REST/model.py @@ -54,7 +54,7 @@ import logging logger = logging.getLogger(__name__) -__updated__ = '2016-03-09' +__updated__ = '2016-04-18' # a few constants @@ -88,7 +88,7 @@ class BaseModelHandler(Handler): :param gui: List of "gui" items where the field will be added :param field: Field to be added (dictionary) ''' - gui.append({ + v = { 'name': field.get('name', ''), 'value': '', 'gui': { @@ -105,7 +105,10 @@ class BaseModelHandler(Handler): 'order': field.get('order', 0), 'values': field.get('values', []) } - }) + } + if 'tab' in field: + v['gui']['tab'] = field['tab'] + gui.append(v) return gui def addDefaultFields(self, gui, flds): diff --git a/server/src/uds/auths/IP/Authenticator.py b/server/src/uds/auths/IP/Authenticator.py index b6760e9e5..d269f0c99 100644 --- a/server/src/uds/auths/IP/Authenticator.py +++ b/server/src/uds/auths/IP/Authenticator.py @@ -43,13 +43,13 @@ from uds.core.ui.UserInterface import gui import logging -__updated__ = '2015-01-21' +__updated__ = '2016-04-18' logger = logging.getLogger(__name__) class IPAuth(Authenticator): - acceptProxy = gui.CheckBoxField(label=_('Accept proxy'), order=3, tooltip=_('If checked, requests via proxy will get FORWARDED ip address (take care with this bein checked, can take internal IP addresses from internet)')) + acceptProxy = gui.CheckBoxField(label=_('Accept proxy'), order=3, tooltip=_('If checked, requests via proxy will get FORWARDED ip address (take care with this bein checked, can take internal IP addresses from internet)'), tab=gui.ADVANCED_TAB) typeName = _('IP Authenticator') typeType = 'IPAuth' diff --git a/server/src/uds/auths/InternalDB/Authenticator.py b/server/src/uds/auths/InternalDB/Authenticator.py index d71970245..0ecfb24a9 100644 --- a/server/src/uds/auths/InternalDB/Authenticator.py +++ b/server/src/uds/auths/InternalDB/Authenticator.py @@ -43,7 +43,7 @@ from uds.core.util.State import State import dns import logging -__updated__ = '2015-02-02' +__updated__ = '2016-04-18' logger = logging.getLogger(__name__) @@ -60,8 +60,8 @@ class InternalDBAuth(Authenticator): # This is the only internal source isExternalSource = False - differentForEachHost = gui.CheckBoxField(label=_('Different user for each host'), order=1, tooltip=_('If checked, each host will have a different user name'), defvalue="false", rdonly=True) - reverseDns = gui.CheckBoxField(label=_('Reverse DNS'), order=2, tooltip=_('If checked, the host will be reversed dns'), defvalue="false", rdonly=True) + differentForEachHost = gui.CheckBoxField(label=_('Different user for each host'), order=1, tooltip=_('If checked, each host will have a different user name'), defvalue="false", rdonly=True, tab=gui.ADVANCED_TAB) + reverseDns = gui.CheckBoxField(label=_('Reverse DNS'), order=2, tooltip=_('If checked, the host will be reversed dns'), defvalue="false", rdonly=True, tab=gui.ADVANCED_TAB) def initialize(self, values): if values is None: diff --git a/server/src/uds/auths/RegexLdap/Authenticator.py b/server/src/uds/auths/RegexLdap/Authenticator.py index cb50168d1..36558ca89 100644 --- a/server/src/uds/auths/RegexLdap/Authenticator.py +++ b/server/src/uds/auths/RegexLdap/Authenticator.py @@ -44,7 +44,7 @@ import ldap.filter import re import logging -__updated__ = '2015-02-02' +__updated__ = '2016-04-18' logger = logging.getLogger(__name__) @@ -56,14 +56,15 @@ class RegexLdap(auths.Authenticator): host = gui.TextField(length=64, label=_('Host'), order=1, tooltip=_('Ldap Server Host'), required=True) port = gui.NumericField(length=5, label=_('Port'), defvalue='389', order=2, tooltip=_('Ldap port (usually 389 for non ssl and 636 for ssl)'), required=True) ssl = gui.CheckBoxField(label=_('Use SSL'), order=3, tooltip=_('If checked, the connection will be ssl, using port 636 instead of 389')) - username = gui.TextField(length=64, label=_('Ldap User'), order=4, tooltip=_('Username with read privileges on the base selected'), required=True) - password = gui.PasswordField(lenth=32, label=_('Password'), order=5, tooltip=_('Password of the ldap user'), required=True) + username = gui.TextField(length=64, label=_('User'), order=4, tooltip=_('Username with read privileges on the base selected'), required=True, tab=gui.CREDENTIALS_TAB) + password = gui.PasswordField(lenth=32, label=_('Password'), order=5, tooltip=_('Password of the ldap user'), required=True, tab=gui.CREDENTIALS_TAB) timeout = gui.NumericField(length=3, label=_('Timeout'), defvalue='10', order=6, tooltip=_('Timeout in seconds of connection to LDAP'), required=True, minValue=1) - ldapBase = gui.TextField(length=64, label=_('Base'), order=7, tooltip=_('Common search base (used for "users" and "groups")'), required=True) - userClass = gui.TextField(length=64, label=_('User class'), defvalue='posixAccount', order=8, tooltip=_('Class for LDAP users (normally posixAccount)'), required=True) - userIdAttr = gui.TextField(length=64, label=_('User Id Attr'), defvalue='uid', order=9, tooltip=_('Attribute that contains the user id'), required=True) - userNameAttr = gui.TextField(length=640, label=_('User Name Attr'), multiline=2, defvalue='uid', order=10, tooltip=_('Attributes that contains the user name (list of comma separated values)'), required=True) - groupNameAttr = gui.TextField(length=640, label=_('Group Name Attr'), multiline=2, defvalue='cn', order=11, tooltip=_('Attribute that contains the group name'), required=True) + + ldapBase = gui.TextField(length=64, label=_('Base'), order=7, tooltip=_('Common search base (used for "users" and "groups")'), required=True, tab=_('Ldap info')) + userClass = gui.TextField(length=64, label=_('User class'), defvalue='posixAccount', order=8, tooltip=_('Class for LDAP users (normally posixAccount)'), required=True, tab=_('Ldap info')) + userIdAttr = gui.TextField(length=64, label=_('User Id Attr'), defvalue='uid', order=9, tooltip=_('Attribute that contains the user id'), required=True, tab=_('Ldap info')) + userNameAttr = gui.TextField(length=640, label=_('User Name Attr'), multiline=2, defvalue='uid', order=10, tooltip=_('Attributes that contains the user name (list of comma separated values)'), required=True, tab=_('Ldap info')) + groupNameAttr = gui.TextField(length=640, label=_('Group Name Attr'), multiline=2, defvalue='cn', order=11, tooltip=_('Attribute that contains the group name'), required=True, tab=_('Ldap info')) # regex = gui.TextField(length=64, label = _('Regular Exp. for groups'), defvalue = '^(.*)', order = 12, tooltip = _('Regular Expression to extract the group name'), required = True) typeName = _('Regex LDAP Authenticator') diff --git a/server/src/uds/auths/SimpleLDAP/Authenticator.py b/server/src/uds/auths/SimpleLDAP/Authenticator.py index 1cedea655..2102ab883 100644 --- a/server/src/uds/auths/SimpleLDAP/Authenticator.py +++ b/server/src/uds/auths/SimpleLDAP/Authenticator.py @@ -45,7 +45,7 @@ import ldap import logging import six -__updated__ = '2015-02-02' +__updated__ = '2016-04-18' logger = logging.getLogger(__name__) @@ -57,16 +57,16 @@ class SimpleLDAPAuthenticator(Authenticator): host = gui.TextField(length=64, label=_('Host'), order=1, tooltip=_('Ldap Server IP or Hostname'), required=True) port = gui.NumericField(length=5, label=_('Port'), defvalue='389', order=2, tooltip=_('Ldap port (usually 389 for non ssl and 636 for ssl)'), required=True) ssl = gui.CheckBoxField(label=_('Use SSL'), order=3, tooltip=_('If checked, the connection will be ssl, using port 636 instead of 389')) - username = gui.TextField(length=64, label=_('Ldap User'), order=4, tooltip=_('Username with read privileges on the base selected'), required=True) - password = gui.PasswordField(lenth=32, label=_('Password'), order=5, tooltip=_('Password of the ldap user'), required=True) + username = gui.TextField(length=64, label=_('Ldap User'), order=4, tooltip=_('Username with read privileges on the base selected'), required=True, tab=gui.CREDENTIALS_TAB) + password = gui.PasswordField(lenth=32, label=_('Password'), order=5, tooltip=_('Password of the ldap user'), required=True, tab=gui.CREDENTIALS_TAB) timeout = gui.NumericField(length=3, label=_('Timeout'), defvalue='10', order=6, tooltip=_('Timeout in seconds of connection to LDAP'), required=True, minValue=1) - ldapBase = gui.TextField(length=64, label=_('Base'), order=7, tooltip=_('Common search base (used for "users" and "groups")'), required=True) - userClass = gui.TextField(length=64, label=_('User class'), defvalue='posixAccount', order=8, tooltip=_('Class for LDAP users (normally posixAccount)'), required=True) - userIdAttr = gui.TextField(length=64, label=_('User Id Attr'), defvalue='uid', order=9, tooltip=_('Attribute that contains the user id'), required=True) - userNameAttr = gui.TextField(length=64, label=_('User Name Attr'), defvalue='uid', order=10, tooltip=_('Attributes that contains the user name (list of comma separated values)'), required=True) - groupClass = gui.TextField(length=64, label=_('Group class'), defvalue='posixGroup', order=11, tooltip=_('Class for LDAP groups (normally poxisGroup)'), required=True) - groupIdAttr = gui.TextField(length=64, label=_('Group Id Attr'), defvalue='cn', order=12, tooltip=_('Attribute that contains the group id'), required=True) - memberAttr = gui.TextField(length=64, label=_('Group membership attr'), defvalue='memberUid', order=13, tooltip=_('Attribute of the group that contains the users belonging to it'), required=True) + ldapBase = gui.TextField(length=64, label=_('Base'), order=7, tooltip=_('Common search base (used for "users" and "groups")'), required=True, tab=_('Ldap info')) + userClass = gui.TextField(length=64, label=_('User class'), defvalue='posixAccount', order=8, tooltip=_('Class for LDAP users (normally posixAccount)'), required=True, tab=_('Ldap info')) + userIdAttr = gui.TextField(length=64, label=_('User Id Attr'), defvalue='uid', order=9, tooltip=_('Attribute that contains the user id'), required=True, tab=_('Ldap info')) + userNameAttr = gui.TextField(length=64, label=_('User Name Attr'), defvalue='uid', order=10, tooltip=_('Attributes that contains the user name (list of comma separated values)'), required=True, tab=_('Ldap info')) + groupClass = gui.TextField(length=64, label=_('Group class'), defvalue='posixGroup', order=11, tooltip=_('Class for LDAP groups (normally poxisGroup)'), required=True, tab=_('Ldap info')) + groupIdAttr = gui.TextField(length=64, label=_('Group Id Attr'), defvalue='cn', order=12, tooltip=_('Attribute that contains the group id'), required=True, tab=_('Ldap info')) + memberAttr = gui.TextField(length=64, label=_('Group membership attr'), defvalue='memberUid', order=13, tooltip=_('Attribute of the group that contains the users belonging to it'), required=True, tab=_('Ldap info')) typeName = _('SimpleLDAP Authenticator') typeType = 'SimpleLdapAuthenticator' diff --git a/server/src/uds/core/ui/UserInterface.py b/server/src/uds/core/ui/UserInterface.py index 2eb687e87..1715df42d 100644 --- a/server/src/uds/core/ui/UserInterface.py +++ b/server/src/uds/core/ui/UserInterface.py @@ -84,6 +84,9 @@ class gui(object): # : String for advanced tabs ADVANCED_TAB = ugettext_noop('Advanced') + PARAMETERS_TAB = ugettext_noop('Parameters') + CREDENTIALS_TAB = ugettext_noop('Credentials') + TUNNEL_TAB = ugettext_noop('Tunnel') # : Static Callbacks simple registry callbacks = {} diff --git a/server/src/uds/services/OVirt/OVirtProvider.py b/server/src/uds/services/OVirt/OVirtProvider.py index 4afce0afd..184547a8b 100644 --- a/server/src/uds/services/OVirt/OVirtProvider.py +++ b/server/src/uds/services/OVirt/OVirtProvider.py @@ -45,7 +45,7 @@ from .client import oVirtClient import logging -__updated__ = '2016-04-07' +__updated__ = '2016-04-18' logger = logging.getLogger(__name__) @@ -97,12 +97,12 @@ class Provider(ServiceProvider): username = gui.TextField(length=32, label=_('Username'), order=3, tooltip=_('User with valid privileges on oVirt, (use "user@domain" form)'), required=True, defvalue='admin@internal') password = gui.PasswordField(lenth=32, label=_('Password'), order=4, tooltip=_('Password of the user of oVirt'), required=True) - maxPreparingServices = gui.NumericField(length=3, label=_('Creation concurrency'), defvalue='10', minValue=1, maxValue=65536, order=50, tooltip=_('Maximum number of concurrently removing VMs'), required=True) - maxRemovingServices = gui.NumericField(length=3, label=_('Removal concurrency'), defvalue='5', minValue=1, maxValue=65536, order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True) + maxPreparingServices = gui.NumericField(length=3, label=_('Creation concurrency'), defvalue='10', minValue=1, maxValue=65536, order=50, tooltip=_('Maximum number of concurrently removing VMs'), required=True, tab=gui.ADVANCED_TAB) + maxRemovingServices = gui.NumericField(length=3, label=_('Removal concurrency'), defvalue='5', minValue=1, maxValue=65536, order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True, tab=gui.ADVANCED_TAB) - timeout = gui.NumericField(length=3, label=_('Timeout'), defvalue='10', order=90, tooltip=_('Timeout in seconds of connection to oVirt'), required=True) + timeout = gui.NumericField(length=3, label=_('Timeout'), defvalue='10', order=90, tooltip=_('Timeout in seconds of connection to oVirt'), required=True, tab=gui.ADVANCED_TAB) macsRange = gui.TextField(length=36, label=_('Macs range'), defvalue='52:54:00:00:00:00-52:54:00:FF:FF:FF', order=91, rdonly=True, - tooltip=_('Range of valid macs for UDS managed machines'), required=True) + tooltip=_('Range of valid macs for UDS managed machines'), required=True, tab=gui.ADVANCED_TAB) # Own variables _api = None diff --git a/server/src/uds/services/OpenNebula/Provider.py b/server/src/uds/services/OpenNebula/Provider.py index 28ab6c19e..f01e3dc01 100644 --- a/server/src/uds/services/OpenNebula/Provider.py +++ b/server/src/uds/services/OpenNebula/Provider.py @@ -50,7 +50,7 @@ import six # Python bindings for OpenNebula import oca -__updated__ = '2016-04-07' +__updated__ = '2016-04-18' logger = logging.getLogger(__name__) @@ -101,10 +101,10 @@ class Provider(ServiceProvider): username = gui.TextField(length=32, label=_('Username'), order=4, tooltip=_('User with valid privileges on OpenNebula'), required=True, defvalue='oneadmin') password = gui.PasswordField(lenth=32, label=_('Password'), order=5, tooltip=_('Password of the user of OpenNebula'), required=True) - maxPreparingServices = gui.NumericField(length=3, label=_('Creation concurrency'), defvalue='10', minValue=1, maxValue=65536, order=50, tooltip=_('Maximum number of concurrently removing VMs'), required=True) - maxRemovingServices = gui.NumericField(length=3, label=_('Removal concurrency'), defvalue='5', minValue=1, maxValue=65536, order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True) + maxPreparingServices = gui.NumericField(length=3, label=_('Creation concurrency'), defvalue='10', minValue=1, maxValue=65536, order=50, tooltip=_('Maximum number of concurrently removing VMs'), required=True, tab=gui.ADVANCED_TAB) + maxRemovingServices = gui.NumericField(length=3, label=_('Removal concurrency'), defvalue='5', minValue=1, maxValue=65536, order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True, tab=gui.ADVANCED_TAB) - timeout = gui.NumericField(length=3, label=_('Timeout'), defvalue='10', order=90, tooltip=_('Timeout in seconds of connection to OpenNebula'), required=True) + timeout = gui.NumericField(length=3, label=_('Timeout'), defvalue='10', order=90, tooltip=_('Timeout in seconds of connection to OpenNebula'), required=True, tab=gui.ADVANCED_TAB) # Own variables _api = None diff --git a/server/src/uds/services/OpenStack/LiveService.py b/server/src/uds/services/OpenStack/LiveService.py index 6b84be999..e1e5684bb 100644 --- a/server/src/uds/services/OpenStack/LiveService.py +++ b/server/src/uds/services/OpenStack/LiveService.py @@ -42,7 +42,7 @@ from uds.core.ui import gui import six import logging -__updated__ = '2016-03-09' +__updated__ = '2016-04-18' logger = logging.getLogger(__name__) @@ -113,19 +113,20 @@ class LiveService(Service): }, tooltip=_('Service availability zones'), required=True, rdonly=True ) - volume = gui.ChoiceField(label=_('Volume'), order=4, tooltip=_('Base volume for service (restricted by availability zone)'), required=True) + volume = gui.ChoiceField(label=_('Volume'), order=4, tooltip=_('Base volume for service (restricted by availability zone)'), required=True, tab=_('Machine')) # volumeType = gui.ChoiceField(label=_('Volume Type'), order=5, tooltip=_('Volume type for service'), required=True) - network = gui.ChoiceField(label=_('Network'), order=6, tooltip=_('Network to attach to this service'), required=True) - flavor = gui.ChoiceField(label=_('Flavor'), order=7, tooltip=_('Flavor for service'), required=True) + network = gui.ChoiceField(label=_('Network'), order=6, tooltip=_('Network to attach to this service'), required=True, tab=_('Machine')) + flavor = gui.ChoiceField(label=_('Flavor'), order=7, tooltip=_('Flavor for service'), required=True, tab=_('Machine')) - securityGroups = gui.MultiChoiceField(label=_('Security Groups'), order=8, tooltip=_('Service security groups'), required=True) + securityGroups = gui.MultiChoiceField(label=_('Security Groups'), order=8, tooltip=_('Service security groups'), required=True, tab=_('Machine')) baseName = gui.TextField( label=_('Machine Names'), rdonly=False, order=9, tooltip=_('Base name for clones from this machine'), - required=True + required=True, + tab=_('Machine') ) lenName = gui.NumericField( @@ -134,7 +135,8 @@ class LiveService(Service): defvalue=5, order=10, tooltip=_('Size of numeric part for the names of these machines (between 3 and 6)'), - required=True + required=True, + tab=_('Machine') ) ov = gui.HiddenField(value=None) diff --git a/server/src/uds/services/OpenStack/Provider.py b/server/src/uds/services/OpenStack/Provider.py index 89fc72e49..e39f4711c 100644 --- a/server/src/uds/services/OpenStack/Provider.py +++ b/server/src/uds/services/OpenStack/Provider.py @@ -44,7 +44,7 @@ from . import openStack import logging -__updated__ = '2016-04-07' +__updated__ = '2016-04-18' logger = logging.getLogger(__name__) @@ -105,10 +105,10 @@ class Provider(ServiceProvider): username = gui.TextField(length=64, label=_('Username'), order=9, tooltip=_('User with valid privileges on OpenStack'), required=True, defvalue='admin') password = gui.PasswordField(lenth=32, label=_('Password'), order=10, tooltip=_('Password of the user of OpenStack'), required=True) - maxPreparingServices = gui.NumericField(length=3, label=_('Creation concurrency'), defvalue='10', minValue=1, maxValue=65536, order=50, tooltip=_('Maximum number of concurrently removing VMs'), required=True) - maxRemovingServices = gui.NumericField(length=3, label=_('Removal concurrency'), defvalue='5', minValue=1, maxValue=65536, order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True) + maxPreparingServices = gui.NumericField(length=3, label=_('Creation concurrency'), defvalue='10', minValue=1, maxValue=65536, order=50, tooltip=_('Maximum number of concurrently removing VMs'), required=True, tab=gui.ADVANCED_TAB) + maxRemovingServices = gui.NumericField(length=3, label=_('Removal concurrency'), defvalue='5', minValue=1, maxValue=65536, order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True, tab=gui.ADVANCED_TAB) - timeout = gui.NumericField(length=3, label=_('Timeout'), defvalue='10', minValue=1, maxValue=128, order=99, tooltip=_('Timeout in seconds of connection to OpenStack'), required=True) + timeout = gui.NumericField(length=3, label=_('Timeout'), defvalue='10', minValue=1, maxValue=128, order=99, tooltip=_('Timeout in seconds of connection to OpenStack'), required=True, tab=gui.ADVANCED_TAB) # tenant = gui.TextField(length=64, label=_('Project'), order=6, tooltip=_('Project (tenant) for this provider'), required=True, defvalue='') diff --git a/server/src/uds/services/Xen/XenProvider.py b/server/src/uds/services/Xen/XenProvider.py index f23b0f3dc..a032a8def 100644 --- a/server/src/uds/services/Xen/XenProvider.py +++ b/server/src/uds/services/Xen/XenProvider.py @@ -48,7 +48,7 @@ import logging logger = logging.getLogger(__name__) -__updated__ = '2016-04-07' +__updated__ = '2016-04-18' CACHE_TIME_FOR_SERVER = 1800 @@ -99,13 +99,13 @@ class Provider(ServiceProvider): username = gui.TextField(length=32, label=_('Username'), order=2, tooltip=_('User with valid privileges on XenServer'), required=True, defvalue='root') password = gui.PasswordField(lenth=32, label=_('Password'), order=3, tooltip=_('Password of the user of XenServer'), required=True) - maxPreparingServices = gui.NumericField(length=3, label=_('Creation concurrency'), defvalue='10', minValue=1, maxValue=65536, order=50, tooltip=_('Maximum number of concurrently removing VMs'), required=True) - maxRemovingServices = gui.NumericField(length=3, label=_('Removal concurrency'), defvalue='5', minValue=1, maxValue=65536, order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True) + maxPreparingServices = gui.NumericField(length=3, label=_('Creation concurrency'), defvalue='10', minValue=1, maxValue=65536, order=50, tooltip=_('Maximum number of concurrently removing VMs'), required=True, tab=gui.ADVANCED_TAB) + maxRemovingServices = gui.NumericField(length=3, label=_('Removal concurrency'), defvalue='5', minValue=1, maxValue=65536, order=51, tooltip=_('Maximum number of concurrently removing VMs'), required=True, tab=gui.ADVANCED_TAB) macsRange = gui.TextField(length=36, label=_('Macs range'), defvalue='02:46:00:00:00:00-02:46:00:FF:FF:FF', order=90, rdonly=True, - tooltip=_('Range of valid macs for created machines'), required=True) + tooltip=_('Range of valid macs for created machines'), required=True, tab=gui.ADVANCED_TAB) verifySSL = gui.CheckBoxField(label=_('Verify Certificate'), order=91, - tooltip=_('If selected, certificate will be checked against system valid certificate providers'), required=True) + tooltip=_('If selected, certificate will be checked against system valid certificate providers'), required=True, tab=gui.ADVANCED_TAB) # XenServer engine, right now, only permits a connection to one server and only one per instance # If we want to connect to more than one server, we need keep locked access to api, change api server, etc.. diff --git a/server/src/uds/static/adm/js/gui-form.coffee b/server/src/uds/static/adm/js/gui-form.coffee index cff01fab5..1e9c12a5a 100644 --- a/server/src/uds/static/adm/js/gui-form.coffee +++ b/server/src/uds/static/adm/js/gui-form.coffee @@ -117,7 +117,7 @@ $.each fields.tabs, (index, tab) -> h = gui.forms.fieldsToHtml(tab.fields, item) tabsContent.push "
" + h.html + "
" - tabs.push "
  • " + tab.title + "
  • " + tabs.push "
  • " + tab.title + "
  • " active = "" fillers = fillers.concat(h.fillers) # Fillers (callback based) $.extend originalValues, h.originalValues # Original values @@ -269,16 +269,25 @@ # Validation - + firstErrorTab = null $form.validate - debug: true - ignore: ':hidden:not("select")' + debug: false + ignore: ':hidden:not("select"):not(".modal_field_data")' errorClass: "text-danger" validClass: "has-success" + focusInvalid: true highlight: (element) -> - $(element).closest(".form-group").addClass "has-error" + group = $(element).closest(".form-group") + group.addClass "has-error" + if firstErrorTab == null && group.parent().hasClass('tab-pane') + firstErrorTab = $("a[href='#" + group.parent().attr('id') + "']") + firstErrorTab.tab('show') return + showErrors: (errorMap, errorList) -> + firstErrorTab = null # Show errors is invoked before Hightlihg, that is isnoved from defaultShowErrors + this.defaultShowErrors() + success: (element) -> $(element).closest(".form-group").removeClass "has-error" $(element).remove() diff --git a/server/src/uds/templates/uds/admin/tmpl/fld/textbox.html b/server/src/uds/templates/uds/admin/tmpl/fld/textbox.html index 48d7f2946..9757f85ff 100644 --- a/server/src/uds/templates/uds/admin/tmpl/fld/textbox.html +++ b/server/src/uds/templates/uds/admin/tmpl/fld/textbox.html @@ -1,6 +1,6 @@ {% extends "uds/admin/tmpl/fld/form-group.html" %} {% block field %} {% verbatim %} - + {% endverbatim %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/server/src/uds/transports/HTML5RDP/HTML5RDP.py b/server/src/uds/transports/HTML5RDP/HTML5RDP.py index 4d48a6f97..e6a0a97ec 100644 --- a/server/src/uds/transports/HTML5RDP/HTML5RDP.py +++ b/server/src/uds/transports/HTML5RDP/HTML5RDP.py @@ -59,20 +59,20 @@ class HTML5RDPTransport(Transport): typeName = _('HTML5 RDP Transport') typeType = 'HTML5RDPTransport' typeDescription = _('RDP Transport using HTML5 client') - iconFile = 'rdp.png' + iconFile = 'html5.png' ownLink = True supportedOss = OsDetector.allOss protocol = protocols.RDP - guacamoleServer = gui.TextField(label=_('Tunnel Server'), order=1, tooltip=_('Host of the tunnel server (use http/https & port if needed) as accesible from users'), defvalue='https://', length=64, required=True) - useEmptyCreds = gui.CheckBoxField(label=_('Empty creds'), order=2, tooltip=_('If checked, the credentials used to connect will be emtpy')) - fixedName = gui.TextField(label=_('Username'), order=3, tooltip=_('If not empty, this username will be always used as credential')) - fixedPassword = gui.PasswordField(label=_('Password'), order=4, tooltip=_('If not empty, this password will be always used as credential')) - withoutDomain = gui.CheckBoxField(label=_('Without Domain'), order=5, tooltip=_('If checked, the domain part will always be emptied (to connecto to xrdp for example is needed)')) - fixedDomain = gui.TextField(label=_('Domain'), order=6, tooltip=_('If not empty, this domain will be always used as credential (used as DOMAIN\\user)')) - enableAudio = gui.CheckBoxField(label=_('Enable Audio'), order=7, tooltip=_('If checked, the audio will be redirected to client (if client browser supports it)')) - enablePrinting = gui.CheckBoxField(label=_('Enable Printing'), order=8, tooltip=_('If checked, the printing will be redirected to client (if client browser supports it)')) + guacamoleServer = gui.TextField(label=_('Tunnel Server'), order=1, tooltip=_('Host of the tunnel server (use http/https & port if needed) as accesible from users'), defvalue='https://', length=64, required=True, tab=gui.TUNNEL_TAB) + useEmptyCreds = gui.CheckBoxField(label=_('Empty creds'), order=2, tooltip=_('If checked, the credentials used to connect will be emtpy'), tab=gui.CREDENTIALS_TAB) + fixedName = gui.TextField(label=_('Username'), order=3, tooltip=_('If not empty, this username will be always used as credential'), tab=gui.CREDENTIALS_TAB) + fixedPassword = gui.PasswordField(label=_('Password'), order=4, tooltip=_('If not empty, this password will be always used as credential'), tab=gui.CREDENTIALS_TAB) + withoutDomain = gui.CheckBoxField(label=_('Without Domain'), order=5, tooltip=_('If checked, the domain part will always be emptied (to connecto to xrdp for example is needed)'), tab=gui.CREDENTIALS_TAB) + fixedDomain = gui.TextField(label=_('Domain'), order=6, tooltip=_('If not empty, this domain will be always used as credential (used as DOMAIN\\user)'), tab=gui.CREDENTIALS_TAB) + enableAudio = gui.CheckBoxField(label=_('Enable Audio'), order=7, tooltip=_('If checked, the audio will be redirected to client (if client browser supports it)'), tab=gui.PARAMETERS_TAB) + enablePrinting = gui.CheckBoxField(label=_('Enable Printing'), order=8, tooltip=_('If checked, the printing will be redirected to client (if client browser supports it)'), tab=gui.PARAMETERS_TAB) def initialize(self, values): if values is None: diff --git a/server/src/uds/transports/HTML5RDP/html5.png b/server/src/uds/transports/HTML5RDP/html5.png new file mode 100644 index 000000000..e34419263 Binary files /dev/null and b/server/src/uds/transports/HTML5RDP/html5.png differ diff --git a/server/src/uds/transports/HTML5RDP/rdp.png b/server/src/uds/transports/HTML5RDP/rdp.png deleted file mode 100644 index 5457e4105..000000000 Binary files a/server/src/uds/transports/HTML5RDP/rdp.png and /dev/null differ diff --git a/server/src/uds/transports/NX/NXTransport.py b/server/src/uds/transports/NX/NXTransport.py index 0c2904ad7..6925f2274 100644 --- a/server/src/uds/transports/NX/NXTransport.py +++ b/server/src/uds/transports/NX/NXTransport.py @@ -62,9 +62,9 @@ class NXTransport(Transport): needsJava = True # If this transport needs java for rendering protocol = protocols.NX - useEmptyCreds = gui.CheckBoxField(label=_('Empty creds'), order=1, tooltip=_('If checked, the credentials used to connect will be emtpy')) - fixedName = gui.TextField(label=_('Username'), order=2, tooltip=_('If not empty, this username will be always used as credential')) - fixedPassword = gui.PasswordField(label=_('Password'), order=3, tooltip=_('If not empty, this password will be always used as credential')) + useEmptyCreds = gui.CheckBoxField(label=_('Empty creds'), order=1, tooltip=_('If checked, the credentials used to connect will be emtpy'), tab=gui.CREDENTIALS_TAB) + fixedName = gui.TextField(label=_('Username'), order=2, tooltip=_('If not empty, this username will be always used as credential'), tab=gui.CREDENTIALS_TAB) + fixedPassword = gui.PasswordField(label=_('Password'), order=3, tooltip=_('If not empty, this password will be always used as credential'), tab=gui.CREDENTIALS_TAB) listenPort = gui.NumericField(label=_('Listening port'), length=5, order=4, tooltip=_('Listening port of NX (ssh) at client machine'), defvalue='22') connection = gui.ChoiceField(label=_('Connection'), order=6, tooltip=_('Connection speed for this transport (quality)'), values=[ @@ -73,13 +73,13 @@ class NXTransport(Transport): {'id': 'adsl', 'text': 'adsl'}, {'id': 'wan', 'text': 'wan'}, {'id': 'lan', 'text': 'lan'} - ]) + ], tab=gui.PARAMETERS_TAB) session = gui.ChoiceField(label=_('Session'), order=7, tooltip=_('Desktop session'), values=[ {'id': 'gnome', 'text': 'gnome'}, {'id': 'kde', 'text': 'kde'}, {'id': 'cde', 'text': 'cde'}, - ]) + ], tab=gui.PARAMETERS_TAB) cacheDisk = gui.ChoiceField(label=_('Disk Cache'), order=8, tooltip=_('Cache size en Mb stored at disk'), values=[ {'id': '0', 'text': '0 Mb'}, @@ -88,7 +88,7 @@ class NXTransport(Transport): {'id': '128', 'text': '128 Mb'}, {'id': '256', 'text': '256 Mb'}, {'id': '512', 'text': '512 Mb'}, - ]) + ], tab=gui.PARAMETERS_TAB) cacheMem = gui.ChoiceField(label=_('Memory Cache'), order=9, tooltip=_('Cache size en Mb kept at memory'), values=[ {'id': '4', 'text': '4 Mb'}, @@ -97,7 +97,7 @@ class NXTransport(Transport): {'id': '32', 'text': '32 Mb'}, {'id': '64', 'text': '64 Mb'}, {'id': '128', 'text': '128 Mb'}, - ]) + ], tab=gui.PARAMETERS_TAB) def __init__(self, environment, values=None): super(NXTransport, self).__init__(environment, values) diff --git a/server/src/uds/transports/NX/TSNXTransport.py b/server/src/uds/transports/NX/TSNXTransport.py index 302a907e2..147465526 100644 --- a/server/src/uds/transports/NX/TSNXTransport.py +++ b/server/src/uds/transports/NX/TSNXTransport.py @@ -66,12 +66,12 @@ class TSNXTransport(Transport): needsJava = True # If this transport needs java for rendering protocol = protocols.NX - tunnelServer = gui.TextField(label=_('Tunnel server'), order=1, tooltip=_('IP or Hostname of tunnel server sent to client device ("public" ip) and port. (use HOST:PORT format)')) - tunnelCheckServer = gui.TextField(label=_('Tunnel host check'), order=2, tooltip=_('If not empty, this server will be used to check if service is running before assigning it to user. (use HOST:PORT format)')) + tunnelServer = gui.TextField(label=_('Tunnel server'), order=1, tooltip=_('IP or Hostname of tunnel server sent to client device ("public" ip) and port. (use HOST:PORT format)'), tab=gui.TUNNEL_TAB) + tunnelCheckServer = gui.TextField(label=_('Tunnel host check'), order=2, tooltip=_('If not empty, this server will be used to check if service is running before assigning it to user. (use HOST:PORT format)'), tab=gui.TUNNEL_TAB) - useEmptyCreds = gui.CheckBoxField(label=_('Empty creds'), order=3, tooltip=_('If checked, the credentials used to connect will be emtpy')) - fixedName = gui.TextField(label=_('Username'), order=4, tooltip=_('If not empty, this username will be always used as credential')) - fixedPassword = gui.PasswordField(label=_('Password'), order=5, tooltip=_('If not empty, this password will be always used as credential')) + useEmptyCreds = gui.CheckBoxField(label=_('Empty creds'), order=3, tooltip=_('If checked, the credentials used to connect will be emtpy'), tab=gui.CREDENTIALS_TAB) + fixedName = gui.TextField(label=_('Username'), order=4, tooltip=_('If not empty, this username will be always used as credential'), tab=gui.CREDENTIALS_TAB) + fixedPassword = gui.PasswordField(label=_('Password'), order=5, tooltip=_('If not empty, this password will be always used as credential'), tab=gui.CREDENTIALS_TAB) listenPort = gui.NumericField(label=_('Listening port'), length=5, order=6, tooltip=_('Listening port of NX (ssh) at client machine'), defvalue='22') connection = gui.ChoiceField(label=_('Connection'), order=7, tooltip=_('Connection speed for this transport (quality)'), values=[ @@ -80,13 +80,13 @@ class TSNXTransport(Transport): {'id': 'adsl', 'text': 'adsl'}, {'id': 'wan', 'text': 'wan'}, {'id': 'lan', 'text': 'lan'}, - ]) + ], tab=gui.PARAMETERS_TAB) session = gui.ChoiceField(label=_('Session'), order=8, tooltip=_('Desktop session'), values=[ {'id': 'gnome', 'text': 'gnome'}, {'id': 'kde', 'text': 'kde'}, {'id': 'cde', 'text': 'cde'}, - ]) + ], tab=gui.PARAMETERS_TAB) cacheDisk = gui.ChoiceField(label=_('Disk Cache'), order=9, tooltip=_('Cache size en Mb stored at disk'), values=[ {'id': '0', 'text': '0 Mb'}, @@ -95,7 +95,7 @@ class TSNXTransport(Transport): {'id': '128', 'text': '128 Mb'}, {'id': '256', 'text': '256 Mb'}, {'id': '512', 'text': '512 Mb'}, - ]) + ], tab=gui.PARAMETERS_TAB) cacheMem = gui.ChoiceField(label=_('Memory Cache'), order=10, tooltip=_('Cache size en Mb kept at memory'), values=[ {'id': '4', 'text': '4 Mb'}, @@ -104,7 +104,7 @@ class TSNXTransport(Transport): {'id': '32', 'text': '32 Mb'}, {'id': '64', 'text': '64 Mb'}, {'id': '128', 'text': '128 Mb'}, - ]) + ], tab=gui.PARAMETERS_TAB) def __init__(self, environment, values=None): super(TSNXTransport, self).__init__(environment, values) diff --git a/server/src/uds/transports/RDP/BaseRDPTransport.py b/server/src/uds/transports/RDP/BaseRDPTransport.py index 4cfce2fae..7b1cf6227 100644 --- a/server/src/uds/transports/RDP/BaseRDPTransport.py +++ b/server/src/uds/transports/RDP/BaseRDPTransport.py @@ -42,7 +42,7 @@ from uds.core.util import connection import logging import os -__updated__ = '2016-04-07' +__updated__ = '2016-04-18' logger = logging.getLogger(__name__) @@ -58,18 +58,18 @@ class BaseRDPTransport(Transport): iconFile = 'rdp.png' protocol = protocols.RDP - useEmptyCreds = gui.CheckBoxField(label=_('Empty creds'), order=11, tooltip=_('If checked, the credentials used to connect will be emtpy')) - fixedName = gui.TextField(label=_('Username'), order=12, tooltip=_('If not empty, this username will be always used as credential')) - fixedPassword = gui.PasswordField(label=_('Password'), order=13, tooltip=_('If not empty, this password will be always used as credential')) - withoutDomain = gui.CheckBoxField(label=_('Without Domain'), order=14, tooltip=_('If checked, the domain part will always be emptied (to connecto to xrdp for example is needed)')) - fixedDomain = gui.TextField(label=_('Domain'), order=15, tooltip=_('If not empty, this domain will be always used as credential (used as DOMAIN\\user)')) - allowSmartcards = gui.CheckBoxField(label=_('Allow Smartcards'), order=16, tooltip=_('If checked, this transport will allow the use of smartcards')) - allowPrinters = gui.CheckBoxField(label=_('Allow Printers'), order=17, tooltip=_('If checked, this transport will allow the use of user printers')) - allowDrives = gui.CheckBoxField(label=_('Allow Drives'), order=18, tooltip=_('If checked, this transport will allow the use of user drives')) - allowSerials = gui.CheckBoxField(label=_('Allow Serials'), order=19, tooltip=_('If checked, this transport will allow the use of user serial ports')) - wallpaper = gui.CheckBoxField(label=_('Show wallpaper'), order=20, tooltip=_('If checked, the wallpaper and themes will be shown on machine (better user experience, more bandwidth)')) - multimon = gui.CheckBoxField(label=_('Multiple monitors'), order=21, tooltip=_('If checked, all client monitors will be used for displaying (only works on windows clients)')) - aero = gui.CheckBoxField(label=_('Allow Aero'), order=22, tooltip=_('If checked, desktop composition will be allowed')) + useEmptyCreds = gui.CheckBoxField(label=_('Empty creds'), order=11, tooltip=_('If checked, the credentials used to connect will be emtpy'), tab=gui.CREDENTIALS_TAB) + fixedName = gui.TextField(label=_('Username'), order=12, tooltip=_('If not empty, this username will be always used as credential'), tab=gui.CREDENTIALS_TAB) + fixedPassword = gui.PasswordField(label=_('Password'), order=13, tooltip=_('If not empty, this password will be always used as credential'), tab=gui.CREDENTIALS_TAB) + withoutDomain = gui.CheckBoxField(label=_('Without Domain'), order=14, tooltip=_('If checked, the domain part will always be emptied (to connect to xrdp for example is needed)'), tab=gui.CREDENTIALS_TAB) + fixedDomain = gui.TextField(label=_('Domain'), order=15, tooltip=_('If not empty, this domain will be always used as credential (used as DOMAIN\\user)'), tab=gui.CREDENTIALS_TAB) + allowSmartcards = gui.CheckBoxField(label=_('Allow Smartcards'), order=16, tooltip=_('If checked, this transport will allow the use of smartcards'), tab=gui.PARAMETERS_TAB) + allowPrinters = gui.CheckBoxField(label=_('Allow Printers'), order=17, tooltip=_('If checked, this transport will allow the use of user printers'), tab=gui.PARAMETERS_TAB) + allowDrives = gui.CheckBoxField(label=_('Allow Drives'), order=18, tooltip=_('If checked, this transport will allow the use of user drives'), tab=gui.PARAMETERS_TAB) + allowSerials = gui.CheckBoxField(label=_('Allow Serials'), order=19, tooltip=_('If checked, this transport will allow the use of user serial ports'), tab=gui.PARAMETERS_TAB) + wallpaper = gui.CheckBoxField(label=_('Show wallpaper'), order=20, tooltip=_('If checked, the wallpaper and themes will be shown on machine (better user experience, more bandwidth)'), tab=gui.PARAMETERS_TAB) + multimon = gui.CheckBoxField(label=_('Multiple monitors'), order=21, tooltip=_('If checked, all client monitors will be used for displaying (only works on windows clients)'), tab=gui.PARAMETERS_TAB) + aero = gui.CheckBoxField(label=_('Allow Aero'), order=22, tooltip=_('If checked, desktop composition will be allowed'), tab=gui.PARAMETERS_TAB) def isAvailableFor(self, userService, ip): ''' diff --git a/server/src/uds/transports/RDP/TRDPTransport.py b/server/src/uds/transports/RDP/TRDPTransport.py index 6ee2ed63d..491afc4e1 100644 --- a/server/src/uds/transports/RDP/TRDPTransport.py +++ b/server/src/uds/transports/RDP/TRDPTransport.py @@ -47,7 +47,7 @@ import logging import random import string -__updated__ = '2015-05-18' +__updated__ = '2016-04-18' logger = logging.getLogger(__name__) @@ -66,8 +66,8 @@ class TRDPTransport(BaseRDPTransport): needsJava = True # If this transport needs java for rendering protocol = protocols.RDP - tunnelServer = gui.TextField(label=_('Tunnel server'), order=1, tooltip=_('IP or Hostname of tunnel server sent to client device ("public" ip) and port. (use HOST:PORT format)')) - tunnelCheckServer = gui.TextField(label=_('Tunnel host check'), order=2, tooltip=_('If not empty, this server will be used to check if service is running before assigning it to user. (use HOST:PORT format)')) + tunnelServer = gui.TextField(label=_('Tunnel server'), order=1, tooltip=_('IP or Hostname of tunnel server sent to client device ("public" ip) and port. (use HOST:PORT format)'), tab=gui.TUNNEL_TAB) + tunnelCheckServer = gui.TextField(label=_('Tunnel host check'), order=2, tooltip=_('If not empty, this server will be used to check if service is running before assigning it to user. (use HOST:PORT format)'), tab=gui.TUNNEL_TAB) useEmptyCreds = BaseRDPTransport.useEmptyCreds fixedName = BaseRDPTransport.fixedName diff --git a/server/src/uds/transports/SPICE/BaseSPICETransport.py b/server/src/uds/transports/SPICE/BaseSPICETransport.py index 39bc05cda..704a3ba97 100644 --- a/server/src/uds/transports/SPICE/BaseSPICETransport.py +++ b/server/src/uds/transports/SPICE/BaseSPICETransport.py @@ -44,7 +44,7 @@ from uds.services.OVirt.OVirtProvider import Provider as oVirtProvider import logging import os -__updated__ = '2015-05-13' +__updated__ = '2016-04-18' logger = logging.getLogger(__name__) @@ -64,17 +64,20 @@ class BaseSpiceTransport(Transport): useEmptyCreds = gui.CheckBoxField( order=1, label=_('Empty creds'), - tooltip=_('If checked, the credentials used to connect will be emtpy') + tooltip=_('If checked, the credentials used to connect will be emtpy'), + tab=gui.CREDENTIALS_TAB ) fixedName = gui.TextField( order=2, label=_('Username'), - tooltip=_('If not empty, this username will be always used as credential') + tooltip=_('If not empty, this username will be always used as credential'), + tab=gui.CREDENTIALS_TAB ) fixedPassword = gui.PasswordField( order=3, label=_('Password'), - tooltip=_('If not empty, this password will be always used as credential') + tooltip=_('If not empty, this password will be always used as credential'), + tab=gui.CREDENTIALS_TAB ) serverCertificate = gui.TextField( order=4, diff --git a/server/src/uds/transports/SPICE/SPICETransport.py b/server/src/uds/transports/SPICE/SPICETransport.py index 28c173a9c..255771c1d 100644 --- a/server/src/uds/transports/SPICE/SPICETransport.py +++ b/server/src/uds/transports/SPICE/SPICETransport.py @@ -39,7 +39,7 @@ from .RemoteViewerFile import RemoteViewerFile import logging -__updated__ = '2015-05-11' +__updated__ = '2016-04-18' logger = logging.getLogger(__name__) @@ -53,9 +53,9 @@ class SPICETransport(BaseSpiceTransport): typeType = 'SPICETransport' typeDescription = _('SPICE Transport for direct connection (EXPERIMENTAL)') - useEmptyCreds = BaseSpiceTransport.useEmptyCreds - fixedName = BaseSpiceTransport.fixedName - fixedPassword = BaseSpiceTransport.fixedPassword + # useEmptyCreds = BaseSpiceTransport.useEmptyCreds + # fixedName = BaseSpiceTransport.fixedName + # fixedPassword = BaseSpiceTransport.fixedPassword serverCertificate = BaseSpiceTransport.serverCertificate def getUDSTransportScript(self, userService, transport, ip, os, user, password, request): diff --git a/server/src/uds/transports/SPICE/TSPICETransport.py b/server/src/uds/transports/SPICE/TSPICETransport.py index 94d57a544..4f4c9bea9 100644 --- a/server/src/uds/transports/SPICE/TSPICETransport.py +++ b/server/src/uds/transports/SPICE/TSPICETransport.py @@ -46,7 +46,7 @@ import logging import random import string -__updated__ = '2015-05-13' +__updated__ = '2016-04-18' logger = logging.getLogger(__name__) @@ -62,7 +62,7 @@ class TSPICETransport(BaseSpiceTransport): needsJava = True # If this transport needs java for rendering protocol = protocols.SPICE - tunnelServer = gui.TextField(label=_('Tunnel server'), order=1, tooltip=_('IP or Hostname of tunnel server sent to client device ("public" ip) and port. (use HOST:PORT format)')) + tunnelServer = gui.TextField(label=_('Tunnel server'), order=1, tooltip=_('IP or Hostname of tunnel server sent to client device ("public" ip) and port. (use HOST:PORT format)'), tab=gui.TUNNEL_TAB) serverCertificate = BaseSpiceTransport.serverCertificate