dirty...dirty..dirty hack to get rid of r2q.
[util-vserver-pl.git] / python / bwlimit.py
index 1be3bd4..58d3052 100644 (file)
@@ -154,24 +154,24 @@ default_share = 1
 # be off by a small fraction.
 suffixes = {
     "":         1,
-    "bit":     1,
-    "kibit":   1024,
-    "kbit":    1000,
-    "mibit":   1024*1024,
-    "mbit":    1000000,
-    "gibit":   1024*1024*1024,
-    "gbit":    1000000000,
-    "tibit":   1024*1024*1024*1024,
-    "tbit":    1000000000000,
-    "bps":     8,
-    "kibps":   8*1024,
-    "kbps":    8000,
-    "mibps":   8*1024*1024,
-    "mbps":    8000000,
-    "gibps":   8*1024*1024*1024,
-    "gbps":    8000000000,
-    "tibps":   8*1024*1024*1024*1024,
-    "tbps":    8000000000000
+    "bit":      1,
+    "kibit":    1024,
+    "kbit":     1000,
+    "mibit":    1024*1024,
+    "mbit":     1000000,
+    "gibit":    1024*1024*1024,
+    "gbit":     1000000000,
+    "tibit":    1024*1024*1024*1024,
+    "tbit":     1000000000000,
+    "bps":      8,
+    "kibps":    8*1024,
+    "kbps":     8000,
+    "mibps":    8*1024*1024,
+    "mbps":     8000000,
+    "gibps":    8*1024*1024*1024,
+    "gbps":     8000000000,
+    "tibps":    8*1024*1024*1024*1024,
+    "tbps":     8000000000000
 }
 
 
@@ -191,6 +191,24 @@ def get_tc_rate(s):
     else:
         return -1
 
+def format_bytes(bytes, si = True):
+    """
+    Formats bytes into a string
+    """
+    if si:
+        kilo = 1000.
+    else:
+        # Officially, a kibibyte
+        kilo = 1024.
+
+    if bytes >= (kilo * kilo * kilo):
+        return "%.1f GB" % (bytes / (kilo * kilo * kilo))
+    elif bytes >= 1000000:
+        return "%.1f MB" % (bytes / (kilo * kilo))
+    elif bytes >= 1000:
+        return "%.1f KB" % (bytes / kilo)
+    else:
+        return "%.0f bytes" % bytes
 
 def format_tc_rate(rate):
     """
@@ -303,6 +321,16 @@ def tc(cmd):
     return run(TC + " " + cmd)
 
 
+def stop(dev = dev):
+    '''
+    Turn off all queing.  Stops all slice HTBS and reverts to pfifo_fast (the default).
+    '''
+    try:
+        for i in range(0,2):
+            tc("qdisc del dev %s root" % dev)
+    except: pass
+
+
 def init(dev = dev, bwcap = bwmax):
     """
     (Re)initialize the bandwidth limits on this node
@@ -546,15 +574,9 @@ def on(xid, dev = dev, share = None, minrate = None, maxrate = None, minexemptra
 
 
 def set(xid, share = None, minrate = None, maxrate = None, minexemptrate = None, maxexemptrate = None):
-    # Get defaults from current state if available
-    # get(xid,dev) = ( xid, share, minrate, maxrate, minexemptrate, maxexemptrate, bytes, i2bytes )
-    current = get(xid, dev)
-    if current == None: current = () # must be a new slice if returned nothing.
-    new = ( share, minrate, maxrate, minexemptrate, maxexemptrate )
-    if current[1:6] != new:
-        on(xid = xid, share = share,
-            minrate = minrate, maxrate = maxrate,
-            minexemptrate = minexemptrate, maxexemptrate = maxexemptrate)
+    on(xid = xid, share = share,
+       minrate = minrate, maxrate = maxrate,
+       minexemptrate = minexemptrate, maxexemptrate = maxexemptrate)
 
 
 # Remove class associated with specified slice xid. If further packets
@@ -605,7 +627,7 @@ Usage:
 %s [OPTION]... [COMMAND] [ARGUMENT]...
 
 Options:
-       -d device       Network interface (default: %s)
+        -d device   Network interface (default: %s)
         -r rate         Node bandwidth cap (default: %s)
         -q quantum      Share multiplier (default: %d bytes)
         -n              Print rates in numeric bits per second
@@ -686,11 +708,11 @@ def main():
                            minexemptrate, maxexemptrate,
                            bytes, exemptbytes)
                 else:
-                    print "%s %d %s %s %s %s %d %d" % \
+                    print "%s %d %s %s %s %s %s %s" % \
                           (slice, share,
                            format_tc_rate(minrate), format_tc_rate(maxrate),
                            format_tc_rate(minexemptrate), format_tc_rate(maxexemptrate),
-                           bytes, exemptbytes)
+                           format_bytes(bytes), format_bytes(exemptbytes))
 
         elif len(argv) >= 2:
             # slice, ...