oshi.hardware.platform.unix.solaris.SolarisHWDiskStore Maven / Gradle / Ivy
/**
* MIT License
*
* Copyright (c) 2010 - 2021 The OSHI Project Contributors: https://github.com/oshi/oshi/graphs/contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package oshi.hardware.platform.unix.solaris;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import com.sun.jna.platform.unix.solaris.LibKstat.Kstat; //NOSONAR
import com.sun.jna.platform.unix.solaris.LibKstat.KstatIO;
import oshi.annotation.concurrent.ThreadSafe;
import oshi.driver.unix.solaris.disk.Iostat;
import oshi.driver.unix.solaris.disk.Lshal;
import oshi.driver.unix.solaris.disk.Prtvtoc;
import oshi.hardware.HWDiskStore;
import oshi.hardware.HWPartition;
import oshi.hardware.common.AbstractHWDiskStore;
import oshi.util.platform.unix.solaris.KstatUtil;
import oshi.util.platform.unix.solaris.KstatUtil.KstatChain;
import oshi.util.tuples.Quintet;
/**
* Solaris hard disk implementation.
*/
@ThreadSafe
public final class SolarisHWDiskStore extends AbstractHWDiskStore {
private long reads = 0L;
private long readBytes = 0L;
private long writes = 0L;
private long writeBytes = 0L;
private long currentQueueLength = 0L;
private long transferTime = 0L;
private long timeStamp = 0L;
private List partitionList;
private SolarisHWDiskStore(String name, String model, String serial, long size) {
super(name, model, serial, size);
}
@Override
public long getReads() {
return reads;
}
@Override
public long getReadBytes() {
return readBytes;
}
@Override
public long getWrites() {
return writes;
}
@Override
public long getWriteBytes() {
return writeBytes;
}
@Override
public long getCurrentQueueLength() {
return currentQueueLength;
}
@Override
public long getTransferTime() {
return transferTime;
}
@Override
public long getTimeStamp() {
return timeStamp;
}
@Override
public List getPartitions() {
return this.partitionList;
}
@Override
public boolean updateAttributes() {
try (KstatChain kc = KstatUtil.openChain()) {
Kstat ksp = KstatChain.lookup(null, 0, getName());
if (ksp != null && KstatChain.read(ksp)) {
KstatIO data = new KstatIO(ksp.ks_data);
this.reads = data.reads;
this.writes = data.writes;
this.readBytes = data.nread;
this.writeBytes = data.nwritten;
this.currentQueueLength = (long) data.wcnt + data.rcnt;
// rtime and snaptime are nanoseconds, convert to millis
this.transferTime = data.rtime / 1_000_000L;
this.timeStamp = ksp.ks_snaptime / 1_000_000L;
return true;
}
}
return false;
}
/**
* Gets the disks on this machine
*
* @return a list of {@link HWDiskStore} objects representing the disks
*/
public static List getDisks() {
// Create map to correlate disk name with block device mount point for
// later use in partition info
Map deviceMap = Iostat.queryPartitionToMountMap();
// Create map to correlate disk name with block device mount point for
// later use in partition info. Run lshal, if available, to get block device
// major (we'll use partition # for minor)
Map majorMap = Lshal.queryDiskToMajorMap();
// Create map of model, vendor, product, serial, size
// We'll use Model if available, otherwise Vendor+Product
Map> deviceStringMap = Iostat
.queryDeviceStrings(deviceMap.keySet());
List storeList = new ArrayList<>();
for (Entry> entry : deviceStringMap.entrySet()) {
String storeName = entry.getKey();
Quintet val = entry.getValue();
storeList.add(createStore(storeName, val.getA(), val.getB(), val.getC(), val.getD(), val.getE(),
deviceMap.getOrDefault(storeName, ""), majorMap.getOrDefault(storeName, 0)));
}
return storeList;
}
private static SolarisHWDiskStore createStore(String diskName, String model, String vendor, String product,
String serial, long size, String mount, int major) {
SolarisHWDiskStore store = new SolarisHWDiskStore(diskName,
model.isEmpty() ? (vendor + " " + product).trim() : model, serial, size);
store.partitionList = Collections.unmodifiableList(Prtvtoc.queryPartitions(mount, major).stream()
.sorted(Comparator.comparing(HWPartition::getName)).collect(Collectors.toList()));
store.updateAttributes();
return store;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy