summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am51
-rw-r--r--Makefile.in131
-rwxr-xr-xconfigure28
-rw-r--r--configure.ac7
-rw-r--r--ldap/admin/src/scripts/50addchainingsaslpwroles.ldif6
-rw-r--r--ldap/admin/src/scripts/50bitstringsyntaxplugin.ldif14
-rw-r--r--ldap/admin/src/scripts/50deliverymethodsyntaxplugin.ldif14
-rw-r--r--ldap/admin/src/scripts/50derefplugin.ldif16
-rw-r--r--ldap/admin/src/scripts/50disableurisyntaxplugin.ldif9
-rw-r--r--ldap/admin/src/scripts/50enhancedguidesyntaxplugin.ldif14
-rw-r--r--ldap/admin/src/scripts/50entryusnindex.ldif7
-rw-r--r--ldap/admin/src/scripts/50faxnumbersyntaxplugin.ldif14
-rw-r--r--ldap/admin/src/scripts/50faxsyntaxplugin.ldif14
-rw-r--r--ldap/admin/src/scripts/50guidesyntaxplugin.ldif14
-rw-r--r--ldap/admin/src/scripts/50linkedattrsplugin.ldif16
-rw-r--r--ldap/admin/src/scripts/50memberofindex.ldif6
-rw-r--r--ldap/admin/src/scripts/50memberofplugin.ldif17
-rw-r--r--ldap/admin/src/scripts/50nameuidsyntaxplugin.ldif14
-rw-r--r--ldap/admin/src/scripts/50numericstringsyntaxplugin.ldif14
-rw-r--r--ldap/admin/src/scripts/50printablestringsyntaxplugin.ldif14
-rw-r--r--ldap/admin/src/scripts/50schemareloadplugin.ldif14
-rw-r--r--ldap/admin/src/scripts/50syntaxvalidplugin.ldif14
-rw-r--r--ldap/admin/src/scripts/50teletexterminalidsyntaxplugin.ldif14
-rw-r--r--ldap/admin/src/scripts/50telexnumbersyntaxplugin.ldif14
-rw-r--r--ldap/admin/src/scripts/50usnplugin.ldif15
-rw-r--r--ldap/admin/src/scripts/60upgradeschemafiles.pl54
-rw-r--r--ldap/admin/src/scripts/DSCreate.pm.in51
-rw-r--r--ldap/admin/src/scripts/DSUpdate.pm.in505
-rw-r--r--ldap/admin/src/scripts/DSUpdateDialogs.pm181
-rw-r--r--ldap/admin/src/scripts/FileConn.pm20
-rw-r--r--ldap/admin/src/scripts/Inf.pm27
-rw-r--r--ldap/admin/src/scripts/Resource.pm17
-rw-r--r--ldap/admin/src/scripts/Setup.pm.in44
-rw-r--r--ldap/admin/src/scripts/Util.pm.in41
-rw-r--r--ldap/admin/src/scripts/dnaplugindepends.ldif4
-rw-r--r--ldap/admin/src/scripts/dsupdate.map.in65
-rw-r--r--ldap/admin/src/scripts/exampleupdate.ldif40
-rw-r--r--ldap/admin/src/scripts/exampleupdate.pl56
-rw-r--r--ldap/admin/src/scripts/exampleupdate.sh63
-rw-r--r--ldap/admin/src/scripts/migrate-ds.res1
-rw-r--r--ldap/admin/src/scripts/setup-ds.pl.in47
-rw-r--r--ldap/admin/src/scripts/setup-ds.res.in45
-rw-r--r--ldap/ldif/template-pampta.ldif.in6
43 files changed, 1628 insertions, 130 deletions
diff --git a/Makefile.am b/Makefile.am
index 7f35c6a2..49c345f2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -69,6 +69,7 @@ CLEANFILES = dberrstrs.h ns-slapd.properties \
ldap/admin/src/scripts/template-dbverify ldap/admin/src/template-initconfig \
ldap/admin/src/scripts/dscreate.map ldap/admin/src/scripts/remove-ds.pl \
ldap/admin/src/scripts/DSCreate.pm ldap/admin/src/scripts/DSMigration.pm \
+ ldap/admin/src/scripts/DSUpdate.pm ldap/admin/src/scripts/dsupdate.map \
ldap/admin/src/scripts/dsorgentries.map ldap/admin/src/scripts/migrate-ds.pl \
ldap/admin/src/scripts/Migration.pm ldap/admin/src/scripts/SetupDialogs.pm \
ldap/admin/src/scripts/setup-ds.pl ldap/admin/src/scripts/setup-ds.res \
@@ -128,6 +129,7 @@ perldir = $(libdir)@perldir@
infdir = $(datadir)@infdir@
mibdir = $(datadir)@mibdir@
policydir = $(datadir)/selinux/targeted
+updatedir = $(datadir)@updatedir@
defaultuser=@defaultuser@
defaultgroup=@defaultgroup@
@@ -308,7 +310,9 @@ perl_DATA = ldap/admin/src/scripts/SetupLog.pm \
ldap/admin/src/scripts/Migration.pm \
ldap/admin/src/scripts/DSMigration.pm \
ldap/admin/src/scripts/FileConn.pm \
- ldap/admin/src/scripts/DSCreate.pm
+ ldap/admin/src/scripts/DSCreate.pm \
+ ldap/admin/src/scripts/DSUpdate.pm \
+ ldap/admin/src/scripts/DSUpdateDialogs.pm
property_DATA = ldap/admin/src/scripts/setup-ds.res \
ldap/admin/src/scripts/migrate-ds.res
@@ -351,6 +355,7 @@ initconfig_DATA = ldap/admin/src/$(PACKAGE_NAME)
inf_DATA = ldap/admin/src/slapd.inf \
ldap/admin/src/scripts/dscreate.map \
+ ldap/admin/src/scripts/dsupdate.map \
ldap/admin/src/scripts/dsorgentries.map
mib_DATA = ldap/servers/snmp/RFC-1215.txt \
@@ -383,6 +388,44 @@ dist_man_MANS = man/man1/dbscan.1 \
man/man8/setup-ds.pl.8 \
man/man8/remove-ds.pl.8
+#------------------------
+# updates
+# the first 3 are just the examples provided - since they
+# do not begin with two digits, they will be ignored
+# the remaining items should begin with two digits that
+# correspond to the order in which they should be applied
+# perl files and LDIF files are DATA - not executable
+# processed by the update script
+# shell scripts and other files are SCRIPTS - executable
+#------------------------
+update_DATA = ldap/admin/src/scripts/exampleupdate.pl \
+ ldap/admin/src/scripts/exampleupdate.ldif \
+ ldap/admin/src/scripts/50addchainingsaslpwroles.ldif \
+ ldap/admin/src/scripts/50memberofindex.ldif \
+ ldap/admin/src/scripts/50bitstringsyntaxplugin.ldif \
+ ldap/admin/src/scripts/50memberofplugin.ldif \
+ ldap/admin/src/scripts/50deliverymethodsyntaxplugin.ldif \
+ ldap/admin/src/scripts/50nameuidsyntaxplugin.ldif \
+ ldap/admin/src/scripts/50derefplugin.ldif \
+ ldap/admin/src/scripts/50numericstringsyntaxplugin.ldif \
+ ldap/admin/src/scripts/50disableurisyntaxplugin.ldif \
+ ldap/admin/src/scripts/50printablestringsyntaxplugin.ldif \
+ ldap/admin/src/scripts/50enhancedguidesyntaxplugin.ldif \
+ ldap/admin/src/scripts/50schemareloadplugin.ldif \
+ ldap/admin/src/scripts/50entryusnindex.ldif \
+ ldap/admin/src/scripts/50syntaxvalidplugin.ldif \
+ ldap/admin/src/scripts/50faxnumbersyntaxplugin.ldif \
+ ldap/admin/src/scripts/50teletexterminalidsyntaxplugin.ldif \
+ ldap/admin/src/scripts/50faxsyntaxplugin.ldif \
+ ldap/admin/src/scripts/50telexnumbersyntaxplugin.ldif \
+ ldap/admin/src/scripts/50guidesyntaxplugin.ldif \
+ ldap/admin/src/scripts/50linkedattrsplugin.ldif \
+ ldap/admin/src/scripts/50usnplugin.ldif \
+ ldap/admin/src/scripts/60upgradeschemafiles.pl \
+ ldap/admin/src/scripts/dnaplugindepends.ldif
+
+update_SCRIPTS = ldap/admin/src/scripts/exampleupdate.sh
+
#////////////////////////////////////////////////////////////////
#
# Server Strings
@@ -1251,7 +1294,8 @@ fixupcmd = sed \
-e 's,@with_fhs_opt\@,@with_fhs_opt@,g' \
-e 's,@with_selinux\@,@with_selinux@,g' \
-e 's,@perlexec\@,@perlexec@,g' \
- -e 's,@initconfigdir\@,$(initconfigdir),g'
+ -e 's,@initconfigdir\@,$(initconfigdir),g'\
+ -e 's,@updatedir\@,$(updatedir),g'
else
fixupcmd = sed \
-e 's,@bindir\@,$(bindir),g' \
@@ -1303,7 +1347,8 @@ fixupcmd = sed \
-e 's,@with_fhs_opt\@,@with_fhs_opt@,g' \
-e 's,@with_selinux\@,@with_selinux@,g' \
-e 's,@perlexec\@,@perlexec@,g' \
- -e 's,@initconfigdir\@,$(initconfigdir),g'
+ -e 's,@initconfigdir\@,$(initconfigdir),g' \
+ -e 's,@updatedir\@,$(updatedir),g'
endif
%: %.in
diff --git a/Makefile.in b/Makefile.in
index f064dede..e9197b12 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -97,13 +97,14 @@ am__installdirs = "$(DESTDIR)$(serverdir)" \
"$(DESTDIR)$(serverplugindir)" "$(DESTDIR)$(bindir)" \
"$(DESTDIR)$(sbindir)" "$(DESTDIR)$(bindir)" \
"$(DESTDIR)$(initdir)" "$(DESTDIR)$(sbindir)" \
- "$(DESTDIR)$(taskdir)" "$(DESTDIR)$(man1dir)" \
- "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(configdir)" \
- "$(DESTDIR)$(infdir)" "$(DESTDIR)$(initconfigdir)" \
- "$(DESTDIR)$(mibdir)" "$(DESTDIR)$(propertydir)" \
- "$(DESTDIR)$(perldir)" "$(DESTDIR)$(policydir)" \
- "$(DESTDIR)$(propertydir)" "$(DESTDIR)$(sampledatadir)" \
- "$(DESTDIR)$(schemadir)"
+ "$(DESTDIR)$(taskdir)" "$(DESTDIR)$(updatedir)" \
+ "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man8dir)" \
+ "$(DESTDIR)$(configdir)" "$(DESTDIR)$(infdir)" \
+ "$(DESTDIR)$(initconfigdir)" "$(DESTDIR)$(mibdir)" \
+ "$(DESTDIR)$(propertydir)" "$(DESTDIR)$(perldir)" \
+ "$(DESTDIR)$(policydir)" "$(DESTDIR)$(propertydir)" \
+ "$(DESTDIR)$(sampledatadir)" "$(DESTDIR)$(schemadir)" \
+ "$(DESTDIR)$(updatedir)"
serverLTLIBRARIES_INSTALL = $(INSTALL)
serverpluginLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(server_LTLIBRARIES) $(serverplugin_LTLIBRARIES)
@@ -794,8 +795,9 @@ binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
initSCRIPT_INSTALL = $(INSTALL_SCRIPT)
sbinSCRIPT_INSTALL = $(INSTALL_SCRIPT)
taskSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+updateSCRIPT_INSTALL = $(INSTALL_SCRIPT)
SCRIPTS = $(bin_SCRIPTS) $(init_SCRIPTS) $(sbin_SCRIPTS) \
- $(task_SCRIPTS)
+ $(task_SCRIPTS) $(update_SCRIPTS)
DEFAULT_INCLUDES = -I. -I$(srcdir) -I.
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
@@ -889,9 +891,11 @@ policyDATA_INSTALL = $(INSTALL_DATA)
propertyDATA_INSTALL = $(INSTALL_DATA)
sampledataDATA_INSTALL = $(INSTALL_DATA)
schemaDATA_INSTALL = $(INSTALL_DATA)
+updateDATA_INSTALL = $(INSTALL_DATA)
DATA = $(config_DATA) $(inf_DATA) $(initconfig_DATA) $(mib_DATA) \
$(nodist_property_DATA) $(perl_DATA) $(policy_DATA) \
- $(property_DATA) $(sampledata_DATA) $(schema_DATA)
+ $(property_DATA) $(sampledata_DATA) $(schema_DATA) \
+ $(update_DATA)
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -1106,6 +1110,7 @@ svrcore_inc = @svrcore_inc@
svrcore_lib = @svrcore_lib@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+updatedir = $(datadir)@updatedir@
vendor = @vendor@
with_fhs_opt = @with_fhs_opt@
with_selinux = @with_selinux@
@@ -1169,6 +1174,7 @@ CLEANFILES = dberrstrs.h ns-slapd.properties \
ldap/admin/src/scripts/template-dbverify ldap/admin/src/template-initconfig \
ldap/admin/src/scripts/dscreate.map ldap/admin/src/scripts/remove-ds.pl \
ldap/admin/src/scripts/DSCreate.pm ldap/admin/src/scripts/DSMigration.pm \
+ ldap/admin/src/scripts/DSUpdate.pm ldap/admin/src/scripts/dsupdate.map \
ldap/admin/src/scripts/dsorgentries.map ldap/admin/src/scripts/migrate-ds.pl \
ldap/admin/src/scripts/Migration.pm ldap/admin/src/scripts/SetupDialogs.pm \
ldap/admin/src/scripts/setup-ds.pl ldap/admin/src/scripts/setup-ds.res \
@@ -1347,7 +1353,9 @@ perl_DATA = ldap/admin/src/scripts/SetupLog.pm \
ldap/admin/src/scripts/Migration.pm \
ldap/admin/src/scripts/DSMigration.pm \
ldap/admin/src/scripts/FileConn.pm \
- ldap/admin/src/scripts/DSCreate.pm
+ ldap/admin/src/scripts/DSCreate.pm \
+ ldap/admin/src/scripts/DSUpdate.pm \
+ ldap/admin/src/scripts/DSUpdateDialogs.pm
property_DATA = ldap/admin/src/scripts/setup-ds.res \
ldap/admin/src/scripts/migrate-ds.res
@@ -1389,6 +1397,7 @@ init_SCRIPTS = wrappers/$(PACKAGE_NAME) \
initconfig_DATA = ldap/admin/src/$(PACKAGE_NAME)
inf_DATA = ldap/admin/src/slapd.inf \
ldap/admin/src/scripts/dscreate.map \
+ ldap/admin/src/scripts/dsupdate.map \
ldap/admin/src/scripts/dsorgentries.map
mib_DATA = ldap/servers/snmp/RFC-1215.txt \
@@ -1423,6 +1432,44 @@ dist_man_MANS = man/man1/dbscan.1 \
man/man8/remove-ds.pl.8
+#------------------------
+# updates
+# the first 3 are just the examples provided - since they
+# do not begin with two digits, they will be ignored
+# the remaining items should begin with two digits that
+# correspond to the order in which they should be applied
+# perl files and LDIF files are DATA - not executable
+# processed by the update script
+# shell scripts and other files are SCRIPTS - executable
+#------------------------
+update_DATA = ldap/admin/src/scripts/exampleupdate.pl \
+ ldap/admin/src/scripts/exampleupdate.ldif \
+ ldap/admin/src/scripts/50addchainingsaslpwroles.ldif \
+ ldap/admin/src/scripts/50memberofindex.ldif \
+ ldap/admin/src/scripts/50bitstringsyntaxplugin.ldif \
+ ldap/admin/src/scripts/50memberofplugin.ldif \
+ ldap/admin/src/scripts/50deliverymethodsyntaxplugin.ldif \
+ ldap/admin/src/scripts/50nameuidsyntaxplugin.ldif \
+ ldap/admin/src/scripts/50derefplugin.ldif \
+ ldap/admin/src/scripts/50numericstringsyntaxplugin.ldif \
+ ldap/admin/src/scripts/50disableurisyntaxplugin.ldif \
+ ldap/admin/src/scripts/50printablestringsyntaxplugin.ldif \
+ ldap/admin/src/scripts/50enhancedguidesyntaxplugin.ldif \
+ ldap/admin/src/scripts/50schemareloadplugin.ldif \
+ ldap/admin/src/scripts/50entryusnindex.ldif \
+ ldap/admin/src/scripts/50syntaxvalidplugin.ldif \
+ ldap/admin/src/scripts/50faxnumbersyntaxplugin.ldif \
+ ldap/admin/src/scripts/50teletexterminalidsyntaxplugin.ldif \
+ ldap/admin/src/scripts/50faxsyntaxplugin.ldif \
+ ldap/admin/src/scripts/50telexnumbersyntaxplugin.ldif \
+ ldap/admin/src/scripts/50guidesyntaxplugin.ldif \
+ ldap/admin/src/scripts/50linkedattrsplugin.ldif \
+ ldap/admin/src/scripts/50usnplugin.ldif \
+ ldap/admin/src/scripts/60upgradeschemafiles.pl \
+ ldap/admin/src/scripts/dnaplugindepends.ldif
+
+update_SCRIPTS = ldap/admin/src/scripts/exampleupdate.sh
+
#////////////////////////////////////////////////////////////////
#
# Server Strings
@@ -2196,7 +2243,8 @@ rsearch_bin_LDADD = $(NSPR_LINK) $(NSS_LINK) $(LDAPSDK_LINK) $(SASL_LINK) $(LIBS
@BUNDLE_FALSE@ -e 's,@with_fhs_opt\@,@with_fhs_opt@,g' \
@BUNDLE_FALSE@ -e 's,@with_selinux\@,@with_selinux@,g' \
@BUNDLE_FALSE@ -e 's,@perlexec\@,@perlexec@,g' \
-@BUNDLE_FALSE@ -e 's,@initconfigdir\@,$(initconfigdir),g'
+@BUNDLE_FALSE@ -e 's,@initconfigdir\@,$(initconfigdir),g' \
+@BUNDLE_FALSE@ -e 's,@updatedir\@,$(updatedir),g'
# these are for the config files and scripts that we need to generate and replace
@@ -2258,7 +2306,8 @@ rsearch_bin_LDADD = $(NSPR_LINK) $(NSS_LINK) $(LDAPSDK_LINK) $(SASL_LINK) $(LIBS
@BUNDLE_TRUE@ -e 's,@with_fhs_opt\@,@with_fhs_opt@,g' \
@BUNDLE_TRUE@ -e 's,@with_selinux\@,@with_selinux@,g' \
@BUNDLE_TRUE@ -e 's,@perlexec\@,@perlexec@,g' \
-@BUNDLE_TRUE@ -e 's,@initconfigdir\@,$(initconfigdir),g'
+@BUNDLE_TRUE@ -e 's,@initconfigdir\@,$(initconfigdir),g'\
+@BUNDLE_TRUE@ -e 's,@updatedir\@,$(updatedir),g'
all: $(BUILT_SOURCES) config.h
$(MAKE) $(AM_MAKEFLAGS) all-am
@@ -4173,6 +4222,25 @@ uninstall-taskSCRIPTS:
echo " rm -f '$(DESTDIR)$(taskdir)/$$f'"; \
rm -f "$(DESTDIR)$(taskdir)/$$f"; \
done
+install-updateSCRIPTS: $(update_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(updatedir)" || $(mkdir_p) "$(DESTDIR)$(updatedir)"
+ @list='$(update_SCRIPTS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f $$d$$p; then \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " $(updateSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(updatedir)/$$f'"; \
+ $(updateSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(updatedir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-updateSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(update_SCRIPTS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " rm -f '$(DESTDIR)$(updatedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(updatedir)/$$f"; \
+ done
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -9420,6 +9488,23 @@ uninstall-schemaDATA:
echo " rm -f '$(DESTDIR)$(schemadir)/$$f'"; \
rm -f "$(DESTDIR)$(schemadir)/$$f"; \
done
+install-updateDATA: $(update_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(updatedir)" || $(mkdir_p) "$(DESTDIR)$(updatedir)"
+ @list='$(update_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(updateDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(updatedir)/$$f'"; \
+ $(updateDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(updatedir)/$$f"; \
+ done
+
+uninstall-updateDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(update_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(updatedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(updatedir)/$$f"; \
+ done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -9602,7 +9687,7 @@ check: $(BUILT_SOURCES)
all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) \
$(MANS) $(DATA) config.h
installdirs:
- for dir in "$(DESTDIR)$(serverdir)" "$(DESTDIR)$(serverplugindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(initdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(taskdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(configdir)" "$(DESTDIR)$(infdir)" "$(DESTDIR)$(initconfigdir)" "$(DESTDIR)$(mibdir)" "$(DESTDIR)$(propertydir)" "$(DESTDIR)$(perldir)" "$(DESTDIR)$(policydir)" "$(DESTDIR)$(propertydir)" "$(DESTDIR)$(sampledatadir)" "$(DESTDIR)$(schemadir)"; do \
+ for dir in "$(DESTDIR)$(serverdir)" "$(DESTDIR)$(serverplugindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(initdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(taskdir)" "$(DESTDIR)$(updatedir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(configdir)" "$(DESTDIR)$(infdir)" "$(DESTDIR)$(initconfigdir)" "$(DESTDIR)$(mibdir)" "$(DESTDIR)$(propertydir)" "$(DESTDIR)$(perldir)" "$(DESTDIR)$(policydir)" "$(DESTDIR)$(propertydir)" "$(DESTDIR)$(sampledatadir)" "$(DESTDIR)$(schemadir)" "$(DESTDIR)$(updatedir)"; do \
test -z "$$dir" || $(mkdir_p) "$$dir"; \
done
install: $(BUILT_SOURCES)
@@ -9741,7 +9826,8 @@ install-data-am: install-configDATA install-infDATA \
install-mibDATA install-nodist_propertyDATA install-perlDATA \
install-policyDATA install-propertyDATA install-sampledataDATA \
install-schemaDATA install-serverLTLIBRARIES \
- install-serverpluginLTLIBRARIES install-taskSCRIPTS
+ install-serverpluginLTLIBRARIES install-taskSCRIPTS \
+ install-updateDATA install-updateSCRIPTS
install-exec-am: install-binPROGRAMS install-binSCRIPTS \
install-sbinPROGRAMS install-sbinSCRIPTS
@@ -9780,7 +9866,8 @@ uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
uninstall-sampledataDATA uninstall-sbinPROGRAMS \
uninstall-sbinSCRIPTS uninstall-schemaDATA \
uninstall-serverLTLIBRARIES uninstall-serverpluginLTLIBRARIES \
- uninstall-taskSCRIPTS
+ uninstall-taskSCRIPTS uninstall-updateDATA \
+ uninstall-updateSCRIPTS
uninstall-man: uninstall-man1 uninstall-man8
@@ -9802,11 +9889,12 @@ uninstall-man: uninstall-man1 uninstall-man8
install-policyDATA install-propertyDATA install-sampledataDATA \
install-sbinPROGRAMS install-sbinSCRIPTS install-schemaDATA \
install-serverLTLIBRARIES install-serverpluginLTLIBRARIES \
- install-strip install-taskSCRIPTS installcheck installcheck-am \
- installdirs maintainer-clean maintainer-clean-generic \
- mostlyclean mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
- uninstall-am uninstall-binPROGRAMS uninstall-binSCRIPTS \
+ install-strip install-taskSCRIPTS install-updateDATA \
+ install-updateSCRIPTS installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-binSCRIPTS \
uninstall-configDATA uninstall-infDATA uninstall-info-am \
uninstall-initSCRIPTS uninstall-initconfigDATA uninstall-man \
uninstall-man1 uninstall-man8 uninstall-mibDATA \
@@ -9815,7 +9903,8 @@ uninstall-man: uninstall-man1 uninstall-man8
uninstall-sampledataDATA uninstall-sbinPROGRAMS \
uninstall-sbinSCRIPTS uninstall-schemaDATA \
uninstall-serverLTLIBRARIES uninstall-serverpluginLTLIBRARIES \
- uninstall-taskSCRIPTS
+ uninstall-taskSCRIPTS uninstall-updateDATA \
+ uninstall-updateSCRIPTS
clean-local:
diff --git a/configure b/configure
index d63d882c..9f0902ce 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59 for dirsrv 1.2.2.
+# Generated by GNU Autoconf 2.59 for dirsrv 1.2.3.
#
# Report bugs to <http://bugzilla.redhat.com/>.
#
@@ -423,8 +423,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME='dirsrv'
PACKAGE_TARNAME='dirsrv'
-PACKAGE_VERSION='1.2.2'
-PACKAGE_STRING='dirsrv 1.2.2'
+PACKAGE_VERSION='1.2.3'
+PACKAGE_STRING='dirsrv 1.2.3'
PACKAGE_BUGREPORT='http://bugzilla.redhat.com/'
# Factoring default headers for most tests.
@@ -465,7 +465,7 @@ ac_includes_default="\
#endif"
ac_default_prefix=/opt/$PACKAGE_NAME
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT build build_cpu build_vendor build_os host host_cpu host_vendor host_os CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CCAS CCASFLAGS SED EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL LIBOBJS debug_defs BUNDLE_TRUE BUNDLE_FALSE enable_pam_passthru_TRUE enable_pam_passthru_FALSE enable_dna_TRUE enable_dna_FALSE enable_ldapi_TRUE enable_ldapi_FALSE enable_autobind_TRUE enable_autobind_FALSE enable_auto_dn_suffix_TRUE enable_auto_dn_suffix_FALSE enable_bitwise_TRUE enable_bitwise_FALSE enable_presence_TRUE enable_presence_FALSE with_fhs_opt configdir sampledatadir propertydir schemadir serverdir serverplugindir scripttemplatedir perldir infdir mibdir defaultuser defaultgroup instconfigdir WINNT_TRUE WINNT_FALSE LIBSOCKET LIBNSL LIBDL LIBCSTD LIBCRUN initdir perlexec initconfigdir HPUX_TRUE HPUX_FALSE SOLARIS_TRUE SOLARIS_FALSE PKG_CONFIG ICU_CONFIG NETSNMP_CONFIG KRB5_CONFIG_BIN kerberos_inc kerberos_lib kerberos_libdir with_selinux PACKAGE_BASE_VERSION SELINUX_TRUE SELINUX_FALSE OPENLDAP_TRUE OPENLDAP_FALSE nspr_inc nspr_lib nspr_libdir nss_inc nss_lib nss_libdir ldapsdk_inc ldapsdk_lib ldapsdk_libdir ldapsdk_bindir openldap_inc openldap_lib openldap_libdir openldap_bindir ol_libver db_inc db_incdir db_lib db_libdir db_bindir db_libver sasl_inc sasl_lib sasl_libdir sasl_path svrcore_inc svrcore_lib icu_lib icu_inc icu_bin netsnmp_inc netsnmp_lib netsnmp_libdir netsnmp_link pcre_inc pcre_lib pcre_libdir brand capbrand vendor LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT build build_cpu build_vendor build_os host host_cpu host_vendor host_os CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CCAS CCASFLAGS SED EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL LIBOBJS debug_defs BUNDLE_TRUE BUNDLE_FALSE enable_pam_passthru_TRUE enable_pam_passthru_FALSE enable_dna_TRUE enable_dna_FALSE enable_ldapi_TRUE enable_ldapi_FALSE enable_autobind_TRUE enable_autobind_FALSE enable_auto_dn_suffix_TRUE enable_auto_dn_suffix_FALSE enable_bitwise_TRUE enable_bitwise_FALSE enable_presence_TRUE enable_presence_FALSE with_fhs_opt configdir sampledatadir propertydir schemadir serverdir serverplugindir scripttemplatedir perldir infdir mibdir updatedir defaultuser defaultgroup instconfigdir WINNT_TRUE WINNT_FALSE LIBSOCKET LIBNSL LIBDL LIBCSTD LIBCRUN initdir perlexec initconfigdir HPUX_TRUE HPUX_FALSE SOLARIS_TRUE SOLARIS_FALSE PKG_CONFIG ICU_CONFIG NETSNMP_CONFIG KRB5_CONFIG_BIN kerberos_inc kerberos_lib kerberos_libdir with_selinux PACKAGE_BASE_VERSION SELINUX_TRUE SELINUX_FALSE OPENLDAP_TRUE OPENLDAP_FALSE nspr_inc nspr_lib nspr_libdir nss_inc nss_lib nss_libdir ldapsdk_inc ldapsdk_lib ldapsdk_libdir ldapsdk_bindir openldap_inc openldap_lib openldap_libdir openldap_bindir ol_libver db_inc db_incdir db_lib db_libdir db_bindir db_libver sasl_inc sasl_lib sasl_libdir sasl_path svrcore_inc svrcore_lib icu_lib icu_inc icu_bin netsnmp_inc netsnmp_lib netsnmp_libdir netsnmp_link pcre_inc pcre_lib pcre_libdir brand capbrand vendor LTLIBOBJS'
ac_subst_files=''
# Initialize some variables set by options.
@@ -962,7 +962,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures dirsrv 1.2.2 to adapt to many kinds of systems.
+\`configure' configures dirsrv 1.2.3 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1028,7 +1028,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of dirsrv 1.2.2:";;
+ short | recursive ) echo "Configuration of dirsrv 1.2.3:";;
esac
cat <<\_ACEOF
@@ -1241,7 +1241,7 @@ fi
test -n "$ac_init_help" && exit 0
if $ac_init_version; then
cat <<\_ACEOF
-dirsrv configure 1.2.2
+dirsrv configure 1.2.3
generated by GNU Autoconf 2.59
Copyright (C) 2003 Free Software Foundation, Inc.
@@ -1255,7 +1255,7 @@ cat >&5 <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by dirsrv $as_me 1.2.2, which was
+It was created by dirsrv $as_me 1.2.3, which was
generated by GNU Autoconf 2.59. Invocation command line was
$ $0 $@
@@ -1901,7 +1901,7 @@ fi
# Define the identity of the package.
PACKAGE='dirsrv'
- VERSION='1.2.2'
+ VERSION='1.2.3'
cat >>confdefs.h <<_ACEOF
@@ -23301,6 +23301,8 @@ if test "$with_fhs_opt" = "yes"; then
sampledatadir=/data
# relative to datadir
scripttemplatedir=/script-templates
+ # relative to datadir
+ updatedir=/updates
# relative to libdir
serverdir=
# relative to libdir
@@ -23325,6 +23327,8 @@ else
sampledatadir=/$PACKAGE_NAME/data
# relative to datadir
scripttemplatedir=/$PACKAGE_NAME/script-templates
+ # relative to datadir
+ updatedir=/$PACKAGE_NAME/updates
# relative to libdir
serverdir=/$PACKAGE_NAME
# relative to libdir
@@ -23370,6 +23374,7 @@ defaultgroup=nobody
+
# check for --with-instconfigdir
echo "$as_me:$LINENO: checking for --with-instconfigdir" >&5
echo $ECHO_N "checking for --with-instconfigdir... $ECHO_C" >&6
@@ -27728,7 +27733,7 @@ _ASBOX
} >&5
cat >&5 <<_CSEOF
-This file was extended by dirsrv $as_me 1.2.2, which was
+This file was extended by dirsrv $as_me 1.2.3, which was
generated by GNU Autoconf 2.59. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -27791,7 +27796,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\
-dirsrv config.status 1.2.2
+dirsrv config.status 1.2.3
configured by $0, generated by GNU Autoconf 2.59,
with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
@@ -28089,6 +28094,7 @@ s,@scripttemplatedir@,$scripttemplatedir,;t t
s,@perldir@,$perldir,;t t
s,@infdir@,$infdir,;t t
s,@mibdir@,$mibdir,;t t
+s,@updatedir@,$updatedir,;t t
s,@defaultuser@,$defaultuser,;t t
s,@defaultgroup@,$defaultgroup,;t t
s,@instconfigdir@,$instconfigdir,;t t
diff --git a/configure.ac b/configure.ac
index b8866435..0e32cd84 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
# This version is the version returned by ns-slapd -v
-AC_INIT([dirsrv], [1.2.2], [http://bugzilla.redhat.com/])
+AC_INIT([dirsrv], [1.2.3], [http://bugzilla.redhat.com/])
# AC_CONFIG_HEADER must be called right after AC_INIT.
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([1.9 foreign subdir-objects])
@@ -205,6 +205,8 @@ if test "$with_fhs_opt" = "yes"; then
sampledatadir=/data
# relative to datadir
scripttemplatedir=/script-templates
+ # relative to datadir
+ updatedir=/updates
# relative to libdir
serverdir=
# relative to libdir
@@ -231,6 +233,8 @@ else
sampledatadir=/$PACKAGE_NAME/data
# relative to datadir
scripttemplatedir=/$PACKAGE_NAME/script-templates
+ # relative to datadir
+ updatedir=/$PACKAGE_NAME/updates
# relative to libdir
serverdir=/$PACKAGE_NAME
# relative to libdir
@@ -272,6 +276,7 @@ AC_SUBST(perldir)
AC_SUBST(infdir)
AC_SUBST(mibdir)
AC_SUBST(mandir)
+AC_SUBST(updatedir)
AC_SUBST(defaultuser)
AC_SUBST(defaultgroup)
diff --git a/ldap/admin/src/scripts/50addchainingsaslpwroles.ldif b/ldap/admin/src/scripts/50addchainingsaslpwroles.ldif
new file mode 100644
index 00000000..07ee93a9
--- /dev/null
+++ b/ldap/admin/src/scripts/50addchainingsaslpwroles.ldif
@@ -0,0 +1,6 @@
+dn: cn=config,cn=chaining database,cn=plugins,cn=config
+changetype: modify
+add: nsPossibleChainingComponents
+nsPossibleChainingComponents: cn=password policy,cn=components,cn=config
+nsPossibleChainingComponents: cn=sasl,cn=components,cn=config
+nsPossibleChainingComponents: cn=roles,cn=components,cn=config
diff --git a/ldap/admin/src/scripts/50bitstringsyntaxplugin.ldif b/ldap/admin/src/scripts/50bitstringsyntaxplugin.ldif
new file mode 100644
index 00000000..80916307
--- /dev/null
+++ b/ldap/admin/src/scripts/50bitstringsyntaxplugin.ldif
@@ -0,0 +1,14 @@
+dn: cn=Bit String Syntax,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+cn: Bit String
+nsslapd-pluginpath: libsyntax-plugin
+nsslapd-plugininitfunc: bitstring_init
+nsslapd-plugintype: syntax
+nsslapd-pluginenabled: on
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50deliverymethodsyntaxplugin.ldif b/ldap/admin/src/scripts/50deliverymethodsyntaxplugin.ldif
new file mode 100644
index 00000000..0103c5b0
--- /dev/null
+++ b/ldap/admin/src/scripts/50deliverymethodsyntaxplugin.ldif
@@ -0,0 +1,14 @@
+dn: cn=Delivery Method Syntax,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+cn: Delivery Method Syntax
+nsslapd-pluginpath: libsyntax-plugin
+nsslapd-plugininitfunc: delivery_init
+nsslapd-plugintype: syntax
+nsslapd-pluginenabled: on
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50derefplugin.ldif b/ldap/admin/src/scripts/50derefplugin.ldif
new file mode 100644
index 00000000..decadacd
--- /dev/null
+++ b/ldap/admin/src/scripts/50derefplugin.ldif
@@ -0,0 +1,16 @@
+dn: cn=deref,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+objectclass: nsContainer
+cn: deref
+nsslapd-pluginpath: libderef-plugin
+nsslapd-plugininitfunc: deref_init
+nsslapd-plugintype: preoperation
+nsslapd-pluginenabled: on
+nsslapd-plugin-depends-on-type: database
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50disableurisyntaxplugin.ldif b/ldap/admin/src/scripts/50disableurisyntaxplugin.ldif
new file mode 100644
index 00000000..28380366
--- /dev/null
+++ b/ldap/admin/src/scripts/50disableurisyntaxplugin.ldif
@@ -0,0 +1,9 @@
+dn: cn=URI Syntax,cn=plugins,cn=config
+changetype: modify
+replace: nsslapd-pluginenabled
+nsslapd-pluginenabled: off
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50enhancedguidesyntaxplugin.ldif b/ldap/admin/src/scripts/50enhancedguidesyntaxplugin.ldif
new file mode 100644
index 00000000..b5f8ddca
--- /dev/null
+++ b/ldap/admin/src/scripts/50enhancedguidesyntaxplugin.ldif
@@ -0,0 +1,14 @@
+dn: cn=Enhanced Guide Syntax,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+cn: Enhanced Guide Syntax
+nsslapd-pluginpath: libsyntax-plugin
+nsslapd-plugininitfunc: enhancedguide_init
+nsslapd-plugintype: syntax
+nsslapd-pluginenabled: on
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50entryusnindex.ldif b/ldap/admin/src/scripts/50entryusnindex.ldif
new file mode 100644
index 00000000..9196f677
--- /dev/null
+++ b/ldap/admin/src/scripts/50entryusnindex.ldif
@@ -0,0 +1,7 @@
+dn: cn=entryusn,cn=default indexes, cn=config,cn=ldbm database,cn=plugins,cn=config
+objectclass: top
+objectclass: nsIndex
+cn: entryusn
+nssystemindex: true
+nsindextype: eq
+nsmatchingrule: integerOrderingMatch
diff --git a/ldap/admin/src/scripts/50faxnumbersyntaxplugin.ldif b/ldap/admin/src/scripts/50faxnumbersyntaxplugin.ldif
new file mode 100644
index 00000000..1959cd3b
--- /dev/null
+++ b/ldap/admin/src/scripts/50faxnumbersyntaxplugin.ldif
@@ -0,0 +1,14 @@
+dn: cn=Facsimile Telephone Number Syntax,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+cn: Facsimile Telephone Number Syntax
+nsslapd-pluginpath: libsyntax-plugin
+nsslapd-plugininitfunc: facsimile_init
+nsslapd-plugintype: syntax
+nsslapd-pluginenabled: on
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50faxsyntaxplugin.ldif b/ldap/admin/src/scripts/50faxsyntaxplugin.ldif
new file mode 100644
index 00000000..3410c328
--- /dev/null
+++ b/ldap/admin/src/scripts/50faxsyntaxplugin.ldif
@@ -0,0 +1,14 @@
+dn: cn=Fax Syntax,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+cn: Fax Syntax
+nsslapd-pluginpath: libsyntax-plugin
+nsslapd-plugininitfunc: fax_init
+nsslapd-plugintype: syntax
+nsslapd-pluginenabled: on
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50guidesyntaxplugin.ldif b/ldap/admin/src/scripts/50guidesyntaxplugin.ldif
new file mode 100644
index 00000000..d9c3a087
--- /dev/null
+++ b/ldap/admin/src/scripts/50guidesyntaxplugin.ldif
@@ -0,0 +1,14 @@
+dn: cn=Guide Syntax,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+cn: Guide Syntax
+nsslapd-pluginpath: libsyntax-plugin
+nsslapd-plugininitfunc: guide_init
+nsslapd-plugintype: syntax
+nsslapd-pluginenabled: on
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50linkedattrsplugin.ldif b/ldap/admin/src/scripts/50linkedattrsplugin.ldif
new file mode 100644
index 00000000..a3216731
--- /dev/null
+++ b/ldap/admin/src/scripts/50linkedattrsplugin.ldif
@@ -0,0 +1,16 @@
+dn: cn=Linked Attributes,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+objectclass: nsContainer
+cn: Linked Attributes
+nsslapd-pluginpath: liblinkedattrs-plugin
+nsslapd-plugininitfunc: linked_attrs_init
+nsslapd-plugintype: preoperation
+nsslapd-pluginenabled: on
+nsslapd-plugin-depends-on-type: database
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50memberofindex.ldif b/ldap/admin/src/scripts/50memberofindex.ldif
new file mode 100644
index 00000000..6ede0836
--- /dev/null
+++ b/ldap/admin/src/scripts/50memberofindex.ldif
@@ -0,0 +1,6 @@
+dn: cn=memberOf,cn=default indexes, cn=config,cn=ldbm database,cn=plugins,cn=config
+objectclass: top
+objectclass: nsIndex
+cn: memberOf
+nssystemindex: false
+nsindextype: eq
diff --git a/ldap/admin/src/scripts/50memberofplugin.ldif b/ldap/admin/src/scripts/50memberofplugin.ldif
new file mode 100644
index 00000000..722e9435
--- /dev/null
+++ b/ldap/admin/src/scripts/50memberofplugin.ldif
@@ -0,0 +1,17 @@
+dn: cn=MemberOf Plugin,cn=plugins,cn=config
+objectClass: top
+objectClass: nsSlapdPlugin
+objectClass: extensibleObject
+cn: MemberOf Plugin
+nsslapd-pluginpath: libmemberof-plugin
+nsslapd-plugininitfunc: memberof_postop_init
+nsslapd-plugintype: postoperation
+nsslapd-pluginenabled: off
+nsslapd-plugin-depends-on-type: database
+memberOfGroupAttr: member
+memberOfAttr: memberOf
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50nameuidsyntaxplugin.ldif b/ldap/admin/src/scripts/50nameuidsyntaxplugin.ldif
new file mode 100644
index 00000000..f4a33052
--- /dev/null
+++ b/ldap/admin/src/scripts/50nameuidsyntaxplugin.ldif
@@ -0,0 +1,14 @@
+dn: cn=Name And Optional UID Syntax,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+cn: Name And Optional UID Syntax
+nsslapd-pluginpath: libsyntax-plugin
+nsslapd-plugininitfunc: nameoptuid_init
+nsslapd-plugintype: syntax
+nsslapd-pluginenabled: on
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50numericstringsyntaxplugin.ldif b/ldap/admin/src/scripts/50numericstringsyntaxplugin.ldif
new file mode 100644
index 00000000..a5ba17fa
--- /dev/null
+++ b/ldap/admin/src/scripts/50numericstringsyntaxplugin.ldif
@@ -0,0 +1,14 @@
+dn: cn=Numeric String Syntax,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+cn: Numeric String Syntax
+nsslapd-pluginpath: libsyntax-plugin
+nsslapd-plugininitfunc: numstr_init
+nsslapd-plugintype: syntax
+nsslapd-pluginenabled: on
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50printablestringsyntaxplugin.ldif b/ldap/admin/src/scripts/50printablestringsyntaxplugin.ldif
new file mode 100644
index 00000000..d8dad9b7
--- /dev/null
+++ b/ldap/admin/src/scripts/50printablestringsyntaxplugin.ldif
@@ -0,0 +1,14 @@
+dn: cn=Printable String Syntax,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+cn: Printable String Syntax
+nsslapd-pluginpath: libsyntax-plugin
+nsslapd-plugininitfunc: printable_init
+nsslapd-plugintype: syntax
+nsslapd-pluginenabled: on
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50schemareloadplugin.ldif b/ldap/admin/src/scripts/50schemareloadplugin.ldif
new file mode 100644
index 00000000..b6d12a50
--- /dev/null
+++ b/ldap/admin/src/scripts/50schemareloadplugin.ldif
@@ -0,0 +1,14 @@
+dn: cn=Schema Reload,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+cn: Schema Reload
+nsslapd-pluginpath: libschemareload-plugin
+nsslapd-plugininitfunc: schemareload_init
+nsslapd-plugintype: object
+nsslapd-pluginenabled: on
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50syntaxvalidplugin.ldif b/ldap/admin/src/scripts/50syntaxvalidplugin.ldif
new file mode 100644
index 00000000..ee0a0856
--- /dev/null
+++ b/ldap/admin/src/scripts/50syntaxvalidplugin.ldif
@@ -0,0 +1,14 @@
+dn: cn=Syntax Validation Task,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+cn: Syntax Validation Task
+nsslapd-pluginpath: libsyntax-plugin
+nsslapd-plugininitfunc: syntax_validate_task_init
+nsslapd-plugintype: object
+nsslapd-pluginenabled: on
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50teletexterminalidsyntaxplugin.ldif b/ldap/admin/src/scripts/50teletexterminalidsyntaxplugin.ldif
new file mode 100644
index 00000000..ae16488d
--- /dev/null
+++ b/ldap/admin/src/scripts/50teletexterminalidsyntaxplugin.ldif
@@ -0,0 +1,14 @@
+dn: cn=Teletex Terminal Identifier Syntax,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+cn: Teletex Terminal Identifier Syntax
+nsslapd-pluginpath: libsyntax-plugin
+nsslapd-plugininitfunc: teletex_init
+nsslapd-plugintype: syntax
+nsslapd-pluginenabled: on
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50telexnumbersyntaxplugin.ldif b/ldap/admin/src/scripts/50telexnumbersyntaxplugin.ldif
new file mode 100644
index 00000000..cf288206
--- /dev/null
+++ b/ldap/admin/src/scripts/50telexnumbersyntaxplugin.ldif
@@ -0,0 +1,14 @@
+dn: cn=Telex Number Syntax,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+cn: Telex Number Syntax
+nsslapd-pluginpath: libsyntax-plugin
+nsslapd-plugininitfunc: telex_init
+nsslapd-plugintype: syntax
+nsslapd-pluginenabled: on
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/50usnplugin.ldif b/ldap/admin/src/scripts/50usnplugin.ldif
new file mode 100644
index 00000000..5fd2cfba
--- /dev/null
+++ b/ldap/admin/src/scripts/50usnplugin.ldif
@@ -0,0 +1,15 @@
+dn: cn=USN,cn=plugins,cn=config
+objectclass: top
+objectclass: nsSlapdPlugin
+objectclass: extensibleObject
+cn: USN
+nsslapd-pluginpath: libusn-plugin
+nsslapd-plugininitfunc: usn_init
+nsslapd-plugintype: object
+nsslapd-pluginenabled: off
+nsslapd-plugin-depends-on-type: database
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC
diff --git a/ldap/admin/src/scripts/60upgradeschemafiles.pl b/ldap/admin/src/scripts/60upgradeschemafiles.pl
new file mode 100644
index 00000000..b0f57580
--- /dev/null
+++ b/ldap/admin/src/scripts/60upgradeschemafiles.pl
@@ -0,0 +1,54 @@
+
+use DSCreate qw(installSchema);
+
+sub runinst {
+ my ($inf, $inst, $dseldif, $conn) = @_;
+
+ if (!$inf->{slapd}->{schema_dir} or (! -d $inf->{slapd}->{schema_dir})) {
+ return ('error_reading_schema_dir', $inf->{slapd}->{schema_dir});
+ }
+
+ # these schema files are obsolete, or we want to replace
+ # them with newer versions
+ my @toremove = qw(00core.ldif 01common.ldif 05rfc2247.ldif 10presence.ldif 28pilot.ldif 50ns-directory.ldif 60mozilla.ldif);
+
+ # make a backup directory to store the deleted schema, then
+ # don't really delete it, just move it to that directory
+ my $mode = (stat($inf->{slapd}->{schema_dir}))[2];
+ my $bakdir = $inf->{slapd}->{schema_dir} . ".bak";
+ if (! -d $bakdir) {
+ $! = 0; # clear
+ mkdir $bakdir, $mode;
+ if ($!) {
+ return ('error_creating_directory', $bakdir, $!);
+ }
+ }
+
+ my @errs;
+ for my $file (@toremove) {
+ my $oldname = $inf->{slapd}->{schema_dir} . "/" . $file;
+ next if (! -f $oldname); # does not exist - skip - already (re)moved
+ my $newname = "$bakdir/$file";
+ $! = 0; # clear
+ rename $oldname, $newname;
+ if ($!) {
+ push @errs, ["error_renaming_schema", $oldname, $newname, $!];
+ }
+ }
+
+ if (@errs) { # errors backing up schema
+ # restore the original schema files
+ for my $file (@toremove) {
+ my $oldname = "$bakdir/$file";
+ next if (! -f $oldname); # does not exist - not backed up
+ my $newname = $inf->{slapd}->{schema_dir} . "/" . $file;
+ next if (-f $newname); # not removed
+ rename $oldname, $newname;
+ }
+ return @errs;
+ }
+
+ # after removing them, just add everything in the default
+ # schema directory
+ return installSchema($inf, 1);
+}
diff --git a/ldap/admin/src/scripts/DSCreate.pm.in b/ldap/admin/src/scripts/DSCreate.pm.in
index 15302b9c..a7ab5fae 100644
--- a/ldap/admin/src/scripts/DSCreate.pm.in
+++ b/ldap/admin/src/scripts/DSCreate.pm.in
@@ -64,8 +64,8 @@ use Mozilla::LDAP::LDIF;
use Exporter;
@ISA = qw(Exporter);
-@EXPORT = qw(createDSInstance removeDSInstance);
-@EXPORT_OK = qw(createDSInstance removeDSInstance);
+@EXPORT = qw(createDSInstance removeDSInstance setDefaults createInstanceScripts installSchema);
+@EXPORT_OK = qw(createDSInstance removeDSInstance setDefaults createInstanceScripts installSchema);
use strict;
@@ -207,9 +207,9 @@ sub makeDSDirs {
# more privileged user than the directory server, but
# still allows the admin server to manage directory
# server files/dirs without being root
- for (qw(inst_dir config_dir schema_dir log_dir lock_dir run_dir tmp_dir
+ for my $kw (qw(inst_dir config_dir schema_dir log_dir lock_dir run_dir tmp_dir
cert_dir db_dir ldif_dir bak_dir)) {
- my $dir = $inf->{slapd}->{$_};
+ my $dir = $inf->{slapd}->{$kw};
@errs = makePaths($dir, $mode, $inf->{General}->{SuiteSpotUserID},
$inf->{General}->{SuiteSpotGroup});
if (@errs) {
@@ -240,8 +240,8 @@ sub makeDSDirs {
}
# set the group of the parent dir of config_dir and inst_dir
if (defined($inf->{General}->{SuiteSpotGroup})) {
- for (qw(inst_dir config_dir)) {
- my $dir = $inf->{slapd}->{$_};
+ for my $kw (qw(inst_dir config_dir)) {
+ my $dir = $inf->{slapd}->{$kw};
my $parent = dirname($dir);
# changeOwnerMode(inf, mode, file, gidonly & default mode);
@errs = changeOwnerMode($inf, 7, $parent, 5);
@@ -256,6 +256,7 @@ sub makeDSDirs {
sub createInstanceScripts {
my $inf = shift;
+ my $skip = shift;
my $perlexec = "@perlexec@" || "/usr/bin/env perl";
my $myperl = "!$perlexec";
my $mydevnull = (-f "/dev/null" ? " /dev/null " : " NUL ");
@@ -280,18 +281,21 @@ sub createInstanceScripts {
);
my $dir = "$inf->{General}->{prefix}@taskdir@";
- for (glob("$dir/template-*")) {
- my $basename = $_;
+ for my $file (glob("$dir/template-*")) {
+ my $basename = $file;
$basename =~ s/^.*template-//;
my $destfile = "$inf->{slapd}->{inst_dir}/$basename";
- if (!open(SRC, "< $_")) {
- return ("error_opening_scripttmpl", $_, $!);
+
+ next if ($skip and -f $destfile); # in skip mode, skip files that already exist
+
+ if (!open(SRC, "< $file")) {
+ return ("error_opening_scripttmpl", $file, $!);
}
if (!open(DEST, "> $destfile")) {
return ("error_opening_scripttmpl", $destfile, $!);
}
my $contents; # slurp entire file into memory
- read SRC, $contents, int(-s $_);
+ read SRC, $contents, int(-s $file);
close(SRC);
while (my ($key, $val) = each %maptable) {
$contents =~ s/\{\{$key\}\}/$val/g;
@@ -482,6 +486,7 @@ sub makeOtherConfigFiles {
sub installSchema {
my $inf = shift;
+ my $skip = shift;
my @errs;
my @schemafiles = ();
if (!defined($inf->{slapd}->{install_full_schema}) or
@@ -499,10 +504,13 @@ sub installSchema {
push @schemafiles, $inf->{slapd}->{SchemaFile};
}
}
- for (@schemafiles) {
- my $src = $_;
+ for my $file (@schemafiles) {
+ my $src = $file;
my $basename = basename($src);
my $dest = "$inf->{slapd}->{schema_dir}/$basename";
+
+ next if ($skip and -f $dest); # skip files that already exist
+
$! = 0; # clear errno
copy($src, $dest);
if ($!) {
@@ -667,17 +675,18 @@ sub startServer {
}
my $pos = tell(IN);
+ my $line;
while (($done == 0) && (time < $timeout)) {
- for (; ($done == 0) && ($_ = <IN>); $pos = tell(IN)) {
- $lastLine = $_;
- debug(1, $_);
- if (/$cmdPat/) {
+ for (; ($done == 0) && ($line = <IN>); $pos = tell(IN)) {
+ $lastLine = $line;
+ debug(1, $line);
+ if ($line =~ /$cmdPat/) {
$done = 1;
$started = 1;
- } elsif (/Initialization Failed/) {
+ } elsif ($line =~ /Initialization Failed/) {
debug(1, "Server failed to start, retrying . . .\n");
$code = system($startcmd);
- } elsif (/exiting\./) {
+ } elsif ($line =~ /exiting\./) {
debug(1, "Server failed to start, retrying . . .\n");
$code = system($startcmd);
}
@@ -894,9 +903,9 @@ sub updateSelinuxPolicy {
# if selinux is not available, do nothing
if ("@with_selinux@") {
# run restorecon on all directories we created
- for (qw(inst_dir config_dir schema_dir log_dir lock_dir run_dir tmp_dir
+ for my $kw (qw(inst_dir config_dir schema_dir log_dir lock_dir run_dir tmp_dir
cert_dir db_dir ldif_dir bak_dir)) {
- my $dir = $inf->{slapd}->{$_};
+ my $dir = $inf->{slapd}->{$kw};
system("restorecon -R $dir");
}
diff --git a/ldap/admin/src/scripts/DSUpdate.pm.in b/ldap/admin/src/scripts/DSUpdate.pm.in
new file mode 100644
index 00000000..23f33899
--- /dev/null
+++ b/ldap/admin/src/scripts/DSUpdate.pm.in
@@ -0,0 +1,505 @@
+# BEGIN COPYRIGHT BLOCK
+# This Program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; version 2 of the License.
+#
+# This Program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA 02111-1307 USA.
+#
+# In addition, as a special exception, Red Hat, Inc. gives You the additional
+# right to link the code of this Program with code not covered under the GNU
+# General Public License ("Non-GPL Code") and to distribute linked combinations
+# including the two, subject to the limitations in this paragraph. Non-GPL Code
+# permitted under this exception must only link to the code of this Program
+# through those well defined interfaces identified in the file named EXCEPTION
+# found in the source code files (the "Approved Interfaces"). The files of
+# Non-GPL Code may instantiate templates or use macros or inline functions from
+# the Approved Interfaces without causing the resulting work to be covered by
+# the GNU General Public License. Only Red Hat, Inc. may make changes or
+# additions to the list of Approved Interfaces. You must obey the GNU General
+# Public License in all respects for all of the Program code and other code used
+# in conjunction with the Program except the Non-GPL Code covered by this
+# exception. If you modify this file, you may extend this exception to your
+# version of the file, but you are not obligated to do so. If you do not wish to
+# provide this exception without modification, you must delete this exception
+# statement from your version and license this file solely under the GPL without
+# exception.
+#
+#
+# Copyright (C) 2009 Red Hat, Inc.
+# All rights reserved.
+# END COPYRIGHT BLOCK
+#
+
+###########################
+#
+# This perl module provides code to update/upgrade directory
+# server shared files/config and instance specific files/config
+#
+##########################
+
+package DSUpdate;
+use Util;
+use Inf;
+use FileConn;
+use DSCreate qw(setDefaults createInstanceScripts);
+
+use File::Basename qw(basename dirname);
+
+# load perldap
+use Mozilla::LDAP::Conn;
+use Mozilla::LDAP::Utils qw(normalizeDN);
+use Mozilla::LDAP::API qw(ldap_explode_dn);
+use Mozilla::LDAP::LDIF;
+
+use Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(updateDS);
+@EXPORT_OK = qw(updateDS);
+
+use strict;
+
+use SetupLog;
+
+# the default location of the updates - this is a subdir
+# of the directory server data dir (e.g. /usr/share/dirsrv)
+# the default directory is read-only - if you need to provide
+# additional updates, pass in additional update directories
+# to updateDS
+my $DS_UPDATE_PATH = "@updatedir@";
+
+my $PRE_STAGE = "pre";
+my $PREINST_STAGE = "preinst";
+my $RUNINST_STAGE = "runinst";
+my $POSTINST_STAGE = "postinst";
+my $POST_STAGE = "post";
+
+my @STAGES = ($PRE_STAGE, $PREINST_STAGE, $RUNINST_STAGE, $POSTINST_STAGE, $POST_STAGE);
+my @INSTSTAGES = ($PREINST_STAGE, $RUNINST_STAGE, $POSTINST_STAGE);
+
+# used to create unique package names for loading updates
+# from perl scriptlets
+my $pkgname = "Package00000000000";
+
+# generate and return a unique package name that is a
+# subpackage of our current package
+sub get_pkgname {
+ return __PACKAGE__ . "::" . $pkgname++;
+}
+
+sub loadUpdates {
+ my $errs = shift;
+ my $dirs = shift;
+ my $mapinfo = shift || {};
+ my @updates; # a list of hash refs, sorted in execution order
+
+ for my $dir (@{$dirs}) {
+ for my $file (glob("$dir/*")) {
+ my $name = basename($file);
+ next if $name !~ /^\d\d/; # we only consider files that begin with two digits
+# print "name = $name\n";
+ my $href = { path => $file, name => $name };
+ if ($file =~ /\.(pl|pm)$/) { # a perl file
+ my $fullpkg = get_pkgname(); # get a unique package name for the file
+ # this will import the update functions from the given file
+ # each file is given its own private namespace via the package
+ # directive below
+ # we have to use the eval because package takes a "bareword" -
+ # you cannot pass a dynamically constructed string to package
+ eval "package $fullpkg; require q($file)"; # "import" it
+ if ($@) {
+ if ($@ =~ /did not return a true value/) {
+ # this usually means the file did not end with 1; - just use it anyway
+ debug(3, "notice: $file does not return a true value - using anyway\n");
+ } else {
+ # probably a syntax or other compilation error in the file
+ # we can't safely use it, so log it and skip it
+ push @{$errs}, ['error_loading_update', $file, $@];
+ debug(0, "Error: not applying update $file. Error: $@\n");
+ next; # skip this one
+ }
+ }
+ # grab the hook functions from the update
+ for my $fn (@STAGES) {
+ # this is some deep perl magic - see the perl Symbol Table
+ # documentation for the gory details
+ # We're trying to find if the file defined a symbol called
+ # pre, run, post, etc. and if so, if that symbol is code
+ no strict 'refs'; # turn off strict refs to use magic
+ if (*{$fullpkg . "::" . $fn}{CODE}) {
+ debug(5, "$file $fn is defined\n");
+ # store the "function pointer" in the href for this update
+ $href->{$fn} = \&{$fullpkg . "::" . $fn};
+ } else {
+ debug(5, "$file $fn is not defined or not a subroutine\n");
+ }
+ }
+ } else { # some other type of file
+ $href->{file} = 1;
+ }
+ if ($mapinfo->{$file}) {
+ $href->{mapper} = $mapinfo->{$file}->{mapper};
+ $href->{infary} = $mapinfo->{$file}->{infary};
+ }
+ push @updates, $href;
+ }
+ }
+
+ # we have all the updates now - sort by the name
+ @updates = sort { $a->{name} cmp $b->{name} } @updates;
+
+ return @updates;
+}
+
+sub applyLDIFUpdate {
+ my ($upd, $conn, $inf) = @_;
+ my @errs;
+ my $path = ref($upd) ? $upd->{path} : $upd;
+
+ my $mapper;
+ my @infary;
+ # caller can set mapper to use and additional inf to use
+ if (ref($upd)) {
+ if ($upd->{mapper}) {
+ $mapper = new Inf($upd->{mapper});
+ }
+ if ($upd->{infary}) {
+ @infary = @{$upd->{infary}};
+ }
+ }
+ if (!$mapper) {
+ $mapper = new Inf("$inf->{General}->{prefix}@infdir@/dsupdate.map");
+ }
+ my $dsinf = new Inf("$inf->{General}->{prefix}@infdir@/slapd.inf");
+
+ $mapper = process_maptbl($mapper, \@errs, $inf, $dsinf, @infary);
+ if (!$mapper or @errs) {
+ return @errs;
+ }
+
+ getMappedEntries($mapper, [$path], \@errs, \&check_and_add_entry,
+ [$conn]);
+
+ return @errs;
+}
+
+# process an update from an ldif file or executable
+# LDIF files only apply to instance updates, so ignore
+# LDIF files when not processing updates for instances
+sub processUpdate {
+ my ($upd, $inf, $configdir, $stage, $inst, $dseldif, $conn) = @_;
+ my @errs;
+ # $upd is either a hashref or a simple path name
+ my $path = ref($upd) ? $upd->{path} : $upd;
+ if ($path =~ /\.ldif$/) {
+ # ldif files are only processed during the runinst stage
+ if ($stage eq $RUNINST_STAGE) {
+ @errs = applyLDIFUpdate($upd, $conn, $inf);
+ }
+ } elsif (-x $path) {
+ # setup environment
+ $ENV{DS_UPDATE_STAGE} = $stage;
+ $ENV{DS_UPDATE_DIR} = $configdir;
+ $ENV{DS_UPDATE_INST} = $inst; # empty if not instance specific
+ $ENV{DS_UPDATE_DSELDIF} = $dseldif; # empty if not instance specific
+ $? = 0; # clear error condition
+ my $output = `$path 2>&1`;
+ if ($?) {
+ @errs = ('error_executing_update', $path, $?, $output);
+ }
+ debug(1, $output);
+ } else {
+ @errs = ('error_unknown_update', $path);
+ }
+
+ return @errs;
+}
+
+#
+sub updateDS {
+ # get base configdir, instances from setup
+ my $setup = shift;
+ # get other info from inf
+ my $inf = $setup->{inf};
+ # directories containing updates to apply
+ my $dirs = shift || [];
+ my $mapinfo = shift;
+ # the default directory server update path
+ if ($inf->{slapd}->{updatedir}) {
+ push @{$dirs}, $inf->{General}->{prefix} . $inf->{slapd}->{updatedir};
+ } else {
+ push @{$dirs}, $inf->{General}->{prefix} . $DS_UPDATE_PATH;
+ }
+ my @errs;
+ my $force = $setup->{force};
+
+ my @updates = loadUpdates(\@errs, $dirs, $mapinfo);
+
+ if (@errs and !$force) {
+ return @errs;
+ }
+
+ if (!@updates) {
+ # nothing to do?
+ debug(0, "No updates to apply in @{$dirs}\n");
+ return @errs;
+ }
+
+ # run pre-update hooks
+ for my $upd (@updates) {
+ my @localerrs;
+ if ($upd->{$PRE_STAGE}) {
+ debug(1, "Running stage $PRE_STAGE update ", $upd->{path}, "\n");
+ @localerrs = &{$upd->{$PRE_STAGE}}($inf, $setup->{configdir});
+ } elsif ($upd->{file}) {
+ debug(1, "Running stage $PRE_STAGE update ", $upd->{path}, "\n");
+ @localerrs = processUpdate($upd, $inf, $setup->{configdir}, $PRE_STAGE);
+ }
+ if (@localerrs) {
+ push @errs, @localerrs;
+ if (!$force) {
+ return @errs;
+ }
+ }
+ }
+
+ # update each instance
+ for my $inst ($setup->getDirServers()) {
+ my @localerrs = updateDSInstance($inst, $inf, $setup->{configdir}, \@updates, $force);
+ if (@localerrs) {
+ # push array here because localerrs will likely be an array of
+ # array refs already
+ push @errs, @localerrs;
+ if (!$force) {
+ return @errs;
+ }
+ }
+ }
+
+ # run post-update hooks
+ for my $upd (@updates) {
+ my @localerrs;
+ if ($upd->{$POST_STAGE}) {
+ debug(1, "Running stage $POST_STAGE update ", $upd->{path}, "\n");
+ @localerrs = &{$upd->{$POST_STAGE}}($inf, $setup->{configdir});
+ } elsif ($upd->{file}) {
+ debug(1, "Running stage $POST_STAGE update ", $upd->{path}, "\n");
+ @localerrs = processUpdate($upd, $inf, $setup->{configdir}, $POST_STAGE);
+ }
+ if (@localerrs) {
+ push @errs, @localerrs;
+ if (!$force) {
+ return @errs;
+ }
+ }
+ }
+
+ return @errs;
+}
+
+sub updateDSInstance {
+ my ($inst, $inf, $configdir, $updates, $force) = @_;
+ my @errs;
+
+ my $dseldif = "$configdir/$inst/dse.ldif";
+
+ # get the information we need from the instance
+ delete $inf->{slapd}; # delete old data, if any
+ if (@errs = initInfFromInst($inf, $dseldif, $configdir, $inst)) {
+ return @errs;
+ }
+
+ # upgrade instance scripts
+ if (@errs = createInstanceScripts($inf, 1)) {
+ return @errs;
+ }
+
+ my $conn;
+ if ($inf->{General}->{UpdateMode} eq 'online') {
+ # open a connection to the directory server to upgrade
+ my $host = $inf->{General}->{FullMachineName};
+ my $port = $inf->{slapd}->{ServerPort};
+ # this says RootDN and password, but it can be any administrative DN
+ # such as the one used by the console
+ my $binddn = $inf->{$inst}->{RootDN} || $inf->{slapd}->{RootDN};
+ my $bindpw = $inf->{$inst}->{RootDNPwd};
+ my $certdir = $inf->{$inst}->{cert_dir} || $inf->{$inst}->{config_dir} || $inf->{slapd}->{cert_dir};
+
+ $conn = new Mozilla::LDAP::Conn({ host => $host, port => $port, bind => $binddn,
+ pswd => $bindpw, cert => $certdir, starttls => 1 });
+ if (!$conn) {
+ debug(0, "Could not open TLS connection to $host:$port - trying regular connection\n");
+ $conn = new Mozilla::LDAP::Conn({ host => $host, port => $port, bind => $binddn,
+ pswd => $bindpw });
+ }
+
+ if (!$conn) {
+ debug(0, "Could not open a connection to $host:$port\n");
+ return ('error_online_update', $host, $port, $binddn);
+ }
+ } else {
+ $conn = new FileConn($dseldif);
+ if (!$conn) {
+ debug(0, "Could not open a connection to $dseldif: $!\n");
+ return ('error_offline_update', $dseldif, $!);
+ }
+ }
+
+ # run pre-instance hooks first, then runinst hooks, then postinst hooks
+ # the DS_UPDATE_STAGE
+ for my $stage (@INSTSTAGES) {
+ # always process these first in the runinst stage - we don't really have any
+ # other good way to process conditional features during update
+ if ($stage eq $RUNINST_STAGE) {
+ my @ldiffiles;
+ if ("@enable_pam_passthru@") {
+ push @ldiffiles, "$inf->{General}->{prefix}@templatedir@/template-pampta.ldif";
+ }
+ if ("@enable_bitwise@") {
+ push @ldiffiles, "$inf->{General}->{prefix}@templatedir@/template-bitwise.ldif";
+ }
+ if ("@enable_dna@") {
+ push @ldiffiles, "$inf->{General}->{prefix}@templatedir@/template-dnaplugin.ldif";
+ push @ldiffiles, $inf->{General}->{prefix} . $DS_UPDATE_PATH . "/dnaplugindepends.ldif";
+ }
+ for my $ldiffile (@ldiffiles) {
+ my @localerrs = processUpdate($ldiffile, $inf, $configdir, $stage,
+ $inst, $dseldif, $conn);
+ if (@localerrs) {
+ push @errs, @localerrs;
+ if (!$force) {
+ $conn->close();
+ return @errs;
+ }
+ }
+ }
+ }
+ for my $upd (@{$updates}) {
+ my @localerrs;
+ if ($upd->{$stage}) {
+ debug(1, "Running stage $stage update ", $upd->{path}, "\n");
+ @localerrs = &{$upd->{$stage}}($inf, $inst, $dseldif, $conn);
+ } elsif ($upd->{file}) {
+ debug(1, "Running stage $stage update ", $upd->{path}, "\n");
+ @localerrs = processUpdate($upd, $inf, $configdir, $stage,
+ $inst, $dseldif, $conn);
+ }
+ if (@localerrs) {
+ push @errs, @localerrs;
+ if (!$force) {
+ $conn->close();
+ return @errs;
+ }
+ }
+ }
+ }
+
+ $conn->close();
+ return @errs;
+}
+
+# populate the fields in the inf we need to perform upgrade
+# tasks from the information in the instance dse.ldif and
+# other config
+sub initInfFromInst {
+ my ($inf, $dseldif, $configdir, $inst) = @_;
+ my $conn = new FileConn($dseldif, 1);
+ if (!$conn) {
+ debug(1, "Error: Could not open config file $dseldif: Error $!\n");
+ return ('error_opening_dseldif', $dseldif, $!);
+ }
+
+ my $dn = "cn=config";
+ my $entry = $conn->search($dn, "base", "(cn=*)", 0);
+ if (!$entry) {
+ $conn->close();
+ debug(1, "Error: Search $dn in $dseldif failed: ".$conn->getErrorString()."\n");
+ return ('error_finding_config_entry', $dn, $dseldif, $conn->getErrorString());
+ }
+
+ my $servid = $inst;
+ $servid =~ s/slapd-//;
+
+ $inf->{General}->{FullMachineName} = $entry->getValue("nsslapd-localhost");
+ $inf->{General}->{SuiteSpotUserID} = $entry->getValue("nsslapd-localuser");
+ $inf->{slapd}->{ServerPort} = $entry->getValue("nsslapd-port");
+ $inf->{slapd}->{ldapifilepath} = $entry->getValue("nsslapd-ldapifilepath");
+ if (!$inf->{$inst}->{RootDN}) {
+ $inf->{$inst}->{RootDN} || $entry->getValue('nsslapd-rootdn');
+ }
+ # we don't use this password - we either use {$inst} password or
+ # none at all
+ $inf->{slapd}->{RootDNPwd} = '{SSHA}dummy';
+ if (!$inf->{$inst}->{cert_dir}) {
+ $inf->{$inst}->{cert_dir} = $entry->getValue('nsslapd-certdir');
+ }
+ $inf->{slapd}->{cert_dir} = $inf->{$inst}->{cert_dir};
+ if (!$inf->{slapd}->{ldif_dir}) {
+ $inf->{slapd}->{ldif_dir} = $entry->getValue('nsslapd-ldifdir');
+ }
+ if (!$inf->{slapd}->{ServerIdentifier}) {
+ $inf->{slapd}->{ServerIdentifier} = $servid;
+ }
+ if (!$inf->{slapd}->{bak_dir}) {
+ $inf->{slapd}->{bak_dir} = $entry->getValue('nsslapd-bakdir');
+ }
+ if (!$inf->{slapd}->{config_dir}) {
+ $inf->{slapd}->{config_dir} = $configdir;
+ }
+ if (!$inf->{slapd}->{inst_dir}) {
+ $inf->{slapd}->{inst_dir} = $entry->getValue('nsslapd-instancedir');
+ }
+ if (!$inf->{slapd}->{run_dir}) {
+ $inf->{slapd}->{run_dir} = $entry->getValue('nsslapd-rundir');
+ }
+ if (!$inf->{slapd}->{schema_dir}) {
+ $inf->{slapd}->{schema_dir} = $entry->getValue('nsslapd-schemadir');
+ }
+ if (!$inf->{slapd}->{lock_dir}) {
+ $inf->{slapd}->{lock_dir} = $entry->getValue('nsslapd-lockdir');
+ }
+ if (!$inf->{slapd}->{log_dir}) {
+ # use the errorlog dir
+ my $logfile = $entry->getValue('nsslapd-errorlog');
+ if ($logfile) {
+ $inf->{slapd}->{log_dir} = dirname($logfile);
+ }
+ }
+ if (!$inf->{slapd}->{sasl_path}) {
+ $inf->{slapd}->{sasl_path} = $entry->getValue('nsslapd-saslpath');
+ }
+
+
+ # dn: cn=config,cn=ldbm database,cn=plugins,cn=config
+ $dn = "cn=config,cn=ldbm database,cn=plugins,cn=config";
+ $entry = $conn->search($dn, "base", "(cn=*)", 0);
+ if (!$entry) {
+ $conn->close();
+ debug(1, "Error: Search $dn in $dseldif failed: ".$conn->getErrorString()."\n");
+ return ('error_finding_config_entry', $dn, $dseldif, $conn->getErrorString());
+ }
+
+ if (!$inf->{slapd}->{db_dir}) {
+ $inf->{slapd}->{db_dir} = $entry->getValue('nsslapd-directory');
+ }
+
+ $conn->close(); # don't need this anymore
+
+ # set defaults for things we don't know how to find, after setting the values
+ # we do know how to find
+ return setDefaults($inf);
+}
+
+1;
+
+# emacs settings
+# Local Variables:
+# mode:perl
+# indent-tabs-mode: nil
+# tab-width: 4
+# End:
diff --git a/ldap/admin/src/scripts/DSUpdateDialogs.pm b/ldap/admin/src/scripts/DSUpdateDialogs.pm
new file mode 100644
index 00000000..32185b88
--- /dev/null
+++ b/ldap/admin/src/scripts/DSUpdateDialogs.pm
@@ -0,0 +1,181 @@
+# BEGIN COPYRIGHT BLOCK
+# This Program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; version 2 of the License.
+#
+# This Program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA 02111-1307 USA.
+#
+# In addition, as a special exception, Red Hat, Inc. gives You the additional
+# right to link the code of this Program with code not covered under the GNU
+# General Public License ("Non-GPL Code") and to distribute linked combinations
+# including the two, subject to the limitations in this paragraph. Non-GPL Code
+# permitted under this exception must only link to the code of this Program
+# through those well defined interfaces identified in the file named EXCEPTION
+# found in the source code files (the "Approved Interfaces"). The files of
+# Non-GPL Code may instantiate templates or use macros or inline functions from
+# the Approved Interfaces without causing the resulting work to be covered by
+# the GNU General Public License. Only Red Hat, Inc. may make changes or
+# additions to the list of Approved Interfaces. You must obey the GNU General
+# Public License in all respects for all of the Program code and other code used
+# in conjunction with the Program except the Non-GPL Code covered by this
+# exception. If you modify this file, you may extend this exception to your
+# version of the file, but you are not obligated to do so. If you do not wish to
+# provide this exception without modification, you must delete this exception
+# statement from your version and license this file solely under the GPL without
+# exception.
+#
+#
+# Copyright (C) 2009 Red Hat, Inc.
+# All rights reserved.
+# END COPYRIGHT BLOCK
+#
+
+package DSUpdateDialogs;
+
+use strict;
+
+use DialogManager;
+use Setup;
+use Dialog;
+use Util;
+use FileConn;
+
+my @updateadmindialogs;
+
+my $updatewelcome = new DialogYesNo (
+ $EXPRESS,
+ ['update_dialog_first', 'brand', 'brand'],
+ 1,
+ sub {
+ my $self = shift;
+ my $ans = shift;
+ my $res = $self->handleResponse($ans);
+ if ($res == $DialogManager::NEXT) {
+ $res = $DialogManager::ERR if (!$self->isYes());
+ }
+ return $res;
+ },
+ ['update_dialog_first_prompt'],
+);
+
+my $updatemode = new Dialog (
+ $EXPRESS,
+ 'update_dialog_mode',
+ sub {
+ my $self = shift;
+ return $self->{manager}->{inf}->{General}->{UpdateMode} ||
+ 'quit';
+ },
+ sub {
+ my $self = shift;
+ my $ans = shift;
+ my $res = $DialogManager::ERR;
+
+ if ($ans =~ /^off/i) {
+ $self->{manager}->{inf}->{General}->{UpdateMode} = 'offline';
+ $res = $DialogManager::NEXT;
+ for (@updateadmindialogs) {
+ $_->disable(); # don't need admins and passwords
+ }
+ } elsif ($ans =~ /^on/i) {
+ $self->{manager}->{inf}->{General}->{UpdateMode} = 'online';
+ $res = $DialogManager::NEXT;
+ if (!@updateadmindialogs) {
+ @updateadmindialogs = makeInstanceDialogs($self->{manager});
+ $self->{manager}->addDialog(@updateadmindialogs);
+ }
+ for (@updateadmindialogs) {
+ $_->enable(); # need admins and passwords
+ }
+ }
+ return $res;
+ },
+ ['update_dialog_mode_prompt']
+);
+
+sub makeInstanceDialogs {
+ my $manager = shift;
+ # for each directory server instance, create a dialog that prompts
+ # for the admin user and password for that instance
+ # the default admin user for each instance is the rootdn for that
+ # instance
+ for my $inst ($manager->{setup}->getDirServers()) {
+ my $innerinst = $inst;
+ if (!$manager->{inf}->{$inst}->{RootDN}) {
+ # if we don't already have an admin DN set for this
+ # instance, look in the dse.ldif for the nsslapd-rootdn
+ my $dseldif = $manager->{setup}->{configdir} . "/" . $inst . "/dse.ldif";
+ my $conn = new FileConn($dseldif, 1);
+ my $rootdn;
+ if ($conn) {
+ my $ent = $conn->search("cn=config", "base", '(objectclass=*)');
+ if ($ent) {
+ $rootdn = $ent->getValue('nsslapd-rootdn');
+ } else {
+ $manager->alert('error_finding_config_entry',
+ "cn=config", $dseldif, $conn->getErrorString());
+ }
+ $conn->close();
+ } else {
+ $manager->alert('error_opening_dseldif', $dseldif, $!);
+ }
+ if ($rootdn) {
+ $manager->{inf}->{$inst}->{RootDN} = $rootdn;
+ } else {
+ $manager->{inf}->{$inst}->{RootDN} = "cn=Directory Manager";
+ }
+ }
+ my $dlg = new Dialog (
+ $EXPRESS,
+ ['update_admin_dialog', $innerinst],
+ sub {
+ my $self = shift;
+ my $index = shift;
+ my $id;
+ if ($index == 0) { # return undef for password defaults
+ $id = $self->{manager}->{inf}->{$innerinst}->{RootDN};
+ }
+ return $id;
+ },
+ sub {
+ my $self = shift;
+ my $ans = shift;
+ my $index = shift;
+
+ my $res = $DialogManager::SAME;
+ if ($index == 0) {
+ if (!isValidDN($ans)) {
+ $self->{manager}->alert("dialog_dsrootdn_error", $ans);
+ } else {
+ $self->{manager}->{inf}->{$innerinst}->{RootDN} = $ans;
+ $res = $DialogManager::NEXT;
+ }
+ } else {
+ if (!$ans or !length($ans)) {
+ $self->{manager}->alert("dialog_dsrootpw_invalid");
+ } else {
+ $self->{manager}->{inf}->{$innerinst}->{RootDNPwd} = $ans;
+ $res = $DialogManager::NEXT;
+ }
+ }
+ return $res;
+ },
+ ['update_admin_id_prompt'], ['update_admin_pwd_prompt', 1]
+ );
+ push @updateadmindialogs, $dlg;
+ }
+
+ return @updateadmindialogs;
+}
+
+sub getDialogs {
+ return ($updatewelcome, $updatemode);
+}
+
+1;
diff --git a/ldap/admin/src/scripts/FileConn.pm b/ldap/admin/src/scripts/FileConn.pm
index fe5acb5c..bead2a48 100644
--- a/ldap/admin/src/scripts/FileConn.pm
+++ b/ldap/admin/src/scripts/FileConn.pm
@@ -63,8 +63,8 @@ sub new {
$self = bless $self, $class;
$self->{readonly} = $readonly;
- for (@namingContexts) {
- $self->setNamingContext($_);
+ for my $ctx (@namingContexts) {
+ $self->setNamingContext($ctx);
}
$self->setNamingContext(""); # root DSE
if (!$self->read($filename)) {
@@ -192,9 +192,9 @@ sub write {
}
$self->iterate("", LDAP_SCOPE_SUBTREE, \&writecb, \*MYLDIF);
- for (keys %{$self->{namingContexts}}) {
- next if (!$_); # skip "" - we already did that
- $self->iterate($_, LDAP_SCOPE_SUBTREE, \&writecb, \*MYLDIF);
+ for my $ctx (keys %{$self->{namingContexts}}) {
+ next if (!$ctx); # skip "" - we already did that
+ $self->iterate($ctx, LDAP_SCOPE_SUBTREE, \&writecb, \*MYLDIF);
}
close( MYLDIF );
@@ -354,12 +354,12 @@ sub cloneEntry {
}
my $dest = new Mozilla::LDAP::Entry();
$dest->setDN($src->getDN());
- for (keys %{$src}) {
- if (ref($src->{$_})) {
- my @copyary = @{$src->{$_}};
- $dest->{$_} = [ @copyary ]; # make a deep copy
+ for my $key (keys %{$src}) {
+ if (ref($src->{$key})) {
+ my @copyary = @{$src->{$key}};
+ $dest->{$key} = [ @copyary ]; # make a deep copy
} else {
- $dest->{$_} = $src->{$_};
+ $dest->{$key} = $src->{$key};
}
}
diff --git a/ldap/admin/src/scripts/Inf.pm b/ldap/admin/src/scripts/Inf.pm
index 091940be..bb229137 100644
--- a/ldap/admin/src/scripts/Inf.pm
+++ b/ldap/admin/src/scripts/Inf.pm
@@ -88,31 +88,32 @@ sub read {
}
$inffh = \*INF;
}
- while (<$inffh>) {
+ my $line;
+ while ($line = <$inffh>) {
my $iscontinuation;
- chop; # trim trailing newline
- if (/^\s*$/) { # skip blank/empty lines
+ chop $line; # trim trailing newline
+ if ($line =~ /^\s*$/) { # skip blank/empty lines
$incontinuation = 0;
next;
}
- if (/^\s*\#/) { # skip comment lines
+ if ($line =~ /^\s*\#/) { # skip comment lines
$incontinuation = 0;
next;
}
- if (/\\$/) { # line ends in \ - continued on next line
- chop;
+ if ($line =~ /\\$/) { # line ends in \ - continued on next line
+ chop $line;
$iscontinuation = 1;
}
if ($incontinuation) {
if ($curval) {
- $self->{$curSection}->{$curkey}->[$curval] .= "\n" . $_; # add line in entirety to current value
+ $self->{$curSection}->{$curkey}->[$curval] .= "\n" . $line; # add line in entirety to current value
} else {
- $self->{$curSection}->{$curkey} .= "\n" . $_; # add line in entirety to current value
+ $self->{$curSection}->{$curkey} .= "\n" . $line; # add line in entirety to current value
}
- } elsif (/^\[(.*?)\]/) { # e.g. [General]
+ } elsif ($line =~ /^\[(.*?)\]/) { # e.g. [General]
$curSection = $1;
$iscontinuation = 0; # disallow section continuations
- } elsif (/^\s*(.*?)\s*=\s*(.*?)\s*$/) { # key = value
+ } elsif ($line =~ /^\s*(.*?)\s*=\s*(.*?)\s*$/) { # key = value
$curkey = $1;
# a single value is just a single scalar
# multiple values are represented by an array ref
@@ -207,8 +208,8 @@ sub updateFromArgs {
}
# read args into temp inf
- for (@_) {
- if (/^([\w_-]+)\.([\w_-]+)=(.*)$/) { # e.g. section.param=value
+ for my $arg (@_) {
+ if ($arg =~ /^([\w_-]+)\.([\w_-]+)=(.*)$/) { # e.g. section.param=value
my $sec = $1;
my $parm = $2;
my $val = $3;
@@ -227,7 +228,7 @@ sub updateFromArgs {
$argsinf->{$sec}->{$parm} = $val;
}
} else { # error
- print STDERR "Error: unknown command line option $_\n";
+ print STDERR "Error: unknown command line option $arg\n";
return;
}
}
diff --git a/ldap/admin/src/scripts/Resource.pm b/ldap/admin/src/scripts/Resource.pm
index 1fcd44ca..911ab087 100644
--- a/ldap/admin/src/scripts/Resource.pm
+++ b/ldap/admin/src/scripts/Resource.pm
@@ -77,27 +77,28 @@ sub read {
my $incontinuation = 0;
my $curkey;
open RES, $filename or die "Error: could not open resource file $filename: $!";
- while (<RES>) {
+ my $line;
+ while ($line = <RES>) {
my $iscontinuation;
- chop; # trim trailing newline
- if (/^\s*$/) { # skip blank/empty lines
+ chop $line; # trim trailing newline
+ if ($line =~ /^\s*$/) { # skip blank/empty lines
$incontinuation = 0;
next;
}
- if (/^\s*\#/) { # skip comment lines
+ if ($line =~ /^\s*\#/) { # skip comment lines
$incontinuation = 0;
next;
}
# read name = value pairs like this
# bol whitespace* name whitespace* '=' whitespace* value eol
# the value will include any trailing whitespace
- if (/\\$/) {
- chop;
+ if ($line =~ /\\$/) {
+ chop $line;
$iscontinuation = 1;
}
if ($incontinuation) {
- $self->{res}->{$curkey} .= "\n" . $_;
- } elsif (/^\s*(.*?)\s*=\s*(.*?)$/) {
+ $self->{res}->{$curkey} .= "\n" . $line;
+ } elsif ($line =~ /^\s*(.*?)\s*=\s*(.*?)$/) {
# replace \n with real newline
if ($curkey) {
$self->{res}->{$curkey} =~ s/\\n/\n/g;
diff --git a/ldap/admin/src/scripts/Setup.pm.in b/ldap/admin/src/scripts/Setup.pm.in
index 7ad57c1f..5927d40b 100644
--- a/ldap/admin/src/scripts/Setup.pm.in
+++ b/ldap/admin/src/scripts/Setup.pm.in
@@ -99,6 +99,8 @@ options:
--file=name Use the file 'name' in .inf format to supply the default answers
--keepcache Do not delete the temporary .inf file generated by this program
--logfile Log setup messages to this file - otherwise, a temp file will be used
+ --update Update an existing installation (e.g. after upgrading packages)
+ --continue (update only) keep going despite errors (also --force)
For all options, you can also use the short name e.g. -h, -d, etc. For the -d argument,
specifying it more than once will increase the debug level e.g. -ddddd
@@ -124,7 +126,7 @@ sub new {
sub init {
my $self = shift;
$self->{res} = shift;
- my ($silent, $inffile, $keep, $preonly, $logfile, $update);
+ my ($silent, $inffile, $keep, $preonly, $logfile, $update, $force);
GetOptions('help|h|?' => sub { VersionMessage(); HelpMessage(); exit 0 },
'version|v' => sub { VersionMessage(); exit 0 },
@@ -134,7 +136,8 @@ sub init {
'keepcache|k' => \$keep,
'preonly|p' => \$preonly,
'logfile|l=s' => \$logfile,
- 'update|u' => \$update
+ 'update|u' => \$update,
+ 'continue|force|c' => \$force
);
$self->{silent} = $silent;
@@ -142,6 +145,7 @@ sub init {
$self->{keep} = $keep;
$self->{preonly} = $preonly;
$self->{update} = $update;
+ $self->{force} = $force;
$self->{logfile} = $logfile;
$self->{log} = new SetupLog($self->{logfile});
# if user supplied inf file, use that to initialize
@@ -193,21 +197,40 @@ sub log {
sub msg {
my $self = shift;
my $level = shift;
- my @text = @_;
- if (!$level && @text) {
+ my @ary = @_;
+ if (!$level && @ary) {
# e.g. msg(0, "string") - no logging
- } elsif ($level and @text and grep {/^$level$/} $self->{log}->levels()) {
+ } elsif ($level and @ary and grep {/^$level$/} $self->{log}->levels()) {
# e.g. msg($WARN, "string") - print and log
} else {
# log at default INFO level
- unshift @text, $level;
+ unshift @ary, $level;
$level = $INFO;
}
- my $string = $self->{res}->getText(@text);
- if ($level) {
- $self->log($level, $string);
+ # @text is an array of strings for one message or
+ # an array of array refs, each one is a message
+ while (@ary) {
+ my @text = shift @ary;
+
+ last if (!@text or !$text[0]);
+
+ # element is an array ref - just pass to getText
+ # else is a list of strings
+ # NOTE: this will NOT work if ary contains
+ # consecutive simple string errors not separated
+ # by an array ref e.g. this will work
+ # ARRAY, 'errkey', arg, arg, ARRAY
+ # this will not work
+ # ARRAY, 'errkey', arg, 'errkey2', arg2, ARRAY
+ while (@ary and !ref($ary[0])) {
+ push @text, shift @ary;
+ }
+ my $string = $self->{res}->getText(@text);
+ if ($level) {
+ $self->log($level, $string);
+ }
+ print $string;
}
- print $string;
}
sub doExit {
@@ -231,6 +254,7 @@ sub getDirServers {
if (!$self->{dirservers}) {
$self->{dirservers} = [];
for my $dir (glob("$self->{configdir}/slapd-*")) {
+ next if ($dir =~ /\.removed$/); # skip removed instances
if (-d $dir) {
$dir =~ s,$self->{configdir}/,,; # strip off dir part
push @{$self->{dirservers}}, $dir;
diff --git a/ldap/admin/src/scripts/Util.pm.in b/ldap/admin/src/scripts/Util.pm.in
index 6d54648f..29f268f5 100644
--- a/ldap/admin/src/scripts/Util.pm.in
+++ b/ldap/admin/src/scripts/Util.pm.in
@@ -46,11 +46,11 @@ use Mozilla::LDAP::LDIF;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(portAvailable getAvailablePort isValidDN addSuffix getMappedEntries
- process_maptbl check_and_add_entry getMappedEntries
+ process_maptbl check_and_add_entry getMappedEntries addErr
getHashedPassword debug createInfFromConfig shellEscape
isValidServerID isValidUser makePaths getLogin remove_tree remove_pidfile);
@EXPORT_OK = qw(portAvailable getAvailablePort isValidDN addSuffix getMappedEntries
- process_maptbl check_and_add_entry getMappedEntries
+ process_maptbl check_and_add_entry getMappedEntries addErr
getHashedPassword debug createInfFromConfig shellEscape
isValidServerID isValidUser makePaths getLogin remove_tree remove_pidfile);
@@ -658,7 +658,7 @@ sub process_maptbl
}
else
{
- push @{$errs}, 'no_mapvalue_for_key', $value, $key;
+ push @{$errs}, ['no_mapvalue_for_key', $value, $key];
return {};
}
}
@@ -813,21 +813,21 @@ sub makePaths {
$parent = dirname($parent)) {
unshift @dirnames, $parent;
}
- for (@dirnames) {
- next if (-d $_);
+ for my $dir (@dirnames) {
+ next if (-d $dir);
$! = 0; # clear
- mkdir $_, $mode;
+ mkdir $dir, $mode;
if ($!) {
- return ('error_creating_directory', $_, $!);
+ return ('error_creating_directory', $dir, $!);
}
- chown $uid, $gid, $_;
+ chown $uid, $gid, $dir;
if ($!) {
- return ('error_chowning_directory', $_, $!);
+ return ('error_chowning_directory', $dir, $!);
}
- chmod $mode, $_;
+ chmod $mode, $dir;
$mode_string = sprintf "%lo", $mode;
- debug(1, "makePaths: created directory $_ mode $mode_string user $user group $group\n");
- debug(2, "\t" . `ls -ld $_`);
+ debug(1, "makePaths: created directory $dir mode $mode_string user $user group $group\n");
+ debug(2, "\t" . `ls -ld $dir`);
}
return ();
@@ -926,9 +926,10 @@ sub remove_pidfile
unless(open(INFILE,"$instdir/start-slapd")) {
print("Cannot open start-slapd file for reading "); return 0;
}
- while(<INFILE>) {
- if (/start-dirsrv /g) {
- my @servline=split(/start-dirsrv /, );
+ my $line;
+ while($line = <INFILE>) {
+ if ($line =~ /start-dirsrv /g) {
+ my @servline=split(/start-dirsrv /, $line);
@servline=split(/\s+/, $servline[1]);
$serv_id=$servline[0];
}
@@ -939,14 +940,14 @@ sub remove_pidfile
unless(open(INFILE,"@initconfigdir@/@package_name@-$serv_id")) {
print("Couldn't open @initconfigdir@/@package_name@-$serv_id "); return 0;
}
- while(<INFILE>) {
- if (/RUN_DIR=/g) {
- my @rundir_line=split(/RUN_DIR=+/, );
+ while($line = <INFILE>) {
+ if ($line =~ /RUN_DIR=/g) {
+ my @rundir_line=split(/RUN_DIR=+/, $line);
@rundir_line=split(/;/, $rundir_line[1]);
$run_dir = $rundir_line[0];
chop($run_dir);
- } elsif (/PRODUCT_NAME=/g) {
- my @product_line=split(/PRODUCT_NAME=+/, );
+ } elsif ($line =~ /PRODUCT_NAME=/g) {
+ my @product_line=split(/PRODUCT_NAME=+/, $line);
@product_line=split(/;/, $product_line[1]);
$product_name = $product_line[0];
chop($product_name);
diff --git a/ldap/admin/src/scripts/dnaplugindepends.ldif b/ldap/admin/src/scripts/dnaplugindepends.ldif
new file mode 100644
index 00000000..9622c420
--- /dev/null
+++ b/ldap/admin/src/scripts/dnaplugindepends.ldif
@@ -0,0 +1,4 @@
+dn: cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config
+changetype: modify
+add: nsslapd-plugin-depends-on-type
+nsslapd-plugin-depends-on-type: database
diff --git a/ldap/admin/src/scripts/dsupdate.map.in b/ldap/admin/src/scripts/dsupdate.map.in
new file mode 100644
index 00000000..90a6d7e0
--- /dev/null
+++ b/ldap/admin/src/scripts/dsupdate.map.in
@@ -0,0 +1,65 @@
+# BEGIN COPYRIGHT BLOCK
+# This Program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; version 2 of the License.
+#
+# This Program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA 02111-1307 USA.
+#
+# In addition, as a special exception, Red Hat, Inc. gives You the additional
+# right to link the code of this Program with code not covered under the GNU
+# General Public License ("Non-GPL Code") and to distribute linked combinations
+# including the two, subject to the limitations in this paragraph. Non-GPL Code
+# permitted under this exception must only link to the code of this Program
+# through those well defined interfaces identified in the file named EXCEPTION
+# found in the source code files (the "Approved Interfaces"). The files of
+# Non-GPL Code may instantiate templates or use macros or inline functions from
+# the Approved Interfaces without causing the resulting work to be covered by
+# the GNU General Public License. Only Red Hat, Inc. may make changes or
+# additions to the list of Approved Interfaces. You must obey the GNU General
+# Public License in all respects for all of the Program code and other code used
+# in conjunction with the Program except the Non-GPL Code covered by this
+# exception. If you modify this file, you may extend this exception to your
+# version of the file, but you are not obligated to do so. If you do not wish to
+# provide this exception without modification, you must delete this exception
+# statement from your version and license this file solely under the GPL without
+# exception.
+#
+#
+# Copyright (C) 2009 Red Hat, Inc.
+# All rights reserved.
+# END COPYRIGHT BLOCK
+#
+# [Parameter resolution rules]
+# * If the right-hand value is in ` (backquote), the value is eval'ed by perl.
+# The output should be stored in $returnvalue to pass to the internal hash.
+# * If the right-hand value is in " (doublequote), the value is passed as is.
+# * If the right-hand value is not in any quote, the value should be found
+# in either of the setup inf file (static) or the install inf file (dynamic).
+# * Variables surrounded by @ (e.g., @configdir@) are replaced with the
+# system path at the compile time.
+# * The right-hand value can contain variables surrounded by % (e.g., %asid%)
+# which refers the right-hand value (key) of this map file.
+#
+fqdn = FullMachineName
+dsid = ServerIdentifier
+ds_user = SuiteSpotUserID
+ds_port = ServerPort
+rootdn = RootDN
+
+schema_dir = schema_dir
+lock_dir = lock_dir
+tmp_dir = tmp_dir
+cert_dir = cert_dir
+ldif_dir = ldif_dir
+bak_dir = bak_dir
+inst_dir = inst_dir
+log_dir = log_dir
+config_dir = config_dir
+db_dir = db_dir
+run_dir = run_dir
diff --git a/ldap/admin/src/scripts/exampleupdate.ldif b/ldap/admin/src/scripts/exampleupdate.ldif
new file mode 100644
index 00000000..00f9a70d
--- /dev/null
+++ b/ldap/admin/src/scripts/exampleupdate.ldif
@@ -0,0 +1,40 @@
+# BEGIN COPYRIGHT BLOCK
+# This Program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; version 2 of the License.
+#
+# This Program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA 02111-1307 USA.
+#
+# In addition, as a special exception, Red Hat, Inc. gives You the additional
+# right to link the code of this Program with code not covered under the GNU
+# General Public License ("Non-GPL Code") and to distribute linked combinations
+# including the two, subject to the limitations in this paragraph. Non-GPL Code
+# permitted under this exception must only link to the code of this Program
+# through those well defined interfaces identified in the file named EXCEPTION
+# found in the source code files (the "Approved Interfaces"). The files of
+# Non-GPL Code may instantiate templates or use macros or inline functions from
+# the Approved Interfaces without causing the resulting work to be covered by
+# the GNU General Public License. Only Red Hat, Inc. may make changes or
+# additions to the list of Approved Interfaces. You must obey the GNU General
+# Public License in all respects for all of the Program code and other code used
+# in conjunction with the Program except the Non-GPL Code covered by this
+# exception. If you modify this file, you may extend this exception to your
+# version of the file, but you are not obligated to do so. If you do not wish to
+# provide this exception without modification, you must delete this exception
+# statement from your version and license this file solely under the GPL without
+# exception.
+#
+#
+# Copyright (C) 2009 Red Hat, Inc.
+# All rights reserved.
+# END COPYRIGHT BLOCK
+#
+
+# These files work the same way as the LDIF templates in
+# /usr/share/dirsrv/ldif/template*.ldif
diff --git a/ldap/admin/src/scripts/exampleupdate.pl b/ldap/admin/src/scripts/exampleupdate.pl
new file mode 100644
index 00000000..cff4a3dd
--- /dev/null
+++ b/ldap/admin/src/scripts/exampleupdate.pl
@@ -0,0 +1,56 @@
+# BEGIN COPYRIGHT BLOCK
+# This Program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; version 2 of the License.
+#
+# This Program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA 02111-1307 USA.
+#
+# In addition, as a special exception, Red Hat, Inc. gives You the additional
+# right to link the code of this Program with code not covered under the GNU
+# General Public License ("Non-GPL Code") and to distribute linked combinations
+# including the two, subject to the limitations in this paragraph. Non-GPL Code
+# permitted under this exception must only link to the code of this Program
+# through those well defined interfaces identified in the file named EXCEPTION
+# found in the source code files (the "Approved Interfaces"). The files of
+# Non-GPL Code may instantiate templates or use macros or inline functions from
+# the Approved Interfaces without causing the resulting work to be covered by
+# the GNU General Public License. Only Red Hat, Inc. may make changes or
+# additions to the list of Approved Interfaces. You must obey the GNU General
+# Public License in all respects for all of the Program code and other code used
+# in conjunction with the Program except the Non-GPL Code covered by this
+# exception. If you modify this file, you may extend this exception to your
+# version of the file, but you are not obligated to do so. If you do not wish to
+# provide this exception without modification, you must delete this exception
+# statement from your version and license this file solely under the GPL without
+# exception.
+#
+#
+# Copyright (C) 2009 Red Hat, Inc.
+# All rights reserved.
+# END COPYRIGHT BLOCK
+#
+
+sub pre {
+ my ($inf, $configdir) = @_;
+}
+
+sub preinst {
+ my ($inf, $inst, $dseldif, $conn) = @_;
+}
+sub runinst {
+ my ($inf, $inst, $dseldif, $conn) = @_;
+}
+
+sub postinst {
+ my ($inf, $inst, $dseldif, $conn) = @_;
+}
+
+sub post {
+ my ($inf, $configdir) = @_;
+}
diff --git a/ldap/admin/src/scripts/exampleupdate.sh b/ldap/admin/src/scripts/exampleupdate.sh
new file mode 100644
index 00000000..dae2e4c5
--- /dev/null
+++ b/ldap/admin/src/scripts/exampleupdate.sh
@@ -0,0 +1,63 @@
+#!/bin/sh
+# BEGIN COPYRIGHT BLOCK
+# This Program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; version 2 of the License.
+#
+# This Program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA 02111-1307 USA.
+#
+# In addition, as a special exception, Red Hat, Inc. gives You the additional
+# right to link the code of this Program with code not covered under the GNU
+# General Public License ("Non-GPL Code") and to distribute linked combinations
+# including the two, subject to the limitations in this paragraph. Non-GPL Code
+# permitted under this exception must only link to the code of this Program
+# through those well defined interfaces identified in the file named EXCEPTION
+# found in the source code files (the "Approved Interfaces"). The files of
+# Non-GPL Code may instantiate templates or use macros or inline functions from
+# the Approved Interfaces without causing the resulting work to be covered by
+# the GNU General Public License. Only Red Hat, Inc. may make changes or
+# additions to the list of Approved Interfaces. You must obey the GNU General
+# Public License in all respects for all of the Program code and other code used
+# in conjunction with the Program except the Non-GPL Code covered by this
+# exception. If you modify this file, you may extend this exception to your
+# version of the file, but you are not obligated to do so. If you do not wish to
+# provide this exception without modification, you must delete this exception
+# statement from your version and license this file solely under the GPL without
+# exception.
+#
+#
+# Copyright (C) 2009 Red Hat, Inc.
+# All rights reserved.
+# END COPYRIGHT BLOCK
+#
+
+# There are several environment variables passed in:
+my $PRE_STAGE = "pre";
+my $PREINST_STAGE = "preinst";
+my $RUNINST_STAGE = "runinst";
+my $POSTINST_STAGE = "postinst";
+my $POST_STAGE = "post";
+
+# $DS_UPDATE_STAGE - the current stage of the update - one of
+# pre - called at the beginning of the update
+# preinst - called before processing an instance
+# runinst - the main update stage for an instance
+# postinst - called after processing an instance
+# post - called the the end of the update
+# you should definitely check the stage to make sure you only perform
+# your actions during the correct stage e.g.
+
+if [ "$DS_UPDATE_STAGE" != "pre" ] ; then
+ exit 0
+fi
+
+# $DS_UPDATE_DIR - the main config directory containing the schema dir
+# the config dir and the instance specific (slapd-instance) directories
+# $DS_UPDATE_INST - the name of the instance (slapd-instance), if one of the instance specific stages
+# $DS_UPDATE_DSELDIF - the full path ane filename of the dse.ldif file for the instance
diff --git a/ldap/admin/src/scripts/migrate-ds.res b/ldap/admin/src/scripts/migrate-ds.res
index 3d01f0f3..d58649b7 100644
--- a/ldap/admin/src/scripts/migrate-ds.res
+++ b/ldap/admin/src/scripts/migrate-ds.res
@@ -9,7 +9,6 @@ error_reading_olddbconfig = Could not read the old database configuration inform
error_migrating_schema = Could not copy old schema file '%s'. Error: %s\n
error_opening_schema = Could not open new schema file '%s'. Error: %s\n
error_schema_permissions = Could not reset permissions on schema file '%s'. Error: %s\n
-error_renaming_schema = Could not rename schema file '%s' tp '%s'. Error: %s\n
error_copying_dbdir = Could not copy database directory '%s' to '%s'. Error: %s\n
error_copying_dbfile = Could not copy database file '%s' to '%s'. Error: %s\n
error_dbsrcdir_not_exist = Could not copy from the database source directory '%s' because it does not exist. Please check your configuration.\n
diff --git a/ldap/admin/src/scripts/setup-ds.pl.in b/ldap/admin/src/scripts/setup-ds.pl.in
index 7fdc9772..aad6bfc8 100644
--- a/ldap/admin/src/scripts/setup-ds.pl.in
+++ b/ldap/admin/src/scripts/setup-ds.pl.in
@@ -48,6 +48,7 @@ use Resource;
use DialogManager;
use Util;
use DSCreate;
+use DSUpdate;
my $res = new Resource("@propertydir@/setup-ds.res");
@@ -56,11 +57,16 @@ my $setup = new Setup($res);
if (!$setup->{silent}) {
my $dialogmgr = new DialogManager($setup, $res, $TYPICAL);
- require SetupDialogs;
- require DSDialogs;
-
- my @dialogs = SetupDialogs->getDialogs();
- push @dialogs, DSDialogs->getDialogs();
+ my @dialogs;
+ if ($setup->{update}) {
+ require DSUpdateDialogs;
+ push @dialogs, DSUpdateDialogs->getDialogs();
+ } else {
+ require SetupDialogs;
+ require DSDialogs;
+ push @dialogs, SetupDialogs->getDialogs();
+ push @dialogs, DSDialogs->getDialogs();
+ }
$dialogmgr->addDialog(@dialogs);
@@ -71,15 +77,29 @@ if (!$setup->{silent}) {
$setup->{inf}->write();
}
-my @errs = createDSInstance($setup->{inf});
+my @errs;
+if ($setup->{update}) {
+ @errs = updateDS($setup);
+} else {
+ @errs = createDSInstance($setup->{inf});
+}
+
if (@errs) {
$setup->msg(@errs);
- $setup->msg($FATAL, 'error_creating_dsinstance',
- $setup->{inf}->{slapd}->{ServerIdentifier});
+ if ($setup->{update}) {
+ $setup->msg($FATAL, 'error_updating');
+ } else {
+ $setup->msg($FATAL, 'error_creating_dsinstance',
+ $setup->{inf}->{slapd}->{ServerIdentifier});
+ }
$setup->doExit(1);
} else {
- $setup->msg('created_dsinstance',
- $setup->{inf}->{slapd}->{ServerIdentifier});
+ if ($setup->{update}) {
+ $setup->msg('update_successful');
+ } else {
+ $setup->msg('created_dsinstance',
+ $setup->{inf}->{slapd}->{ServerIdentifier});
+ }
}
$setup->doExit(0);
@@ -91,3 +111,10 @@ END {
}
}
}
+
+# emacs settings
+# Local Variables:
+# mode:perl
+# indent-tabs-mode: nil
+# tab-width: 4
+# End:
diff --git a/ldap/admin/src/scripts/setup-ds.res.in b/ldap/admin/src/scripts/setup-ds.res.in
index 53269631..c4be6589 100644
--- a/ldap/admin/src/scripts/setup-ds.res.in
+++ b/ldap/admin/src/scripts/setup-ds.res.in
@@ -136,3 +136,48 @@ error_no_such_instance = Error: could not find directory server configuration di
error_finding_config_entry = Error: could not find the config entry '%s' in '%s'. Error: %s\n
error_removing_path = Error: could not remove path '%s'. Error: %s\n
error_removing_port_label = Error: could not remove selinux label from port '%s'. Error: %s\n
+error_loading_update = Error: not applying update '%s'. Error: %s\n
+error_unknown_update = Error: cannot apply update '%s'. Not a recognized update type.\n
+error_executing_update = Error: update '%s' returned code '%s': %s\n
+error_updating = Error: could not update the directory server.\n
+update_successful = Finished successful update of directory server.\n
+
+update_dialog_first = This program will update the %s Directory Server.\n\nIt is recommended that you have "root" privilege to perform the update.\nTips for using this program:\n - Press "Enter" to choose the default and go to the next screen\n - Type "Control-B" or the word "back" then "Enter" to go back to the previous screen\n - Type "Control-C" to cancel the update\n\n
+# %s -> brand
+
+update_dialog_first_prompt = Would you like to continue with update?
+
+update_dialog_mode =\
+The update process can work in one of two modes:\
+\
+ - Online: The changes are made to the running directory servers using LDAP.\
+ The operations must be performed as an administrative user.\
+ You must provide the name and password, for each instance\
+ if there is more than one instance of directory server.\
+ Some operations may require a directory server restart to take\
+ effect. The update script will notify you if you need to restart\
+ the server.\
+\
+ - Offline: The changes are made to the server configuration files. The\
+ servers MUST FIRST BE SHUTDOWN BY YOU. The script will not\
+ shutdown the servers for you. You MUST shutdown the\
+ servers in order to use this mode. A username and password\
+ are not required to use Offline mode. If the servers are not\
+ shutdown, CHANGES WILL BE LOST.\
+\
+To summarize:\
+ Online - servers remain running - you must provide admin name and password\
+ for each server - servers may need to be restarted\
+ Offline - servers must be shutdown - no username or password required\n\n
+
+update_dialog_mode_prompt = Which update mode do you want to use?
+
+update_admin_dialog = Please specify the authentication data for '%s'\n\n
+update_admin_id_prompt = Full DN of administrative user
+update_admin_pwd_prompt = Password for this user
+error_renaming_schema = Could not rename schema file '%s' tp '%s'. Error: %s\n
+error_reading_schema_dir = Schema directory '%s' does not exist or is not readable\n
+error_online_update = Could not open a connection to the server at %s port %s as '%s'.\
+Please make sure the server is up and running before using online mode,\
+or use offline mode.\n\n
+error_offline_update = Could not read the server config file '%s'. Error: %s\n\n
diff --git a/ldap/ldif/template-pampta.ldif.in b/ldap/ldif/template-pampta.ldif.in
index 2875df7f..10df3523 100644
--- a/ldap/ldif/template-pampta.ldif.in
+++ b/ldap/ldif/template-pampta.ldif.in
@@ -17,4 +17,8 @@ pamIDAttr: notUsedWithRDNMethod
pamFallback: FALSE
pamSecure: TRUE
pamService: ldapserver
-
+# these will be replaced when the server loads the plugin
+nsslapd-pluginId: ID
+nsslapd-pluginVersion: PACKAGE_VERSION
+nsslapd-pluginVendor: VENDOR
+nsslapd-pluginDescription: DESC