7077465 Text installer's multiple name service input screens need to be less confusing
authorWilliam Schumann <william.schumann@sun.com>
Thu, 25 Aug 2011 09:35:46 -0700
changeset 1422 b4ceead84bf0
parent 1421 35aa122843de
child 1423 2c16d86832a0
7077465 Text installer's multiple name service input screens need to be less confusing 7077490 The "Domain Name" is confusing 7077462 scitool makes erroneous assumption that DNS and NIS domain will be the same 7077417 underscore as part of domain name is rejected by sysconfig configure 7077397 After the install both domain and search appeared in resolv.conf 7055847 NIS setup does not display the correct NIS domainname
usr/src/cmd/system-config/__init__.py
usr/src/cmd/system-config/helpfiles/domain.txt
usr/src/cmd/system-config/nameservice.py
usr/src/cmd/system-config/profile/nameservice_info.py
usr/src/cmd/system-config/profile/test/test_nameservice_info.py
usr/src/cmd/system-config/summary.py
usr/src/cmd/system-config/test/test_nameservice.py
usr/src/cmd/text-install/summary.py
--- a/usr/src/cmd/system-config/__init__.py	Thu Aug 25 07:22:54 2011 -0700
+++ b/usr/src/cmd/system-config/__init__.py	Thu Aug 25 09:35:46 2011 -0700
@@ -295,10 +295,10 @@
 def _append_nameservice_screens(result, main_win):
     ''' Initialize and append all name service screens '''
     result.append(NSDNSChooser(main_win))
+    result.append(NSDNSServer(main_win))
+    result.append(NSDNSSearch(main_win))
     result.append(NSAltChooser(main_win))
     result.append(NSDomain(main_win))
-    result.append(NSDNSServer(main_win))
-    result.append(NSDNSSearch(main_win))
     result.append(NSLDAPProfile(main_win))
     result.append(NSLDAPProxyBindChooser(main_win))
     result.append(NSLDAPProxyBindInfo(main_win))
--- a/usr/src/cmd/system-config/helpfiles/domain.txt	Thu Aug 25 07:22:54 2011 -0700
+++ b/usr/src/cmd/system-config/helpfiles/domain.txt	Thu Aug 25 09:35:46 2011 -0700
@@ -1,6 +1,6 @@
 DOMAIN NAME
 
-Identifies the system as part of a name service domain.
+Identifies the system as part of a name service domain for NIS or LDAP name servers.
 
 GUIDELINES
 
--- a/usr/src/cmd/system-config/nameservice.py	Thu Aug 25 07:22:54 2011 -0700
+++ b/usr/src/cmd/system-config/nameservice.py	Thu Aug 25 09:35:46 2011 -0700
@@ -55,8 +55,8 @@
 
 # pre-compile patterns used in incremental validation
 NO_WHITE_NO_SPECIAL_PATTERN = re.compile(r'^[A-Z0-9\-_]+$')
-INCREMENTAL_DOMAIN_LABEL_PATTERN = re.compile(r'^[A-Z0-9\-]{0,63}$')
-DOMAIN_LABEL_PATTERN = re.compile(r'^[A-Z0-9\-]{1,63}$')
+INCREMENTAL_DOMAIN_LABEL_PATTERN = re.compile(r'^[A-Z0-9\-_]{0,63}$')
+DOMAIN_LABEL_PATTERN = re.compile(r'^[A-Z0-9\-_]{1,63}$')
 
 
 class NameService(BaseScreen):
@@ -115,7 +115,7 @@
                 LOGGER.info(nic)
                 # if values were learned from the NIC, offer those as defaults
                 if nic.domain:
-                    sc_profile.nameservice.domain = nic.domain
+                    sc_profile.nameservice.dns_search.append(nic.domain)
                 if nic.dns_address:
                     sc_profile.nameservice.dns_server = nic.dns_address
         self.nameservice = sc_profile.nameservice
@@ -227,7 +227,7 @@
     def __init__(self, main_win, screen=None):
         super(NSDomain, self).__init__(main_win)
         self.intro = \
