    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one
    003 * or more contributor license agreements.  See the NOTICE file
    004 * distributed with this work for additional information
    005 * regarding copyright ownership.  The ASF licenses this file
    006 * to you under the Apache License, Version 2.0 (the
    007 * "License"); you may not use this file except in compliance
    008 * with the License.  You may obtain a copy of the License at
    009 *
    010 *   https://www.apache.org/licenses/LICENSE-2.0
    011 *
    012 * Unless required by applicable law or agreed to in writing,
    013 * software distributed under the License is distributed on an
    014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    015 * KIND, either express or implied.  See the License for the
    016 * specific language governing permissions and limitations
    017 * under the License.
    018 */
    019package org.apache.commons.compress.archivers.dump;
    020
    021import java.io.IOException;
    022import java.util.Date;
    023import java.util.Objects;
    024
    025import org.apache.commons.compress.archivers.zip.ZipEncoding;
    026
    027/**
    028 * This class represents identifying information about a Dump archive volume. It consists the archive's dump date, label, hostname, device name and possibly
    029 * last mount point plus the volume's volume id and first record number.
    030 * <p>
    031 * For the corresponding C structure see the header of {@link DumpArchiveEntry}.
    032 * </p>
    033 */
    034public class DumpArchiveSummary {
    035
    036    private long dumpDate;
    037    private long previousDumpDate;
    038    private int volume;
    039    private String label;
    040    private int level;
    041    private String filesys;
    042    private String devname;
    043    private String hostname;
    044    private int flags;
    045    private int firstrec;
    046    private int ntrec;
    047
    048    DumpArchiveSummary(final byte[] buffer, final ZipEncoding encoding) throws IOException {
    049        dumpDate = 1000L * DumpArchiveUtil.convert32(buffer, 4);
    050        previousDumpDate = 1000L * DumpArchiveUtil.convert32(buffer, 8);
    051        volume = DumpArchiveUtil.convert32(buffer, 12);
    052        label = DumpArchiveUtil.decode(encoding, buffer, 676, DumpArchiveConstants.LBLSIZE).trim();
    053        level = DumpArchiveUtil.convert32(buffer, 692);
    054        filesys = DumpArchiveUtil.decode(encoding, buffer, 696, DumpArchiveConstants.NAMELEN).trim();
    055        devname = DumpArchiveUtil.decode(encoding, buffer, 760, DumpArchiveConstants.NAMELEN).trim();
    056        hostname = DumpArchiveUtil.decode(encoding, buffer, 824, DumpArchiveConstants.NAMELEN).trim();
    057        flags = DumpArchiveUtil.convert32(buffer, 888);
    058        firstrec = DumpArchiveUtil.convert32(buffer, 892);
    059        ntrec = DumpArchiveUtil.convert32(buffer, 896);
    060
    061        // extAttributes = DumpArchiveUtil.convert32(buffer, 900);
    062    }
    063
    064    @Override
    065    public boolean equals(final Object obj) {
    066        if (this == obj) {
    067            return true;
    068        }
    069        if (obj == null || getClass() != obj.getClass()) {
    070            return false;
    071        }
    072        final DumpArchiveSummary other = (DumpArchiveSummary) obj;
    073        return Objects.equals(devname, other.devname) && dumpDate == other.dumpDate && Objects.equals(hostname, other.hostname);
    074    }
    075
    076    /**
    077     * Gets the device name, for example, /dev/sda3 or /dev/mapper/vg0-home.
    078     *
    079     * @return device name
    080     */
    081    public String getDevname() {
    082        return devname;
    083    }
    084
    085    /**
    086     * Gets the date of this dump.
    087     *
    088     * @return the date of this dump.
    089     */
    090    public Date getDumpDate() {
    091        return new Date(dumpDate);
    092    }
    093
    094    /**
    095     * Gets the last mountpoint, for example, /home.
    096     *
    097     * @return last mountpoint
    098     */
    099    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}