diff options
Diffstat (limited to 'desktop/source/registration/com/sun/star/servicetag/LinuxSystemEnvironment.java')
-rw-r--r-- | desktop/source/registration/com/sun/star/servicetag/LinuxSystemEnvironment.java | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/desktop/source/registration/com/sun/star/servicetag/LinuxSystemEnvironment.java b/desktop/source/registration/com/sun/star/servicetag/LinuxSystemEnvironment.java new file mode 100644 index 0000000000..88ccd453a1 --- /dev/null +++ b/desktop/source/registration/com/sun/star/servicetag/LinuxSystemEnvironment.java @@ -0,0 +1,194 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LinuxSystemEnvironment.java,v $ + * + * $Revision: 1.2 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package com.sun.star.servicetag; + +// 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. + +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 ""; + } + +} |