-                _("Specify the domain where this system resides. "
+                _("Specify the domain for the NIS or LDAP name server. "
                   "Use the domain name's exact capitalization and "
                   "punctuation.")
         self.title = _("Domain Name:")
@@ -237,7 +237,7 @@
         super(NSDomain, self)._show()
         if not _has_name_service():
             raise SkipException
-        if not self.nameservice.dns and not self.nameservice.nameservice:
+        if not self.nameservice.nameservice:
             raise SkipException
         y_loc = self._paint_opening()
         cols = min(MAXDOMAINLEN + 1,
@@ -379,11 +379,7 @@
             area = WindowArea(1, cols, y_loc,
                               textwidth(self.title) + INDENT + 1)
             y_loc += 1
-            if i == 0 and self.nameservice.domain:
-                # default in domain user already entered
-                text = self.nameservice.domain
-                find_last_nonblank = 0
-            elif i < len(self.nameservice.dns_search) and \
+            if i < len(self.nameservice.dns_search) and \
                     self.nameservice.dns_search[i] is not None:
                 text = self.nameservice.dns_search[i]
             else:
--- a/usr/src/cmd/system-config/profile/nameservice_info.py	Thu Aug 25 07:22:54 2011 -0700
+++ b/usr/src/cmd/system-config/profile/nameservice_info.py	Thu Aug 25 09:35:46 2011 -0700
@@ -82,10 +82,10 @@
 
     def __repr__(self):
         return '\n'.join(["NS %s:" % self.nameservice,
-                          "Domain: %s" % self.domain,
                           "DNS? %s" % self.dns,
                           "DNSserv: %s" % self.dns_server,
                           "DNSsearch: %s" % self.dns_search,
+                          "Domain: %s" % self.domain,
                           "LDAPprofname: %s" % self.ldap_profile,
                           "LDAPprofip: %s" % self.ldap_ip,
                           "LDAP search base: %s" % self.ldap_search_base,
@@ -125,9 +125,6 @@
                                                    proptype)
                     nameserver.add_value_list(propvals=ilist,
                                               proptype=proptype)
-            # configure DNS domain
-            if self.domain:
-                dns_props.setprop("propval", "domain", "astring", self.domain)
             if self.dns_search:
                 # filter empty values from list
                 ilist = [val for val in self.dns_search if val]
--- a/usr/src/cmd/system-config/profile/test/test_nameservice_info.py	Thu Aug 25 07:22:54 2011 -0700
+++ b/usr/src/cmd/system-config/profile/test/test_nameservice_info.py	Thu Aug 25 09:35:46 2011 -0700
@@ -71,7 +71,6 @@
           <value_node value="1.1.1.1"/>
         </net_address_list>
       </property>
-      <propval type="astring" name="domain" value="my.domain.com"/>
       <property type="astring" name="search">
         <astring_list>
           <value_node value="my.domain.com"/>
--- a/usr/src/cmd/system-config/summary.py	Thu Aug 25 07:22:54 2011 -0700
+++ b/usr/src/cmd/system-config/summary.py	Thu Aug 25 09:35:46 2011 -0700
@@ -200,42 +200,7 @@
 
     def _get_nameservice(self, summary):
         ''' Find all name services information and append to summary '''
-        if not self.sysconfig.nameservice:
-            return
-        nameservice = self.sysconfig.nameservice
-        if not nameservice.dns and not nameservice.nameservice:
-            return
-        if nameservice.domain:
-            summary.append(_("Domain: %s") % nameservice.domain)
-        # fetch localized name for name service
-        if nameservice.dns:
-            summary.append(_("Name service: %s") % NameService.USER_CHOICE_DNS)
-            # strip empty list entries
-            dnslist = [ln for ln in nameservice.dns_server if ln]
-            summary.append(_("DNS servers: ") + " ".join(dnslist))
-            dnslist = [ln for ln in nameservice.dns_search if ln]
-            summary.append(_("DNS Domain search list: ") + " ".join(dnslist))
-        if nameservice.nameservice == 'LDAP':
-            ns_idx = NameService.CHOICE_LIST.index(nameservice.nameservice)
-            summary.append(_("Name service: %s") %
-                           NameService.USER_CHOICE_LIST[ns_idx])
-            summary.append(_("LDAP profile: ") + nameservice.ldap_profile)
-            summary.append(_("LDAP server's IP: ") + nameservice.ldap_ip)
-            summary.append(_("LDAP search base: ") + 
-                           nameservice.ldap_search_base)
-            if nameservice.ldap_proxy_bind == \
-                    NameServiceInfo.LDAP_CHOICE_PROXY_BIND:
-                summary.append(_("LDAP proxy bind distinguished name: ") +
-                               nameservice.ldap_pb_dn)
-                summary.append(_("LDAP proxy bind password: [concealed]"))
-        elif nameservice.nameservice == 'NIS':
-            ns_idx = NameService.CHOICE_LIST.index(nameservice.nameservice)
-            summary.append(_("Name service: %s") %
-                           NameService.USER_CHOICE_LIST[ns_idx])
-            if nameservice.nis_auto == NameServiceInfo.NIS_CHOICE_AUTO:
-                summary.append(_("NIS server: broadcast"))
-            elif nameservice.nis_ip:
-                summary.append(_("NIS server's IP: ") + nameservice.nis_ip)
+        nameservice_summary(self.sysconfig.nameservice, summary)
 
     def get_users(self):
         '''Build a summary of the user information, and return it as a list
@@ -257,3 +222,58 @@
         '''Return a string summary of the timezone selection'''
         timezone = self.sysconfig.system.tz_timezone
         return _("Time Zone: %s") % timezone
+
+
+def nameservice_summary(nameservice, summary):
+    '''sppend name service summary information
+    Args: nameservice - name service info
+        summary - list of summary lines to append to
+    '''
+    if not nameservice:
+        return
+    if not nameservice.dns and not nameservice.nameservice:
+        return
+    # fetch localized name for name service
+    if nameservice.dns:
+        summary.append(_("Name service: %s") % NameService.USER_CHOICE_DNS)
+        # strip empty list entries
+        dnslist = [ln for ln in nameservice.dns_server if ln]
+        summary.append(_("DNS servers: ") + " ".join(dnslist))
+        dnslist = [ln for ln in nameservice.dns_search if ln]
+        summary.append(_("DNS Domain search list: ") + " ".join(dnslist))
+    if nameservice.nameservice == 'LDAP':
+        ns_idx = NameService.CHOICE_LIST.index(nameservice.nameservice)
+        summary.append(_("Name service: %s") %
+                       NameService.USER_CHOICE_LIST[ns_idx])
+        summary.append(_("Domain: %s") % nameservice.domain)
+        summary.append(_("LDAP profile: ") + nameservice.ldap_profile)
+        summary.append(_("LDAP server's IP: ") + nameservice.ldap_ip)
+        summary.append(_("LDAP search base: ") + 
+                       nameservice.ldap_search_base)
+        if nameservice.ldap_proxy_bind == \
+                NameServiceInfo.LDAP_CHOICE_PROXY_BIND:
+            summary.append(_("LDAP proxy bind distinguished name: ") +
+                           nameservice.ldap_pb_dn)
+            summary.append(_("LDAP proxy bind password: [concealed]"))
+    elif nameservice.nameservice == 'NIS':
+        ns_idx = NameService.CHOICE_LIST.index(nameservice.nameservice)
+        summary.append(_("Name service: %s") %
+                       NameService.USER_CHOICE_LIST[ns_idx])
+        summary.append(_("Domain: %s") % nameservice.domain)
+        if nameservice.nis_auto == NameServiceInfo.NIS_CHOICE_AUTO:
+            summary.append(_("NIS server: broadcast"))
+        elif nameservice.nis_ip:
+            summary.append(_("NIS server's IP: ") + nameservice.nis_ip)
+        # offer user help for modifying name service sources
+        if nameservice.dns:
+            summary.append(_("Note: DNS will be configured to resolve "
+                             "host and IP node names."))
+            summary.append(_("This setting can be modified upon "
+                             "rebooting. For example:"))
+            summary.append("# svccfg -s svc:/system/name-service/switch")
+            summary.append("svc:/system/name-service/switch> "
+                           "setprop config/host=\"files nis dns\"")
+            summary.append("svc:/system/name-service/switch> quit")
+            summary.append("# svcadm refresh svc:/system/name-service/switch")
+            summary.append(_("See nsswitch.conf(4), svccfg(1M) and "
+                             "nscfg(1M)."))
--- a/usr/src/cmd/system-config/test/test_nameservice.py	Thu Aug 25 07:22:54 2011 -0700
+++ b/usr/src/cmd/system-config/test/test_nameservice.py	Thu Aug 25 09:35:46 2011 -0700
@@ -87,7 +87,7 @@
 
     def test_validate_ns_validate_method(self):
         ''' Test SCI tool name service validation method - all screens '''
-        self.ns_domain.domain = MockField('dom.ain')
+        self.ns_domain.domain = MockField('dom.ai_n')
         self.assertEqual(self.ns_domain.validate(), None)
         self.ns_domain.domain = MockField('dom ain')
         self.assertRaises(UIMessage, self.ns_domain.validate)
@@ -161,6 +161,8 @@
         # incremental domain
         self.assertEqual(nsv.incremental_validate_domain(MockField('a')),
                          None)
+        self.assertEqual(nsv.incremental_validate_domain(MockField('_')),
+                         None)
         self.assertRaises(UIMessage, nsv.incremental_validate_domain,
                           MockField(' '))
         self.assertRaises(UIMessage, nsv.incremental_validate_domain,
--- a/usr/src/cmd/text-install/summary.py	Thu Aug 25 07:22:54 2011 -0700
+++ b/usr/src/cmd/text-install/summary.py	Thu Aug 25 09:35:46 2011 -0700
@@ -38,6 +38,7 @@
 from solaris_install.sysconfig.profile.nameservice_info import NameServiceInfo
 from solaris_install.sysconfig.profile.network_info import NetworkInfo
 from solaris_install.sysconfig.profile.user_info import UserInfo
+from solaris_install.sysconfig.summary import nameservice_summary
 from solaris_install.target.libdiskmgt import const as libdiskmgt_const
 from solaris_install.target.size import Size
 from solaris_install.text_install import _, RELEASE, TUI_HELP, LOCALIZED_GB
@@ -162,46 +163,10 @@
                 network_summary.append(_("    Router: %s") % nic.gateway)
         return network_summary
     
-    def _get_nameservice(self, ns_summary):
+    def _get_nameservice(self, summary):
         ''' Find all name services information and append to summary '''
-        if not self.sysconfig.nameservice:
-            return
-        nameservice = self.sysconfig.nameservice
-        if not nameservice.dns and not nameservice.nameservice:
-            return
-        if nameservice.domain:
-            ns_summary.append(_("Domain: %s") % nameservice.domain)
-        # fetch localized name for name service
-        if nameservice.dns:
-            ns_summary.append(_("Name service: %s") %
-                              NameService.USER_CHOICE_DNS)
-            # strip empty list entries
-            dnslist = [ln for ln in nameservice.dns_server if ln]
-            ns_summary.append(_("DNS servers: ") + " ".join(dnslist))
-            dnslist = [ln for ln in nameservice.dns_search if ln]
-            ns_summary.append(_("DNS Domain search list: ") +
-                              " ".join(dnslist))
-        if nameservice.nameservice == 'LDAP':
-            ns_idx = NameService.CHOICE_LIST.index(nameservice.nameservice)
-            ns_summary.append(_("Name service: %s") %
-                              NameService.USER_CHOICE_LIST[ns_idx])
-            ns_summary.append(_("LDAP profile: ") + nameservice.ldap_profile)
-            ns_summary.append(_("LDAP server's IP: ") + nameservice.ldap_ip)
-            ns_summary.append(_("LDAP search base: ") + 
-                              nameservice.ldap_search_base)
-            if nameservice.ldap_proxy_bind == \
-                    NameServiceInfo.LDAP_CHOICE_PROXY_BIND:
-                ns_summary.append(_("LDAP proxy bind distinguished name: ") +
-                                  nameservice.ldap_pb_dn)
-                ns_summary.append(_("LDAP proxy bind password: [concealed]"))
-        elif nameservice.nameservice == 'NIS':
-            ns_idx = NameService.CHOICE_LIST.index(nameservice.nameservice)
-            ns_summary.append(_("Name service: %s") %
-                              NameService.USER_CHOICE_LIST[ns_idx])
-            if nameservice.nis_auto == NameServiceInfo.NIS_CHOICE_AUTO:
-                ns_summary.append(_("NIS server: broadcast"))
-            elif nameservice.nis_ip:
-                ns_summary.append(_("NIS server's IP: ") + nameservice.nis_ip)
+        # append lines of name service info to summary
+        nameservice_summary(self.sysconfig.nameservice, summary)
 
     def get_users(self):
         '''Build a summary of the user information, and return it as a list