|  | #!/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 | 
|  | if [[ -r $SUDO_SECURE_PATH_FILE ]]; then | 
|  | 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 | 
|  | if [[ ! $line =~ $dir ]]; then | 
|  | 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 | 
|  | # configure_rootwrap project | 
|  | function configure_rootwrap { | 
|  | local project=$1 | 
|  | local project_uc | 
|  | project_uc=$(echo $1|tr a-z A-Z) | 
|  | 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" | 
|  |  | 
|  | # 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 | 
|  | local tempfile | 
|  | tempfile=$(mktemp) | 
|  | # Specify rootwrap.conf as first parameter to rootwrap | 
|  | rootwrap_sudo_cmd="${rootwrap_bin} /etc/${project}/rootwrap.conf *" | 
|  | echo "$STACK_USER ALL=(root) NOPASSWD: $rootwrap_sudo_cmd" >$tempfile | 
|  | 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 | 
|  | 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: |