| #!/usr/bin/env bash |
| |
| # **create-stack-user.sh** |
| |
| # Create a user account suitable for running DevStack |
| # - create a group named $STACK_USER if it does not exist |
| # - create a user named $STACK_USER if it does not exist |
| # |
| # - home is $DEST |
| # |
| # - configure sudo for $STACK_USER |
| |
| # ``stack.sh`` was never intended to run as root. It had a hack to do what is |
| # now in this script and re-launch itself, but that hack was less than perfect |
| # and it was time for this nonsense to stop. Run this script as root to create |
| # the user and configure sudo. |
| |
| set -o errexit |
| |
| # Keep track of the DevStack directory |
| TOP_DIR=$(cd $(dirname "$0")/.. && pwd) |
| |
| # Import common functions |
| source $TOP_DIR/functions |
| |
| # Determine what system we are running on. This provides ``os_VENDOR``, |
| # ``os_RELEASE``, ``os_PACKAGE``, ``os_CODENAME`` |
| # and ``DISTRO`` |
| GetDistro |
| |
| # Needed to get ``ENABLED_SERVICES`` and ``STACK_USER`` |
| source $TOP_DIR/stackrc |
| |
| # Give the non-root user the ability to run as **root** via ``sudo`` |
| is_package_installed sudo || is_package_installed sudo-ldap || install_package sudo |
| |
| [[ -z "$STACK_USER" ]] && die "STACK_USER is not set. Exiting." |
| |
| if ! getent group $STACK_USER >/dev/null; then |
| echo "Creating a group called $STACK_USER" |
| groupadd $STACK_USER |
| fi |
| |
| if ! getent passwd $STACK_USER >/dev/null; then |
| echo "Creating a user called $STACK_USER" |
| useradd -g $STACK_USER -s /bin/bash -d $DEST -m $STACK_USER |
| # RHEL based distros create home dir with 700 permissions, |
| # And Ubuntu 21.04+ with 750, i.e missing executable |
| # permission for either group or others |
| # Devstack deploy will have issues with this, fix it by |
| # adding executable permission |
| if [[ $(stat -c '%A' $DEST|grep -o x|wc -l) -lt 3 ]]; then |
| echo "Executable permission missing for $DEST, adding it" |
| chmod +x $DEST |
| fi |
| fi |
| |
| echo "Giving stack user passwordless sudo privileges" |
| # UEC images ``/etc/sudoers`` does not have a ``#includedir``, add one |
| grep -q "^#includedir.*/etc/sudoers.d" /etc/sudoers || |
| echo "#includedir /etc/sudoers.d" >> /etc/sudoers |
| ( umask 226 && echo "$STACK_USER ALL=(ALL) NOPASSWD:ALL" \ |
| > /etc/sudoers.d/50_stack_sh ) |