private Map<NativeAttribute, String> buildPasswdSwitches(
      SolarisEntry entry, SolarisConnection conn) {
    Map<NativeAttribute, String> passwdSwitches =
        new EnumMap<NativeAttribute, String>(NativeAttribute.class);
    passwdSwitches.put(NativeAttribute.PWSTAT, "-f");
    // passwdSwitches.put(NativeAttribute.PW_LAST_CHANGE, null); // this is
    // not used attribute (see LoginsCommand and its SVIDRA counterpart).
    // TODO erase this comment.
    passwdSwitches.put(NativeAttribute.MIN_DAYS_BETWEEN_CHNG, "-n");
    passwdSwitches.put(NativeAttribute.MAX_DAYS_BETWEEN_CHNG, "-x");
    passwdSwitches.put(NativeAttribute.DAYS_BEFORE_TO_WARN, "-w");

    String lockFlag = null;
    Attribute lock = entry.searchForAttribute(NativeAttribute.LOCK);
    if (lock != null) {
      Object lockValue = AttributeUtil.getSingleValue(lock);
      if (lockValue == null) {
        throw new IllegalArgumentException("missing value for attribute LOCK");
      }
      boolean isLock = (Boolean) lockValue;
      if (isLock) {
        lockFlag = "-l";
      } else {
        // *unlocking* differs in Solaris 8,9 and in Solaris 10+:
        lockFlag = (conn.isVersionLT10()) ? "-df" : "-u";
        passwdSwitches.put(NativeAttribute.LOCK, lockFlag);
      }
    }
    if (lockFlag != null) {
      passwdSwitches.put(NativeAttribute.LOCK, lockFlag);
    }
    return passwdSwitches;
  }
 @Override
 public String getRenameDirScript(SolarisEntry entry, String newName) {
   // @formatter:off
   String renameDir =
       "NEWNAME="
           + newName
           + "; "
           + "OLDNAME="
           + entry.getName()
           + "; "
           + "OLDDIR=`"
           + conn.buildCommand(true, "logins")
           + " -ox -l $NEWNAME | cut -d: -f6`; "
           + "OLDBASE=`basename $OLDDIR`; "
           + "if [ \"$OLDNAME\" = \"$OLDBASE\" ]; then\n"
           + "PARENTDIR=`dirname $OLDDIR`; "
           + "NEWDIR=`echo $PARENTDIR/$NEWNAME`; "
           + "if [ ! -s $NEWDIR ]; then "
           + conn.buildCommand(true, "chown")
           + " $NEWNAME $OLDDIR; "
           + conn.buildCommand(true, "mv")
           + " -f $OLDDIR $NEWDIR; "
           + "if [ $? -eq 0 ]; then\n"
           + conn.buildCommand(true, "usermod")
           + " -d $NEWDIR $NEWNAME; "
           + "fi; "
           + "fi; "
           + "fi";
   // @formatter:off
   return renameDir;
 }
  @Override
  public void configurePasswordProperties(SolarisEntry entry, SolarisConnection conn) {
    Map<NativeAttribute, String> passwdSwitches = buildPasswdSwitches(entry, conn);
    final String cmdSwitches = CommandSwitches.formatCommandSwitches(entry, conn, passwdSwitches);
    if (cmdSwitches.length() == 0) {
      return; // no password related attribute present in the entry.
    }

    try {
      final String command = conn.buildCommand(true, "passwd", cmdSwitches, entry.getName());
      final String out = conn.executeCommand(command);
      final String loweredOut = out.toLowerCase();
      if (loweredOut.contains("usage:")
          || loweredOut.contains("password aging is disabled")
          || loweredOut.contains("command not found")) {
        throw new ConnectorException(
            "Error during configuration of password related attributes. Buffer content: <"
                + out
                + ">");
      }
    } catch (Exception ex) {
      throw ConnectorException.wrap(ex);
    }
  }