batch add users to nextcloud on docker with csv





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}







1












$begingroup$


I have a working script that will batch add users to an instance of nextcloud running on top of docker. This version is the result of changes made after asking this question.



I guess I'm looking for a re-review to ensure that I haven't missed anything. I'm also interested if there are areas where I could make things better in terms of readability, performance, security, etc. You're the reviewer. My code is your oyster.



#!/bin/sh

set -eu

# Handle printing errors
die () {
printf '%sn' "$1" >&2
exit 1
}

message () {
printf '%sn' "$1" >&2
}

usage () {
cat <<'EOF'
NAME
batch_up - batch upload users

SYNOPSIS
batch_up -?
batch_up -h
batch_up --help
batch_up -v
batch_up -vv
batch_up -vvv
batch_up --verbose
batch_up -d
batch_up --delimiter
batch_up --delimiter=

DESCRIPTION
Batch_up is a program that adds a batch of users to an instance of NextCloud
running inside of a docker container by reading a comma separated list from
stdin or a csv file. Stdin is the default and will be used if no file is
supplied. The delimiter does not have to be a comma, and can be set via the
-d flag.

CSV file should be formatted in one of the following configurations:
username,Display Name,group,email@address.domain
username,Display Name,group
username,Display Name
username

CSV files should not include the header.

OPTIONS
-? or -h or --help
This option displays a summary of the commands accepted by batch_up.

-v or -vv or -vvv or --verbose
This option sets the verbosity. Each v adds to the verbosity.
See the occ command for OwnCloud/NextCloud for more details as this
option is passed on to the occ command.

If this option is not passed, the default behavior is to pass the
-q option to occ (the quiet option), making occ non-verbose.

-d or --delimiter or --delimiter=
This option allows you to choose which delimiter you would like to use.
The following are acceptable characters for this option. ,.;:|

ENVIRONMENT VARIABLES
OC_PASS
Sets the password for users added. The OC_PASS environment variable
is required.

EXAMPLES
The command:
batch_up.sh foobar.csv
Will add the users from foobar.csv. Users will be given the password
in the OC_PASS environment variable.

The command:
batch_up.sh <<< "jack,Jack Frost,users,jack.frost@gmail.com"
Will add the user jack, set his display name to Jack Frost, add him
to the group users, and set his email to jack.frost@gmail.com.

The command:
echo "jack,Jack Frost,users,jack.frost@gmail.com" | batch_up.sh
Will add the user jack, set his display name to Jack Frost, add him
to the group users, and set his email to jack.frost@gmail.com.

The command:
batch_up.sh -d : foobar.csv
Will set the delimiter to : and add the users from foobar.csv.

EOF
}


# Set verbosity. Default is silent.
verbose=-q

# flags
while [ $# -gt 0 ]
do
case $1 in
-h|-?|--help)
usage # Display a usage synopsis.
exit
;;
-v|-vv|-vvv|--verbose)
verbose=$1
;;
-d|--delimiter)
if [ $# -gt 1 ]
then
case $2 in
,|.|;|:||)
delimiter=$2
shift
;;
*)
die 'Error: delimiter should be one of ,.;:| characters.'
esac
else
die 'Error: "--delimiter requires a non-empty option argument.'
fi
;;
--delimiter=?*)
case ${1#*=} in # Delete everything up to the = and assign the remainder.
,|.|;|:||)
delimiter=${1#*=}
shift
;;
*)
die 'Error: delimiter should be one of ,.;:| characters.'
esac
;;
--delimiter=) # Handle the case of empty --delimiter=
die 'Error: "--delimiter=" requires a non-empty option argument.'
;;
--)
shift
break
;;
-?*)
printf 'WARN: Unknown option (ignored): %sn' "$1" >&2
;;
*) # Default case. No more options, so break out of the loop
break
esac

shift
done

