[1376] | 1 | #!/usr/bin/perl |
---|
| 2 | # |
---|
| 3 | # BEGIN COPYRIGHT BLOCK |
---|
| 4 | # This Program is free software; you can redistribute it and/or modify it under |
---|
| 5 | # the terms of the GNU General Public License as published by the Free Software |
---|
| 6 | # Foundation; version 2 of the License. |
---|
| 7 | # |
---|
| 8 | # This Program is distributed in the hope that it will be useful, but WITHOUT |
---|
| 9 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
---|
| 10 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. |
---|
| 11 | # |
---|
| 12 | # You should have received a copy of the GNU General Public License along with |
---|
| 13 | # this Program; if not, write to the Free Software Foundation, Inc., 59 Temple |
---|
| 14 | # Place, Suite 330, Boston, MA 02111-1307 USA. |
---|
| 15 | # |
---|
| 16 | # Copyright (C) 2001 Sun Microsystems, Inc. Used by permission. |
---|
| 17 | # Copyright (C) 2005 Red Hat, Inc. |
---|
| 18 | # All rights reserved. |
---|
| 19 | # END COPYRIGHT BLOCK |
---|
| 20 | # |
---|
| 21 | |
---|
| 22 | @instances = qw(userRoot); |
---|
| 23 | @included = qw(); |
---|
| 24 | @excluded = qw(); |
---|
| 25 | |
---|
| 26 | our $nowrap = 1; # output LDIF is not folded |
---|
| 27 | our $nobase64 = 0; # avoid base64 encoding |
---|
| 28 | our $noversion = 0; # don't print version line |
---|
| 29 | our $nouniqueid = 0; # don't export unique id |
---|
| 30 | our $useid2entry = 0; # use main db file only |
---|
| 31 | our $onefile = 1; # one file (MUST BE 1) |
---|
| 32 | our $printkey = 1; # print key |
---|
| 33 | our $ldiffile; # override LDIF output file location |
---|
| 34 | |
---|
| 35 | $doreplica = 0; |
---|
| 36 | $ldifdir = "/var/lib/dirsrv/slapd-scripts/ldif"; |
---|
| 37 | $servid = "scripts"; |
---|
| 38 | $verbose = 0; |
---|
| 39 | $rootdn = "cn=Directory Manager"; |
---|
| 40 | our $passwd; |
---|
| 41 | our $passwdfile = "/etc/signup-ldap-pw"; |
---|
| 42 | $i = 0; |
---|
| 43 | $insti = 0; |
---|
| 44 | $incli = 0; |
---|
| 45 | $excli = 0; |
---|
| 46 | $decrypt_on_export = 0; |
---|
| 47 | |
---|
| 48 | foreach (@ARGV) { |
---|
| 49 | $verbose++ if ($_ eq "-v"); |
---|
| 50 | } |
---|
| 51 | |
---|
| 52 | if ((!@instances && !@included) || !$rootdn || !($passwd || $passwdfile)) { &usage; exit(1); } |
---|
| 53 | |
---|
| 54 | ($s, $m, $h, $dy, $mn, $yr, $wdy, $ydy, $r) = localtime(time); |
---|
| 55 | $mn++; $yr += 1900; |
---|
| 56 | $taskname = "export_${yr}_${mn}_${dy}_${h}_${m}_${s}"; |
---|
| 57 | $dn = "dn: cn=$taskname, cn=export, cn=tasks, cn=config\n"; |
---|
| 58 | $misc = "changetype: add\nobjectclass: top\nobjectclass: extensibleObject\n"; |
---|
| 59 | $cn = "cn: $taskname\n"; |
---|
| 60 | $i = 0; |
---|
| 61 | $be = ""; |
---|
| 62 | $nsinstance = ""; |
---|
| 63 | foreach my $instance (@instances) { |
---|
| 64 | $nsinstance .= "nsInstance: $instance\n"; |
---|
| 65 | if ( !$be ) { |
---|
| 66 | $be = "$instance"; |
---|
| 67 | } else { |
---|
| 68 | $be = "${be}-$instance"; |
---|
| 69 | } |
---|
| 70 | $i++; |
---|
| 71 | } |
---|
| 72 | $i = 0; |
---|
| 73 | $nsincluded = ""; |
---|
| 74 | foreach my $include (@included) { |
---|
| 75 | $nsincluded .= "nsIncludeSuffix: $include\n"; |
---|
| 76 | my ($rdn, $rest) = split(/,/, $include); |
---|
| 77 | my ($rest, $tmpbe) = split(/=/, $rdn); |
---|
| 78 | if ( !$be ) { |
---|
| 79 | $be = "$tmpbe"; |
---|
| 80 | } else { |
---|
| 81 | $be = "${be}-$tmpbe"; |
---|
| 82 | } |
---|
| 83 | $i++; |
---|
| 84 | } |
---|
| 85 | $i = 0; |
---|
| 86 | $nsexcluded = ""; |
---|
| 87 | foreach my $exclude (@excluded) { |
---|
| 88 | $nsexcluded .= "nsExcludeSuffix: $exclude\n"; |
---|
| 89 | $i++; |
---|
| 90 | } |
---|
| 91 | if ($ldiffile eq "") { |
---|
| 92 | if ($onefile == 0) { |
---|
| 93 | $ldiffile = "${ldifdir}/${servid}-${yr}_${mn}_${dy}_${h}_${m}_${s}.ldif"; |
---|
| 94 | } else { |
---|
| 95 | $ldiffile = "${ldifdir}/${servid}-${be}-${yr}_${mn}_${dy}_${h}_${m}_${s}.ldif"; |
---|
| 96 | } |
---|
| 97 | } |
---|
| 98 | |
---|
| 99 | $nsreplica = ""; |
---|
| 100 | if ($doreplica != 0) { $nsreplica = "nsExportReplica: true\n"; } |
---|
| 101 | $nsnobase64 = ""; |
---|
| 102 | if ($nobase64 != 0) { $nsnobase64 = "nsMinimalEncoding: true\n"; } |
---|
| 103 | $nsnowrap = ""; |
---|
| 104 | if ($nowrap != 0) { $nsnowrap = "nsNoWrap: true\n"; } |
---|
| 105 | $nsnoversion = ""; |
---|
| 106 | if ($noversion != 0) { $nsnoversion = "nsNoVersionLine: true\n"; } |
---|
| 107 | $nsnouniqueid = ""; |
---|
| 108 | if ($nouniqueid != 0) { $nsnouniqueid = "nsDumpUniqId: false\n"; } |
---|
| 109 | $nsuseid2entry = ""; |
---|
| 110 | if ($useid2entry != 0) { $nsuseid2entry = "nsUseId2Entry: true\n"; } |
---|
| 111 | $nsonefile = ""; |
---|
| 112 | if ($onefile != 0) { $nsonefile = "nsUseOneFile: true\n"; } |
---|
| 113 | if ($onefile == 0) { $nsonefile = "nsUseOneFile: false\n"; } |
---|
| 114 | $nsexportdecrypt = ""; |
---|
| 115 | if ($decrypt_on_export != 0) { $nsexportdecrypt = "nsExportDecrypt: true\n"; } |
---|
| 116 | $nsprintkey = ""; |
---|
| 117 | if ($printkey == 0) { $nsprintkey = "nsPrintKey: false\n"; } |
---|
| 118 | $nsldiffile = "nsFilename: ${ldiffile}\n"; |
---|
| 119 | $entry = "${dn}${misc}${cn}${nsinstance}${nsincluded}${nsexcluded}${nsreplica}${nsnobase64}${nsnowrap}${nsnoversion}${nsnouniqueid}${nsuseid2entry}${nsonefile}${nsexportdecrypt}${nsprintkey}${nsldiffile}"; |
---|
| 120 | my @vstr = (); |
---|
| 121 | if ($verbose != 0) { @vstr = ("-v"); } |
---|
| 122 | my @qstr = ("-q"); |
---|
| 123 | if ($verbose) { @qstr = (); } |
---|
| 124 | $ENV{'PATH'} = "/usr/lib64/mozldap:/usr/bin:"; |
---|
| 125 | print STDERR ("Exporting to ldif file: ${ldiffile}\n") if ($verbose); |
---|
| 126 | |
---|
| 127 | my @pass; |
---|
| 128 | if ($passwdfile) { |
---|
| 129 | @pass = ("-j", $passwdfile); |
---|
| 130 | } elsif ($passwd) { |
---|
| 131 | @pass = ("-w", $passwd); |
---|
| 132 | } |
---|
| 133 | |
---|
| 134 | my @cmd = ("ldapmodify", @vstr, @qstr, qw(-h localhost -p 389), "-D", $rootdn, @pass, "-a"); |
---|
| 135 | |
---|
| 136 | print STDERR "@cmd\n" if ($verbose); |
---|
| 137 | print STDERR "$entry\n" if ($verbose); |
---|
| 138 | |
---|
| 139 | open(FOO, "|-", @cmd) or die "Couldn't start ldapmodify: $!"; |
---|
| 140 | print(FOO "$entry"); |
---|
| 141 | close(FOO); |
---|
| 142 | |
---|
| 143 | die "Couldn't successfully execute ldapmodify: $!" if $?; |
---|
| 144 | |
---|
| 145 | my @statuscmd = ("ldapsearch", @vstr, qw(-h localhost -p 389), "-D", $rootdn, @pass, qw(-T -b cn=export,cn=tasks,cn=config), "cn=$taskname", qw(nstaskstatus nstaskexitcode)); |
---|
| 146 | |
---|
| 147 | print STDERR "Status command: @statuscmd\n" if ($verbose); |
---|
| 148 | |
---|
| 149 | my $exitstatus=255; |
---|
| 150 | |
---|
| 151 | STATUS: while (1) { |
---|
| 152 | sleep(1); |
---|
| 153 | open(FOO, "-|", @statuscmd) or die "Couldn't start ldapsearch: $!"; |
---|
| 154 | while (<FOO>) { |
---|
| 155 | chomp; |
---|
| 156 | my ($key, $value) = split(": ", $_, 2); |
---|
| 157 | if ($key eq "nstaskstatus" && $verbose) { |
---|
| 158 | print STDERR "Status: $value\n"; |
---|
| 159 | } |
---|
| 160 | if ($key eq "nstaskexitcode") { |
---|
| 161 | $exitstatus = $value; |
---|
| 162 | last STATUS; |
---|
| 163 | } |
---|
| 164 | } |
---|
| 165 | close(FOO); |
---|
| 166 | } |
---|
| 167 | |
---|
| 168 | open(OUTPUT, "<", $ldiffile) or die "Couldn't open output file: $!"; |
---|
| 169 | print while (<OUTPUT>); |
---|
| 170 | close(OUTPUT); |
---|
| 171 | |
---|
| 172 | exit $exitstatus; |
---|