#!/bin/bash
# Tool zur Umrechnung von langen in kurze Netzwerkmasken
# (c) 2009 Stefan Schaefer invis-server.org
# Questions at: stefan@invis-server.org
# Donations welcome ;-)

# License: GPLv3
# Dieses Programm ist freie Software. Sie können es unter den Bedingungen der 
# GNU General Public License, wie von der Free Software Foundation veröffentlicht,
# weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder
# (nach Ihrer Option) jeder späteren Version.

# Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen
# von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite 
# Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. 
# Details finden Sie in der GNU General Public License.

# Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem 
# Programm erhalten haben. Falls nicht, siehe <http://www.gnu.org/licenses/>. 

# Einlesen der langen Netzwerkmaske
longmask=$1
#echo $longmask > subnetmask.log
# Array zum Testen der eingegebenen Netzwerkmaske
possible=(0 128 192 224 240 248 252 255)

shortmask=0
i=1
while (( $i <= 4 )); do
    #Stueck fuer Stueck zerlegen
    lmpart=`echo $longmask|cut -d "." -f $i`
    geprueft=8
    for number in ${possible[*]}; do
	if [[ $lmpart != $number ]]; then
	    (( geprueft=$geprueft-1 ))
	fi
    done
    if [[ $lmpart == "" ]] || (( $geprueft == 0 )); then echo "Keine gueltige Netzwerkmaske"; exit; fi
    
    #echo $lmpart
    if (( $lmpart == 255 )); then
	bitsum=8
    else
	n=8
	bitsum=0
	while (( n > 0 )); do
	    (( potenz=2**$n ))
	    #echo $potenz
	    #echo $lmpart
	    if (( $lmpart >= $potenz )); then
		bit=1
		(( lmpart=$lmpart-$potenz ))
	    else
		bit=0
	    fi
	(( bitsum=$bitsum+$bit ))
	(( n=$n-1 ))
	done
    fi
    #echo $bitsum
    (( shortmask=$shortmask+$bitsum ))
    (( i=$i+1 ))
done

echo $shortmask