| Latest revision |
Your text |
| Line 60: |
Line 60: |
| | Here <code>X.X.X.X</code> is an IP address of container. | | Here <code>X.X.X.X</code> is an IP address of container. |
| | | | |
| − | == An alternate approach using HTB == | + | == An alternate approch using HTB == |
| | | | |
| | For details refer to the [http://luxik.cdi.cz/~devik/qos/htb/ HTB Home Page] | | For details refer to the [http://luxik.cdi.cz/~devik/qos/htb/ HTB Home Page] |
| Line 127: |
Line 127: |
| | tc filter show dev $DEV | | tc filter show dev $DEV |
| | </source> | | </source> |
| − |
| |
| − |
| |
| − |
| |
| − | == Autogen rules for CT ==
| |
| − |
| |
| − | <source lang="python">
| |
| − | #!/usr/bin/env python
| |
| − | # -*- coding: utf-8 -*-
| |
| − | ######################################
| |
| − | ## by VoidLess, lepus.su
| |
| − | ######################################
| |
| − | import fnmatch
| |
| − | import os
| |
| − |
| |
| − | ######################################
| |
| − | ## НАСТРОЙКИ СКРИПТА
| |
| − | confdir = "/etc/vz/conf/"
| |
| − | rulefile = "/etc/vz/shaper/rules.sh"
| |
| − |
| |
| − | # шейпятся только эти тарифы
| |
| − | table_band = {
| |
| − | #ORIGIN_SAMPLE : канал
| |
| − | "SSD8": "100mbit",
| |
| − | "SSD7": "100mbit",
| |
| − | "SSD6": "100mbit",
| |
| − | "SSD5": "100mbit",
| |
| − | "SSD4": "100mbit",
| |
| − | "SSD3": "100mbit",
| |
| − | "SSD2": "100mbit",
| |
| − | "SSD1": "100mbit"
| |
| − | }
| |
| − |
| |
| − | ######################################
| |
| − | ## ШАБЛОН СКРИПТА НАСТРОЙКИ ШЕЙПЕРА
| |
| − |
| |
| − | fileheader = """#!/bin/bash
| |
| − | # shaper configuration file
| |
| − |
| |
| − | ##### ЧИСТКА ОТ СТАРЫХ ПРАВИЛ #####
| |
| − | tc qdisc del dev eth0 root
| |
| − | tc -s qdisc ls dev eth0
| |
| − |
| |
| − | tc qdisc del dev venet0 root
| |
| − | tc -s qdisc ls dev venet0
| |
| − | ##### ЧИСТКА ОТ СТАРЫХ ПРАВИЛ #####
| |
| − | """
| |
| − |
| |
| − | # eth0
| |
| − |
| |
| − | eth0header = """
| |
| − | DEV=eth0
| |
| − | tc qdisc del dev $DEV root 2>/dev/null
| |
| − | tc qdisc add dev $DEV root handle 1: htb default 1 r2q 3000
| |
| − | tc class add dev $DEV parent 1: classid 1:1 htb rate 1000mbit burst 10mb
| |
| − | """
| |
| − |
| |
| − | eth0template = """
| |
| − | # vzid {VPSID} tarif {BANDWIDTH} ip {IP}
| |
| − |
| |
| − | tc class add dev $DEV parent 1:1 classid 1:{CLASS} htb rate {BANDWIDTH} ceil {BANDWIDTH} burst 1mb
| |
| − | tc qdisc add dev $DEV parent 1:{CLASS} handle {CLASS}: sfq perturb 5 #quantum 5000b
| |
| − | """
| |
| − |
| |
| − | eth0match = """
| |
| − | tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip src {IP} flowid 1:{CLASS}
| |
| − | """
| |
| − |
| |
| − | # venet0
| |
| − |
| |
| − | venet0header = """
| |
| − | DEV=venet0
| |
| − | tc qdisc del dev $DEV root 2>/dev/null
| |
| − | tc qdisc add dev $DEV root handle 1: htb default 1 r2q 3000
| |
| − | tc class add dev $DEV parent 1: classid 1:1 htb rate 1000mbit burst 10mb
| |
| − | """
| |
| − |
| |
| − | venet0template = """
| |
| − | # vzid {VPSID} tarif {BANDWIDTH} ip {IP}
| |
| − |
| |
| − | tc class add dev $DEV parent 1:1 classid 1:{CLASS} htb rate {BANDWIDTH} ceil {BANDWIDTH} burst 1mb
| |
| − | tc qdisc add dev $DEV parent 1:{CLASS} handle {CLASS}: sfq perturb 5 #quantum 5000b
| |
| − | """
| |
| − |
| |
| − | venet0match = """
| |
| − | tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip dst {IP} flowid 1:{CLASS}
| |
| − | """
| |
| − |
| |
| − | ######################################
| |
| − | ## КОД СКРИПТА
| |
| − | # получает список и настройки виртуалок из папки конфигов OpenVZ
| |
| − | def getvz():
| |
| − | vzlist = []
| |
| − |
| |
| − | for file in os.listdir(confdir):
| |
| − | if fnmatch.fnmatch(file, '*.conf') and file != "0.conf":
| |
| − | #берем список конфигов
| |
| − | vzid = file.split(".",1)[0]
| |
| − | vztarif = None
| |
| − | vzip = None
| |
| − |
| |
| − | #открываем файл, узнаем название тарифа
| |
| − | with open(confdir + file) as f:
| |
| − | for line in f:
| |
| − | if line[0]=="#":
| |
| − | continue
| |
| − |
| |
| − | ar = line.split("=")
| |
| − |
| |
| − | if ar[0] == "ORIGIN_SAMPLE":
| |
| − | vztarif = ar[1].replace('"', '').strip()
| |
| − | continue
| |
| − |
| |
| − | if ar[0] == "IP_ADDRESS":
| |
| − | vzip = ar[1].replace('"', '').strip().split(" ")
| |
| − | continue
| |
| − |
| |
| − | #если в файле не написан тариф, или он левый, ничего не делаем
| |
| − | if vztarif == None or vzip == None or vztarif not in table_band:
| |
| − | continue
| |
| − |
| |
| − | # в список записываем инфу про все vps
| |
| − | vzlist.append((vzid, table_band[vztarif], vzip))
| |
| − | return vzlist
| |
| − |
| |
| − | # записывает команды настройки шейпера в sh файл
| |
| − | def genconf(vzlist):
| |
| − | with open(rulefile,"w+") as f:
| |
| − |
| |
| − | # file header
| |
| − | f.write(fileheader)
| |
| − |
| |
| − | # eth0 rules
| |
| − | f.write(eth0header)
| |
| − |
| |
| − | shaper_id = 100
| |
| − | for vz in vzlist:
| |
| − | f.write(eth0template
| |
| − | .replace("{VPSID}",vz[0])
| |
| − | .replace("{CLASS}",str(shaper_id))
| |
| − | .replace("{BANDWIDTH}",vz[1])
| |
| − | .replace("{IP}",str(vz[2])))
| |
| − | for ip in vz[2]:
| |
| − | f.write(eth0match
| |
| − | .replace("{VPSID}",vz[0])
| |
| − | .replace("{CLASS}",str(shaper_id))
| |
| − | .replace("{IP}",ip))
| |
| − | shaper_id += 1
| |
| − |
| |
| − | # venet0 rules
| |
| − | f.write(venet0header)
| |
| − |
| |
| − | shaper_id = 100
| |
| − | for vz in vzlist:
| |
| − | f.write(venet0template
| |
| − | .replace("{VPSID}",vz[0])
| |
| − | .replace("{CLASS}",str(shaper_id))
| |
| − | .replace("{BANDWIDTH}",vz[1])
| |
| − | .replace("{IP}",str(vz[2])))
| |
| − | for ip in vz[2]:
| |
| − | f.write(venet0match
| |
| − | .replace("{VPSID}",vz[0])
| |
| − | .replace("{CLASS}",str(shaper_id))
| |
| − | .replace("{IP}",ip))
| |
| − | shaper_id += 1
| |
| − |
| |
| − | # make in runnable
| |
| − | os.chmod(rulefile, 0755)
| |
| − |
| |
| − | ## основной код скрипта. выполнение функций
| |
| − | # получили список VPSок
| |
| − | vzlist = getvz()
| |
| − |
| |
| − | # сгенерировали скрипт с правилами
| |
| − | genconf(vzlist)
| |
| − |
| |
| − | # применили правила
| |
| − | os.system(rulefile)
| |
| − | </source>
| |
| − |
| |
| | | | |
| | == External links == | | == External links == |