#!/bin/bash

#####################################################################################################
# DISABLE IPV6 AS GRUB KERNEL PARAMETERS
#####################################################################################################

# ПАМЯТКА по замене пробелов и табуляторов:
# (Более подробно в книге  "Регулярные выражения", автор Сергей Колесниченко (или по адресу: http://php.su/articles/?cat=regexp&page=001 )
#
# REGEXP выражение '[ \t]*' идентично выражению '[ \t]{0,}' но SED не понимает второй вариант (люое кол-во симводлов включая ни одного)
# REGEXP выражение '[ \t]+' идентично выражению '[ \t]{1,}' но SED не понимает второй вариант (минимум один символ и более)
#
# Выражение '^[ \t]*linux' означалет любое количесвто пробелов и табуляторов с начала строки, включая ни одного, пока не встретится слово 'linux'
# Выражение 'linux[ \t]+\/' означалет: слово 'linux' отделенное минимум одним пробелом или табулятором от символа '/' (слеш)
#
# Выражение '^[ \t]*kernel[ \t]+\/' означает строка начинается на  'linux /', при этом
# в начале строки может быть любое количество пробелов и табуляторов
# и между словами 'linux' и  '/' минимум один пробел или табулятор
#
# Два спец.символа (если вне скобок []):
# '^' означает начало строки, маркер, позиция перед первым символом (пустой, безбайтный символ, просто позиция без отображения)
# '$' означает конец  строки, маркер, позиция после последнего символа (пустой, безбайтный символ, просто позиция без отображения)


