| #!/bin/bash |
| # OpenVZ post-install script |
| # Copyright (C) 2009-2013, Parallels, Inc. Licensed under GNU GPL. |
| # |
| # 1. tune /etc/sysctl.conf |
| # 2. disable selinux |
| |
| |
| # Error out |
| fatal() |
| { |
| echo "$0: FATAL ERROR:" $* 1>&2 |
| exit 1 |
| } |
| |
| # Checks if the file exists and is writable |
| # $*: file name(s) |
| check_file() |
| { |
| local file |
| |
| for file in $*; do |
| test -a $file || fatal "$file not found" |
| test -w $file || fatal "$file is not writable" |
| done |
| } |
| |
| # Changes the value of param, or adds it. |
| # $1: file name |
| # $2: parameter name |
| # $3: new parameter value |
| # $4: optional 'noadd' if you don't want to add a non-existing parameter |
| change_param() |
| { |
| local file=$1 p=$2 v=$3 |
| # Escape dots, to be used for regexps |
| local pp=${p//./\\.} |
| |
| # Check if param is there |
| if grep -q "^[ \t]*${p}[ \t]*=.*" $file; then |
| grep -q "^[ \t]*${p}[ \t]*=[ \t]*${v}$" $file && return |
| # Replace the value |
| echo "vz-postinstall: $file: set $p = $v" |
| sed -i -e \ |
| "s/^\([ \t]*${p}[ \t]*=[ \t]*\).*\$/\1${v}/" \ |
| $file |
| elif test "x$4" != 'xnoadd'; then # Add the param |
| # If EOL is missing at the last line, fix |
| sed -i -e '$q' $file |
| # Add param |
| echo "vz-postinstall: $file: add $p = $v" |
| echo "${p}=${v}" >> $file |
| fi |
| } |
| |
| # Modifies and reloads sysctl parameters |
| tune_sysctl() |
| { |
| local file=/etc/sysctl.conf |
| |
| check_file $file |
| change_param $file net.ipv4.ip_forward 1 |
| change_param $file net.ipv4.conf.default.proxy_arp 0 |
| change_param $file kernel.sysrq 1 |
| change_param $file net.ipv4.conf.default.send_redirects 1 |
| change_param $file net.ipv4.conf.all.send_redirects 0 |
| # https://bugzilla.openvz.org/2641 |
| change_param $file net.bridge.bridge-nf-call-ip6tables 1 noadd |
| change_param $file net.bridge.bridge-nf-call-iptables 1 noadd |
| sysctl -q -p 2>/dev/null |
| } |
| |
| # Disables SELinux |
| disable_selinux() |
| { |
| local file=/etc/sysconfig/selinux |
| |
| # If there's no /etc/sysconfig, just skip |
| test -d $(dirname $file) || return |
| |
| # If there's no $file, create it |
| test -a $file || touch $file |
| |
| # Check we can write to it |
| check_file $file |
| |
| # Put SELINUX=disabled |
| change_param $file SELINUX disabled |
| } |
| |
| case $1 in |
| selinux) |
| disable_selinux |
| ;; |
| sysctl) |
| tune_sysctl |
| ;; |
| *) |
| echo "Usage: $0 selinux | sysctl" 1>&2 |
| exit 1 |
| esac |