1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * https://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19 package org.apache.commons.compress.archivers.dump;
20
21 import java.io.IOException;
22 import java.util.Date;
23 import java.util.Objects;
24
25 import org.apache.commons.compress.archivers.zip.ZipEncoding;
26
27 /**
28 * This class represents identifying information about a Dump archive volume. It consists the archive's dump date, label, hostname, device name and possibly
29 * last mount point plus the volume's volume id and first record number.
30 * <p>
31 * For the corresponding C structure see the header of {@link DumpArchiveEntry}.
32 * </p>
33 */
34 public class DumpArchiveSummary {
35
36 private long dumpDate;
37 private long previousDumpDate;
38 private int volume;
39 private String label;
40 private int level;
41 private String filesys;
42 private String devname;
43 private String hostname;
44 private int flags;
45 private int firstrec;
46 private int ntrec;
47
48 DumpArchiveSummary(final byte[] buffer, final ZipEncoding encoding) throws IOException {
49 dumpDate = 1000L * DumpArchiveUtil.convert32(buffer, 4);
50 previousDumpDate = 1000L * DumpArchiveUtil.convert32(buffer, 8);
51 volume = DumpArchiveUtil.convert32(buffer, 12);
52 label = DumpArchiveUtil.decode(encoding, buffer, 676, DumpArchiveConstants.LBLSIZE).trim();
53 level = DumpArchiveUtil.convert32(buffer, 692);
54 filesys = DumpArchiveUtil.decode(encoding, buffer, 696, DumpArchiveConstants.NAMELEN).trim();
55 devname = DumpArchiveUtil.decode(encoding, buffer, 760, DumpArchiveConstants.NAMELEN).trim();
56 hostname = DumpArchiveUtil.decode(encoding, buffer, 824, DumpArchiveConstants.NAMELEN).trim();
57 flags = DumpArchiveUtil.convert32(buffer, 888);
58 firstrec = DumpArchiveUtil.convert32(buffer, 892);
59 ntrec = DumpArchiveUtil.convert32(buffer, 896);
60
61 // extAttributes = DumpArchiveUtil.convert32(buffer, 900);
62 }
63
64 @Override
65 public boolean equals(final Object obj) {
66 if (this == obj) {
67 return true;
68 }
69 if (obj == null || getClass() != obj.getClass()) {
70 return false;
71 }
72 final DumpArchiveSummary other = (DumpArchiveSummary) obj;
73 return Objects.equals(devname, other.devname) && dumpDate == other.dumpDate && Objects.equals(hostname, other.hostname);
74 }
75
76 /**
77 * Gets the device name, for example, /dev/sda3 or /dev/mapper/vg0-home.
78 *
79 * @return device name
80 */
81 public String getDevname() {
82 return devname;
83 }
84
85 /**
86 * Gets the date of this dump.
87 *
88 * @return the date of this dump.
89 */
90 public Date getDumpDate() {
91 return new Date(dumpDate);
92 }
93
94 /**
95 * Gets the last mountpoint, for example, /home.
96 *
97 * @return last mountpoint
98 */
99 public String getFilesystem() {
100 return filesys;
101 }
102
103 /**
104 * Gets the inode of the first record on this volume.
105 *
106 * @return inode of the first record on this volume.
107 */
108 public int getFirstRecord() {
109 return firstrec;
110 }
111
112 /**
113 * Gets the miscellaneous flags. See below.
114 *
115 * @return flags
116 */
117 public int getFlags() {
118 return flags;
119 }
120
121 /**
122 * Gets the hostname of the system where the dump was performed.
123 *
124 * @return hostname the host name
125 */
126 public String getHostname() {
127 return hostname;
128 }
129
130 /**
131 * Gets dump label. This may be autogenerated, or it may be specified by the user.
132 *
133 * @return dump label
134 */
135 public String getLabel() {
136 return label;
137 }
138
139 /**
140 * Gets the level of this dump. This is a number between 0 and 9, inclusive, and a level 0 dump is a complete dump of the partition. For any other dump 'n'
141 * this dump contains all files that have changed since the last dump at this level or lower. This is used to support different levels of incremental
142 * backups.
143 *
144 * @return dump level
145 */
146 public int getLevel() {
147 return level;
148 }
149
150 /**
151 * Gets the number of records per tape block. This is typically between 10 and 32.
152 *
153 * @return the number of records per tape block
154 */
155 public int getNTRec() {
156 return ntrec;
157 }
158
159 /**
160 * Gets the date of the previous dump at this level higher.
161 *
162 * @return dumpdate may be null
163 */
164 public Date getPreviousDumpDate() {
165 return new Date(previousDumpDate);
166 }
167
168 /**
169 * Gets volume (tape) number.
170 *
171 * @return volume (tape) number.
172 */
173 public int getVolume() {
174 return volume;
175 }
176
177 @Override
178 public int hashCode() {
179 return Objects.hash(devname, dumpDate, hostname);
180 }
181
182 /**
183 * Is this volume compressed? N.B., individual blocks may or may not be compressed. The first block is never compressed.
184 *
185 * @return true if volume is compressed
186 */
187 public boolean isCompressed() {
188 return (flags & 0x0080) == 0x0080;
189 }
190
191 /**
192 * Does this volume contain extended attributes.
193 *
194 * @return true if volume contains extended attributes.
195 */
196 public boolean isExtendedAttributes() {
197 return (flags & 0x8000) == 0x8000;
198 }
199
200 /**
201 * Does this volume only contain metadata?
202 *
203 * @return true if volume only contains meta-data
204 */
205 public boolean isMetaDataOnly() {
206 return (flags & 0x0100) == 0x0100;
207 }
208
209 /**
210 * Is this the new header format? (We do not currently support the old format.)
211 *
212 * @return true if using new header format
213 */
214 public boolean isNewHeader() {
215 return (flags & 0x0001) == 0x0001;
216 }
217
218 /**
219 * Is this the new inode format? (We do not currently support the old format.)
220 *
221 * @return true if using new inode format
222 */
223 public boolean isNewInode() {
224 return (flags & 0x0002) == 0x0002;
225 }
226
227 /**
228 * Sets the device name.
229 *
230 * @param devname the device name
231 */
232 public void setDevname(final String devname) {
233 this.devname = devname;
234 }
235
236 /**
237 * Sets dump date.
238 *
239 * @param dumpDate the dump date
240 */
241 public void setDumpDate(final Date dumpDate) {
242 this.dumpDate = dumpDate.getTime();
243 }
244
245 /**
246 * Sets the last mountpoint.
247 *
248 * @param fileSystem the last mountpoint
249 */
250 public void setFilesystem(final String fileSystem) {
251 this.filesys = fileSystem;
252 }
253
254 /**
255 * Sets the inode of the first record.
256 *
257 * @param firstrec the first record
258 */
259 public void setFirstRecord(final int firstrec) {
260 this.firstrec = firstrec;
261 }
262
263 /**
264 * Sets the miscellaneous flags.
265 *
266 * @param flags flags
267 */
268 public void setFlags(final int flags) {
269 this.flags = flags;
270 }
271
272 /**
273 * Sets the hostname.
274 *
275 * @param hostname the host name
276 */
277 public void setHostname(final String hostname) {
278 this.hostname = hostname;
279 }
280
281 /**
282 * Sets dump label.
283 *
284 * @param label the label
285 */
286 public void setLabel(final String label) {
287 this.label = label;
288 }
289
290 /**
291 * Sets level.
292 *
293 * @param level the level
294 */
295 public void setLevel(final int level) {
296 this.level = level;
297 }
298
299 /**
300 * Sets the number of records per tape block.
301 *
302 * @param ntrec the number of records per tape block
303 */
304 public void setNTRec(final int ntrec) {
305 this.ntrec = ntrec;
306 }
307
308 /**
309 * Sets previous dump date.
310 *
311 * @param previousDumpDate the previous dump dat
312 */
313 public void setPreviousDumpDate(final Date previousDumpDate) {
314 this.previousDumpDate = previousDumpDate.getTime();
315 }
316
317 /**
318 * Sets volume (tape) number.
319 *
320 * @param volume the volume number
321 */
322 public void setVolume(final int volume) {
323 this.volume = volume;
324 }
325 }