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; |
---|