blob: 4c65440a4e5ea70e753064b0c074cc34e3983c94 [file] [log] [blame]
Dean Troyer32d6bc62015-03-29 14:16:44 -05001#!/bin/bash
2#
3# **inc/rootwrap** - Rootwrap functions
4#
5# Handle rootwrap's foibles
6
7# Uses: ``STACK_USER``
8# Defines: ``SUDO_SECURE_PATH_FILE``
9
10# Save trace setting
11INC_ROOT_TRACE=$(set +o | grep xtrace)
12set +o xtrace
13
14# Accumulate all additions to sudo's ``secure_path`` in one file read last
15# so they all work in a venv configuration
16SUDO_SECURE_PATH_FILE=${SUDO_SECURE_PATH_FILE:-/etc/sudoers.d/zz-secure-path}
17
18# Add a directory to the common sudo ``secure_path``
19# add_sudo_secure_path dir
20function add_sudo_secure_path {
21 local dir=$1
22 local line
23
24 # This is pretty simplistic for now - assume only the first line is used
Dmitry Guryanove0ac37c2015-11-30 18:48:23 +030025 if [[ -r $SUDO_SECURE_PATH_FILE ]]; then
Dean Troyer32d6bc62015-03-29 14:16:44 -050026 line=$(head -1 $SUDO_SECURE_PATH_FILE)
27 else
28 line="Defaults:$STACK_USER secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin"
29 fi
30
31 # Only add ``dir`` if it is not already present
Dmitry Guryanove0ac37c2015-11-30 18:48:23 +030032 if [[ ! $line =~ $dir ]]; then
Dean Troyer32d6bc62015-03-29 14:16:44 -050033 echo "${line}:$dir" | sudo tee $SUDO_SECURE_PATH_FILE
34 sudo chmod 400 $SUDO_SECURE_PATH_FILE
35 sudo chown root:root $SUDO_SECURE_PATH_FILE
36 fi
37}
38
39# Configure rootwrap
40# Make a load of assumptions otherwise we'll have 6 arguments
Ian Wienandc6782412015-05-14 10:01:53 +100041# configure_rootwrap project
Dean Troyer32d6bc62015-03-29 14:16:44 -050042function configure_rootwrap {
Ian Wienandc6782412015-05-14 10:01:53 +100043 local project=$1
Ian Wienandada886d2015-10-07 14:06:26 +110044 local project_uc
45 project_uc=$(echo $1|tr a-z A-Z)
Ian Wienandc6782412015-05-14 10:01:53 +100046 local bin_dir="${project_uc}_BIN_DIR"
47 bin_dir="${!bin_dir}"
48 local project_dir="${project_uc}_DIR"
49 project_dir="${!project_dir}"
50
51 local rootwrap_conf_src_dir="${project_dir}/etc/${project}"
52 local rootwrap_bin="${bin_dir}/${project}-rootwrap"
Dean Troyer32d6bc62015-03-29 14:16:44 -050053
54 # Start fresh with rootwrap filters
55 sudo rm -rf /etc/${project}/rootwrap.d
56 sudo install -d -o root -g root -m 755 /etc/${project}/rootwrap.d
57 sudo install -o root -g root -m 644 $rootwrap_conf_src_dir/rootwrap.d/*.filters /etc/${project}/rootwrap.d
58
59 # Set up rootwrap.conf, pointing to /etc/*/rootwrap.d
60 sudo install -o root -g root -m 644 $rootwrap_conf_src_dir/rootwrap.conf /etc/${project}/rootwrap.conf
61 sudo sed -e "s:^filters_path=.*$:filters_path=/etc/${project}/rootwrap.d:" -i /etc/${project}/rootwrap.conf
62
Clark Boylana40f9cb2018-04-04 14:02:30 -070063 # Rely on $PATH set by devstack to determine what is safe to execute
64 # by rootwrap rather than use explicit whitelist of paths in
65 # rootwrap.conf
66 sudo sed -e 's/^exec_dirs=.*/#&/' -i /etc/${project}/rootwrap.conf
67
Dean Troyer32d6bc62015-03-29 14:16:44 -050068 # Set up the rootwrap sudoers
Ian Wienandada886d2015-10-07 14:06:26 +110069 local tempfile
70 tempfile=$(mktemp)
Davanum Srinivas8afbaa12015-05-13 20:53:08 -040071 # Specify rootwrap.conf as first parameter to rootwrap
72 rootwrap_sudo_cmd="${rootwrap_bin} /etc/${project}/rootwrap.conf *"
Dean Troyer32d6bc62015-03-29 14:16:44 -050073 echo "$STACK_USER ALL=(root) NOPASSWD: $rootwrap_sudo_cmd" >$tempfile
Davanum Srinivas8afbaa12015-05-13 20:53:08 -040074 if [ -f ${bin_dir}/${project}-rootwrap-daemon ]; then
75 # rootwrap daemon does not need any parameters
76 rootwrap_sudo_cmd="${rootwrap_bin}-daemon /etc/${project}/rootwrap.conf"
77 echo "$STACK_USER ALL=(root) NOPASSWD: $rootwrap_sudo_cmd" >>$tempfile
78 fi
Dean Troyer32d6bc62015-03-29 14:16:44 -050079 chmod 0440 $tempfile
80 sudo chown root:root $tempfile
81 sudo mv $tempfile /etc/sudoers.d/${project}-rootwrap
82
83 # Add bin dir to sudo's secure_path because rootwrap is being called
84 # without a path because BROKEN.
85 add_sudo_secure_path $(dirname $rootwrap_bin)
86}
87
88
89# Restore xtrace
90$INC_ROOT_TRACE
91
92# Local variables:
93# mode: shell-script
94# End: