/******************************************************************************* * Copyright (c) 2011, 2016 Eurotech and others * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eurotech * Red Hat Inc - allow opting-out of System.exit(), fix resource leak *******************************************************************************/ package org.eclipse.kura.core.system; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.URL; import java.net.UnknownHostException; import java.security.AccessController; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Map; import java.util.Properties; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import org.eclipse.kura.KuraException; import org.eclipse.kura.core.util.IOUtil; import org.eclipse.kura.core.util.NetUtil; import org.eclipse.kura.core.util.ProcessUtil; import org.eclipse.kura.core.util.SafeProcess; import org.eclipse.kura.net.NetInterface; import org.eclipse.kura.net.NetInterfaceAddress; import org.eclipse.kura.net.NetworkService; import org.eclipse.kura.system.SystemService; import org.osgi.framework.Bundle; import org.osgi.service.component.ComponentContext; import org.osgi.service.component.ComponentException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SystemServiceImpl implements SystemService { private static final Logger s_logger = LoggerFactory.getLogger(SystemServiceImpl.class); private static final String CLOUDBEES_SECURITY_SETTINGS_PATH = "/private/eurotech/settings-security.xml"; private static final String KURA_PATH = "/opt/eclipse/kura"; private static boolean onCloudbees = false; private Properties m_kuraProperties; private ComponentContext m_ctx; private NetworkService m_networkService; // ---------------------------------------------------------------- // // Dependencies // // ---------------------------------------------------------------- public void setNetworkService(NetworkService networkService) { this.m_networkService = networkService; } public void unsetNetworkService(NetworkService networkService) { this.m_networkService = null; } // ---------------------------------------------------------------- // // Activation APIs // // ---------------------------------------------------------------- @SuppressWarnings({ "rawtypes", "unchecked" }) protected void activate(ComponentContext componentContext) { this.m_ctx = componentContext; AccessController.doPrivileged(new PrivilegedAction() { @Override public Object run() { try { // privileged code goes here, for example: onCloudbees = new File(CLOUDBEES_SECURITY_SETTINGS_PATH).exists(); return null; // nothing to return } catch (Exception e) { System.out.println("Unable to execute privileged in SystemService"); return null; } } }); // load the defaults from the kura.properties files Properties kuraDefaults = new Properties(); boolean updateTriggered = false; try { // special cases for older versions to fix relative path bug in v2.0.4 and earlier if (System.getProperty(KURA_CONFIG) != null && System.getProperty(KURA_CONFIG).trim().equals("file:kura/kura.properties")) { System.setProperty(KURA_CONFIG, "file:/opt/eclipse/kura/kura/kura.properties"); updateTriggered = true; s_logger.warn("Overridding invalid kura.properties location"); } if (System.getProperty("dpa.configuration") != null && System.getProperty("dpa.configuration").trim().equals("kura/dpa.properties")) { System.setProperty("dpa.configuration", "/opt/eclipse/kura/kura/dpa.properties"); updateTriggered = true; s_logger.warn("Overridding invalid dpa.properties location"); } if (System.getProperty("log4j.configuration") != null && System.getProperty("log4j.configuration").trim().equals("file:kura/log4j.properties")) { System.setProperty("log4j.configuration", "file:/opt/eclipse/kura/kura/log4j.properties"); updateTriggered = true; s_logger.warn("Overridding invalid log4j.properties location"); } // load the default kura.properties // look for kura.properties as resource in the classpath // if not found, look for such file in the kura.home directory String kuraHome = System.getProperty(KEY_KURA_HOME_DIR); String kuraConfig = System.getProperty(KURA_CONFIG); String kuraProperties = IOUtil.readResource(KURA_PROPS_FILE); if (kuraProperties != null) { kuraDefaults.load(new StringReader(kuraProperties)); s_logger.info("Loaded Jar Resource kura.properties."); } else if (kuraConfig != null) { try { final URL kuraConfigUrl = new URL(kuraConfig); final InputStream in = kuraConfigUrl.openStream(); try { kuraDefaults.load(in); } finally { if (in != null) { in.close(); } } s_logger.info("Loaded URL kura.properties: " + kuraConfig); } catch (Exception e) { s_logger.warn("Could not open kuraConfig URL", e); } } else if (kuraHome != null) { File kuraPropsFile = new File(kuraHome + File.separator + KURA_PROPS_FILE); if (kuraPropsFile.exists()) { final FileReader fr = new FileReader(kuraPropsFile); try { kuraDefaults.load(fr); } finally { fr.close(); } s_logger.info("Loaded File kura.properties: " + kuraPropsFile); } else { s_logger.warn("File does not exist: " + kuraPropsFile); } } else { s_logger.error("Could not located kura.properties with kura.home "); // +kuraHome } // load custom kura properties // look for kura_custom.properties as resource in the classpath // if not found, look for such file in the kura.home directory Properties kuraCustomProps = new Properties(); String kuraCustomConfig = System.getProperty(KURA_CUSTOM_CONFIG); String kuraCustomProperties = IOUtil.readResource(KURA_CUSTOM_PROPS_FILE); if (kuraCustomProperties != null) { kuraCustomProps.load(new StringReader(kuraCustomProperties)); s_logger.info("Loaded Jar Resource: " + KURA_CUSTOM_PROPS_FILE); } else if (kuraCustomConfig != null) { try { final URL kuraConfigUrl = new URL(kuraCustomConfig); final InputStream in = kuraConfigUrl.openStream(); try { kuraCustomProps.load(in); } finally { if (in != null) { in.close(); } } s_logger.info("Loaded URL kura_custom.properties: " + kuraCustomConfig); } catch (Exception e) { s_logger.warn("Could not open kuraCustomConfig URL: " + e); } } else if (kuraHome != null) { File kuraCustomPropsFile = new File(kuraHome + File.separator + KURA_CUSTOM_PROPS_FILE); if (kuraCustomPropsFile.exists()) { Reader reader = new FileReader(kuraCustomPropsFile); try { kuraCustomProps.load(reader); } finally { reader.close(); } s_logger.info("Loaded File " + KURA_CUSTOM_PROPS_FILE + ": " + kuraCustomPropsFile); } else { s_logger.warn("File does not exist: " + kuraCustomPropsFile); } } else { s_logger.info("Did not locate a kura_custom.properties file in " + kuraHome); } // Override defaults with values from kura_custom.properties kuraDefaults.putAll(kuraCustomProps); // more path overrides based on earlier Kura problem with relative paths if (kuraDefaults.getProperty(KEY_KURA_HOME_DIR) != null && kuraDefaults.getProperty(KEY_KURA_HOME_DIR).trim().equals("kura")) { kuraDefaults.setProperty(KEY_KURA_HOME_DIR, "/opt/eclipse/kura/kura"); updateTriggered = true; s_logger.warn("Overridding invalid kura.home location"); } if (kuraDefaults.getProperty(KEY_KURA_PLUGINS_DIR) != null && kuraDefaults.getProperty(KEY_KURA_PLUGINS_DIR).trim().equals("kura/plugins")) { kuraDefaults.setProperty(KEY_KURA_PLUGINS_DIR, "/opt/eclipse/kura/kura/plugins"); updateTriggered = true; s_logger.warn("Overridding invalid kura.plugins location"); } if (kuraDefaults.getProperty("kura.packages") != null && kuraDefaults.getProperty("kura.packages").trim().equals("kura/packages")) { kuraDefaults.setProperty("kura.packages", "/opt/eclipse/kura/kura/packages"); updateTriggered = true; s_logger.warn("Overridding invalid kura.packages location"); } if (updateTriggered) { File directory; // Desired current working directory directory = new File(KURA_PATH).getAbsoluteFile(); if (directory.exists() || directory.mkdirs()) { String oldDir = System.getProperty("user.dir"); if (System.setProperty("user.dir", directory.getAbsolutePath()) != null) { s_logger.warn("Changed working directory to /opt/eclipse/kura from " + oldDir); } } /* * // we were updated so we need to reload the DeploymentAdmin so it reads in the correct values * s_logger.info("kura.home = " + kuraDefaults.getProperty(KEY_KURA_HOME_DIR)); * s_logger.info("kura.plugins = " + kuraDefaults.getProperty(KEY_KURA_PLUGINS_DIR)); * s_logger.info("kura.packages = " + kuraDefaults.getProperty("kura.packages")); * * //write out Kura defaults back to kuraPropsFile * FileOutputStream fos = new FileOutputStream(kuraHome+File.separator+KURA_PROPS_FILE); * kuraDefaults.store(fos, null); * fos.flush(); * fos.getFD().sync(); * fos.close(); * * s_logger.warn("Restarting DeploymentAgent to reload kura.properties"); * String bundleName = "org.eclipse.kura.deployment.agent"; * * Bundle[] bundles = m_ctx.getBundleContext().getBundles(); * Long id = null; * try { * if(bundles != null && bundles.length > 0) { * for(Bundle bundle : bundles) { * if(bundle.getSymbolicName().equals(bundleName)) { * id = bundle.getBundleId(); * break; * } * } * } * } catch (NumberFormatException e){ * throw new ComponentException( * "Error restarting org.eclipse.kura.deployment.agent.DeploymentAgentService to update Kura", e); * } * * if (id != null) { * Bundle bundle = m_ctx.getBundleContext().getBundle(id); * if (bundle == null) { * s_logger.error("Bundle ID {} not found", id); * throw new ComponentException( * "Error restarting org.eclipse.kura.deployment.agent.DeploymentAgentService to update Kura"); * } else { * try { * bundle.stop(); * bundle.start(); * } catch (BundleException e) { * s_logger.error("Failed to restart bundle ", e); * } * } * } */ } // build the m_kuraProperties instance with the defaults this.m_kuraProperties = new Properties(kuraDefaults); // take care of the CloudBees environment // that is run in the continuous integration. if (onCloudbees) { this.m_kuraProperties.put(KEY_OS_NAME, OS_CLOUDBEES); } // Put the Net Admin and Web interface availability property so that is available through a get. Boolean hasNetAdmin = Boolean.valueOf(this.m_kuraProperties.getProperty(KEY_KURA_HAVE_NET_ADMIN, "true")); this.m_kuraProperties.put(KEY_KURA_HAVE_NET_ADMIN, hasNetAdmin); s_logger.info("Kura has net admin? " + hasNetAdmin); String hasWebInterface = this.m_kuraProperties.getProperty(KEY_KURA_HAVE_WEB_INTER, "true"); this.m_kuraProperties.put(KEY_KURA_HAVE_WEB_INTER, hasWebInterface); s_logger.info("Kura has web interface? " + hasWebInterface); String kuraVersion = this.m_kuraProperties.getProperty(KEY_KURA_VERSION, "version-unknown"); this.m_kuraProperties.put(KEY_KURA_VERSION, kuraVersion); s_logger.info("Kura version? " + kuraVersion); // load the System properties for what it makes sense // Properties systemProperties = System.getProperties(); // m_kuraProperties.putAll(systemProperties); if (System.getProperty(KEY_KURA_NAME) != null) { this.m_kuraProperties.put(KEY_KURA_NAME, System.getProperty(KEY_KURA_NAME)); } if (System.getProperty(KEY_KURA_VERSION) != null) { this.m_kuraProperties.put(KEY_KURA_VERSION, System.getProperty(KEY_KURA_VERSION)); } if (System.getProperty(KEY_DEVICE_NAME) != null) { this.m_kuraProperties.put(KEY_DEVICE_NAME, System.getProperty(KEY_DEVICE_NAME)); } if (System.getProperty(KEY_PLATFORM) != null) { this.m_kuraProperties.put(KEY_PLATFORM, System.getProperty(KEY_PLATFORM)); } if (System.getProperty(KEY_MODEL_ID) != null) { this.m_kuraProperties.put(KEY_MODEL_ID, System.getProperty(KEY_MODEL_ID)); } if (System.getProperty(KEY_MODEL_NAME) != null) { this.m_kuraProperties.put(KEY_MODEL_NAME, System.getProperty(KEY_MODEL_NAME)); } if (System.getProperty(KEY_PART_NUMBER) != null) { this.m_kuraProperties.put(KEY_PART_NUMBER, System.getProperty(KEY_PART_NUMBER)); } if (System.getProperty(KEY_SERIAL_NUM) != null) { this.m_kuraProperties.put(KEY_SERIAL_NUM, System.getProperty(KEY_SERIAL_NUM)); } if (System.getProperty(KEY_BIOS_VERSION) != null) { this.m_kuraProperties.put(KEY_BIOS_VERSION, System.getProperty(KEY_BIOS_VERSION)); } if (System.getProperty(KEY_FIRMWARE_VERSION) != null) { this.m_kuraProperties.put(KEY_FIRMWARE_VERSION, System.getProperty(KEY_FIRMWARE_VERSION)); } if (System.getProperty(KEY_PRIMARY_NET_IFACE) != null) { this.m_kuraProperties.put(KEY_PRIMARY_NET_IFACE, System.getProperty(KEY_PRIMARY_NET_IFACE)); } if (System.getProperty(KEY_KURA_HOME_DIR) != null) { this.m_kuraProperties.put(KEY_KURA_HOME_DIR, System.getProperty(KEY_KURA_HOME_DIR)); } if (System.getProperty(KEY_KURA_PLUGINS_DIR) != null) { this.m_kuraProperties.put(KEY_KURA_PLUGINS_DIR, System.getProperty(KEY_KURA_PLUGINS_DIR)); } if (System.getProperty(KEY_KURA_DATA_DIR) != null) { this.m_kuraProperties.put(KEY_KURA_DATA_DIR, System.getProperty(KEY_KURA_DATA_DIR)); } if (System.getProperty(KEY_KURA_TMP_DIR) != null) { this.m_kuraProperties.put(KEY_KURA_TMP_DIR, System.getProperty(KEY_KURA_TMP_DIR)); } if (System.getProperty(KEY_KURA_SNAPSHOTS_DIR) != null) { this.m_kuraProperties.put(KEY_KURA_SNAPSHOTS_DIR, System.getProperty(KEY_KURA_SNAPSHOTS_DIR)); } if (System.getProperty(KEY_KURA_SNAPSHOTS_COUNT) != null) { this.m_kuraProperties.put(KEY_KURA_SNAPSHOTS_COUNT, System.getProperty(KEY_KURA_SNAPSHOTS_COUNT)); } if (System.getProperty(KEY_KURA_HAVE_NET_ADMIN) != null) { this.m_kuraProperties.put(KEY_KURA_HAVE_NET_ADMIN, System.getProperty(KEY_KURA_HAVE_NET_ADMIN)); } if (System.getProperty(KEY_KURA_HAVE_WEB_INTER) != null) { this.m_kuraProperties.put(KEY_KURA_HAVE_WEB_INTER, System.getProperty(KEY_KURA_HAVE_WEB_INTER)); } if (System.getProperty(KEY_KURA_STYLE_DIR) != null) { this.m_kuraProperties.put(KEY_KURA_STYLE_DIR, System.getProperty(KEY_KURA_STYLE_DIR)); } if (System.getProperty(KEY_KURA_WIFI_TOP_CHANNEL) != null) { this.m_kuraProperties.put(KEY_KURA_WIFI_TOP_CHANNEL, System.getProperty(KEY_KURA_WIFI_TOP_CHANNEL)); } if (System.getProperty(KEY_KURA_KEY_STORE_PWD) != null) { this.m_kuraProperties.put(KEY_KURA_KEY_STORE_PWD, System.getProperty(KEY_KURA_KEY_STORE_PWD)); } if (System.getProperty(KEY_KURA_TRUST_STORE_PWD) != null) { this.m_kuraProperties.put(KEY_KURA_TRUST_STORE_PWD, System.getProperty(KEY_KURA_TRUST_STORE_PWD)); } if (System.getProperty(KEY_FILE_COMMAND_ZIP_MAX_SIZE) != null) { this.m_kuraProperties.put(KEY_FILE_COMMAND_ZIP_MAX_SIZE, System.getProperty(KEY_FILE_COMMAND_ZIP_MAX_SIZE)); } if (System.getProperty(KEY_FILE_COMMAND_ZIP_MAX_NUMBER) != null) { this.m_kuraProperties.put(KEY_FILE_COMMAND_ZIP_MAX_NUMBER, System.getProperty(KEY_FILE_COMMAND_ZIP_MAX_NUMBER)); } if (System.getProperty(KEY_OS_ARCH) != null) { this.m_kuraProperties.put(KEY_OS_ARCH, System.getProperty(KEY_OS_ARCH)); } if (System.getProperty(KEY_OS_NAME) != null) { this.m_kuraProperties.put(KEY_OS_NAME, System.getProperty(KEY_OS_NAME)); } if (System.getProperty(KEY_OS_VER) != null) { this.m_kuraProperties.put(KEY_OS_VER, getOsVersion()); // System.getProperty(KEY_OS_VER) } if (System.getProperty(KEY_OS_DISTRO) != null) { this.m_kuraProperties.put(KEY_OS_DISTRO, System.getProperty(KEY_OS_DISTRO)); } if (System.getProperty(KEY_OS_DISTRO_VER) != null) { this.m_kuraProperties.put(KEY_OS_DISTRO_VER, System.getProperty(KEY_OS_DISTRO_VER)); } if (System.getProperty(KEY_JAVA_VERSION) != null) { this.m_kuraProperties.put(KEY_JAVA_VERSION, System.getProperty(KEY_JAVA_VERSION)); } if (System.getProperty(KEY_JAVA_VENDOR) != null) { this.m_kuraProperties.put(KEY_JAVA_VENDOR, System.getProperty(KEY_JAVA_VENDOR)); } if (System.getProperty(KEY_JAVA_VM_NAME) != null) { this.m_kuraProperties.put(KEY_JAVA_VM_NAME, System.getProperty(KEY_JAVA_VM_NAME)); } if (System.getProperty(KEY_JAVA_VM_VERSION) != null) { this.m_kuraProperties.put(KEY_JAVA_VM_VERSION, System.getProperty(KEY_JAVA_VM_VERSION)); } if (System.getProperty(KEY_JAVA_VM_INFO) != null) { this.m_kuraProperties.put(KEY_JAVA_VM_INFO, System.getProperty(KEY_JAVA_VM_INFO)); } if (System.getProperty(KEY_OSGI_FW_NAME) != null) { this.m_kuraProperties.put(KEY_OSGI_FW_NAME, System.getProperty(KEY_OSGI_FW_NAME)); } if (System.getProperty(KEY_OSGI_FW_VERSION) != null) { this.m_kuraProperties.put(KEY_OSGI_FW_VERSION, System.getProperty(KEY_OSGI_FW_VERSION)); } if (System.getProperty(KEY_JAVA_HOME) != null) { this.m_kuraProperties.put(KEY_JAVA_HOME, System.getProperty(KEY_JAVA_HOME)); } if (System.getProperty(KEY_FILE_SEP) != null) { this.m_kuraProperties.put(KEY_FILE_SEP, System.getProperty(KEY_FILE_SEP)); } if (System.getProperty(CONFIG_CONSOLE_DEVICE_MANAGE_SERVICE_IGNORE) != null) { this.m_kuraProperties.put(CONFIG_CONSOLE_DEVICE_MANAGE_SERVICE_IGNORE, System.getProperty(CONFIG_CONSOLE_DEVICE_MANAGE_SERVICE_IGNORE)); } if (System.getProperty(DB_URL_PROPNAME) != null) { this.m_kuraProperties.put(DB_URL_PROPNAME, System.getProperty(DB_URL_PROPNAME)); } if (System.getProperty(DB_CACHE_ROWS_PROPNAME) != null) { this.m_kuraProperties.put(DB_CACHE_ROWS_PROPNAME, System.getProperty(DB_CACHE_ROWS_PROPNAME)); } if (System.getProperty(DB_LOB_FILE_PROPNAME) != null) { this.m_kuraProperties.put(DB_LOB_FILE_PROPNAME, System.getProperty(DB_LOB_FILE_PROPNAME)); } if (System.getProperty(DB_DEFRAG_LIMIT_PROPNAME) != null) { this.m_kuraProperties.put(DB_DEFRAG_LIMIT_PROPNAME, System.getProperty(DB_DEFRAG_LIMIT_PROPNAME)); } if (System.getProperty(DB_LOG_DATA_PROPNAME) != null) { this.m_kuraProperties.put(DB_LOG_DATA_PROPNAME, System.getProperty(DB_LOG_DATA_PROPNAME)); } if (System.getProperty(DB_LOG_SIZE_PROPNAME) != null) { this.m_kuraProperties.put(DB_LOG_SIZE_PROPNAME, System.getProperty(DB_LOG_SIZE_PROPNAME)); } if (System.getProperty(DB_NIO_PROPNAME) != null) { this.m_kuraProperties.put(DB_NIO_PROPNAME, System.getProperty(DB_NIO_PROPNAME)); } if (System.getProperty(DB_WRITE_DELAY_MILLIES_PROPNAME) != null) { this.m_kuraProperties.put(DB_WRITE_DELAY_MILLIES_PROPNAME, System.getProperty(DB_WRITE_DELAY_MILLIES_PROPNAME)); } if (getKuraHome() == null) { s_logger.error("Did not initialize kura.home"); } else { s_logger.info("Kura home directory is " + getKuraHome()); createDirIfNotExists(getKuraHome()); } if (getKuraSnapshotsDirectory() == null) { s_logger.error("Did not initialize kura.snapshots"); } else { s_logger.info("Kura snapshots directory is " + getKuraSnapshotsDirectory()); createDirIfNotExists(getKuraSnapshotsDirectory()); } if (getKuraTemporaryConfigDirectory() == null) { s_logger.error("Did not initialize kura.tmp"); } else { s_logger.info("Kura tmp directory is " + getKuraTemporaryConfigDirectory()); createDirIfNotExists(getKuraTemporaryConfigDirectory()); } s_logger.info(new StringBuffer().append("Kura version ").append(getKuraVersion()).append(" is starting") .toString()); } catch (IOException e) { throw new ComponentException("Error loading default properties", e); } } protected void deactivate(ComponentContext componentContext) { this.m_ctx = null; this.m_kuraProperties = null; } public void updated(Map<String, Object> properties) { // nothing to do // all properties of the System service are read-only } // ---------------------------------------------------------------- // // Service APIs // // ---------------------------------------------------------------- /** * Returns all KuraProperties for this system. The returned instances is * initialized by loading the kura.properties file. Properties defined at * the System level - for example using the java -D command line flag - * are used to overwrite the values loaded from the kura.properties file * in a hierarchical configuration fashion. */ @Override public Properties getProperties() { return this.m_kuraProperties; } @Override public String getPrimaryMacAddress() { String primaryNetworkInterfaceName = getPrimaryNetworkInterfaceName(); String macAddress = null; InetAddress ip; if (OS_MAC_OSX.equals(getOsName())) { SafeProcess proc = null; try { s_logger.info("executing: ifconfig and looking for " + primaryNetworkInterfaceName); proc = ProcessUtil.exec("ifconfig"); BufferedReader br = null; try { proc.waitFor(); br = new BufferedReader(new InputStreamReader(proc.getInputStream())); String line = null; while ((line = br.readLine()) != null) { if (line.startsWith(primaryNetworkInterfaceName)) { // get the next line and save the MAC line = br.readLine(); if (line == null) { throw new IOException("Null imput!"); } if (!line.trim().startsWith("ether")) { line = br.readLine(); } String[] splitLine = line.split(" "); if (splitLine.length > 0) { return splitLine[1].toUpperCase(); } } } } catch (InterruptedException e) { s_logger.error("Exception while executing ifconfig!", e); } finally { if (br != null) { try { br.close(); } catch (IOException ex) { s_logger.error("I/O Exception while closing BufferedReader!"); } } } } catch (Exception e) { s_logger.error("Failed to get network interfaces", e); } finally { if (proc != null) { ProcessUtil.destroy(proc); } } } else if (getOsName().contains("Windows")) { try { s_logger.info("executing: InetAddress.getLocalHost " + primaryNetworkInterfaceName); ip = InetAddress.getLocalHost(); Enumeration<NetworkInterface> networks = NetworkInterface.getNetworkInterfaces(); while (networks.hasMoreElements()) { NetworkInterface network = networks.nextElement(); if ("eth0".equals(network.getName())) { ip = network.getInetAddresses().nextElement(); break; } } NetworkInterface network = NetworkInterface.getByInetAddress(ip); byte[] mac = network.getHardwareAddress(); macAddress = NetUtil.hardwareAddressToString(mac); s_logger.info("macAddress " + macAddress); } catch (UnknownHostException e) { s_logger.error(e.getLocalizedMessage()); } catch (SocketException e) { s_logger.error(e.getLocalizedMessage()); } } else { try { List<NetInterface<? extends NetInterfaceAddress>> interfaces = this.m_networkService .getNetworkInterfaces(); if (interfaces != null) { for (NetInterface<? extends NetInterfaceAddress> iface : interfaces) { if (iface.getName() != null && getPrimaryNetworkInterfaceName().equals(iface.getName())) { macAddress = NetUtil.hardwareAddressToString(iface.getHardwareAddress()); break; } } } } catch (KuraException e) { s_logger.error("Failed to get network interfaces", e); } } return macAddress; } @Override public String getPrimaryNetworkInterfaceName() { if (this.m_kuraProperties.getProperty(KEY_PRIMARY_NET_IFACE) != null) { return this.m_kuraProperties.getProperty(KEY_PRIMARY_NET_IFACE); } else { if (OS_MAC_OSX.equals(getOsName())) { return "en0"; } else if (OS_LINUX.equals(getOsName())) { return "eth0"; } else if (getOsName().contains("Windows")) { return "windows"; } else { s_logger.error("Unsupported platform"); return null; } } } @Override public String getPlatform() { return this.m_kuraProperties.getProperty(KEY_PLATFORM); } @Override public String getOsArch() { String override = this.m_kuraProperties.getProperty(KEY_OS_ARCH); if (override != null) { return override; } return System.getProperty(KEY_OS_ARCH); } @Override public String getOsName() { String override = this.m_kuraProperties.getProperty(KEY_OS_NAME); if (override != null) { return override; } return System.getProperty(KEY_OS_NAME); } @Override public String getOsVersion() { String override = this.m_kuraProperties.getProperty(KEY_OS_VER); if (override != null) { return override; } StringBuilder sbOsVersion = new StringBuilder(); sbOsVersion.append(System.getProperty(KEY_OS_VER)); if (OS_LINUX.equals(getOsName())) { BufferedReader in = null; File linuxKernelVersion = null; FileReader fr = null; try { linuxKernelVersion = new File("/proc/sys/kernel/version"); if (linuxKernelVersion.exists()) { StringBuilder kernelVersionData = new StringBuilder(); fr = new FileReader(linuxKernelVersion); in = new BufferedReader(fr); String tempLine = null; while ((tempLine = in.readLine()) != null) { kernelVersionData.append(" "); kernelVersionData.append(tempLine); } sbOsVersion.append(kernelVersionData.toString()); } } catch (FileNotFoundException e) { } catch (IOException e) { } finally { try { if (fr != null) { fr.close(); } if (in != null) { in.close(); } } catch (IOException e) { s_logger.error("Exception while closing resources!", e); } } } return sbOsVersion.toString(); } @Override public String getOsDistro() { return this.m_kuraProperties.getProperty(KEY_OS_DISTRO); } @Override public String getOsDistroVersion() { return this.m_kuraProperties.getProperty(KEY_OS_DISTRO_VER); } @Override public String getJavaVendor() { String override = this.m_kuraProperties.getProperty(KEY_JAVA_VENDOR); if (override != null) { return override; } return System.getProperty(KEY_JAVA_VENDOR); } @Override public String getJavaVersion() { String override = this.m_kuraProperties.getProperty(KEY_JAVA_VERSION); if (override != null) { return override; } return System.getProperty(KEY_JAVA_VERSION); } @Override public String getJavaVmName() { String override = this.m_kuraProperties.getProperty(KEY_JAVA_VM_NAME); if (override != null) { return override; } return System.getProperty(KEY_JAVA_VM_NAME); } @Override public String getJavaVmVersion() { String override = this.m_kuraProperties.getProperty(KEY_JAVA_VM_VERSION); if (override != null) { return override; } return System.getProperty(KEY_JAVA_VM_VERSION); } @Override public String getJavaVmInfo() { String override = this.m_kuraProperties.getProperty(KEY_JAVA_VM_INFO); if (override != null) { return override; } return System.getProperty(KEY_JAVA_VM_INFO); } @Override public String getOsgiFwName() { String override = this.m_kuraProperties.getProperty(KEY_OSGI_FW_NAME); if (override != null) { return override; } return System.getProperty(KEY_OSGI_FW_NAME); } @Override public String getOsgiFwVersion() { String override = this.m_kuraProperties.getProperty(KEY_OSGI_FW_VERSION); if (override != null) { return override; } return System.getProperty(KEY_OSGI_FW_VERSION); } @Override public int getNumberOfProcessors() { try { return Runtime.getRuntime().availableProcessors(); } catch (Throwable t) { // NoSuchMethodError on pre-1.4 runtimes } return -1; } @Override public long getTotalMemory() { return Runtime.getRuntime().totalMemory() / 1024; } @Override public long getFreeMemory() { return Runtime.getRuntime().freeMemory() / 1024; } @Override public String getFileSeparator() { String override = this.m_kuraProperties.getProperty(KEY_FILE_SEP); if (override != null) { return override; } return System.getProperty(KEY_FILE_SEP); } @Override public String getJavaHome() { String override = this.m_kuraProperties.getProperty(KEY_JAVA_HOME); if (override != null) { return override; } return System.getProperty(KEY_JAVA_HOME); } public String getKuraName() { return this.m_kuraProperties.getProperty(KEY_KURA_NAME); } @Override public String getKuraVersion() { return this.m_kuraProperties.getProperty(KEY_KURA_VERSION); } @Override public String getKuraHome() { return this.m_kuraProperties.getProperty(KEY_KURA_HOME_DIR); } public String getKuraPluginsDirectory() { return this.m_kuraProperties.getProperty(KEY_KURA_PLUGINS_DIR); } @Override public String getKuraDataDirectory() { return this.m_kuraProperties.getProperty(KEY_KURA_DATA_DIR); } @Override public String getKuraTemporaryConfigDirectory() { return this.m_kuraProperties.getProperty(KEY_KURA_TMP_DIR); } @Override public String getKuraSnapshotsDirectory() { return this.m_kuraProperties.getProperty(KEY_KURA_SNAPSHOTS_DIR); } @Override public int getKuraSnapshotsCount() { int iMaxCount = 10; String maxCount = this.m_kuraProperties.getProperty(KEY_KURA_SNAPSHOTS_COUNT); if (maxCount != null && maxCount.trim().length() > 0) { try { iMaxCount = Integer.parseInt(maxCount); } catch (NumberFormatException nfe) { s_logger.error("Error - Invalid kura.snapshots.count setting. Using default.", nfe); } } return iMaxCount; } @Override public int getKuraWifiTopChannel() { String topWifiChannel = this.m_kuraProperties.getProperty(KEY_KURA_WIFI_TOP_CHANNEL); if (topWifiChannel != null && topWifiChannel.trim().length() > 0) { return Integer.parseInt(topWifiChannel); } s_logger.warn("The last wifi channel is not defined for this system - setting to lowest common value of 11"); return 11; } @Override public String getKuraStyleDirectory() { return this.m_kuraProperties.getProperty(KEY_KURA_STYLE_DIR); } @Override public String getKuraWebEnabled() { return this.m_kuraProperties.getProperty(KEY_KURA_HAVE_WEB_INTER); } @Override public int getFileCommandZipMaxUploadSize() { String commandMaxUpload = this.m_kuraProperties.getProperty(KEY_FILE_COMMAND_ZIP_MAX_SIZE); if (commandMaxUpload != null && commandMaxUpload.trim().length() > 0) { return Integer.parseInt(commandMaxUpload); } s_logger.warn("Maximum command line upload size not available. Set default to 100 MB"); return 100; } @Override public int getFileCommandZipMaxUploadNumber() { String commandMaxFilesUpload = this.m_kuraProperties.getProperty(KEY_FILE_COMMAND_ZIP_MAX_NUMBER); if (commandMaxFilesUpload != null && commandMaxFilesUpload.trim().length() > 0) { return Integer.parseInt(commandMaxFilesUpload); } s_logger.warn( "Missing the parameter that specifies the maximum number of files uploadable using the command servlet. Set default to 1024 files"); return 1024; } @Override public String getBiosVersion() { String override = this.m_kuraProperties.getProperty(KEY_BIOS_VERSION); if (override != null) { return override; } String biosVersion = UNSUPPORTED; if (OS_LINUX.equals(getOsName())) { if ("2.6.34.9-WR4.2.0.0_standard".equals(getOsVersion()) || "2.6.34.12-WR4.3.0.0_standard".equals(getOsVersion())) { biosVersion = runSystemInfoCommand("eth_vers_bios"); } else { String biosTmp = runSystemInfoCommand("dmidecode -s bios-version"); if (biosTmp.length() > 0 && !biosTmp.contains("Permission denied")) { biosVersion = biosTmp; } } } else if (OS_MAC_OSX.equals(getOsName())) { String[] cmds = { "/bin/sh", "-c", "system_profiler SPHardwareDataType | grep 'Boot ROM'" }; String biosTmp = runSystemInfoCommand(cmds); if (biosTmp.contains(": ")) { biosVersion = biosTmp.split(":\\s+")[1]; } } return biosVersion; } @Override public String getDeviceName() { String override = this.m_kuraProperties.getProperty(KEY_DEVICE_NAME); if (override != null) { return override; } String deviceName = UNKNOWN; if (OS_MAC_OSX.equals(getOsName())) { String displayTmp = runSystemInfoCommand("scutil --get ComputerName"); if (displayTmp.length() > 0) { deviceName = displayTmp; } } else if (OS_LINUX.equals(getOsName()) || OS_CLOUDBEES.equals(getOsName())) { String displayTmp = runSystemInfoCommand("hostname"); if (displayTmp.length() > 0) { deviceName = displayTmp; } } return deviceName; } @Override public String getFirmwareVersion() { String override = this.m_kuraProperties.getProperty(KEY_FIRMWARE_VERSION); if (override != null) { return override; } String fwVersion = UNSUPPORTED; if (OS_LINUX.equals(getOsName()) && getOsVersion() != null) { if (getOsVersion().startsWith("2.6.34.9-WR4.2.0.0_standard") || getOsVersion().startsWith("2.6.34.12-WR4.3.0.0_standard")) { fwVersion = runSystemInfoCommand("eth_vers_cpld") + " " + runSystemInfoCommand("eth_vers_uctl"); } else if (getOsVersion().startsWith("3.0.35-12.09.01+yocto")) { fwVersion = runSystemInfoCommand("eth_vers_avr"); } } return fwVersion; } @Override public String getModelId() { String override = this.m_kuraProperties.getProperty(KEY_MODEL_ID); if (override != null) { return override; } String modelId = UNKNOWN; if (OS_MAC_OSX.equals(getOsName())) { String modelTmp = runSystemInfoCommand("sysctl -b hw.model"); if (modelTmp.length() > 0) { modelId = modelTmp; } } else if (OS_LINUX.equals(getOsName())) { String modelTmp = runSystemInfoCommand("dmidecode -t system"); if (modelTmp.contains("Version: ")) { modelId = modelTmp.split("Version:\\s+")[1].split("\n")[0]; } } return modelId; } @Override public String getModelName() { String override = this.m_kuraProperties.getProperty(KEY_MODEL_NAME); if (override != null) { return override; } String modelName = UNKNOWN; if (OS_MAC_OSX.equals(getOsName())) { String[] cmds = { "/bin/sh", "-c", "system_profiler SPHardwareDataType | grep 'Model Name'" }; String modelTmp = runSystemInfoCommand(cmds); if (modelTmp.contains(": ")) { modelName = modelTmp.split(":\\s+")[1]; } } else if (OS_LINUX.equals(getOsName())) { String modelTmp = runSystemInfoCommand("dmidecode -t system"); if (modelTmp.contains("Product Name: ")) { modelName = modelTmp.split("Product Name:\\s+")[1].split("\n")[0]; } } return modelName; } @Override public String getPartNumber() { String override = this.m_kuraProperties.getProperty(KEY_PART_NUMBER); if (override != null) { return override; } String partNumber = UNSUPPORTED; if (OS_LINUX.equals(getOsName())) { if ("2.6.34.9-WR4.2.0.0_standard".equals(getOsVersion()) || "2.6.34.12-WR4.3.0.0_standard".equals(getOsVersion())) { partNumber = runSystemInfoCommand("eth_partno_bsp") + " " + runSystemInfoCommand("eth_partno_epr"); } } return partNumber; } @Override public String getSerialNumber() { String override = this.m_kuraProperties.getProperty(KEY_SERIAL_NUM); if (override != null) { return override; } String serialNum = UNKNOWN; if (OS_MAC_OSX.equals(getOsName())) { String[] cmds = { "/bin/sh", "-c", "system_profiler SPHardwareDataType | grep 'Serial Number'" }; String serialTmp = runSystemInfoCommand(cmds); if (serialTmp.contains(": ")) { serialNum = serialTmp.split(":\\s+")[1]; } } else if (OS_LINUX.equals(getOsName())) { String serialTmp = runSystemInfoCommand("dmidecode -t system"); if (serialTmp.contains("Serial Number: ")) { serialNum = serialTmp.split("Serial Number:\\s+")[1].split("\n")[0]; } } return serialNum; } @Override public char[] getJavaKeyStorePassword() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, IOException { String keyStorePwd = this.m_kuraProperties.getProperty(KEY_KURA_KEY_STORE_PWD); if (keyStorePwd != null) { return keyStorePwd.toCharArray(); } return null; } @Override public char[] getJavaTrustStorePassword() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, IOException { String trustStorePwd = this.m_kuraProperties.getProperty(KEY_KURA_TRUST_STORE_PWD); if (trustStorePwd != null) { return trustStorePwd.toCharArray(); } return null; } @Override public Bundle[] getBundles() { if (this.m_ctx == null) { return null; } return this.m_ctx.getBundleContext().getBundles(); } @Override public List<String> getDeviceManagementServiceIgnore() { String servicesToIgnore = this.m_kuraProperties.getProperty(CONFIG_CONSOLE_DEVICE_MANAGE_SERVICE_IGNORE); if (servicesToIgnore != null && !servicesToIgnore.trim().isEmpty()) { String[] servicesArray = servicesToIgnore.split(","); if (servicesArray != null && servicesArray.length > 0) { List<String> services = new ArrayList<String>(); for (String service : servicesArray) { services.add(service); } return services; } } return null; } // ---------------------------------------------------------------- // // Private Methods // // ---------------------------------------------------------------- private String runSystemInfoCommand(String command) { return runSystemInfoCommand(command.split("\\s+")); } private static String runSystemInfoCommand(String[] commands) { StringBuffer response = new StringBuffer(); SafeProcess proc = null; BufferedReader br = null; try { proc = ProcessUtil.exec(commands); proc.waitFor(); br = new BufferedReader(new InputStreamReader(proc.getInputStream())); String line = null; String newLine = ""; while ((line = br.readLine()) != null) { response.append(newLine); response.append(line); newLine = "\n"; } } catch (Exception e) { StringBuilder command = new StringBuilder(); String delim = ""; for (String command2 : commands) { command.append(delim); command.append(command2); delim = " "; } s_logger.error("failed to run commands " + command.toString(), e); } finally { if (br != null) { try { br.close(); } catch (IOException ex) { s_logger.error("I/O Exception while closing BufferedReader!"); } } if (proc != null) { ProcessUtil.destroy(proc); } } return response.toString(); } private static void createDirIfNotExists(String fileName) { // Make sure the configuration directory exists - create it if not File file = new File(fileName); if (!file.exists() && !file.mkdirs()) { s_logger.error("Failed to create the temporary configuration directory: {}", fileName); if (Boolean.getBoolean("org.eclipse.kura.core.dontExitOnFailure")) { throw new RuntimeException( String.format("Failed to create the temporary configuration directory: %s", fileName)); } System.exit(-1); } } }