All pastes #362795 Raw Edit

Mine

public text v1 · immutable
#362795 ·published 2007-02-19 01:39 UTC
rendered paste body
#!/bin/bash
# -------------- HTB Sharper 1.7.3 "rc.htb" -------------
#         All rights reserved for B@roo 2000-2005
#                     Poprawki Gervys79
# ---------------------------------------------------------
#set -x
# Ladowanie konfiguracji
  if [ ! -e ${0%rc.htb}rc.fire_conf ]; then
    exit 1
  fi
    START_FILE="rc.htb"
    source ${0%rc.htb}rc.fire_conf

  if [ ! "$QOS_ENABLE" == "htb" ]; then
    echo -n "HTB QoS fuction is disable."
    exit 1
  fi

# -------- Ladowanie modulow i usuwanie kolejek ------------
ip link set imq0 up
ip link set imq1 up

stop()
{
tc qdisc del root dev imq1 2> /dev/null
tc qdisc del root dev imq0 2> /dev/null
}

# ----------------- Przeliczenia klas ----------------------
start()
{
    if [ "$NAT_ENABLE" == "MASQUERADE" ]; then
        INTERNET_IP=`ifconfig $INTERNET_ETH | grep "inet addr:" | awk '{print $2}' | cut -d ":" -f 2`
    fi

    DOWNLOAD_ALL_UL=$[$DOWNLOAD*99/100]
    DOWNLOAD_ALL=$[$DOWNLOAD*98/100]

    DOWNLOAD_PRIO=`echo $QOS_PRIO_BAND | cut -d':' -f1`
    DOWNLOAD_CRIT=`echo $QOS_CRIT_BAND | cut -d':' -f1`

    if [ ! `echo $QOS_CRIT_BAND | cut -d':' -f3` == "hard" ]; then
        DOWNLOAD_CRIT_UL=$DOWNLOAD_ALL_UL
        DOWNLOAD_NORMAL=$[$DOWNLOAD_ALL-$DOWNLOAD_CRIT]
        DOWNLOAD_NORMAL_UL=$DOWNLOAD_ALL_UL
    else
        DOWNLOAD_CRIT_UL=$DOWNLOAD_ALL_UL
        DOWNLOAD_NORMAL=$[$DOWNLOAD_ALL-$DOWNLOAD_CRIT]
        DOWNLOAD_NORMAL_UL=$[$DOWNLOAD_ALL_UL-$DOWNLOAD_CRIT]
    fi

    if [ "$DOWNLOAD_CRIT" -ge "$[$DOWNLOAD_ALL/2]" ]; then
        DOWNLOAD_CRIT_M1=$[$DOWNLOAD_ALL*75/100]
    else
        DOWNLOAD_CRIT_M1=$[2*$DOWNLOAD_CRIT*85/100]
    fi

    UPLOAD_ALL_UL=$[$UPLOAD*99/100]
    UPLOAD_ALL=$[$UPLOAD*98/100]

    UPLOAD_PRIO=`echo $QOS_PRIO_BAND | cut -d':' -f2`
    UPLOAD_CRIT=`echo $QOS_CRIT_BAND | cut -d':' -f2`

    if [ ! `echo $QOS_CRIT_BAND | cut -d':' -f3` == "hard" ]; then
        UPLOAD_CRIT_UL=$UPLOAD_ALL_UL
        UPLOAD_NORMAL=$[$UPLOAD_ALL-$UPLOAD_CRIT]
        UPLOAD_NORMAL_UL=$UPLOAD_ALL_UL
    else
        UPLOAD_CRIT_UL=$UPLOAD_ALL_UL
        UPLOAD_NORMAL=$[$UPLOAD_ALL-$UPLOAD_CRIT]
        UPLOAD_NORMAL_UL=$[$UPLOAD_ALL_UL-$UPLOAD_CRIT]
    fi

    if [ "$UPLOAD_CRIT" -ge "$[$UPLOAD_ALL/2]" ]; then
        UPLOAD_CRIT_M1=$[$UPLOAD_ALL*75/100]
    else
        UPLOAD_CRIT_M1=$[2*$UPLOAD_CRIT*85/100]
    fi

    DOWNLOAD_ROUTER=`echo $QOS_ROUTER_BAND | cut -d':' -f1`
    UPLOAD_ROUTER=`echo $QOS_ROUTER_BAND | cut -d':' -f3`

    if [ ! `echo $QOS_ROUTER_BAND | cut -d':' -f2` == "auto" ]; then
        DOWNLOAD_ROUTER_UL=`echo $QOS_ROUTER_BAND | cut -d':' -f2`
    else
        DOWNLOAD_ROUTER_UL=$DOWNLOAD_NORMAL_UL
    fi

    if [ ! `echo $QOS_ROUTER_BAND | cut -d':' -f4` == "auto" ]; then
        UPLOAD_ROUTER_UL=`echo $QOS_ROUTER_BAND | cut -d':' -f4`
    else
        UPLOAD_ROUTER_UL=$UPLOAD_NORMAL_UL
    fi

    USERS_COUNT_DOWN=0
    RATE_COUNT_DOWN=0
    USERS_COUNT_UP=0
    RATE_COUNT_UP=0

    if [ ! "$P2P_LIMIT" == "" ]; then
        USERS_COUNT_DOWN=1
        USERS_COUNT_UP=1
    fi

    for i in $QOS_ALLOW
     do
        if [ ! `echo $i | cut -d':' -f2` == "auto" ]; then
            TMP=`echo $i | cut -d':' -f2`
            RATE_COUNT_DOWN=$[$RATE_COUNT_DOWN+$TMP]
        else
            USERS_COUNT_DOWN=$[$USERS_COUNT_DOWN+1]
        fi
        if [ ! `echo $i | cut -d':' -f4` == "auto" ]; then
            TMP=`echo $i | cut -d':' -f4`
            RATE_COUNT_UP=$[$RATE_COUNT_UP+$TMP]
        else
            USERS_COUNT_UP=$[$USERS_COUNT_UP+1]
        fi
     done

    if [ ! "$USERS_COUNT_DOWN" == "0" ]; then
        DOWNLOAD_USER_RATE=$[($DOWNLOAD_NORMAL-$DOWNLOAD_PRIO-$DOWNLOAD_ROUTER-$RATE_COUNT_DOWN)/$USERS_COUNT_DOWN]
    fi
    if [ ! "$USERS_COUNT_UP" == "0" ]; then
        UPLOAD_USER_RATE=$[($UPLOAD_NORMAL-$UPLOAD_PRIO-$UPLOAD_ROUTER-$RATE_COUNT_UP)/$USERS_COUNT_UP]
    fi

# P2P

   if [ "$P2P_TYPE" == "advanced" ]; then
    if [ ! "$P2P_LIMIT" == "" ]; then
     DOWNLOAD_ALL_P2P=`echo $P2P_LIMIT | cut -d':' -f1`
     UPLOAD_ALL_P2P=`echo $P2P_LIMIT | cut -d':' -f2`

     RATE_COUNT_DOWN_P2P=0
     USERS_COUNT_DOWN_P2P=0
     RATE_COUNT_UP_P2P=0
     USERS_COUNT_UP_P2P=0
    else
     echo "Warning: you must define P2P_LIMIT value in advanced mode"
    fi
   fi

   if [ "$P2P_TYPE" == "advanced" ]; then
    if [ ! "$P2P_LIMIT" == "" ]; then
    for i in $P2P_USER_LIMIT
     do
        if [ ! `echo $i | cut -d':' -f2` == "auto" ]; then
            TMP=`echo $i | cut -d':' -f2`
            RATE_COUNT_DOWN_P2P=$[$RATE_COUNT_DOWN_P2P+$TMP]
        else
            USERS_COUNT_DOWN_P2P=$[$USERS_COUNT_DOWN_P2P+1]
        fi
        if [ ! `echo $i | cut -d':' -f4` == "auto" ]; then
            TMP=`echo $i | cut -d':' -f4`
            RATE_COUNT_UP_P2P=$[$RATE_COUNT_UP_P2P+$TMP]
        else
            USERS_COUNT_UP_P2P=$[$USERS_COUNT_UP_P2P+1]
        fi
     done

    if [ ! "$USERS_COUNT_DOWN_P2P" == "0" ]; then
        DOWNLOAD_USER_RATE_P2P=$[($DOWNLOAD_ALL_P2P-$RATE_COUNT_DOWN_P2P)/$USERS_COUNT_DOWN_P2P]
    fi
    if [ ! "$USERS_COUNT_UP_P2P" == "0" ]; then
        UPLOAD_USER_RATE_P2P=$[($UPLOAD_ALL_P2P-$RATE_COUNT_UP_P2P)/$USERS_COUNT_UP_P2P]
    fi
    fi
   fi

# ------------ Tworzenie kolejek - odbieranie ---------------
### Tworzenie korzenia kolejek
    tc qdisc add dev imq0 root handle 1:0 htb default 100 r2q 4
    tc class add dev imq0 parent 1:0 classid 1:1 htb rate ${DOWNLOAD_ALL}kbit ceil ${DOWNLOAD_ALL_UL}kbit

### Ruch krytyczny
    tc class add dev imq0 parent 1:1 classid 1:2 htb rate ${DOWNLOAD_CRIT_M1}kbit ceil ${DOWNLOAD_CRIT_UL}kbit
    tc qdisc add dev imq0 parent 1:2 sfq perturb 5
    tc filter add dev imq0 parent 1:0 protocol ip prio 2 handle 0x2 fw flowid 1:2

### Ruch normalny
    tc class add dev imq0 parent 1:1 classid 1:5 htb rate ${DOWNLOAD_NORMAL}kbit ceil ${DOWNLOAD_NORMAL_UL}kbit

  # Ruch priorytetowy
    tc class add dev imq0 parent 1:5 classid 1:10 htb rate ${DOWNLOAD_PRIO}kbit ceil ${DOWNLOAD_NORMAL_UL}kbit
    tc qdisc add dev imq0 parent 1:10 sfq perturb 5
    tc filter add dev imq0 parent 1:0 protocol ip prio 3 u32 match ip protocol 17 0xff match ip sport 53 0xffff flowid 1:10     # DNS

  # Ruch routera
    tc class add dev imq0 parent 1:5 classid 1:20 htb rate ${DOWNLOAD_ROUTER}kbit ceil ${DOWNLOAD_ROUTER_UL}kbit
    tc qdisc add dev imq0 parent 1:20 sfq perturb 10
    tc filter add dev imq0 parent 1:0 protocol ip prio 4 u32 match ip dst $INTERNET_IP flowid 1:20

  # Ruch P2P
    if [ "$P2P_TYPE" == "normal" ]; then
     if [ ! "$P2P_LIMIT" == "" ]; then
        DOWNLOAD_P2P=`echo $P2P_LIMIT | cut -d':' -f1`
        tc class add dev imq0 parent 1:5 classid 1:30 htb rate ${DOWNLOAD_USER_RATE}kbit ceil ${DOWNLOAD_P2P}kbit
        tc qdisc add dev imq0 parent 1:30 esfq perturb 10 hash dst
        tc filter add dev imq0 parent 1:0 protocol ip prio 1 handle 0x30 fw flowid 1:30
     fi
    fi

  # Ruch normalny userow
    if [ "$P2P_TYPE" == "normal" ]; then
     MARK=100
    else
     MARK=50
     MARK2=500
    fi

    for i in $QOS_ALLOW
    do
    DOWN_NORMAL=$DOWNLOAD_USER_RATE
    DOWN_CEIL=$DOWNLOAD_NORMAL_UL

    ADDRESS=`echo $i | cut -d':' -f1`

    if [ ! `echo $i | cut -d':' -f2` == "auto" ]; then
        DOWN_NORMAL=`echo $i | cut -d':' -f2`
    fi

    if [ ! `echo $i | cut -d':' -f3` == "auto" ]; then
        DOWN_CEIL=`echo $i | cut -d':' -f3`
        DL="ceil ${DOWN_CEIL}kbit"
    else
        DL="ceil ${DOWN_CEIL}kbit"
    fi

    if [ $DOWN_NORMAL -ge $DOWN_CEIL ]; then
        DOWN_NORMAL=$DOWN_CEIL
    fi

     if [ "$P2P_TYPE" == "normal" ]; then
      tc class add dev imq0 parent 1:5 classid 1:${MARK} htb rate ${DOWN_NORMAL}kbit $DL
      if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then
        tc qdisc add dev imq0 parent 1:${MARK} esfq perturb 10 hash dst
      elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then
        tc qdisc add dev imq0 parent 1:${MARK} sfq perturb 10
      else
        tc qdisc add dev imq0 parent 1:${MARK} sfq perturb 10
      fi
      tc filter add dev imq0 parent 1:0 protocol ip prio 5 u32 match ip dst $ADDRESS flowid 1:${MARK}

      MARK=$[$MARK+1]

     elif [ "$P2P_TYPE" == "advanced" ]; then
      tc class add dev imq0 parent 1:5 classid 1:${MARK} htb rate ${DOWN_NORMAL}kbit $DL
      if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then
        tc qdisc add dev imq0 parent 1:${MARK} esfq perturb 10 hash dst
      elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then
        tc qdisc add dev imq0 parent 1:${MARK} sfq perturb 10
      else
        tc qdisc add dev imq0 parent 1:${MARK} sfq perturb 10
      fi

      tc class add dev imq0 parent 1:${MARK} classid 1:${MARK2} htb rate ${DOWN_NORMAL}kbit $DL
      if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then
        tc qdisc add dev imq0 parent 1:${MARK2} esfq perturb 10 hash dst
      elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then
        tc qdisc add dev imq0 parent 1:${MARK2} sfq perturb 10
      else
        tc qdisc add dev imq0 parent 1:${MARK2} sfq perturb 10
      fi
      tc filter add dev imq0 parent 1:0 protocol ip prio 5 u32 match ip dst $ADDRESS flowid 1:${MARK2}

      MARK=$[$MARK+1]
      MARK2=$[$MARK2+2]

     fi
    done

  # Ruch p2p userow
    if [ "$P2P_TYPE" == "advanced" ]; then
    MARK=50
    MARK2=501
    for i in $P2P_USER_LIMIT
     do
      DOWN_NORMAL_P2P=$DOWNLOAD_USER_RATE_P2P
      DOWN_CEIL_P2P=`echo $P2P_LIMIT | cut -d':' -f1`

      if [ ! `echo $i | cut -d':' -f2` == "auto" ]; then
        DOWN_NORMAL_P2P=`echo $i | cut -d':' -f2`
      fi

      if [ ! `echo $i | cut -d':' -f3` == "auto" ]; then
        DOWN_CEIL_P2P=`echo $i | cut -d':' -f3`
        DL_P2P="ceil ${DOWN_CEIL_P2P}kbit"
      else
        DL_P2P="ceil ${DOWN_CEIL_P2P}kbit"
      fi

      if [ $DOWN_NORMAL_P2P -ge $DOWN_CEIL_P2P ]; then
        DOWN_NORMAL_P2P=$DOWN_CEIL_P2P
      fi

      tc class add dev imq0 parent 1:${MARK} classid 1:${MARK2} htb rate ${DOWN_NORMAL_P2P}kbit $DL_P2P
      tc qdisc add dev imq0 parent 1:${MARK2} esfq perturb 10 hash dst
      tc filter add dev imq0 parent 1:0 protocol ip prio 1 handle 0x${MARK2} fw flowid 1:${MARK2}

      MARK=$[$MARK+1]
      MARK2=$[$MARK2+2]
     done

# ------------- Tworzenie kolejek - wysylanie ----------------
### Tworzenie korzenia kolejek
    if [ "$P2P_TYPE" == "normal" ]; then
     tc qdisc add dev imq1 root handle 1:0 htb default 100 r2q 4
    else
     tc qdisc add dev imq1 root handle 1:0 htb default 50 r2q 4
    fi
    tc class add dev imq1 parent 1:0 classid 1:1 htb rate ${UPLOAD_ALL}kbit ceil ${UPLOAD_ALL_UL}kbit

### Ruch krytyczny
    tc class add dev imq1 parent 1:1 classid 1:2 htb rate ${UPLOAD_CRIT_M1}kbit ceil ${UPLOAD_CRIT_UL}kbit
    tc qdisc add dev imq1 parent 1:2 sfq perturb 5
    tc filter add dev imq1 parent 1:0 protocol ip prio 2 handle 0x2 fw flowid 1:2

### Ruch normalny
    tc class add dev imq1 parent 1:1 classid 1:5 htb rate ${UPLOAD_NORMAL}kbit ceil ${UPLOAD_NORMAL_UL}kbit

  # Ruch priorytetowy
    tc class add dev imq1 parent 1:5 classid 1:10 htb rate ${UPLOAD_PRIO}kbit ceil ${UPLOAD_NORMAL_UL}kbit
    tc qdisc add dev imq1 parent 1:10 sfq perturb 5
    tc filter add dev imq1 parent 1:0 protocol ip prio 3 u32 match ip protocol 17 0xff match ip dport 53 0xffff flowid 1:10     # DNS
    tc filter add dev imq1 parent 1:0 protocol ip prio 3 u32 match ip protocol 6 0xff \
    match u8 0x05 0x0f at 0 match u16 0x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid 1:10                                   # ACK

  # Ruch routera
    tc class add dev imq1 parent 1:5 classid 1:20 htb rate ${UPLOAD_ROUTER}kbit ceil ${UPLOAD_ROUTER_UL}kbit
    tc qdisc add dev imq1 parent 1:20 sfq perturb 10
    tc filter add dev imq1 parent 1:0 protocol ip prio 4 handle 0x20 fw flowid 1:20

  # Ruch P2P
    if [ "$P2P_TYPE" == "normal" ]; then
     if [ ! "$P2P_LIMIT" == "" ]; then
        UPLOAD_P2P=`echo $P2P_LIMIT | cut -d':' -f2`
        tc class add dev imq1 parent 1:5 classid 1:30 htb rate ${UPLOAD_USER_RATE}kbit ceil ${UPLOAD_P2P}kbit
        tc qdisc add dev imq1 parent 1:30 esfq perturb 10 hash src
        tc filter add dev imq1 parent 1:0 protocol ip prio 1 handle 0x30 fw flowid 1:30
     fi
    fi

  # Ruch normalny userow
    if [ "$P2P_TYPE" == "normal" ]; then
     MARK=100
    else
     MARK=50
     MARK2=500
     MARK3=100
    fi
    for i in $QOS_ALLOW
    do
    UP_NORMAL=$UPLOAD_USER_RATE
    UP_CEIL=$UPLOAD_NORMAL_UL

    if [ ! `echo $i | cut -d':' -f4` == "auto" ]; then
        UP_NORMAL=`echo $i | cut -d':' -f4`
    fi

    if [ ! `echo $i | cut -d':' -f5` == "auto" ]; then
        UP_CEIL=`echo $i | cut -d':' -f5`
        UL="ceil ${UP_CEIL}kbit"
    else
        UL="ceil ${UP_CEIL}kbit"
    fi

    if [ $UP_NORMAL -ge $UP_CEIL ]; then
        UP_NORMAL=$UP_CEIL
    fi
     if [ "$P2P_TYPE" == "normal" ]; then
      tc class add dev imq1 parent 1:5 classid 1:${MARK} htb rate ${UP_NORMAL}kbit $UL
      if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then
        tc qdisc add dev imq1 parent 1:${MARK} esfq perturb 10 hash src
      elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then
        tc qdisc add dev imq1 parent 1:${MARK} sfq perturb 10
      else
        tc qdisc add dev imq1 parent 1:${MARK} sfq perturb 10
      fi
      tc filter add dev imq1 parent 1:0 protocol ip prio 5 handle 0x${MARK} fw flowid 1:${MARK}

      MARK=$[$MARK+1]

     elif [ "$P2P_TYPE" == "advanced" ]; then
      tc class add dev imq1 parent 1:5 classid 1:${MARK} htb rate ${UP_NORMAL}kbit $UL
      if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then
        tc qdisc add dev imq1 parent 1:${MARK} esfq perturb 10 hash src
      elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then
        tc qdisc add dev imq1 parent 1:${MARK} sfq perturb 10
      else
        tc qdisc add dev imq1 parent 1:${MARK} sfq perturb 10
      fi

      tc class add dev imq1 parent 1:${MARK} classid 1:${MARK2} htb rate ${UP_NORMAL}kbit $UL
      if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then
        tc qdisc add dev imq1 parent 1:${MARK2} esfq perturb 10 hash src
      elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then
        tc qdisc add dev imq1 parent 1:${MARK2} sfq perturb 10
      else
        tc qdisc add dev imq1 parent 1:${MARK2} sfq perturb 10
      fi
      tc filter add dev imq1 parent 1:0 protocol ip prio 5 handle 0x${MARK3} fw flowid 1:${MARK2}

      MARK=$[$MARK+1]
      MARK2=$[$MARK2+2]
      MARK3=$[$MARK3+1]

     fi
    done

  # Ruch p2p userow
    if [ "$P2P_TYPE" == "advanced" ]; then
    MARK=50
    MARK2=501
    for i in $P2P_USER_LIMIT
    do
     UP_NORMAL_P2P=$UPLOAD_USER_RATE_P2P
     UP_CEIL_P2P=`echo $P2P_LIMIT | cut -d':' -f2`

     if [ ! `echo $i | cut -d':' -f4` == "auto" ]; then
        UP_NORMAL_P2P=`echo $i | cut -d':' -f4`
     fi

     if [ ! `echo $i | cut -d':' -f5` == "auto" ]; then
        UP_CEIL_P2P=`echo $i | cut -d':' -f5`
        UL_P2P="ceil ${UP_CEIL_P2P}kbit"
     else
        UL_P2P="ceil ${UP_CEIL_P2P}kbit"
     fi

     if [ $UP_NORMAL_P2P -ge $UP_CEIL_P2P ]; then
        UP_NORMAL_P2P=$UP_CEIL_P2P
     fi

       tc class add dev imq1 parent 1:${MARK} classid 1:${MARK2} htb rate ${UP_NORMAL_P2P}kbit $UL_P2P
       tc qdisc add dev imq1 parent 1:${MARK2} esfq perturb 10 hash src
       tc filter add dev imq1 parent 1:0 protocol ip prio 1 handle 0x${MARK2} fw flowid 1:${MARK2}

       MARK=$[$MARK+1]
       MARK2=$[$MARK2+2]
     done
    fi
fi
}

# -------------------- { start | stop } ----------------------
case "$1" in
    'start')
        echo "Starting HTB Sharper 1.7.3 STABLE ... - All rights reserved for B@roo 2000-2005"
        echo "                          Poprawki Gervys79"
        echo "                                  HTB"
        echo "--------------------------------------------------------------------------------"
        stop
        start
        ;;
    'stop')
        echo "Stopping HTB Sharper 1.7.3 STABLE ... - All rights reserved for B@roo 2000-2005"
        echo "                          Poprawki Gervys79"
        echo "--------------------------------------------------------------------------------"
        stop
        ;;
    *)
        echo -e "\n Usage: rc.htb { start | stop }"
        ;;
esac