| /* |
| * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package com.sun.servicetag; |
| |
| // This class is a copy of the com.sun.scn.servicetags.LinuxSystemEnvironment |
| // class from the Sun Connection source. |
| // |
| // The Service Tags team maintains the latest version of the implementation |
| // for system environment data collection. JDK will include a copy of |
| // the most recent released version for a JDK release. We rename |
| // the package to com.sun.servicetag so that the Sun Connection |
| // product always uses the latest version from the com.sun.scn.servicetags |
| // package. JDK and users of the com.sun.servicetag API |
| // (e.g. NetBeans and SunStudio) will use the version in JDK. |
| // |
| // So we keep this class in src/share/classes instead of src/<os>/classes. |
| |
| import java.io.*; |
| |
| /** |
| * Linux implementation of the SystemEnvironment class. |
| */ |
| class LinuxSystemEnvironment extends SystemEnvironment { |
| LinuxSystemEnvironment() { |
| setHostId(getLinuxHostId()); |
| setSystemModel(getCommandOutput("/bin/uname", "-i")); |
| setSystemManufacturer(getLinuxSystemManufacturer()); |
| setCpuManufacturer(getLinuxCpuManufacturer()); |
| setSerialNumber(getLinuxSN()); |
| } |
| private String dmiInfo = null; |
| |
| private static final int SN = 1; |
| private static final int SYS = 2; |
| private static final int CPU = 3; |
| |
| private String getLinuxHostId() { |
| String output = getCommandOutput("/usr/bin/hostid"); |
| // trim off the leading 0x |
| if (output.startsWith("0x")) { |
| output = output.substring(2); |
| } |
| return output; |
| } |
| |
| /** |
| * Tries to obtain and return the cpu manufacturer. |
| * @return The cpu manufacturer (an empty string if not found or an error occurred) |
| */ |
| private String getLinuxCpuManufacturer() { |
| String tmp = getLinuxPSNInfo(CPU); |
| if (tmp.length() > 0) { |
| return tmp; |
| } |
| |
| String contents = getFileContent("/proc/cpuinfo"); |
| for (String line : contents.split("\n")) { |
| if (line.contains("vendor_id")) { |
| String[] ss = line.split(":", 2); |
| if (ss.length > 1) { |
| return ss[1].trim(); |
| } |
| } |
| } |
| |
| // returns an empty string if it can't be found or an error happened |
| return getLinuxDMIInfo("dmi type 4", "manufacturer"); |
| } |
| |
| |
| /** |
| * Tries to obtain and return the system manufacturer. |
| * @return The system manufacturer (an empty string if not found or an error occurred) |
| */ |
| private String getLinuxSystemManufacturer() { |
| String tmp = getLinuxPSNInfo(SYS); |
| if (tmp.length() > 0) { |
| return tmp; |
| } |
| |
| // returns an empty string if it can't be found or an error happened |
| return getLinuxDMIInfo("dmi type 1", "manufacturer"); |
| } |
| |
| /** |
| * Tries to obtain and return the serial number of the system. |
| * @return The serial number (an empty string if not found or an error occurred) |
| */ |
| private String getLinuxSN() { |
| String tmp = getLinuxPSNInfo(SN); |
| if (tmp.length() > 0) { |
| return tmp; |
| } |
| |
| // returns an empty string if it can't be found or an error happened |
| return getLinuxDMIInfo("dmi type 1", "serial number"); |
| } |
| |
| private String getLinuxPSNInfo(int target) { |
| // try to read from the psn file if it exists |
| String contents = getFileContent("/var/run/psn"); |
| String[] ss = contents.split("\n"); |
| if (target <= ss.length) { |
| return ss[target-1]; |
| } |
| |
| // default case is to return "" |
| return ""; |
| } |
| |
| // reads from dmidecode with the given type and target |
| // returns an empty string if nothing was found or an error occurred |
| // |
| // Sample output segment: |
| // Handle 0x0001 |
| // DMI type 1, 25 bytes. |
| // System Information |
| // Manufacturer: System manufacturer |
| // Product Name: System Product Name |
| // Version: System Version |
| // Serial Number: System Serial Number |
| // UUID: 3091D719-B25B-D911-959D-6D1B12C7686E |
| // Wake-up Type: Power Switch |
| |
| private synchronized String getLinuxDMIInfo(String dmiType, String target) { |
| // only try to get dmidecode information once, after that, we can |
| // reuse the output |
| if (dmiInfo == null) { |
| Thread dmidecodeThread = new Thread() { |
| public void run() { |
| dmiInfo = getCommandOutput("/usr/sbin/dmidecode"); |
| } |
| }; |
| dmidecodeThread.start(); |
| |
| try { |
| dmidecodeThread.join(2000); |
| if (dmidecodeThread.isAlive()) { |
| dmidecodeThread.interrupt(); |
| dmiInfo = ""; |
| } |
| } catch (InterruptedException ie) { |
| dmidecodeThread.interrupt(); |
| } |
| } |
| |
| if (dmiInfo.length() == 0) { |
| return ""; |
| } |
| boolean dmiFlag = false; |
| for (String s : dmiInfo.split("\n")) { |
| String line = s.toLowerCase(); |
| if (dmiFlag) { |
| if (line.contains(target)) { |
| String key = target + ":"; |
| int indx = line.indexOf(key) + key.length(); |
| if (line.contains(key) && indx < line.length()) { |
| return line.substring(indx).trim(); |
| } |
| String[] ss = line.split(":"); |
| return ss[ss.length-1]; |
| } |
| } else if (line.contains(dmiType)) { |
| dmiFlag = true; |
| } |
| } |
| return ""; |
| } |
| |
| } |