inc/rootwrap
32d6bc6a
 #!/bin/bash
 #
 # **inc/rootwrap** - Rootwrap functions
 #
 # Handle rootwrap's foibles
 
 # Uses: ``STACK_USER``
 # Defines: ``SUDO_SECURE_PATH_FILE``
 
 # Save trace setting
 INC_ROOT_TRACE=$(set +o | grep xtrace)
 set +o xtrace
 
 # Accumulate all additions to sudo's ``secure_path`` in one file read last
 # so they all work in a venv configuration
 SUDO_SECURE_PATH_FILE=${SUDO_SECURE_PATH_FILE:-/etc/sudoers.d/zz-secure-path}
 
 # Add a directory to the common sudo ``secure_path``
 # add_sudo_secure_path dir
 function add_sudo_secure_path {
     local dir=$1
     local line
 
     # This is pretty simplistic for now - assume only the first line is used
e0ac37c2
     if [[ -r $SUDO_SECURE_PATH_FILE ]]; then
32d6bc6a
         line=$(head -1 $SUDO_SECURE_PATH_FILE)
     else
         line="Defaults:$STACK_USER secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin"
     fi
 
     # Only add ``dir`` if it is not already present
e0ac37c2
     if [[ ! $line =~ $dir ]]; then
32d6bc6a
         echo "${line}:$dir" | sudo tee $SUDO_SECURE_PATH_FILE
         sudo chmod 400 $SUDO_SECURE_PATH_FILE
         sudo chown root:root $SUDO_SECURE_PATH_FILE
     fi
 }
 
 # Configure rootwrap
 # Make a load of assumptions otherwise we'll have 6 arguments
c6782413
 # configure_rootwrap project
32d6bc6a
 function configure_rootwrap {
c6782413
     local project=$1
ada886dd
     local project_uc
     project_uc=$(echo $1|tr a-z A-Z)
c6782413
     local bin_dir="${project_uc}_BIN_DIR"
     bin_dir="${!bin_dir}"
     local project_dir="${project_uc}_DIR"
     project_dir="${!project_dir}"
 
     local rootwrap_conf_src_dir="${project_dir}/etc/${project}"
     local rootwrap_bin="${bin_dir}/${project}-rootwrap"
32d6bc6a
 
     # Start fresh with rootwrap filters
     sudo rm -rf /etc/${project}/rootwrap.d
     sudo install -d -o root -g root -m 755 /etc/${project}/rootwrap.d
     sudo install -o root -g root -m 644 $rootwrap_conf_src_dir/rootwrap.d/*.filters /etc/${project}/rootwrap.d
 
     # Set up rootwrap.conf, pointing to /etc/*/rootwrap.d
     sudo install -o root -g root -m 644 $rootwrap_conf_src_dir/rootwrap.conf /etc/${project}/rootwrap.conf
     sudo sed -e "s:^filters_path=.*$:filters_path=/etc/${project}/rootwrap.d:" -i /etc/${project}/rootwrap.conf
 
     # Set up the rootwrap sudoers
ada886dd
     local tempfile
     tempfile=$(mktemp)
8afbaa1c
     # Specify rootwrap.conf as first parameter to rootwrap
     rootwrap_sudo_cmd="${rootwrap_bin} /etc/${project}/rootwrap.conf *"
32d6bc6a
     echo "$STACK_USER ALL=(root) NOPASSWD: $rootwrap_sudo_cmd" >$tempfile
8afbaa1c
     if [ -f ${bin_dir}/${project}-rootwrap-daemon ]; then
         # rootwrap daemon does not need any parameters
         rootwrap_sudo_cmd="${rootwrap_bin}-daemon /etc/${project}/rootwrap.conf"
         echo "$STACK_USER ALL=(root) NOPASSWD: $rootwrap_sudo_cmd" >>$tempfile
     fi
32d6bc6a
     chmod 0440 $tempfile
     sudo chown root:root $tempfile
     sudo mv $tempfile /etc/sudoers.d/${project}-rootwrap
 
     # Add bin dir to sudo's secure_path because rootwrap is being called
     # without a path because BROKEN.
     add_sudo_secure_path $(dirname $rootwrap_bin)
 }
 
 
 # Restore xtrace
 $INC_ROOT_TRACE
 
 # Local variables:
 # mode: shell-script
 # End: