commit
87dcc05fcc
45 changed files with 1389 additions and 0 deletions
@ -0,0 +1,19 @@ |
||||
#!/usr/bin/perl -w |
||||
|
||||
use esmith::Build::CreateLinks qw(:all); |
||||
|
||||
panel_link("qos", 'manager'); |
||||
|
||||
service_link_enhanced("qos", "S85", "7"); |
||||
service_link_enhanced("qos", "K25", "6"); |
||||
service_link_enhanced("qos", "K25", "0"); |
||||
|
||||
templates2events("/etc/rc.d/init.d/qos", "bootstrap-console-save"); |
||||
templates2events("/etc/rc.d/init.d/qos", "qos-update"); |
||||
templates2events("/etc/squid/squid.conf", "qos-update"); |
||||
|
||||
event_link("reload-squid", "qos-update", "90"); |
||||
|
||||
safe_symlink("adjust", "root/etc/e-smith/events/qos-update/services2adjust/qos"); |
||||
safe_symlink("adjust", "root/etc/e-smith/events/ip-up/services2adjust/qos"); |
||||
|
@ -0,0 +1 @@ |
||||
4000 |
@ -0,0 +1 @@ |
||||
5060,10000-20000,4569 |
@ -0,0 +1 @@ |
||||
400 |
@ -0,0 +1 @@ |
||||
100 |
@ -0,0 +1 @@ |
||||
.rar,.zip,.tar,.tar.gz,.tar.bz2,.tgz,.tbz2,.avi,.mpg,.mpeg,.mkv,.mov,.flv,.iso |
@ -0,0 +1 @@ |
||||
100 |
@ -0,0 +1 @@ |
||||
disabled |
@ -0,0 +1 @@ |
||||
service |
@ -0,0 +1,3 @@ |
||||
#!/bin/bash |
||||
|
||||
/usr/sbin/squid -k reconfigure |
@ -0,0 +1,130 @@ |
||||
<lexicon lang="en-us"> |
||||
<entry> |
||||
<base>QOS</base> |
||||
<trans>Quality of Service</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>FORM_TITLE</base> |
||||
<trans>Configure quality of service</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_QOS</base> |
||||
<trans>You can manage quality of service on your server. You must define the capacities of the band-width</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_UDPPrio</base> |
||||
<trans>You can configure specific high priority ports for the UDP protocol. You can enter a list of port or ports ranges separated by a comma (for example 5060,10000-20000,4569). Outgoing paquets to these ports will have the highest priority</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_TCPPrio</base> |
||||
<trans>You can configure specific high priority ports for the TCP protocol. The format is the same as UDP.</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_HostsPrio</base> |
||||
<trans>You can configure a list of high priority hosts. Any traffic to these hosts will have the highest priority</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_BP</base> |
||||
<trans>Enter your link capacity.</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>INVALID_PORT_RANGE</base> |
||||
<trans>This is not a valid list of port or port range</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>INVALID_HOST_IP</base> |
||||
<trans>This is not a valid list of ip address</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_UPLINK</base> |
||||
<trans>Uplink Bandwith (in kbps)</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_DOWNLINK</base> |
||||
<trans>Downlink Bandwith (in kbps)</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_UDPPrio</base> |
||||
<trans>UDP High Priority Ports</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_TCPPrio</base> |
||||
<trans>TCP Hight Priority Ports</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_HostsPrio</base> |
||||
<trans>Hight Priority Hosts</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>IN_SERVERONLY_MODE</base> |
||||
<trans><![CDATA[<span style="color:red">You are running in server only mode. It doesn't make sens to configure QOS as your server do not control outgoing trafic</span>]]></trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_STATUS</base> |
||||
<trans>Do you want to enable the service</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_STATUS</base> |
||||
<trans>Status</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>ENABLED</base> |
||||
<trans>enabled</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DISABLED</base> |
||||
<trans>disabled</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_WEB_THROTTLE</base> |
||||
<trans>The following settings only apply to web downloads which pass through the proxy on this server. Web proxy need to be enabled for this to take effect.</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_WEB_GLOBAL_LIMIT</base> |
||||
<trans>This settings will define a global speed limit for web trafic as a percent of your total available downlink speed. For example, if you set 90, downloads from the web will be limited to 90% of your total bandwidth. You use this to reduce the impact of big downloads on critial streams, like VoIP.</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_WEB_GLOBAL_LIMIT</base> |
||||
<trans>Web global limit</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_WEB_THROTTLE_LIMIT</base> |
||||
<trans>This settings controls per host limit. For example, if you choose 70, each host will be limited to 70% of the total bandwidth (after the burst at full speed). This setting helps preventing one user to slow down everything with big downloads</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_WEB_THROTTLE_LIMIT</base> |
||||
<trans>Per host limit</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_WEB_THROTTLE_EXTENSIONS</base> |
||||
<trans>Enter here the list of extensions which will be affected by the per host limit, one per line. If you want everything to be limited, just enter a dot (.)</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_WEB_THROTTLE_EXTENSIONS</base> |
||||
<trans>Extensions to throttle</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_WEB_SOURCE_EXCEPTION</base> |
||||
<trans>You can enter here IP address of internal host which won't be limited by the per host throttle, one IP address per line. Usefull for example to let your boss surf at full speed. Global limit will still apply to this list.</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_WEB_SOURCE_EXCEPTION</base> |
||||
<trans>Exceptions (sources)</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_WEB_DEST_EXCEPTION</base> |
||||
<trans>You can also enter a list of domain names which won't be affected by the per host throttle, one per line (global limit still applies).</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_WEB_DEST_EXCEPTION</base> |
||||
<trans>Exceptions (destinations)</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>VALUE_NEED_TO_BE_PERCENT</base> |
||||
<trans>This value must be between 0 and 100</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>VALUE_ZERO_OR_POSITIVE</base> |
||||
<trans>This value must be positive or null</trans> |
||||
</entry> |
||||
</lexicon> |
@ -0,0 +1,130 @@ |
||||
<lexicon lang="en-us"> |
||||
<entry> |
||||
<base>QOS</base> |
||||
<trans>Qualité de service</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>FORM_TITLE</base> |
||||
<trans>Configuration de la qualité de service</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_QOS</base> |
||||
<trans>Vous pouvez contrôler la qualité de service sur votre serveur. Vous devez d'abord définir les capacité de votre ligne (bande passante).</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_UDPPrio</base> |
||||
<trans>Vous pouvez configurer une liste de ports prioritaires pour le protocole UDP. Vous pouvez entrer une liste de ports, ou de plages de ports, séparés par des virgules (par exemple 5060,10000-20000,4569). Les paquets sortants utilisant ces ports en destination auront la plus hautes priorité.</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_TCPPrio</base> |
||||
<trans>Vous pouvez définir une liste de ports prioritaires pour le protocole TCP. Le format est le même que pour l'UDP.</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_HostsPrio</base> |
||||
<trans>Vous puvez configurer une liste d'hôtes prioritaires. Tout le trafic à destination de ces hôtes aura la plus haute priorité.</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_BP</base> |
||||
<trans>Entrez les capacités de votre ligne.</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>INVALID_PORT_RANGE</base> |
||||
<trans>Ceci n'est pas une liste valide de ports, ou de plage de ports</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>INVALID_HOST_IP</base> |
||||
<trans>Ceci n'est pas une liste valide d'adresses IP</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_UPLINK</base> |
||||
<trans>Bande passante montante (en kbps)</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_DOWNLINK</base> |
||||
<trans>Bande passante descendante (en kbps)</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_UDPPrio</base> |
||||
<trans>Ports UDP prioritaires</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_TCPPrio</base> |
||||
<trans>Ports TCP prioritaires</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_HostsPrio</base> |
||||
<trans>Hôtes prioritaires</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>IN_SERVERONLY_MODE</base> |
||||
<trans><![CDATA[<span style="color:red">Votre serveur est configuré en mode serveur simple. La QoS ne sera pas gérée puisque votre serveur ne contrôle pas le trafic sortant</span>]]></trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_STATUS</base> |
||||
<trans>Voulez-vous activer le service</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_STATUS</base> |
||||
<trans>Statut</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>ENABLED</base> |
||||
<trans>activé</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DISABLED</base> |
||||
<trans>désactivé</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_WEB_THROTTLE</base> |
||||
<trans>Les réglages suivants ne s'appliquent qu'aux téléchargements sur le web passant à travers le proxy de ce serveur. Le proxy HTTP doit être activé pour que ces réglages soient effectifs</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_WEB_GLOBAL_LIMIT</base> |
||||
<trans>Ce paramètre permet de définir une limite de vitesse pour le trafic web exprimée comme un pourcentage de la bande passante descendante totale. Par exemple, si vous le réglez à 90, les téléchargements seront limités à 90% de votre bande passante totale. Vous pouvez utiliser ce réglage pour limiter l'impacte de gros téléchargements sur des flux critiques, comme la VoIP.</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_WEB_GLOBAL_LIMIT</base> |
||||
<trans>Limite web globale</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_WEB_THROTTLE_LIMIT</base> |
||||
<trans>Ce paramètre contrôle la limite de vitesse par hôte. Par exemple, si vous choisissez 70, chaque machine de votre réseau sera limitée à 70% de la bande passante totale. Ce paramètre permet d'éviter qu'un utilisateur ralentisse tout le réseau avec de gros téléchargements.</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_WEB_THROTTLE_LIMIT</base> |
||||
<trans>Limite par machine</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_WEB_THROTTLE_EXTENSIONS</base> |
||||
<trans>Entrez ici une liste d'extensions sur lesquelles appliquer la limite par machine, une par ligne. Si vous voulez limiter tout type de fichier, entrez simplement un point (.)</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_WEB_THROTTLE_EXTENSIONS</base> |
||||
<trans>Extensions à limiter</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_WEB_SOURCE_EXCEPTION</base> |
||||
<trans>Vous pouvez entrer ici une liste d'adresses IP des machines internes qui ne seront pas affectées par la limite par machine, une adresse par ligne. Ce réglage est utile par exemple pour laisser votre patron surfer à pleine vitesse. La limite globale s'applique tout de même.</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_WEB_SOURCE_EXCEPTION</base> |
||||
<trans>Exceptions (sources)</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>DESC_WEB_DEST_EXCEPTION</base> |
||||
<trans>Vous pouvez aussi entrer une liste de noms de domaine qui ne seront pas affectés par la limite par machine, un domaine par ligne. (le limite globale s'applique toujours)</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>LABEL_WEB_DEST_EXCEPTION</base> |
||||
<trans>Exceptions (destinations)</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>VALUE_NEED_TO_BE_PERCENT</base> |
||||
<trans>Cette valeure doit être comprise entre 0 et 100</trans> |
||||
</entry> |
||||
<entry> |
||||
<base>VALUE_ZERO_OR_POSITIVE</base> |
||||
<trans>Cette valeure doit être positive ou nulle</trans> |
||||
</entry> |
||||
</lexicon> |
@ -0,0 +1 @@ |
||||
PERMS=0554 |
@ -0,0 +1,3 @@ |
||||
# Source function library. |
||||
. /etc/rc.d/init.d/functions |
||||
|
@ -0,0 +1,3 @@ |
||||
TC=/sbin/tc |
||||
IPT=/sbin/iptables |
||||
|
@ -0,0 +1,6 @@ |
||||
{ |
||||
my $extdev = $ExternalInterface{'Name'} || 'eth0'; |
||||
my $landev = $InternalInterface{'Name'} || 'eth0'; |
||||
$OUT .= "EXTDEV=$extdev\n"; |
||||
$OUT .= "LANDEV=$landev\n"; |
||||
} |
@ -0,0 +1,5 @@ |
||||
{ |
||||
$OUT .= "UPLINK=$qos{UpLink}\n"; |
||||
$OUT .= "DOWNLINK=$qos{DownLink}\n"; |
||||
} |
||||
|
@ -0,0 +1,18 @@ |
||||
# Class 10 will handle real time traffic, like VoIP |
||||
# and user specified high priority UDP and TCP ports as well as |
||||
# High priority hosts |
||||
CLASS_1=$[{ ($qos{'Class1'} || '45') }*$UPLINK/100] |
||||
|
||||
# This class will handle high priority traffic, like ICMP, DNS, NTP, TCP Ack |
||||
CLASS_2=$[{ ($qos{'Class2'} || '25') }*$UPLINK/100] |
||||
|
||||
# This class will handle all the traffic which is not marked |
||||
CLASS_3=$[{ ($qos{'Class3'} || '15') }*$UPLINK/100] |
||||
|
||||
# This class will handle low prio traffic like SMTP |
||||
CLASS_4=$[{ ($qos{'Class4'} || '10') }*$UPLINK/100] |
||||
|
||||
# This class will handle very low priority traffic |
||||
CLASS_5=$[{ ($qos{'Class5'} || '5') }*$UPLINK/100] |
||||
|
||||
|
@ -0,0 +1,8 @@ |
||||
|
||||
# Display the status |
||||
status()\{ |
||||
$TC -s qdisc ls dev $EXTDEV |
||||
$TC -s class ls dev $EXTDEV |
||||
exit |
||||
\} |
||||
|
@ -0,0 +1,15 @@ |
||||
|
||||
stop()\{ |
||||
# Flush classes and Qdiscs |
||||
$TC qdisc del dev $EXTDEV root 2> /dev/null > /dev/null |
||||
$TC qdisc del dev $EXTDEV ingress 2> /dev/null > /dev/null |
||||
|
||||
# Flush mangle table |
||||
$IPT -t mangle -F |
||||
if [ $($IPT -t mangle -L | grep -c QOS) -gt 0 ]; then |
||||
$IPT -t mangle -F QOS |
||||
$IPT -t mangle -X QOS |
||||
fi |
||||
|
||||
\} |
||||
|
@ -0,0 +1,3 @@ |
||||
|
||||
start()\{ |
||||
|
@ -0,0 +1,35 @@ |
||||
{ |
||||
|
||||
$OUT = ''; |
||||
our $r2q = $qos{'r2q'} || ''; |
||||
$r2q = "r2q $r2q" if ($r2q ne ''); |
||||
|
||||
} |
||||
|
||||
|
||||
$TC qdisc add dev $EXTDEV root handle 1: htb {"$r2q";} |
||||
|
||||
$TC class add dev $EXTDEV parent 1: classid 1:1 htb rate $\{UPLINK\}kbit ceil $\{UPLINK\}kbit burst 10k |
||||
|
||||
$TC class add dev $EXTDEV parent 1:1 classid 1:10 htb rate $\{CLASS_1\}kbit ceil $\{UPLINK\}kbit prio 1 burst 5k |
||||
$TC class add dev $EXTDEV parent 1:1 classid 1:11 htb rate $\{CLASS_2\}kbit ceil $\{UPLINK\}kbit prio 2 burst 5k |
||||
$TC class add dev $EXTDEV parent 1:1 classid 1:12 htb rate $\{CLASS_3\}kbit ceil $\{UPLINK\}kbit prio 3 |
||||
$TC class add dev $EXTDEV parent 1:1 classid 1:13 htb rate $\{CLASS_4\}kbit ceil $\{UPLINK\}kbit prio 4 |
||||
$TC class add dev $EXTDEV parent 1:1 classid 1:14 htb rate $\{CLASS_5\}kbit ceil $\{UPLINK\}kbit prio 5 |
||||
|
||||
$TC qdisc add dev $EXTDEV parent 1:10 handle 110: pfifo limit 1000 |
||||
$TC qdisc add dev $EXTDEV parent 1:11 handle 111: sfq perturb 10 |
||||
$TC qdisc add dev $EXTDEV parent 1:12 handle 112: sfq perturb 10 |
||||
$TC qdisc add dev $EXTDEV parent 1:13 handle 113: sfq perturb 10 |
||||
$TC qdisc add dev $EXTDEV parent 1:14 handle 114: sfq perturb 10 |
||||
|
||||
$TC filter add dev $EXTDEV parent 1:0 protocol ip prio 1 handle 1 fw flowid 1:10 |
||||
$TC filter add dev $EXTDEV parent 1:0 protocol ip prio 2 handle 2 fw flowid 1:11 |
||||
$TC filter add dev $EXTDEV parent 1:0 protocol ip prio 3 handle 3 fw flowid 1:12 |
||||
$TC filter add dev $EXTDEV parent 1:0 protocol ip prio 4 handle 4 fw flowid 1:13 |
||||
$TC filter add dev $EXTDEV parent 1:0 protocol ip prio 5 handle 5 fw flowid 1:14 |
||||
|
||||
# Handle "excludes" hosts |
||||
$TC filter add dev $EXTDEV parent 1:0 protocol ip prio 6 handle 6 fw flowid 1: |
||||
|
||||
|
@ -0,0 +1,4 @@ |
||||
|
||||
# Create the QOS table, used to classify trafic |
||||
$IPT -t mangle -N QOS |
||||
|
@ -0,0 +1,25 @@ |
||||
{ |
||||
# VPN paquets have already a tos set (when they entered the tun interface |
||||
# So, we just need to send them in the QOS table |
||||
|
||||
# For OpenVPN Bridge |
||||
if (defined ${'openvpn-bridge'}{'UDPPort'}){ |
||||
$OUT .= "\$IPT -t mangle -A QOS -p udp --sport ${'openvpn-bridge'}{'UDPPort'} -j RETURN\n"; |
||||
} |
||||
elsif (defined ${'openvpn-bridge'}{'TCPPort'}){ |
||||
$OUT .= "\$IPT -t mangle -A QOS -p tcp --sport ${'openvpn-bridge'}{'TCPPort'} -j RETURN\n"; |
||||
} |
||||
|
||||
# For OpenVPN Site To Site |
||||
my $ovpndb = esmith::ConfigDB->open_ro('openvpn-s2s') || return ""; |
||||
|
||||
foreach my $server ($ovpndb->get_all_by_prop(type=>'server')){ |
||||
$OUT .= "\$IPT -t mangle -A QOS -p " . ($server->prop('Protocol') || 'udp') . " --sport " . $server->prop('Port') . " -j RETURN\n"; |
||||
} |
||||
foreach my $client ($ovpndb->get_all_by_prop(type=>'client')){ |
||||
$OUT .= "\$IPT -t mangle -A QOS -p " . ($client->prop('Protocol') || 'udp') . " --dport " . $client->prop('Port') . " -j RETURN\n"; |
||||
} |
||||
|
||||
$OUT .= ''; |
||||
|
||||
} |
@ -0,0 +1,13 @@ |
||||
|
||||
# Hosts to exclude from the BW limit |
||||
{ |
||||
my $excludes = ${qos}{'excludes'} || ''; |
||||
|
||||
foreach(split(/[;,]/,$excludes)){ |
||||
$OUT .= "\$IPT -t mangle -A POSTROUTING -d $_ -j MARK --set-mark 0x6\n"; |
||||
$OUT .= "\$IPT -t mangle -A POSTROUTING -d $_ -j RETURN\n"; |
||||
} |
||||
|
||||
} |
||||
|
||||
|
@ -0,0 +1,35 @@ |
||||
|
||||
{ |
||||
$OUT .= "# High prio UDP Ports;\n"; |
||||
|
||||
|
||||
my $TCPPrio = ${qos}{'TCPPrio'} || ''; |
||||
my $UDPPrio = ${qos}{'UDPPrio'} || ''; |
||||
my $HostsPrio = ${qos}{'HostsPrio'} || ''; |
||||
|
||||
$UDPPrio =~ s/-/:/g; |
||||
$TCPPrio =~ s/-/:/g; |
||||
|
||||
foreach (split(/[;,]/,$UDPPrio)){ |
||||
$OUT .= "\$IPT -t mangle -A QOS -p udp --dport $_ -j DSCP --set-dscp 1\n"; |
||||
$OUT .= "\$IPT -t mangle -A QOS -p udp --dport $_ -j RETURN\n"; |
||||
} |
||||
|
||||
|
||||
$OUT .= "\n# High prio TCP Ports:\n"; |
||||
|
||||
foreach (split(/[;,]/,$TCPPrio)){ |
||||
$OUT .= "\$IPT -t mangle -A QOS -p tcp --dport $_ -j DSCP --set-dscp 1\n"; |
||||
$OUT .= "\$IPT -t mangle -A QOS -p tcp --dport $_ -j RETURN\n"; |
||||
} |
||||
|
||||
$OUT .= "\n# High prio Hosts:\n"; |
||||
|
||||
foreach (split(/[;,]/,$HostsPrio)){ |
||||
$OUT .= "\$IPT -t mangle -A QOS -d $_ -j DSCP --set-dscp 1\n"; |
||||
$OUT .= "\$IPT -t mangle -A QOS -d $_ -j RETURN\n"; |
||||
} |
||||
|
||||
} |
||||
|
||||
|
@ -0,0 +1,5 @@ |
||||
|
||||
# Packets marked for lowdelay (TOS field) should be in the first class |
||||
$IPT -t mangle -A QOS -m tos --tos Minimize-Delay -j DSCP --set-dscp 1 |
||||
$IPT -t mangle -A QOS -m tos --tos Minimize-Delay -j RETURN |
||||
|
@ -0,0 +1,7 @@ |
||||
|
||||
# Icmp ping should have a hight priority |
||||
$IPT -t mangle -A QOS -p icmp --icmp-type echo-request -j DSCP --set-dscp 2 |
||||
$IPT -t mangle -A QOS -p icmp --icmp-type echo-request -j RETURN |
||||
$IPT -t mangle -A QOS -p icmp --icmp-type echo-reply -j DSCP --set-dscp 2 |
||||
$IPT -t mangle -A QOS -p icmp --icmp-type echo-reply -j RETURN |
||||
|
@ -0,0 +1,5 @@ |
||||
|
||||
# DNS Requests |
||||
$IPT -t mangle -A QOS -p udp --dport 53 -j DSCP --set-dscp 2 |
||||
$IPT -t mangle -A QOS -p udp --dport 53 -j RETURN |
||||
|
@ -0,0 +1,5 @@ |
||||
|
||||
# NTP |
||||
$IPT -t mangle -A QOS -p udp --dport 123 -j DSCP --set-dscp 2 |
||||
$IPT -t mangle -A QOS -p udp --dport 123 -j RETURN |
||||
|
@ -0,0 +1,8 @@ |
||||
# SMTP(s) |
||||
$IPT -t mangle -A QOS -p tcp --dport 25 -j DSCP --set-dscp 4 |
||||
$IPT -t mangle -A QOS -p tcp --dport 25 -j RETURN |
||||
$IPT -t mangle -A QOS -p tcp --dport 465 -j DSCP --set-dscp 4 |
||||
$IPT -t mangle -A QOS -p tcp --dport 465 -j RETURN |
||||
$IPT -t mangle -A QOS -p tcp --dport 587 -j DSCP --set-dscp 4 |
||||
$IPT -t mangle -A QOS -p tcp --dport 587 -j RETURN |
||||
|
@ -0,0 +1,7 @@ |
||||
|
||||
# Small packets (like TCP control) should also go first |
||||
$IPT -t mangle -A QOS -p tcp --tcp-flags ALL SYN -m length --length 40:64 -j DSCP --set-dscp 2 |
||||
$IPT -t mangle -A QOS -p tcp --tcp-flags ALL SYN -m length --length 40:64 -j RETURN |
||||
$IPT -t mangle -A QOS -p tcp --tcp-flags ALL SYN,ACK -m length --length 40:64 -j DSCP --set-dscp 2 |
||||
$IPT -t mangle -A QOS -p tcp --tcp-flags ALL SYN,ACK -m length --length 40:64 -j RETURN |
||||
|
@ -0,0 +1,10 @@ |
||||
|
||||
# Zabbix Agent responses |
||||
$IPT -t mangle -A QOS -p tcp --sport 10050 -j DSCP --set-dscp 2 |
||||
$IPT -t mangle -A QOS -p tcp --sport 10050 -j RETURN |
||||
|
||||
# Zabbix Agent in active mode or zabbix proxy to Zabbix Server |
||||
$IPT -t mangle -A QOS -p tcp --dport 10051 -j DSCP --set-dscp 2 |
||||
$IPT -t mangle -A QOS -p tcp --dport 10051 -j RETURN |
||||
|
||||
|
@ -0,0 +1,6 @@ |
||||
|
||||
# Catch everything else |
||||
$IPT -t mangle -A QOS -j DSCP --set-dscp 3 |
||||
$IPT -t mangle -A QOS -j RETURN |
||||
|
||||
|
@ -0,0 +1,11 @@ |
||||
|
||||
# Clasification based on the DSCP field set previously |
||||
|
||||
$IPT -t mangle -A POSTROUTING -o $LANDEV -j RETURN |
||||
$IPT -t mangle -A POSTROUTING -o $EXTDEV -j QOS |
||||
$IPT -t mangle -A POSTROUTING -m dscp --dscp 1 -o $EXTDEV -j MARK --set-mark 0x1 |
||||
$IPT -t mangle -A POSTROUTING -m dscp --dscp 2 -o $EXTDEV -j MARK --set-mark 0X2 |
||||
$IPT -t mangle -A POSTROUTING -m dscp --dscp 3 -o $EXTDEV -j MARK --set-mark 0x3 |
||||
$IPT -t mangle -A POSTROUTING -m dscp --dscp 4 -o $EXTDEV -j MARK --set-mark 0x4 |
||||
$IPT -t mangle -A POSTROUTING -m dscp --dscp 5 -o $EXTDEV -j MARK --set-mark 0x5 |
||||
|
@ -0,0 +1,8 @@ |
||||
#Equilibrage des telechargements avec les emissions |
||||
$TC qdisc add dev $EXTDEV handle ffff: ingress |
||||
|
||||
|
||||
$TC filter add dev $EXTDEV parent ffff: protocol ip prio 50 u32 match ip src \ |
||||
0.0.0.0/0 police rate $\{DOWNLINK\}kbit burst 200k drop flowid :1 |
||||
|
||||
|
@ -0,0 +1,3 @@ |
||||
|
||||
\} |
||||
|
@ -0,0 +1,42 @@ |
||||
|
||||
case "$1" in |
||||
start) |
||||
echo -n $"Starting QoS: " |
||||
start |
||||
RETVAL=$? |
||||
;; |
||||
stop) |
||||
echo -n $"Stoping QoS: " |
||||
stop |
||||
RETVAL=$? |
||||
;; |
||||
restart) |
||||
echo -n $"Restarting QoS: " |
||||
stop && start |
||||
RETVAL=$? |
||||
;; |
||||
adjust) |
||||
echo -n $"Adjusting QoS: " |
||||
stop |
||||
if [ $(/sbin/e-smith/db configuration getprop qos status) == 'enabled' ]; then |
||||
start |
||||
fi |
||||
RETVAL=$? |
||||
;; |
||||
status) |
||||
status |
||||
;; |
||||
*) |
||||
echo "Usage: $0 start|stop|restart|status" |
||||
;; |
||||
esac |
||||
|
||||
if [ $RETVAL -eq 0 ]; then |
||||
echo_success |
||||
else |
||||
echo_failure |
||||
fi |
||||
echo |
||||
|
||||
exit $RETVAL |
||||
|
@ -0,0 +1,12 @@ |
||||
#!/bin/bash |
||||
|
||||
#------------------------------------------------------------ |
||||
# !!DO NOT MODIFY THIS FILE!! |
||||
# |
||||
# Manual changes will be lost when this file is regenerated. |
||||
# |
||||
# Please read the developer's guide, which is available |
||||
# at http://www.contribs.org/development/ |
||||
# |
||||
# Copyright (C) 1999-2006 Mitel Networks Corporation |
||||
#------------------------------------------------------------ |
@ -0,0 +1,57 @@ |
||||
{ |
||||
|
||||
my $status = $qos{'status'} || 'disabled'; |
||||
|
||||
return "" unless ($status eq 'enabled'); |
||||
|
||||
my $down = $qos{'DownLink'} || '4000'; |
||||
my $weblimit = $qos{'WebGlobalLimit'} || '100'; |
||||
my $limit = $qos{'WebThrottleLimit'} || '99'; |
||||
|
||||
# Convert weblimit and per user limit in absolute values (in bytes) |
||||
$weblimit = $down * $weblimit * 1024 / (100 * 8); |
||||
$limit = $down * $limit * 1024 / (100 * 8); |
||||
|
||||
my $extensions = $qos{'WebThrottleExtensions'} || '.rar .zip .tar .tar.gz .tar.bz2 .tgz .tbz2 .avi .mpg .mpeg .mkv .mov .flv .iso'; |
||||
$extensions =~ s/[,;]/\ /g; |
||||
$extensions =~ s/\./\\\./g; |
||||
|
||||
my @sexcludes = split(/[;,]/, ($qos{'WebThrottleSourceException'} || '')); |
||||
my @dexcludes = split(/[;,]/, ($qos{'WebThrottleDestException'} || '')); |
||||
|
||||
$OUT .=<<"EOF"; |
||||
|
||||
acl throttle url_regex -i $extensions |
||||
|
||||
delay_pools 2 |
||||
delay_class 1 1 |
||||
delay_parameters 1 $weblimit/$weblimit |
||||
|
||||
delay_class 2 2 |
||||
delay_parameters 2 $weblimit/$weblimit $limit/$limit |
||||
|
||||
delay_access 1 allow localdst |
||||
|
||||
acl exclude_throttle_src src 127.0.0.1 |
||||
acl exclude_throttle_dst dstdomain $DomainName |
||||
|
||||
EOF |
||||
|
||||
foreach (@sexcludes){ |
||||
$OUT .= "acl exclude_throttle_src src $_\n"; |
||||
} |
||||
foreach (@dexcludes){ |
||||
$_ =~ s/^/\./ unless $_ =~ m/^\./; |
||||
$OUT .= "acl exclude_throttle_dst dstdomain $_\n"; |
||||
} |
||||
|
||||
$OUT .=<<"EOF" |
||||
|
||||
delay_access 1 allow localdst |
||||
delay_access 1 allow exclude_throttle_src |
||||
delay_access 1 allow exclude_throttle_dst |
||||
delay_access 2 allow throttle |
||||
delay_access 1 allow !throttle |
||||
|
||||
EOF |
||||
} |
@ -0,0 +1,137 @@ |
||||
#!/usr/bin/perl -wT |
||||
#vim: ft=xml: |
||||
|
||||
#-------------------------------------------------------------------------------------------- |
||||
# heading : Configuration |
||||
# description : QOS |
||||
# navigation : 5000 5400 |
||||
#-------------------------------------------------------------------------------------------- |
||||
|
||||
use strict; |
||||
use warnings; |
||||
|
||||
use esmith::FormMagick::Panel::qos; |
||||
my $f = esmith::FormMagick::Panel::qos->new(); |
||||
$f->display(); |
||||
|
||||
__DATA__ |
||||
<form title="FORM_TITLE" |
||||
header="/etc/e-smith/web/common/head.tmpl" |
||||
footer="/etc/e-smith/web/common/foot.tmpl"> |
||||
|
||||
<page name="First" pre-event="print_status_message()" post-event="change_settings"> |
||||
|
||||
<subroutine src="print_serveronly_msg()" /> |
||||
|
||||
<description>DESC_QOS</description> |
||||
<field |
||||
type="select" |
||||
id="status" |
||||
options="'enabled' => 'ENABLED', 'disabled' => 'DISABLED'" |
||||
value="get_prop('status')"> |
||||
<label>LABEL_STATUS</label> |
||||
<description>DESC_STATUS</description> |
||||
</field> |
||||
<field |
||||
type="text" |
||||
id="UpLink" |
||||
size="4" |
||||
validation="zero_or_positive" |
||||
value="get_prop('UpLink')"> |
||||
<label>LABEL_UPLINK</label> |
||||
<description>DESC_BP</description> |
||||
</field> |
||||
<field |
||||
type="text" |
||||
id="DownLink" |
||||
size="4" |
||||
validation="zero_or_positive" |
||||
value="get_prop('DownLink')"> |
||||
<label>LABEL_DOWNLINK</label> |
||||
</field> |
||||
<field |
||||
type="text" |
||||
id="UDPPrio" |
||||
size="40" |
||||
validation="port_range" |
||||
value="get_prop('UDPPrio')"> |
||||
<description>DESC_UDPPrio</description> |
||||
<label>LABEL_UDPPrio</label> |
||||
</field> |
||||
<field |
||||
type="text" |
||||
id="TCPPrio" |
||||
size="40" |
||||
validation="port_range" |
||||
value="get_prop('TCPPrio')"> |
||||
<description>DESC_TCPPrio</description> |
||||
<label>LABEL_TCPPrio</label> |
||||
</field> |
||||
<field |
||||
type="text" |
||||
id="HostsPrio" |
||||
size="40" |
||||
validation="host_ip" |
||||
value="get_prop('HostsPrio')"> |
||||
<description>DESC_HostsPrio</description> |
||||
<label>LABEL_HostsPrio</label> |
||||
</field> |
||||
|
||||
<subroutine src="print_section_bar()" /> |
||||
|
||||
<field |
||||
type="literal" |
||||
id="web_desc" |
||||
value=""> |
||||
<description>DESC_WEB_THROTTLE</description> |
||||
</field> |
||||
|
||||
<field |
||||
type="text" |
||||
id="WebGlobalLimit" |
||||
size="4" |
||||
validation="is_percent" |
||||
value="get_prop('WebGlobalLimit')"> |
||||
<description>DESC_WEB_GLOBAL_LIMIT</description> |
||||
<label>LABEL_WEB_GLOBAL_LIMIT</label> |
||||
</field> |
||||
<field |
||||
type="text" |
||||
id="WebThrottleLimit" |
||||
size="4" |
||||
validation="is_percent" |
||||
value="get_prop('WebThrottleLimit')"> |
||||
<description>DESC_WEB_THROTTLE_LIMIT</description> |
||||
<label>LABEL_WEB_THROTTLE_LIMIT</label> |
||||
</field> |
||||
<field |
||||
type="textarea" |
||||
rows="12" |
||||
cols="35" |
||||
id="WebThrottleExtensions" |
||||
value="get_list('WebThrottleExtensions')"> |
||||
<description>DESC_WEB_THROTTLE_EXTENSIONS</description> |
||||
<label>LABEL_WEB_THROTTLE_EXTENSIONS</label> |
||||
</field> |
||||
<field |
||||
type="textarea" |
||||
rows="12" |
||||
cols="35" |
||||
id="WebThrottleSourceException" |
||||
value="get_list('WebThrottleSourceException')"> |
||||
<description>DESC_WEB_SOURCE_EXCEPTION</description> |
||||
<label>LABEL_WEB_SOURCE_EXCEPTION</label> |
||||
</field> |
||||
<field |
||||
type="textarea" |
||||
rows="12" |
||||
cols="35" |
||||
id="WebThrottleDestException" |
||||
value="get_list('WebThrottleDestException')"> |
||||
<description>DESC_WEB_DEST_EXCEPTION</description> |
||||
<label>LABEL_WEB_DEST_EXCEPTION</label> |
||||
</field> |
||||
<subroutine src="print_button( 'SAVE' )" /> |
||||
</page> |
||||
|
||||
</form> |
@ -0,0 +1,120 @@ |
||||
#!/usr/bin/perl -w |
||||
|
||||
package esmith::FormMagick::Panel::qos; |
||||
|
||||
use strict; |
||||
use warnings; |
||||
|
||||
use esmith::FormMagick; |
||||
use esmith::ConfigDB; |
||||
|
||||
our @ISA = qw(esmith::FormMagick Exporter); |
||||
|
||||
our @EXPORT = qw(); |
||||
|
||||
our $VERSION = sprintf '%d.%03d', q$Revision: 2.00 $ =~ /: (\d+).(\d+)/; |
||||
|
||||
our $db = esmith::ConfigDB->open(); |
||||
|
||||
sub new |
||||
{ |
||||
shift; |
||||
my $self = esmith::FormMagick->new(); |
||||
$self->{calling_package} = (caller) [0]; |
||||
bless $self; |
||||
return $self; |
||||
} |
||||
|
||||
sub get_prop{ |
||||
my ($self,$prop) = @_; |
||||
return $db->get_prop("qos", $prop); |
||||
} |
||||
|
||||
sub get_list{ |
||||
my ($self,$prop) = @_; |
||||
my $values = get_prop($self,$prop); |
||||
$values =~ s/[;,]/\n/g; |
||||
return $values; |
||||
} |
||||
|
||||
sub print_section_bar{ |
||||
my ($fm) = @_; |
||||
print " <tr>\n <td colspan='2'>\n"; |
||||
print "<hr class=\"sectionbar\"/>\n"; |
||||
return undef; |
||||
} |
||||
|
||||
sub print_serveronly_msg{ |
||||
my $self = shift; |
||||
my $mode = $db->get_value('SystemMode'); |
||||
my $msg = ''; |
||||
if ($mode eq 'serveronly'){ |
||||
$msg = $self->localise('IN_SERVERONLY_MODE'); |
||||
} |
||||
return $msg; |
||||
} |
||||
|
||||
sub zero_or_positive{ |
||||
my $self = shift; |
||||
my $val = shift || 0; |
||||
|
||||
return 'OK' if($val =~ /^\d+$/ and $val >= 0); |
||||
return $self->localise('VALUE_ZERO_OR_POSITIVE'); |
||||
} |
||||
|
||||
sub is_percent{ |
||||
my ($self,$val) = @_; |
||||
if ($val =~ m/^\d+$/ && $val <= 100 && $val >= 0){ |
||||
return 'OK'; |
||||
} |
||||
return $self->localise('VALUE_NEED_TO_BE_PERCENT'); |
||||
} |
||||
|
||||
sub port_range{ |
||||
my $self = shift; |
||||
my $val = shift || 0; |
||||
my $RePort = qr/\d{1,4}|[0-6]\d{4}/; |
||||
my $RePortRange = qr/$RePort(-$RePort)?/; |
||||
if ($val =~ m/^$RePortRange(,$RePortRange)*$/) { |
||||
return 'OK'; |
||||
} |
||||
else { |
||||
return $self->localise('INVALID_PORT_RANGE'); |
||||
} |
||||
} |
||||
|
||||
sub host_ip{ |
||||
my $self = shift; |
||||
my $val = shift || ''; |
||||
my $ReIpNum = qr{([01]?\d\d?|2[0-4]\d|25[0-5])}; |
||||
my $ReIpAddr = qr{($ReIpNum\.$ReIpNum\.$ReIpNum\.$ReIpNum)}; |
||||
if (($val =~ m/^$ReIpAddr(,$ReIpAddr)*$/) || ($val eq '')) { |
||||
return 'OK'; |
||||
} |
||||
else { |
||||
return $self->localise('INVALID_HOST_IP'); |
||||
} |
||||
} |
||||
|
||||
sub change_settings { |
||||
my $fm = shift; |
||||
my $q = $fm->{'cgi'}; |
||||
|
||||
foreach (qw/status UDPPrio TCPPrio HostsPrio UpLink DownLink WebGlobalLimit WebThrottleLimit/){ |
||||
$db->set_prop('qos', "$_", $q->param("$_") ||''); |
||||
} |
||||
|
||||
foreach (qw/WebThrottleExtensions WebThrottleSourceException WebThrottleDestException/){ |
||||
my $list = $q->param("$_") || ''; |
||||
$list =~ s/\r?\n/,/g; |
||||
$db->set_prop('qos', "$_", $list); |
||||
} |
||||
|
||||
unless (system ("/sbin/e-smith/signal-event qos-update") == 0 ){ |
||||
$fm->error('ERROR'); |
||||
} |
||||
|
||||
$fm->success('SUCCESS'); |
||||
} |
||||
|
||||
1; |
@ -0,0 +1,141 @@ |
||||
# $Id: smeserver-qos-1.0.spec,v 1.8 2009/03/03 21:36:59 slords Exp $ |
||||
# Authority: VIP-ire |
||||
# Name: Daniel Berteaud |
||||
|
||||
%define name smeserver-qos |
||||
%define version 1.2 |
||||
%define release 0.beta5 |
||||
|
||||
Summary: Install management web console for QoS |
||||
Name: %{name} |
||||
Version: %{version} |
||||
Release: %{release}%{?dist} |
||||
License: GNU GPL version 2 |
||||
URL: http://contribs.org |
||||
Group: SMEserver/addon |
||||
Source: %{name}-%{version}.tar.gz |
||||
Patch0: smeserver-qos-1.2-fix_throttle_access.patch |
||||
Patch1: smeserver-qos-1.2-stop_prio_ack.patch |
||||
Patch2: smeserver-qos-1.2-only_mark_out_on_extdev.patch |
||||
Patch3: smeserver-qos-1.2-remove_bogus_burst_param.patch |
||||
Patch4: smeserver-qos-1.2-bigger_burst_on_ingress.patch |
||||
Patch5: smeserver-qos-1.2-locale_fr_fix.patch |
||||
|
||||
BuildRoot: %{_tmppath}/%{name}-buildroot |
||||
BuildArchitectures: noarch |
||||
BuildRequires: e-smith-devtools >= 1.13.1-03 |
||||
Requires: e-smith-base |
||||
Conflicts: smeserver-htbwshaper |
||||
|
||||
%description |
||||
SME Server admin interface for QoS |
||||
|
||||
%changelog |
||||
* Fri Oct 07 2011 Daniel B. <daniel@firewall-services.com> - 1.2-1.sme |
||||
- Add squid delay pools |
||||
- Translate in french |
||||
- Stop giving TCP ACK such a high priority (SYN and SYNACK are not affected) |
||||
- Only mark packets going out on EXTDEV |
||||
|
||||
* Tue Apr 19 2011 Daniel B. <daniel@firewall-services.com> - 1.1-10.sme |
||||
- Add rules for SMTP submission port (587) |
||||
|
||||
* Mon Oct 25 2010 Daniel B. <daniel@firewall-services.com> - 1.1-9.sme |
||||
- Add another class (very low priority) |
||||
|
||||
* Mon Oct 25 2010 Daniel B. <daniel@firewall-services.com> - 1.1-8.sme |
||||
- Use DSCP field instead of TOS |
||||
|
||||
* Fri Oct 22 2010 Daniel B. <daniel@firewall-services.com> - 1.1-7.sme |
||||
- Just return LAN trafic |
||||
|
||||
* Wed Oct 20 2010 Daniel B. <daniel@firewall-services.com> - 1.1-6.sme |
||||
- Classification based on TOS field |
||||
- Support for OpenVPN trafic shaping |
||||
|
||||
* Mon May 03 2010 Daniel B. <daniel@firewall-services.com> - 1.1-5.sme |
||||
- % of each class can be specidied in the DB |
||||
- r2q can be changed in the db |
||||
|
||||
* Thu Apr 29 2010 Daniel B. <daniel@firewall-services.com> - 1.1-4.sme |
||||
- packets with tos set as minimize-cost sent in lowest priority |
||||
class |
||||
- syn-acks go in class 2 |
||||
- Zabbix communications go in class 2 |
||||
|
||||
* Tue Apr 27 2010 Daniel B. <daniel@firewall-services.com> - 1.1-3.sme |
||||
- Add burst to the root class |
||||
- remove .orig file |
||||
- changes in % reserved for each class (50, 25, 15, 10) |
||||
- give TCP SYN the same prio than TCP ACKs |
||||
- revert class 2 to sfq |
||||
- reduce r2q for low bandwidth links, and remove useless default |
||||
|
||||
* Tue Apr 27 2010 Daniel B. <daniel@firewall-services.com> - 1.1-2.sme |
||||
- Detects TCP Acks just before the catch all rule |
||||
|
||||
* Mon Apr 26 2010 Daniel B. <daniel@firewall-services.com> - 1.1-1.sme |
||||
- Fixe high priority class handle |
||||
- Use pfifo instead of sfq for high priority traffic (often UDP) |
||||
- Better TCP ACK detection |
||||
- Adjust r2q for low bandwidth connexions |
||||
- remove useless OUTPUT rules (catched in POSTROUTING) |
||||
- changes in % reserved for each class |
||||
- allow 5k burst for the highest priority classes (10 and 11) |
||||
|
||||
* Thu Oct 01 2009 Daniel B. <daniel@firewall-services.com> - 1.0-4.sme |
||||
- Various cleanups |
||||
- Add high priority hosts |
||||
- translate panel name |
||||
|
||||
* Mon May 04 2009 Daniel B. <daniel@firewall-services.com> - 1.0-3.sme |
||||
- Add TC rules for OUTPUT so outgoing traffic from the server itself |
||||
is also shaped |
||||
|
||||
* Mon Apr 14 2009 Daniel B. <daniel@firewall-services.com> - 1.0-2 |
||||
- Adjust qos on ip-up event |
||||
- Print action (stop/start/restart) in init script |
||||
|
||||
* Mon Mar 16 2009 Daniel B. <daniel@firewall-services.com> - 1.0-1 |
||||
- Change default status to disabled |
||||
- Class 1 gets 70%, class 2 15%, class 3 10% and class 4 5% (reserved) |
||||
- Add missing -j RETURN after the catchall rule |
||||
|
||||
* Wed Mar 13 2009 Daniel B. <daniel@firewall-services.com> - 1.0-0 |
||||
- Initial release based on smeserver-htbwshaper, but with a lot of |
||||
changes and enhancement |
||||
|
||||
|
||||
%prep |
||||
%setup |
||||
%patch0 -p1 |
||||
%patch1 -p1 |
||||
%patch2 -p1 |
||||
%patch3 -p1 |
||||
%patch4 -p1 |
||||
%patch5 -p1 |
||||
|
||||
%{__rm} -f root/etc/e-smith/templates/etc/rc.d/init.d/qos/30Functions25DefineClasses.orig |
||||
|
||||
%build |
||||
perl createlinks |
||||
|
||||
%install |
||||
rm -rf $RPM_BUILD_ROOT |
||||
(cd root ; find . -depth -print | cpio -dump $RPM_BUILD_ROOT) |
||||
rm -f %{name}-%{version}-filelist |
||||
/sbin/e-smith/genfilelist $RPM_BUILD_ROOT \ |
||||
> %{name}-%{version}-filelist |
||||
echo "%doc COPYING" >> %{name}-%{version}-filelist |
||||
|
||||
%clean |
||||
cd .. |
||||
rm -rf %{name}-%{version} |
||||
|
||||
%files -f %{name}-%{version}-filelist |
||||
%defattr(-,root,root) |
||||
|
||||
%post |
||||
%preun |
||||
%postun |
||||
|
Loading…
Reference in new issue