# grub-legacy (grub1)
for file in /boot/grub/*.lst /boot/grub/*.mnu /boot/grub/*.cfg ; do
        fulname="$(dirname $file)"/"$(basename $file)"
        if [ -f "$fulname" ] ; then
                # Очищаем все существующие вхождения disable.ipv6=0
                # Очищаем все существующие вхождения disable.ipv6=1
                # для строк (без учета регистра) начинающихся на 'linux /' или 'kernel /'
                # добавляем в конец строки '$' подстроку ' disable.ipv6=1'
                # В РЕЗУЛЬТАТЕ
                # каждая строка вида            <пустые сиволы>linux<пустые сиволы>/<что-то-еще>
                # или такого вида               <пустые сиволы>kernel<пустые сиволы>/<что-то-еще>
                # будут приведены к виду        <пустые сиволы>linux<пустые сиволы>/<что-то-еще>disable.ipv6=1
                # или к виду                    <пустые сиволы>kernel<пустые сиволы>/<что-то-еще>disable.ipv6=1
                sed "/disable.ipv6/s/disable.ipv6=1//gI;/disable.ipv6/s/disable.ipv6=0//gI;/^[ \t]*linux[ \t]+\//s/$/ disable.ipv6=1/I;/^[ \t]*kernel[ \t]+\//s/$/ disable.ipv6=1/I" $fulname > "$fulname".new
                # вновь созданный файл "муваем" поверх существующего исходного файла
	        if [ ! -f "$fulname".original ] ; then
        	        cp $fulname "$fulname".original
	        fi
                mv "$fulname".new "$fulname"
        fi
done

# pc-grub (grub2)
# Устанавливаем disable.ipv6=1 для всех ядер во всех режимах (GRUB_CMDLINE_LINUX=...)
# О параметрах фала можно почитаить здесь: https://help.ubuntu.com/community/Grub2
fulname=/etc/default/grub
if [ -f "$fulname" ] ; then
        # Очищаем все существующие вхождения disable.ipv6=0
        # Очищаем все существующие вхождения disable.ipv6=1
        # для строк (без учета регистра) начинающихся на 'GRUB_CMDLINE_LINUX='
        # заменяем ПЕРВЫЙ символ кавычки '"' на '"disable.ipv6=1 '
        # В РЕЗУЛЬТАТЕ
        # строка вида                   GRUB_CMDLINE_LINUX="<некий набор параметров или пусто>"
        # будет приведена к виду        GRUB_CMDLINE_LINUX="disable.ipv6=1 <некий набор параметров или пусто>"
        sed "/disable.ipv6/s/disable.ipv6=1//gI;/disable.ipv6/s/disable.ipv6=0//gI;/^[ \t]*GRUB_CMDLINE_LINUX[ \t]*=/s/\"/\"disable.ipv6=1 /I"  $fulname > "$fulname".new
        if [ ! -f "$fulname".original ] ; then
       	        cp $fulname "$fulname".original
        fi
        mv "$fulname".new "$fulname"
elif [ -d /etc/default ] ; then
        # Файл не существует, создадим его с одним единственным параметром
        echo GRUB_CMDLINE_LINUX="disable.ipv6=1" > $fulname
fi

#обновляем файл конфигурации GRUB (ошибки подавляем, возможны для grub1)
#/boot/grub/*.cfg
#/boot/grub/*.lst
#/boot/grub/*.mnu
# if grub1 - may be error, ignore errors...
update-grub 2> /dev/null

#####################################################################################################
# DISABLE IPV6 AS MODULE LOADING
# DISABLE IPV6 IN SYSCTL PARAMETERS
#####################################################################################################

# в одних дистрибах используется .conf, в других просто имя файла без .conf
# отработает файлы и каталоги
# /etc/sysctl		/etc/modprobe
# /etc/sysctl.conf	/etc/modprobe.conf
# /etc/sysctl.d/*	/etc/modprobe.d/*

for typeofconf in modprobe sysctl ; do

	myfile=/etc/$typeofconf".d/zzzzz-kos-disable-ipv6.conf
	myexist=0
	for file in /etc/"$typeofconf" /etc/"$typeofconf".conf ; do
    
	        fulname="$(dirname $file)"/"$(basename $file)"

		if [ "$fulname" = "$myfile" ] ; then
			myexist=1

		# если это файл в дирректории 
		elif [ -f "$fulname" ] ; then

			if [ "modprobe" = "$typeofconf" ] ; then
				# ищем строку типа 'alias net-pf-10' и меняем ее на '#alias net-pf-10'
				sed '/^[ \t]*alias[ \t]+net-pf-10/s/alias/#alias/I'  "$fulname" > "$fulname".new
				sed '/^[ \t]*alias[ \t]+ipv6/s/alias/#alias/I'  "$fulname" > "$fulname".new

				# добавляем В КОНЕЦ сформированного файла блеклисты
				echo #KOS:) disabling ipv6	| tee -a "$fulname".new
       				echo blacklist net-pf-10	| tee -a "$fulname".new
			        echo blacklist ipv6		| tee -a "$fulname".new
			else
				# ищем строку типа 'net.ipv6.conf.*.disable_ipv6' и меняем ее на '#net.ipv6.conf.*.disable_ipv6'
				sed '/^[ \t]*net.ipv6.conf.[a-z]*.disable_ipv6/s/net.ipv6.conf/#net.ipv6.conf/I'  "$fulname" > "$fulname".new

				echo #KOS:) disabling ipv6        		| tee -a "$fulname".new
				echo net.ipv6.conf.all.disable_ipv6=1    	| tee -a "$fulname".new
				echo net.ipv6.conf.default.disable_ipv6=1    	| tee -a "$fulname".new
				echo net.ipv6.conf.lo.disable_ipv6=1    	| tee -a "$fulname".new
			fi

			# муваем поверх текущего конфига
		        if [ ! -f "$fulname".original ] ; then
        		        cp $fulname "$fulname".original
		        fi
			mv "$fulname".new "$fulname"
		fi
	done
	if [ myexist=0] ; then
		if [ -d /etc/"$typeofconf".d ] ; then
			if [ "modprobe" = "$typeofconf" ] ; then
				# добавляем В КОНЕЦ сформированного файла блеклисты
				echo #KOS:) disabling ipv6	| tee -a "$myfile"
				echo blacklist net-pf-10	| tee -a "$myfile"
				echo blacklist ipv6		| tee -a "$myfile"
			else
				echo #KOS:) disabling ipv6        		| tee -a "$myfile"
				echo net.ipv6.conf.all.disable_ipv6=1    	| tee -a "$myfile"
				echo net.ipv6.conf.default.disable_ipv6=1    	| tee -a "$myfile"
				echo net.ipv6.conf.lo.disable_ipv6=1    	| tee -a "$myfile"
			fi
		fi
	fi
done

#####################################################################################################
# DISABLE IPV6 AS INIT SYSV USER-SCRIPT
#####################################################################################################

# файлы и каталоги
# /etc/rc.local
# /etc/rc*.d/*rc.local

for file in /etc/rc.local /etc/rc*.d/*rc.local ; do
    
	fulname="$(dirname $file)"/"$(basename $file)"

	# ищем строку типа 'exit 0' и меняем ее на ''
	sed '/^[ \t]*exit[ \t]+0/s/exit/#exit/I'  "$fulname" > "$fulname".new

	# добавляем В КОНЕЦ сформированного файла

	echo #KOS:) disabling ipv6					| tee -a "$fulname".new
	echo if [ -d /proc/sys/net/ipv6 ] ; then			| tee -a "$fulname".new
	# или так
	#echo 1 | tee /proc/sys/net/ipv6/conf/all/disable_ipv6
	#echo 1 | tee /proc/sys/net/ipv6/conf/default/disable_ipv6
	#echo 1 | tee /proc/sys/net/ipv6/conf/lo/disable_ipv6
	# или так
	echo     /sbin/sysctl -w net.ipv6.conf.all.disable_ipv6=1	| tee -a "$fulname".new
	echo     /sbin/sysctl -w net.ipv6.conf.default.disable_ipv6=1	| tee -a "$fulname".new
	echo     /sbin/sysctl -w net.ipv6.conf.lo.disable_ipv6=1	| tee -a "$fulname".new
	echo fi								| tee -a "$fulname".new
	echo exit 0							| tee -a "$fulname".new

	# муваем поверх текущего конфига
        if [ ! -f "$fulname".original ] ; then
       	        cp $fulname "$fulname".original
        fi
	mv "$fulname".new "$fulname"

	# в убунте есть глюк, когда не все скрипты *rc.local имеют бит "Executable" установленным по умолчанию
	# ( Ubuntu bug #50093, с 2006 не исправили, см. https://bugs.launchpad.net/ubuntu/+source/procps/+bug/50093 )
	# принудительно установим его

	chmod 755 "$fulname"

done


