@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(this.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(this.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 getSerialNumber() {
    String override = this.m_kuraProperties.getProperty(KEY_SERIAL_NUM);
    if (override != null) {
      return override;
    }

    String serialNum = UNKNOWN;

    if (OS_MAC_OSX.equals(this.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(this.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 String getPrimaryNetworkInterfaceName() {
   if (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 {
       s_logger.error("Unsupported platform");
       return null;
     }
   }
 }
  @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(this.getOsName())) {
      String displayTmp = runSystemInfoCommand("scutil --get ComputerName");
      if (displayTmp.length() > 0) {
        deviceName = displayTmp;
      }
    } else if (OS_LINUX.equals(this.getOsName()) || OS_CLOUDBEES.equals(this.getOsName())) {
      String displayTmp = runSystemInfoCommand("hostname");
      if (displayTmp.length() > 0) {
        deviceName = displayTmp;
      }
    }
    return deviceName;
  }
  @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(this.getOsName())) {
      String modelTmp = runSystemInfoCommand("sysctl -b hw.model");
      if (modelTmp.length() > 0) {
        modelId = modelTmp;
      }
    } else if (OS_LINUX.equals(this.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(this.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(this.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 getPrimaryMacAddress() {
    String primaryNetworkInterfaceName = getPrimaryNetworkInterfaceName();
    String macAddress = null;

    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 {
      try {
        List<NetInterface<? extends NetInterfaceAddress>> interfaces =
            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;
  }