|
#!/bin/bash
|
|
# --- ROCK-COPYRIGHT-NOTE-BEGIN ---
|
|
#
|
|
# This copyright note is auto-generated by ./scripts/Create-CopyPatch.
|
|
# Please add additional copyright information _after_ the line containing
|
|
# the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by
|
|
# the ./scripts/Create-CopyPatch script. Do not edit this copyright text!
|
|
#
|
|
# ROCK Linux: rock-src/target/tor/fixedfiles/mod_rockate.sh
|
|
# ROCK Linux is Copyright (C) 1998 - 2007 Clifford Wolf
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version. A copy of the GNU General Public
|
|
# License can be found at Documentation/COPYING.
|
|
#
|
|
# Many people helped and are helping developing ROCK Linux. Please
|
|
# have a look at http://www.rocklinux.org/ and the Documentation/TEAM
|
|
# file for details.
|
|
#
|
|
# --- ROCK-COPYRIGHT-NOTE-END ---
|
|
#
|
|
# ROCKate network setup
|
|
|
|
rockate_add_bootmenu() {
|
|
read VERSION < /etc/ROCKATE_VERSION
|
|
disk="${1}"
|
|
installon="${2}"
|
|
mount ${disk} /mnt/generic
|
|
path=/
|
|
[ -d /mnt/generic/boot ] && path=/boot
|
|
read menulst < <( find /mnt/generic$path -name menu.lst | head -n 1)
|
|
read devicemap < <( find /mnt/generic$path -name device.map | head -n 1)
|
|
read physical < <( readlink -f ${installon} )
|
|
physical=${physical%[0-9]}
|
|
if ! grep -q ${physical} ${devicemap} ; then
|
|
for x in /dev /proc /sys /tmp ; do
|
|
mount --bind $x /mnt/generic$x
|
|
done
|
|
chroot /mnt/generic stone -text grub create_device_map
|
|
for x in /dev /proc /sys /tmp ; do
|
|
umount /mnt/generic$x
|
|
done
|
|
fi
|
|
read grubdevice linuxdevice < <( grep ${physical} ${devicemap} )
|
|
if [ -z "${grubdevice}" ] ; then
|
|
echo "WTF?"
|
|
return
|
|
fi
|
|
cat >> ${menulst} <<-EOF
|
|
|
|
title ROCKate ${VERSION} 1024
|
|
kernel ${grubdevice%)},$(( ${installon##*part} - 1 )))/boot/vmlinuz root=/dev/ram init=/linuxrc video=vesa:ywrap,mtrr vga=0x317 rw
|
|
initrd ${grubdevice%)},$(( ${installon##*part} - 1 )))/boot/initrd.img
|
|
|
|
title ROCKate ${VERSION} 1280
|
|
kernel ${grubdevice%)},$(( ${installon##*part} - 1 )))/boot/vmlinuz root=/dev/ram init=/linuxrc video=vesa:ywrap,mtrr vga=0x31A rw
|
|
initrd ${grubdevice%)},$(( ${installon##*part} - 1 )))/boot/initrd.img
|
|
|
|
title ROCKate ${VERSION} 800
|
|
kernel ${grubdevice%)},$(( ${installon##*part} - 1 )))/boot/vmlinuz root=/dev/ram init=/linuxrc video=vesa:ywrap,mtrr vga=0x314 rw
|
|
initrd ${grubdevice%)},$(( ${installon##*part} - 1 )))/boot/initrd.img
|
|
|
|
title ROCKate ${VERSION} 640
|
|
kernel ${grubdevice%)},$(( ${installon##*part} - 1 )))/boot/vmlinuz root=/dev/ram init=/linuxrc video=vesa:ywrap,mtrr vga=0x311 rw
|
|
initrd ${grubdevice%)},$(( ${installon##*part} - 1 )))/boot/initrd.img
|
|
|
|
title ROCKate ${VERSION} Text only
|
|
kernel ${grubdevice%)},$(( ${installon##*part} - 1 )))/boot/vmlinuz root=/dev/ram init=/linuxrc vga=0 rw 3
|
|
initrd ${grubdevice%)},$(( ${installon##*part} - 1 )))/boot/initrd.img
|
|
EOF
|
|
umount /mnt/generic
|
|
}
|
|
rockate_install_on() {
|
|
disk="${1}"
|
|
mount ${disk} /mnt/generic || return
|
|
cp -arv /mnt/cowfs_ro/* /mnt/generic/
|
|
find /mnt/cowfs_rw/ -type f | while read file ; do
|
|
target="${file#/mnt/cowfs_rw/}"
|
|
mkdir -p /mnt/generic/$( dirname ${target} )
|
|
cp -v ${file} /mnt/generic/${target}
|
|
done
|
|
touch /mnt/generic/etc/HDINSTALL
|
|
for x in /dev /proc /sys /tmp ; do
|
|
mount --bind $x /mnt/generic$x
|
|
done
|
|
|
|
echo -n > /mnt/generic/etc/ld.so.preload
|
|
tmp="$(mktemp)"
|
|
grep -v ' / ' /mnt/generic/etc/fstab > $tmp
|
|
echo "${disk} / auto defaults 0 0" >> $tmp
|
|
mv $tmp /mnt/generic/etc/fstab
|
|
chmod 0644 /mnt/generic/etc/fstab
|
|
chown rocker.users /mnt/generic/home/rocker -R
|
|
chroot /mnt/generic mkinitrd
|
|
|
|
for x in /dev /proc /sys /tmp ; do
|
|
umount /mnt/generic$x
|
|
done
|
|
umount /mnt/generic
|
|
}
|
|
|
|
rockate_install() {
|
|
unset bootparts menu
|
|
mkdir -p /mnt/generic
|
|
for disk in /dev/disk/by-id/* ; do
|
|
mount ${disk} /mnt/generic >/dev/null 2>&1 || continue
|
|
if [ -f /mnt/generic/menu.lst -o -f /mnt/generic/boot/menu.lst -o \
|
|
-f /mnt/generic/boot/grub/menu.lst -o -f /mnt/generic/grub/menu.lst ] ; then
|
|
bootparts="${bootparts} ${disk}"
|
|
fi
|
|
menu="${menu} 'Install on ${disk##*/} (contains: $( ls -d /mnt/generic/* 2>/dev/null | sed -e 's,^/mnt/generic/,,g' | sed -e 's/^\(.{,80}\).*$/\1/g' ))' 'installon=${disk}; rockate_install_on ${disk}'"
|
|
umount /mnt/generic >/dev/null 2>&1
|
|
done
|
|
eval gui_menu FOO "'ROCKate installation'" ${menu} || return
|
|
|
|
unset menu
|
|
if [ -n "${bootparts}" ] ; then
|
|
for x in ${bootparts} ; do
|
|
mount $x /mnt/generic
|
|
menu="${menu} 'Add ROCKate to $x (contains:"
|
|
while read y title ; do
|
|
menu="${menu} ${title}"
|
|
done < <( grep -i title $( find /mnt/generic -name menu.lst ) )
|
|
umount /mnt/generic
|
|
menu="${menu})' 'rockate_add_bootmenu ${x} ${installon}'"
|
|
done
|
|
|
|
eval gui_menu FOO "'ROCKate installation'" ${menu} || return
|
|
else
|
|
mount $disk /mnt/generic
|
|
for x in /dev /proc /sys /tmp ; do
|
|
mount --bind $x /mnt/generic$x
|
|
done
|
|
chroot /mnt/generic stone -text grub grub_setup
|
|
for x in /dev /proc /sys /tmp ; do
|
|
umount /mnt/generic$x
|
|
done
|
|
umount $disk
|
|
fi
|
|
}
|
|
|
|
rockate_configure() {
|
|
local device="${1}"
|
|
read inet ip rest < <( ip addr show ${device} | grep 'inet ' )
|
|
gui_input "Enter IP address for ${device}" "${ip}" newip
|
|
if [ -n "${newip}" -a "${newip}" != "${ip}" ] ; then
|
|
ip addr del "${ip}" dev "${device}"
|
|
ip addr add "${newip}" dev "${device}"
|
|
fi
|
|
}
|
|
|
|
rockate_defaultroute(){
|
|
local gw="${1}"
|
|
gui_input "Enter IP Address for the default router" "${gw}" newgw
|
|
if [ -n "${newgw}" -a "${gw}" != "${newgw}" ] ; then
|
|
route del -net default ${gw}
|
|
route add -net default ${newgw}
|
|
fi
|
|
}
|
|
|
|
rockate_update(){
|
|
read version < /etc/ROCKATE_VERSION
|
|
tmp="/tmp/update.${$}"
|
|
echo "Downloading Updatelist"
|
|
wget -O ${tmp} http://xsanr2oqmett7ovm.onion/UPDATES_${version}
|
|
if [ ! -s "${tmp}" ] ; then
|
|
echo "No updates available for version ${version}."
|
|
rm -f ${tmp}
|
|
return
|
|
fi
|
|
while read url description ; do
|
|
echo "Downloading update: ${description}"
|
|
wget -O /tmp/update.tar.bz2 "${url}"
|
|
cd /
|
|
echo "Installing update: ${description}"
|
|
tar xf /tmp/update.tar.bz2
|
|
cd -
|
|
rm -f /tmp/update.tar.bz2
|
|
if [ -f /tmp/postupdate.sh ] ; then
|
|
chmod +x /tmp/postupdate.sh
|
|
/tmp/postupdate.sh
|
|
rm -f /tmp/postupdate.sh
|
|
fi
|
|
done < ${tmp}
|
|
rm -f ${tmp}
|
|
}
|
|
|
|
rockate_transparent_tor(){
|
|
# based on http://wiki.noreply.org/noreply/TheOnionRouter/TransparentProxy
|
|
# destinations you don't want routed through Tor
|
|
NON_TOR=""
|
|
while read inet addr brd bcast rest ; do
|
|
# inet 127.0.0.1/8 scope host lo
|
|
# inet 213.239.220.170/27 brd 213.239.220.191 scope global eth0
|
|
[ "${addr:0:3}" == "127" ] && continue
|
|
|
|
read addr1 addr2 addr3 addr4 subnet <<< "${addr//[.\/]/ }"
|
|
read bcast1 bcast2 bcast3 bcast4 <<< "${bcast//./ }"
|
|
unset netaddr
|
|
for x in 1 2 3 4 ; do
|
|
eval a="\${addr${x}}"
|
|
eval b="\${bcast${x}}"
|
|
if [ ${subnet} -ge 8 ] ; then
|
|
# the simple case
|
|
netaddr="${netaddr}${netaddr:+.}${a}"
|
|
subnet=$(( ${subnet} - 8 ))
|
|
elif [ ${subnet} -eq 0 ] ; then
|
|
# the other simple case
|
|
netaddr="${netaddr}${netaddr:+.}0"
|
|
else
|
|
# 0 < subnet < 8
|
|
b="$(( ( ${b} + 1 ) - ( 2 ** ( 8 - ${subnet} ) ) ))"
|
|
netaddr="${netaddr}${netaddr:+.}${b}"
|
|
subnet=0
|
|
fi
|
|
done
|
|
NON_TOR="${NON_TOR} ${netaddr}/${addr##*/}"
|
|
done < <( ip a | grep inet | grep -v inet6 )
|
|
|
|
# the UID Tor runs as
|
|
TOR_UID="79"
|
|
|
|
# Tor's TransPort
|
|
TRANS_PORT="9040"
|
|
|
|
lsmod | grep ipt_owner || modprobe ipt_owner
|
|
|
|
iptables -F
|
|
iptables -t nat -F
|
|
|
|
iptables -t nat -A OUTPUT -m owner --uid-owner $TOR_UID -j RETURN
|
|
for NET in $NON_TOR 127.0.0.0/9 127.128.0.0/10; do
|
|
iptables -t nat -A OUTPUT -d $NET -j RETURN
|
|
done
|
|
iptables -t nat -A OUTPUT -p tcp --syn -j DNAT --to-dest 127.0.0.1:$TRANS_PORT
|
|
|
|
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
|
|
for NET in $NON_TOR 127.0.0.0/8; do
|
|
iptables -A OUTPUT -d $NET -j ACCEPT
|
|
done
|
|
iptables -A OUTPUT -m owner --uid-owner $TOR_UID -j ACCEPT
|
|
iptables -A OUTPUT -j REJECT
|
|
}
|
|
|
|
main() {
|
|
#eth0 Link encap:Ethernet HWaddr 00:10:DC:7C:EE:8A
|
|
while
|
|
menu=""
|
|
while read name a b c mac ; do
|
|
read inet ip rest < <( ip addr show ${name} | grep 'inet ' )
|
|
menu="${menu} 'Device ${name} (${mac})' ''"
|
|
menu="${menu} ' IP Address: ${ip}' ''"
|
|
menu="${menu} ' Configure via dhcp' 'dhclient -v ${name}'"
|
|
menu="${menu} ' Configure manually' 'rockate_configure ${name}'"
|
|
done < <( ifconfig -a | grep HWaddr ) # we only want 'real' interfaces
|
|
menu="${menu} '' ''"
|
|
read dest gw msk fl met ref use dev < <( route -n | grep ^0.0.0.0 )
|
|
menu="${menu} 'Default Route: ${gw} (via ${dev})' 'rockate_defaultroute ${gw}'"
|
|
menu="${menu} '' ''"
|
|
menu="${menu} 'Setup transparent Tor proxy (use after network setup)' 'rockate_transparent_tor'"
|
|
if [ ! -e /etc/HDINSTALL ] ; then
|
|
menu="${menu} 'The following option can be used to update the ROCKate environment at' ''"
|
|
menu="${menu} 'runtime if an update file has been provided. These changes will be' ''"
|
|
menu="${menu} 'gone after reboot, so please use only if you really want to.' ''"
|
|
fi
|
|
menu="${menu} 'Update ROCKate' 'rockate_update'"
|
|
if [ -f /etc/ULTIMATE -a ! -e /etc/HDINSTALL ] ; then
|
|
menu="${menu} '' ''"
|
|
menu="${menu} 'Install ROCKate to disk' 'rockate_install'"
|
|
menu="${menu} 'See http://xsanr2oqmett7ovm.onion/wiki/show/PostInstall for steps' ''"
|
|
menu="${menu} 'to do after installation!' ''"
|
|
fi
|
|
eval gui_menu FOO "'ROCKate Configuration'" ${menu}
|
|
do : ; done
|
|
}
|
|
|