# Is the file readable?
if [ $# -gt 0 ]
then
[ -r "$1" ] || die "$1: Couldn't read file."
fi

# Is the OC_PASS environment variable set?
[ ${OC_PASS:-} ] || die "$0: No password specified. Run with --help for more info."

status=true # until a command fails

message 'Adding users'

while IFS=${delimiter:-,} read -r f1 f2 f3 f4
do
if [ "$f1" ]
then
docker-compose exec -T -e OC_PASS --user www-data app php occ
user:add --password-from-env
${verbose:+"$verbose"}
${f2:+"--display-name=$f2"}
${f3:+"--group=$f3"}
"$f1" </dev/null
|| status=false

# If there is a fourth value in the csv, use it to set the user email.
if [ "$f4" ]
then
docker-compose exec -T
--user www-data app php occ
user:setting "$f1" settings email "$f4"
</dev/null
|| status=false
fi
else
echo "Expected at least one field, but none were supplied." >&2
status=false
continue
fi
message '...'
done <"${1:-/dev/stdin}"

message 'Done'

exec $status










share|improve this question









$endgroup$



















    1












    $begingroup$


    I have a working script that will batch add users to an instance of nextcloud running on top of docker. This version is the result of changes made after asking this question.



    I guess I'm looking for a re-review to ensure that I haven't missed anything. I'm also interested if there are areas where I could make things better in terms of readability, performance, security, etc. You're the reviewer. My code is your oyster.



    #!/bin/sh

    set -eu

    # Handle printing errors
    die () {
    printf '%sn' "$1" >&2
    exit 1
    }

    message () {
    printf '%sn' "$1" >&2
    }

    usage () {
    cat <<'EOF'
    NAME
    batch_up - batch upload users

    SYNOPSIS
    batch_up -?
    batch_up -h
    batch_up --help
    batch_up -v
    batch_up -vv
    batch_up -vvv
    batch_up --verbose
    batch_up -d
    batch_up --delimiter
    batch_up --delimiter=

    DESCRIPTION
    Batch_up is a program that adds a batch of users to an instance of NextCloud
    running inside of a docker container by reading a comma separated list from
    stdin or a csv file. Stdin is the default and will be used if no file is
    supplied. The delimiter does not have to be a comma, and can be set via the
    -d flag.

    CSV file should be formatted in one of the following configurations:
    username,Display Name,group,email@address.domain
    username,Display Name,group
    username,Display Name
    username

    CSV files should not include the header.

    OPTIONS
    -? or -h or --help
    This option displays a summary of the commands accepted by batch_up.

    -v or -vv or -vvv or --verbose
    This option sets the verbosity. Each v adds to the verbosity.
    See the occ command for OwnCloud/NextCloud for more details as this
    option is passed on to the occ command.

    If this option is not passed, the default behavior is to pass the
    -q option to occ (the quiet option), making occ non-verbose.

    -d or --delimiter or --delimiter=
    This option allows you to choose which delimiter you would like to use.
    The following are acceptable characters for this option. ,.;:|

    ENVIRONMENT VARIABLES
    OC_PASS
    Sets the password for users added. The OC_PASS environment variable
    is required.

    EXAMPLES
    The command:
    batch_up.sh foobar.csv
    Will add the users from foobar.csv. Users will be given the password
    in the OC_PASS environment variable.

    The command:
    batch_up.sh <<< "jack,Jack Frost,users,jack.frost@gmail.com"
    Will add the user jack, set his display name to Jack Frost, add him
    to the group users, and set his email to jack.frost@gmail.com.

    The command:
    echo "jack,Jack Frost,users,jack.frost@gmail.com" | batch_up.sh
    Will add the user jack, set his display name to Jack Frost, add him
    to the group users, and set his email to jack.frost@gmail.com.

    The command:
    batch_up.sh -d : foobar.csv
    Will set the delimiter to : and add the users from foobar.csv.

    EOF
    }


    # Set verbosity. Default is silent.
    verbose=-q

    # flags
    while [ $# -gt 0 ]
    do
    case $1 in
    -h|-?|--help)
    usage # Display a usage synopsis.
    exit
    ;;
    -v|-vv|-vvv|--verbose)
    verbose=$1
    ;;
    -d|--delimiter)
    if [ $# -gt 1 ]
    then
    case $2 in
    ,|.|;|:||)
    delimiter=$2
    shift
    ;;
    *)
    die 'Error: delimiter should be one of ,.;:| characters.'
    esac
    else
    die 'Error: "--delimiter requires a non-empty option argument.'
    fi
    ;;
    --delimiter=?*)
    case ${1#*=} in # Delete everything up to the = and assign the remainder.
    ,|.|;|:||)
    delimiter=${1#*=}
    shift
    ;;
    *)
    die 'Error: delimiter should be one of ,.;:| characters.'
    esac
    ;;
    --delimiter=) # Handle the case of empty --delimiter=
    die 'Error: "--delimiter=" requires a non-empty option argument.'
    ;;
    --)
    shift
    break
    ;;
    -?*)
    printf 'WARN: Unknown option (ignored): %sn' "$1" >&2
    ;;
    *) # Default case. No more options, so break out of the loop
    break
    esac

    shift
    done

    # Is the file readable?
    if [ $# -gt 0 ]
    then
    [ -r "$1" ] || die "$1: Couldn't read file."
    fi

    # Is the OC_PASS environment variable set?
    [ ${OC_PASS:-} ] || die "$0: No password specified. Run with --help for more info."

    status=true # until a command fails

    message 'Adding users'

    while IFS=${delimiter:-,} read -r f1 f2 f3 f4
    do
    if [ "$f1" ]
    then
    docker-compose exec -T -e OC_PASS --user www-data app php occ
    user:add --password-from-env
    ${verbose:+"$verbose"}
    ${f2:+"--display-name=$f2"}
    ${f3:+"--group=$f3"}
    "$f1" </dev/null
    || status=false

    # If there is a fourth value in the csv, use it to set the user email.
    if [ "$f4" ]
    then
    docker-compose exec -T
    --user www-data app php occ
    user:setting "$f1" settings email "$f4"
    </dev/null
    || status=false
    fi
    else
    echo "Expected at least one field, but none were supplied." >&2
    status=false
    continue
    fi
    message '...'
    done <"${1:-/dev/stdin}"

    message 'Done'

    exec $status










    share|improve this question









    $endgroup$















      1












      1








      1





      $begingroup$


      I have a working script that will batch add users to an instance of nextcloud running on top of docker. This version is the result of changes made after asking this question.



      I guess I'm looking for a re-review to ensure that I haven't missed anything. I'm also interested if there are areas where I could make things better in terms of readability, performance, security, etc. You're the reviewer. My code is your oyster.



      #!/bin/sh

      set -eu

      # Handle printing errors
      die () {
      printf '%sn' "$1" >&2
      exit 1
      }

      message () {
      printf '%sn' "$1" >&2
      }

      usage () {
      cat <<'EOF'
      NAME
      batch_up - batch upload users

      SYNOPSIS
      batch_up -?
      batch_up -h
      batch_up --help
      batch_up -v
      batch_up -vv
      batch_up -vvv
      batch_up --verbose
      batch_up -d
      batch_up --delimiter
      batch_up --delimiter=

      DESCRIPTION
      Batch_up is a program that adds a batch of users to an instance of NextCloud
      running inside of a docker container by reading a comma separated list from
      stdin or a csv file. Stdin is the default and will be used if no file is
      supplied. The delimiter does not have to be a comma, and can be set via the
      -d flag.

      CSV file should be formatted in one of the following configurations:
      username,Display Name,group,email@address.domain
      username,Display Name,group
      username,Display Name
      username

      CSV files should not include the header.

      OPTIONS
      -? or -h or --help
      This option displays a summary of the commands accepted by batch_up.

      -v or -vv or -vvv or --verbose
      This option sets the verbosity. Each v adds to the verbosity.
      See the occ command for OwnCloud/NextCloud for more details as this
      option is passed on to the occ command.

      If this option is not passed, the default behavior is to pass the
      -q option to occ (the quiet option), making occ non-verbose.

      -d or --delimiter or --delimiter=
      This option allows you to choose which delimiter you would like to use.
      The following are acceptable characters for this option. ,.;:|

      ENVIRONMENT VARIABLES
      OC_PASS
      Sets the password for users added. The OC_PASS environment variable
      is required.

      EXAMPLES
      The command:
      batch_up.sh foobar.csv
      Will add the users from foobar.csv. Users will be given the password
      in the OC_PASS environment variable.

      The command:
      batch_up.sh <<< "jack,Jack Frost,users,jack.frost@gmail.com"
      Will add the user jack, set his display name to Jack Frost, add him
      to the group users, and set his email to jack.frost@gmail.com.

      The command:
      echo "jack,Jack Frost,users,jack.frost@gmail.com" | batch_up.sh
      Will add the user jack, set his display name to Jack Frost, add him
      to the group users, and set his email to jack.frost@gmail.com.

      The command:
      batch_up.sh -d : foobar.csv
      Will set the delimiter to : and add the users from foobar.csv.

      EOF
      }


      # Set verbosity. Default is silent.
      verbose=-q

      # flags
      while [ $# -gt 0 ]
      do
      case $1 in
      -h|-?|--help)
      usage # Display a usage synopsis.
      exit
      ;;
      -v|-vv|-vvv|--verbose)
      verbose=$1
      ;;
      -d|--delimiter)
      if [ $# -gt 1 ]
      then
      case $2 in
      ,|.|;|:||)
      delimiter=$2
      shift
      ;;
      *)
      die 'Error: delimiter should be one of ,.;:| characters.'
      esac
      else
      die 'Error: "--delimiter requires a non-empty option argument.'
      fi
      ;;
      --delimiter=?*)
      case ${1#*=} in # Delete everything up to the = and assign the remainder.
      ,|.|;|:||)
      delimiter=${1#*=}
      shift
      ;;
      *)
      die 'Error: delimiter should be one of ,.;:| characters.'
      esac
      ;;
      --delimiter=) # Handle the case of empty --delimiter=
      die 'Error: "--delimiter=" requires a non-empty option argument.'
      ;;
      --)
      shift
      break
      ;;
      -?*)
      printf 'WARN: Unknown option (ignored): %sn' "$1" >&2
      ;;
      *) # Default case. No more options, so break out of the loop
      break
      esac

      shift
      done

      # Is the file readable?
      if [ $# -gt 0 ]
      then
      [ -r "$1" ] || die "$1: Couldn't read file."
      fi

      # Is the OC_PASS environment variable set?
      [ ${OC_PASS:-} ] || die "$0: No password specified. Run with --help for more info."

      status=true # until a command fails

      message 'Adding users'

      while IFS=${delimiter:-,} read -r f1 f2 f3 f4
      do
      if [ "$f1" ]
      then
      docker-compose exec -T -e OC_PASS --user www-data app php occ
      user:add --password-from-env
      ${verbose:+"$verbose"}
      ${f2:+"--display-name=$f2"}
      ${f3:+"--group=$f3"}
      "$f1" </dev/null
      || status=false

      # If there is a fourth value in the csv, use it to set the user email.
      if [ "$f4" ]
      then
      docker-compose exec -T
      --user www-data app php occ
      user:setting "$f1" settings email "$f4"
      </dev/null
      || status=false
      fi
      else
      echo "Expected at least one field, but none were supplied." >&2
      status=false
      continue
      fi
      message '...'
      done <"${1:-/dev/stdin}"

      message 'Done'

      exec $status










      share|improve this question









      $endgroup$




      I have a working script that will batch add users to an instance of nextcloud running on top of docker. This version is the result of changes made after asking this question.



      I guess I'm looking for a re-review to ensure that I haven't missed anything. I'm also interested if there are areas where I could make things better in terms of readability, performance, security, etc. You're the reviewer. My code is your oyster.



      #!/bin/sh

      set -eu

      # Handle printing errors
      die () {
      printf '%sn' "$1" >&2
      exit 1
      }

      message () {
      printf '%sn' "$1" >&2
      }

      usage () {
      cat <<'EOF'
      NAME
      batch_up - batch upload users

      SYNOPSIS
      batch_up -?
      batch_up -h
      batch_up --help
      batch_up -v
      batch_up -vv
      batch_up -vvv
      batch_up --verbose
      batch_up -d
      batch_up --delimiter
      batch_up --delimiter=

      DESCRIPTION
      Batch_up is a program that adds a batch of users to an instance of NextCloud
      running inside of a docker container by reading a comma separated list from
      stdin or a csv file. Stdin is the default and will be used if no file is
      supplied. The delimiter does not have to be a comma, and can be set via the
      -d flag.

      CSV file should be formatted in one of the following configurations:
      username,Display Name,group,email@address.domain
      username,Display Name,group
      username,Display Name
      username

      CSV files should not include the header.

      OPTIONS
      -? or -h or --help
      This option displays a summary of the commands accepted by batch_up.

      -v or -vv or -vvv or --verbose
      This option sets the verbosity. Each v adds to the verbosity.
      See the occ command for OwnCloud/NextCloud for more details as this
      option is passed on to the occ command.

      If this option is not passed, the default behavior is to pass the
      -q option to occ (the quiet option), making occ non-verbose.

      -d or --delimiter or --delimiter=
      This option allows you to choose which delimiter you would like to use.
      The following are acceptable characters for this option. ,.;:|

      ENVIRONMENT VARIABLES
      OC_PASS
      Sets the password for users added. The OC_PASS environment variable
      is required.

      EXAMPLES
      The command:
      batch_up.sh foobar.csv
      Will add the users from foobar.csv. Users will be given the password
      in the OC_PASS environment variable.

      The command:
      batch_up.sh <<< "jack,Jack Frost,users,jack.frost@gmail.com"
      Will add the user jack, set his display name to Jack Frost, add him
      to the group users, and set his email to jack.frost@gmail.com.

      The command:
      echo "jack,Jack Frost,users,jack.frost@gmail.com" | batch_up.sh
      Will add the user jack, set his display name to Jack Frost, add him
      to the group users, and set his email to jack.frost@gmail.com.

      The command:
      batch_up.sh -d : foobar.csv
      Will set the delimiter to : and add the users from foobar.csv.

      EOF
      }


      # Set verbosity. Default is silent.
      verbose=-q

      # flags
      while [ $# -gt 0 ]
      do
      case $1 in
      -h|-?|--help)
      usage # Display a usage synopsis.
      exit
      ;;
      -v|-vv|-vvv|--verbose)
      verbose=$1
      ;;
      -d|--delimiter)
      if [ $# -gt 1 ]
      then
      case $2 in
      ,|.|;|:||)
      delimiter=$2
      shift
      ;;
      *)
      die 'Error: delimiter should be one of ,.;:| characters.'
      esac
      else
      die 'Error: "--delimiter requires a non-empty option argument.'
      fi
      ;;
      --delimiter=?*)
      case ${1#*=} in # Delete everything up to the = and assign the remainder.
      ,|.|;|:||)
      delimiter=${1#*=}
      shift
      ;;
      *)
      die 'Error: delimiter should be one of ,.;:| characters.'
      esac
      ;;
      --delimiter=) # Handle the case of empty --delimiter=
      die 'Error: "--delimiter=" requires a non-empty option argument.'
      ;;
      --)
      shift
      break
      ;;
      -?*)
      printf 'WARN: Unknown option (ignored): %sn' "$1" >&2
      ;;
      *) # Default case. No more options, so break out of the loop
      break
      esac

      shift
      done

      # Is the file readable?
      if [ $# -gt 0 ]
      then
      [ -r "$1" ] || die "$1: Couldn't read file."
      fi

      # Is the OC_PASS environment variable set?
      [ ${OC_PASS:-} ] || die "$0: No password specified. Run with --help for more info."

      status=true # until a command fails

      message 'Adding users'

      while IFS=${delimiter:-,} read -r f1 f2 f3 f4
      do
      if [ "$f1" ]
      then
      docker-compose exec -T -e OC_PASS --user www-data app php occ
      user:add --password-from-env
      ${verbose:+"$verbose"}
      ${f2:+"--display-name=$f2"}
      ${f3:+"--group=$f3"}
      "$f1" </dev/null
      || status=false

      # If there is a fourth value in the csv, use it to set the user email.
      if [ "$f4" ]
      then
      docker-compose exec -T
      --user www-data app php occ
      user:setting "$f1" settings email "$f4"
      </dev/null
      || status=false
      fi
      else
      echo "Expected at least one field, but none were supplied." >&2
      status=false
      continue
      fi
      message '...'
      done <"${1:-/dev/stdin}"

      message 'Done'

      exec $status







      csv posix sh docker






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked 3 hours ago









      quarterpiquarterpi

      334




      334






















          0






          active

          oldest

          votes












          Your Answer





          StackExchange.ifUsing("editor", function () {
          return StackExchange.using("mathjaxEditing", function () {
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
          });
          });
          }, "mathjax-editing");

          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "196"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f217111%2fbatch-add-users-to-nextcloud-on-docker-with-csv%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes
















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f217111%2fbatch-add-users-to-nextcloud-on-docker-with-csv%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Список кардиналов, возведённых папой римским Каликстом III

          Deduzione

          Mysql.sock missing - “Can't connect to local MySQL server through socket”