parent
df3502e7e5
commit
decba6d28a
@ -1,3 +0,0 @@ |
||||
<!--#include virtual="/include/ubar.txt" --> |
||||
<!-- The bandwidth bar program is available at: |
||||
http://www.kernel.org/pub/software/web/bwbar/ --> |
@ -1,5 +0,0 @@ |
||||
<div class="csclogo"> |
||||
<a href="http://mirror.csclub.uwaterloo.ca"> |
||||
<img src="/include/header.png" alt="Computer Science Club Mirror - The University of Waterloo - Funded by MEF" /> |
||||
</a> |
||||
</div> |
@ -1,7 +0,0 @@ |
||||
img { |
||||
border-width: 0; |
||||
} |
||||
|
||||
div.biglogo { |
||||
height: 100px; |
||||
} |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 14 KiB |
@ -1,11 +0,0 @@ |
||||
* |
||||
* Welcome to the University of Waterloo Computer Science Club Mirror |
||||
* |
||||
* http://csclub.uwaterloo.ca/ |
||||
* |
||||
* Hardware funded by MEF (http://www.mef.uwaterloo.ca/) |
||||
* |
||||
* Admin Contact: systems-committee@csclub.uwaterloo.ca |
||||
* Hostname: mirror.csclub.uwaterloo.ca |
||||
* IP Address: 129.97.134.71 |
||||
* |
@ -1,2 +0,0 @@ |
||||
User-agent: * |
||||
Disallow: / |
@ -0,0 +1 @@ |
||||
Subproject commit 3b8607ff1a97e77c0dc60c8c9b85d1f593527a53 |
@ -0,0 +1,45 @@ |
||||
#!/bin/bash |
||||
|
||||
# Non-directories in root |
||||
export FILES='index.html index.css stats.png' |
||||
|
||||
# Include trailing slash on all paths |
||||
HOME=/srv/mirror/ |
||||
export SOURCE='/mirror/root/' |
||||
export DESTINATION="/mirror/newroot/.cscmirror1/" |
||||
export LOGS="/var/log/mirror-newroot/" |
||||
export LOCKS="/tmp/mirror-locks/" |
||||
|
||||
export RSYNC_FLAGS='-aHAv --quiet --stats --delay-updates --delete-after --partial --delete --numeric-ids --timeout=3600 --exclude .~tmp~/' |
||||
|
||||
sync_project() { |
||||
if [ $# -ne 1 ]; then |
||||
echo 'Usage:' $0 'project|file' >&2 |
||||
return 1 |
||||
fi |
||||
|
||||
# only 1 active sync for this project |
||||
exec 9>"${LOCKS}$1.lck" |
||||
flock -n 9 || return 0 |
||||
|
||||
# delay a random time (<= 5 mins) |
||||
# that way all projects don't sync at once |
||||
#sleep $((RANDOM%300)) |
||||
|
||||
if [[ $FILES == *"$1"* ]]; then |
||||
nice rsync $RSYNC_FLAGS --log-file="${LOGS}$1.log" "${SOURCE}$1" "${DESTINATION}" >/dev/null 2>&1 |
||||
else |
||||
nice rsync $RSYNC_FLAGS --log-file="${LOGS}$1.log" "${SOURCE}$1/" "${DESTINATION}$1/" >/dev/null 2>&1 |
||||
fi |
||||
} |
||||
export -f sync_project |
||||
|
||||
if [ ! -d "${LOGS}" ]; then |
||||
mkdir -p "${LOGS}" |
||||
fi |
||||
|
||||
if [ ! -d "${LOCKS}" ]; then |
||||
mkdir -p "${LOCKS}" |
||||
fi |
||||
|
||||
rsync --list-only "${SOURCE}" | grep -v '^[\*\.]' | awk '{print $5}' | grep '^[a-zA-Z0-9]' | parallel --no-notice --jobs 8 sync_project |
@ -1,119 +0,0 @@ |
||||
#!/usr/bin/python2.5 |
||||
import sys, os, re, gzip, bz2, hashlib |
||||
|
||||
package_file_map = { |
||||
'Packages' : file, |
||||
'Packages.gz' : gzip.GzipFile, |
||||
'Packages.bz2' : bz2.BZ2File, |
||||
'Sources' : file, |
||||
'Sources.gz' : gzip.GzipFile, |
||||
'Sources.bz2' : bz2.BZ2File, |
||||
} |
||||
|
||||
def parse_packages_file(path): |
||||
try: |
||||
open_func = package_file_map[os.path.basename(path)] |
||||
file = open_func(path) |
||||
except IOError, e: |
||||
print "WARNING: failed to open %s: %s" % (path, e) |
||||
return {} |
||||
cur_dict = {} |
||||
key, value = None, '' |
||||
ret_list = [] |
||||
while True: |
||||
try: |
||||
line = file.readline() |
||||
except IOError, e: |
||||
print "WARNING: failed to read %s: %s" % (path, e) |
||||
print "WARNING: %s" % e |
||||
return {} |
||||
|
||||
# check if we are done with current value |
||||
if (line == '' or line[0] == '\n' or line[0] != ' ') and key != None: |
||||
cur_dict[key] = value |
||||
|
||||
if line == '' or line == '\n': # done current block |
||||
if cur_dict != {}: |
||||
ret_list.append(cur_dict) |
||||
cur_dict = {} |
||||
key = None |
||||
if line == '': break |
||||
elif line[0] == ' ': # multi-line value |
||||
value += '\n' + line[1:-1] |
||||
else: |
||||
if line[-1] == '\n': line = line[:-1] |
||||
pos = line.find(':') |
||||
key = line[:pos] |
||||
if key == '': key = None |
||||
value = line[pos+2:] |
||||
return ret_list |
||||
|
||||
def find_packages_files(path): |
||||
files = [] |
||||
for file in os.listdir(path): |
||||
file_path = "%s/%s" % (path, file) |
||||
if os.path.islink(file_path): |
||||
continue |
||||
elif os.path.isdir(file_path): |
||||
files += find_packages_files(file_path) |
||||
elif file in package_file_map: |
||||
files.append(file_path) |
||||
return files |
||||
|
||||
if len(sys.argv) != 2: |
||||
print "Usage: debian-check-md5sum.py base-dir" |
||||
sys.exit(1) |
||||
base_dir = sys.argv[1] |
||||
|
||||
all = {} |
||||
files_regex = re.compile('(\S+)\s+(\S+)\s+(\S+)') |
||||
for file in find_packages_files(base_dir): |
||||
file_type = os.path.basename(file).split('.')[0] |
||||
a = parse_packages_file(file) |
||||
for package in parse_packages_file(file): |
||||
if file_type == 'Packages': |
||||
if 'Filename' in package: |
||||
all[package['Filename']] = package |
||||
elif file_type == 'Sources': |
||||
files = package['Files'].split('\n') |
||||
for file in files: |
||||
if file == '': continue |
||||
match = files_regex.match(file) |
||||
file_path = '%s/%s' % (package['Directory'], match.group(3)) |
||||
all[file_path] = { 'MD5sum' : match.group(1) } |
||||
print "NOTICE: need to check %d files" % len(all) |
||||
|
||||
ret_val = 0 |
||||
block_size = 65536 |
||||
for (file, package) in all.iteritems(): |
||||
path = '%s/%s' % (base_dir, file) |
||||
try: |
||||
file = open(path, 'rb') |
||||
except IOError: |
||||
print "WARNING: missing %s" % path |
||||
continue |
||||
if 'SHA256' in package: |
||||
md = hashlib.sha256() |
||||
hash = package['SHA256'] |
||||
elif 'SHA1' in package: |
||||
md = hashlib.sha1() |
||||
hash = package['SHA1'] |
||||
elif 'MD5sum' in package: |
||||
md = hashlib.md5() |
||||
hash = package['MD5sum'] |
||||
else: |
||||
print "WARNING: no hash found for %s" % path |
||||
print package |
||||
exit(1) |
||||
while True: |
||||
data = file.read(block_size) |
||||
if data == '': break |
||||
md.update(data) |
||||
hash_calc = md.hexdigest() |
||||
if hash == hash_calc: |
||||
print "NOTICE: hash ok for %s [hash = %s]" % (path, hash) |
||||
else: |
||||
print "ERROR: hash mismatch for %s [hash = %s, hash_calc = %s]" % \ |
||||
(path, hash, hash_calc) |
||||
ret_val = 1 |
||||
exit(ret_val) |
@ -1,22 +0,0 @@ |
||||
# /etc/cron.d/csc-mirror: mirror cron jobs |
||||
|
||||
# m h dom mon dow user command |
||||
|
||||
# update orion routes |
||||
30 5 * * * root /usr/local/sbin/update-orion-routes |
||||
|
||||
# make torrents |
||||
*/10 * * * * mirror /home/mirror/bin/make-torrents > /dev/null 2> /dev/null |
||||
|
||||
# The rsync cron jobs are now run by a small script a2brenna wrote |
||||
# that works a bit more intelligently than cron. For one thing, it |
||||
# won't kick off a sync when one's already running. Please see |
||||
# ~mirror/merlin. |
||||
# -- mspang |
||||
|
||||
# regenerate mirror index at 5:40 am on 14th & 28th of every month |
||||
# feel free to run this manually if you've added or removed an |
||||
# archive or some such thing |
||||
# |
||||
# Documented here: http://wiki.csclub.uwaterloo.ca/Mirror#Index |
||||
40 5 */14 * * mirror cd /home/mirror/mirror-index && /home/mirror/mirror-index/make-index.py |
@ -1,48 +0,0 @@ |
||||
# This file describes the network interfaces available on your system |
||||
# and how to activate them. For more information, see interfaces(5). |
||||
|
||||
# The loopback network interface |
||||
auto lo |
||||
iface lo inet loopback |
||||
|
||||
# The routes added here will not be visible to the 'route' command; you |
||||
# should use 'ip route show table foo' instead. |
||||
|
||||
auto eth0 |
||||
iface eth0 inet static |
||||
address 129.97.134.42 |
||||
netmask 255.255.255.0 |
||||
gateway 129.97.134.1 |
||||
|
||||
# campus routes are checked first and are maintained here |
||||
up ip rule add from all lookup campus prio 1 |
||||
down ip rule del from all lookup campus prio 1 |
||||
up ip route add 129.97.0.0/16 via 129.97.134.1 dev eth0 table campus realm campus |
||||
down ip route del 129.97.0.0/16 via 129.97.134.1 dev eth0 table campus realm campus |
||||
up ip route add 10.0.0.0/8 via 129.97.134.1 dev eth0 table campus realm campus |
||||
down ip route del 10.0.0.0/8 via 129.97.134.1 dev eth0 table campus realm campus |
||||
up ip route add 172.16.0.0/20 via 129.97.134.1 dev eth0 table campus realm campus |
||||
down ip route del 172.16.0.0/20 via 129.97.134.1 dev eth0 table campus realm campus |
||||
up ip route add 192.168.0.0/16 via 129.97.134.1 dev eth0 table campus realm campus |
||||
down ip route del 192.168.0.0/16 via 129.97.134.1 dev eth0 table campus realm campus |
||||
|
||||
# orion routes are checked second and are maintained by a cronjob |
||||
up ip rule add from all lookup orion prio 2 |
||||
down ip rule del from all lookup orion prio 2 |
||||
|
||||
# Traffic shaping - 100M cogent, 200M orion, 700M campus. |
||||
# Note that the border router is configured with a similar policy, but will |
||||
# drop rather than queue excess packets. These rules keep them from dropping. |
||||
up tc qdisc add dev eth0 parent root handle 1: htb default 2 r2q 10000 |
||||
up tc class add dev eth0 parent 1: classid 1:1 htb rate 1000Mbit |
||||
up tc class add dev eth0 parent 1:1 classid 1:2 htb rate 100Mbit |
||||
up tc class add dev eth0 parent 1:1 classid 1:3 htb rate 200Mbit |
||||
up tc class add dev eth0 parent 1:1 classid 1:4 htb rate 700Mbit ceil 1000Mbit |
||||
up tc filter add dev eth0 parent 1: protocol ip pref 2 route to orion flowid 1:3 |
||||
up tc filter add dev eth0 parent 1: protocol ip pref 1 route to campus flowid 1:4 |
||||
down tc qdisc del dev eth0 parent root |
||||
|
||||
auto eth0:mirror |
||||
iface eth0:mirror inet static |
||||
address 129.97.134.71 |
||||
netmask 255.255.255.0 |
@ -1,186 +0,0 @@ |
||||
#!/usr/bin/python |
||||
|
||||
# This file updates the orion routing table. |
||||
# Put it at /usr/local/sbin/orionroutes.py |
||||
|
||||
# Configuration |
||||
ORION_TABLE = 1 # from /etc/iproute2/rt_tables |
||||
ORION_REALMS = 1 # from /etc/iproute2/rt_realms |
||||
ORION_VIAS = [ "66.97.23.33", "66.97.28.65", "129.97.1.46" ] |
||||
ORION_GW = "129.97.134.1" |
||||
ORION_SRC = "129.97.134.42" |
||||
ORION_IFACE = "eth0" |
||||
|
||||
# Don't touch anything beyond here |
||||
|
||||
import sys, iplib, SubnetTree |
||||
from ctypes import * |
||||
|
||||
NETLINK_ROUTE = 0 |
||||
AF_UNSPEC = 0 |
||||
RT_SCOPE_UNIVERSE = 0 |
||||
RTPROT_STATIC = 4 |
||||
NLM_F_REPLACE = 0x100 |
||||
|
||||
def die(msg): |
||||
sys.stderr.write("orionroutes.py: %s\n" % msg) |
||||
sys.exit(1) |
||||
|
||||
try: |
||||
libnl = cdll.LoadLibrary("libnl.so.1") |
||||
nl_geterror = CFUNCTYPE(c_char_p) (("nl_geterror", libnl), None) |
||||
nl_handle_alloc = CFUNCTYPE(c_void_p) (("nl_handle_alloc", libnl), None) |
||||
nl_connect = CFUNCTYPE(c_int, c_void_p, c_int) \ |
||||
(("nl_connect", libnl), ((1, "handle", None), (1, "type", NETLINK_ROUTE))) |
||||
rtnl_route_alloc = CFUNCTYPE(c_void_p) (("rtnl_route_alloc", libnl), None) |
||||
rtnl_link_alloc_cache = CFUNCTYPE(c_void_p, c_void_p) \ |
||||
(("rtnl_link_alloc_cache", libnl), ((1, "handle", None), )) |
||||
rtnl_link_name2i = CFUNCTYPE(c_int, c_void_p, c_char_p) \ |
||||
(("rtnl_link_name2i", libnl), ((1, "cache", None), (1, "iface", -1))) |
||||
rtnl_route_set_oif = CFUNCTYPE(c_void_p, c_void_p, c_int) \ |
||||
(("rtnl_route_set_oif", libnl), ((1, "route", None), (1, "iface", -1))) |
||||
nl_cache_free = CFUNCTYPE(None, c_void_p) \ |
||||
(("nl_cache_free", libnl), ((1, "cache", None), )) |
||||
nl_addr_parse = CFUNCTYPE(c_void_p, c_char_p, c_int) \ |
||||
(("nl_addr_parse", libnl), ((1, "dst", None), (1, "family", AF_UNSPEC))) |
||||
rtnl_route_set_dst = CFUNCTYPE(c_int, c_void_p, c_void_p) \ |
||||
(("rtnl_route_set_dst", libnl), ((1, "route", None), (1, "dst", None))) |
||||
rtnl_route_set_pref_src = CFUNCTYPE(c_int, c_void_p, c_void_p) \ |
||||
(("rtnl_route_set_pref_src", libnl), ((1, "route", None), (1, "src", None))) |
||||
nl_addr_put = CFUNCTYPE(None, c_void_p) \ |
||||
(("nl_addr_put", libnl), ((1, "addr", None), )) |
||||
rtnl_route_set_gateway = CFUNCTYPE(c_int, c_void_p, c_void_p) \ |
||||
(("rtnl_route_set_gateway", libnl), ((1, "route", None), (1, "gw", None))) |
||||
rtnl_route_set_table = CFUNCTYPE(None, c_void_p, c_int) \ |
||||
(("rtnl_route_set_table", libnl), ((1, "route", None), (1, "table", -1))) |
||||
rtnl_route_set_scope = CFUNCTYPE(None, c_void_p, c_int) \ |
||||
(("rtnl_route_set_scope", libnl), ((1, "route", None), (1, "scope", -1))) |
||||
rtnl_route_set_protocol = CFUNCTYPE(None, c_void_p, c_int) \ |
||||
(("rtnl_route_set_protocol", libnl), ((1, "route", None), (1, "proto", -1))) |
||||
rtnl_route_set_realms = CFUNCTYPE(None, c_void_p, c_int) \ |
||||
(("rtnl_route_set_realms", libnl), ((1, "route", None), (1, "realms", -1))) |
||||
rtnl_route_add = CFUNCTYPE(c_int, c_void_p, c_void_p, c_int) \ |
||||
(("rtnl_route_add", libnl), ((1, "handle", None), (1, "route", None), (1, "flags", 0))) |
||||
rtnl_route_put = CFUNCTYPE(None, c_void_p) \ |
||||
(("rtnl_route_put", libnl), ((1, "route", None), )) |
||||
nl_handle_destroy = CFUNCTYPE(None, c_void_p) \ |
||||
(("nl_handle_destroy", libnl), ((1, "handle", None), )) |
||||
rtnl_route_alloc_cache = CFUNCTYPE(c_void_p, c_void_p) \ |
||||
(("rtnl_route_alloc_cache", libnl), ((1, "handle", None), )) |
||||
nl_cache_get_first = CFUNCTYPE(c_void_p, c_void_p) \ |
||||
(("nl_cache_get_first", libnl), ((1, "cache", None), )) |
||||
rtnl_route_get_table = CFUNCTYPE(c_int, c_void_p) \ |
||||
(("rtnl_route_get_table", libnl), ((1, "route", None), )) |
||||
rtnl_route_get_dst = CFUNCTYPE(c_void_p, c_void_p) \ |
||||
(("rtnl_route_get_dst", libnl), ((1, "route", None), )) |
||||
nl_addr2str = CFUNCTYPE(c_char_p, c_void_p, c_char_p, c_int) \ |
||||
(("nl_addr2str", libnl), ((1, "addr", None), (1, "buffer", None), (1, "size", 0))) |
||||
rtnl_route_del = CFUNCTYPE(c_int, c_void_p, c_void_p, c_int) \ |
||||
(("rtnl_route_del", libnl), ((1, "handle", None), (1, "route", None), (1, "flags", 0))) |
||||
nl_cache_get_next = CFUNCTYPE(c_void_p, c_void_p) \ |
||||
(("nl_cache_get_next", libnl), ((1, "object", None), )) |
||||
except Exception,e: |
||||
die("Failed to load libnl: %s" % e) |
||||
|
||||
def nl_die(func): |
||||
die("%s: %s" % (func, nl_geterror())) |
||||
|
||||
ips = [[] for i in range(33)] |
||||
for line in sys.stdin: |
||||
try: |
||||
ip, mask, via = line.strip().split(',')[0:3] |
||||
except KeyError, ValueError: |
||||
die("Malformed line: %s" % line.strip()) |
||||
|
||||
if via not in ORION_VIAS: |
||||
continue |
||||
bits = int(iplib.IPv4NetMask(mask).get_bits()) |
||||
ips[bits].append(int(iplib.IPv4Address(ip))) |
||||
|
||||
count = sum([len(ip_list) for ip_list in ips]) |
||||
if count < 10: |
||||
die("Not enough routes (got %d)" % count) |
||||
|
||||
cidrs = [] |
||||
for bits in range(32, 1, -1): |
||||
ips[bits].sort() |
||||
last_ip = 0 |
||||
for ip in ips[bits]: |
||||
if ip != last_ip and (ip ^ last_ip) == (1 << (32 - bits)): |
||||
ips[bits - 1].append(ip & (((1 << (bits - 1)) - 1) << (32 - (bits - 1)))) |
||||
last_ip = 0 |
||||
elif last_ip != 0: |
||||
cidrs.append((iplib.IPv4Address(last_ip), bits)) |
||||
last_ip = ip |
||||
if last_ip != 0: |
||||
cidrs.append((iplib.IPv4Address(last_ip), bits)) |
||||
|
||||
nlh = nl_handle_alloc() |
||||
if nlh == None: nl_die("nl_handle_alloc") |
||||
if nl_connect(nlh, NETLINK_ROUTE) < 0: nl_die("nl_connect") |
||||
|
||||
link_cache = rtnl_link_alloc_cache(nlh) |
||||
if link_cache == None: nl_die("rtnl_link_alloc") |
||||
iface = rtnl_link_name2i(link_cache, ORION_IFACE) |
||||
if iface < 0: nl_die("rtnl_link_name2i") |
||||
nl_cache_free(link_cache) |
||||
|
||||
cidrs.sort(lambda (ip1, bits1), (ip2, bits2): cmp(ip1, ip2) if bits1 == bits2 else (bits1 - bits2)) |
||||
tree = SubnetTree.SubnetTree() |
||||
for (ip, bits) in cidrs: |
||||
if str(ip) not in tree: |
||||
cidr = "%s/%s" % (ip, bits) |
||||
tree[cidr] = None |
||||
|
||||
route = rtnl_route_alloc() |
||||
if route == None: nl_die("rtnl_route_alloc") |
||||
|
||||
dstaddr = nl_addr_parse(cidr, AF_UNSPEC) |
||||
if dstaddr == None: nl_die("nl_addr_parse(%s)" % cidr) |
||||
if rtnl_route_set_dst(route, dstaddr) < 0: nl_die("rtnl_route_set_dst") |
||||
nl_addr_put(dstaddr) |
||||
|
||||
srcaddr = nl_addr_parse(ORION_SRC, AF_UNSPEC) |
||||
if srcaddr == None: nl_die("nl_addr_parse(%s)" % ORION_SRC) |
||||
if rtnl_route_set_pref_src(route, srcaddr) < 0: nl_die("nl_route_set_pref_src") |
||||
nl_addr_put(srcaddr) |
||||
|
||||
gwaddr = nl_addr_parse(ORION_GW, AF_UNSPEC) |
||||
if gwaddr == None: nl_die("nl_addr_parse(%s)" % ORION_GW) |
||||
if rtnl_route_set_gateway(route, gwaddr) < 0: nl_die("nl_route_set_gateway") |
||||
nl_addr_put(gwaddr) |
||||
|
||||
rtnl_route_set_oif(route, iface) |
||||
rtnl_route_set_table(route, ORION_TABLE) |
||||
rtnl_route_set_scope(route, RT_SCOPE_UNIVERSE) |
||||
rtnl_route_set_protocol(route, RTPROT_STATIC) |
||||
rtnl_route_set_realms(route, ORION_REALMS) |
||||
|
||||
if rtnl_route_add(nlh, route, NLM_F_REPLACE) < 0: nl_die("rtnl_route_add(dst=%s)" % cidr) |
||||
rtnl_route_put(route) |
||||
|
||||
route_cache = rtnl_route_alloc_cache(nlh) |
||||
if route_cache == None: nl_die("rtnl_route_alloc_cache") |
||||
dstaddr_s = create_string_buffer(100) |
||||
|
||||
route = nl_cache_get_first(route_cache) |
||||
while route != None: |
||||
table = rtnl_route_get_table(route) |
||||
if table != ORION_TABLE: |
||||
route = nl_cache_get_next(route) |
||||
continue |
||||
|
||||
dstaddr = rtnl_route_get_dst(route) |
||||
if dstaddr == None: |
||||
continue |
||||
if nl_addr2str(dstaddr, dstaddr_s, sizeof(dstaddr_s)) == None: nl_die("nl_addr2str") |
||||
dstaddr = str(repr(dstaddr_s.value)).strip('\'').split('/')[0] |
||||
|
||||
if dstaddr not in tree: |
||||
rtnl_route_del(nlh, route, 0) |
||||
|
||||
route = nl_cache_get_next(route) |
||||
|
||||
nl_cache_free(route_cache) |
||||
|
||||
nl_handle_destroy(nlh) |
@ -1,11 +0,0 @@ |
||||
# This file lives at /etc/iproute2/rt_realms |
||||
|
||||
# |
||||
# reserved values |
||||
# |
||||
0 cosmos |
||||
# |
||||
# local |
||||
# |
||||
1 orion |
||||
2 campus |
@ -1,14 +0,0 @@ |
||||
# This file lives at /etc/iproute2/rt_tables |
||||
|
||||
# |
||||
# reserved values |
||||
# |
||||
255 local |
||||
254 main |
||||
253 default |
||||
0 unspec |
||||
# |
||||
# local |
||||
# |
||||
1 orion |
||||
2 campus |
@ -1,6 +0,0 @@ |
||||
#!/bin/bash |
||||
|
||||
# This file updates the orion routing table. |
||||
# Put it at /usr/local/sbin/update-orion-routes. |
||||
|
||||
wget --quiet -O - https://istns.uwaterloo.ca/borderroutes/borderroutes.txt | /usr/local/sbin/orionroutes.py |
@ -1,102 +0,0 @@ |
||||
#include <unistd.h> |
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
#include <inttypes.h> |
||||
#include <libgen.h> |
||||
#include <netlink/route/class.h> |
||||
#include <netlink/route/link.h> |
||||
#include <netlink/cache-api.h> |
||||
#include <netlink/object.h> |
||||
#include "mirror-nl-glue.h" |
||||
|
||||
static struct nl_cache *link_cache, *class_cache; |
||||
static struct rtnl_link *eth; |
||||
static int ifindex; |
||||
|
||||
struct class_info cogent_class = { "cogent", "01:02", }; |
||||
struct class_info orion_class = { "orion", "01:03", }; |
||||
struct class_info campus_class = { "campus", "01:04", }; |
||||
|
||||
static struct nl_handle *nl_handle; |
||||
|
||||
void die(const char *message) { |
||||
fprintf(stderr, "fatal: %s\n", message); |
||||
exit(1); |
||||
} |
||||
|
||||
static void match_obj(struct nl_object *obj, void *arg) { |
||||
struct nl_object *needle = *(struct nl_object **)arg; |
||||
struct nl_object **ret = (struct nl_object **)arg + 1; |
||||
|
||||
if (!*ret && nl_object_identical(obj, needle)) { |
||||
nl_object_get(obj); |
||||
*ret = obj; |
||||
} |
||||
} |
||||
|
||||
static struct rtnl_class *get_class_by_id(char *id, int ifindex) { |
||||
uint32_t handle; |
||||
struct rtnl_class *needle; |
||||
struct nl_object *magic[2]; |
||||
|
||||
if (rtnl_tc_str2handle(id, &handle)) |
||||
die("invalid id"); |
||||
|
||||
needle = rtnl_class_alloc(); |
||||
rtnl_class_set_ifindex(needle, ifindex); |
||||
rtnl_class_set_handle(needle, handle); |
||||
|
||||
magic[0] = (struct nl_object *)needle; |
||||
magic[1] = (struct nl_object *)NULL; |
||||
|
||||
nl_cache_foreach(class_cache, match_obj, magic); |
||||
|
||||
rtnl_class_put(needle); |
||||
return (struct rtnl_class *)magic[1]; |
||||
} |
||||
|
||||
uint64_t get_class_byte_count(struct class_info *info) { |
||||
struct rtnl_class *class = get_class_by_id(info->id, ifindex); |
||||
uint64_t bytes; |
||||
if (!class) |
||||
die("class not found"); |
||||
bytes = rtnl_class_get_stat(class, RTNL_TC_BYTES); |
||||
rtnl_class_put(class); |
||||
return bytes; |
||||
} |
||||
|
||||
void mirror_stats_refresh(void) { |
||||
nl_cache_refill(nl_handle, class_cache); |
||||
} |
||||
|
||||
void mirror_stats_initialize(void) { |
||||
nl_handle = nl_handle_alloc(); |
||||
if (!nl_handle) |
||||
die("unable to allocate handle"); |
||||
|
||||
if (nl_connect(nl_handle, NETLINK_ROUTE) < 0) |
||||
die("unable to connect to netlink"); |
||||
|
||||
link_cache = rtnl_link_alloc_cache(nl_handle); |
||||
if (!link_cache) |
||||
die("unable to allocate link cache"); |
||||
|
||||
eth = rtnl_link_get_by_name(link_cache, "eth0"); |
||||
if (!eth) |
||||
die("unable to acquire eth0"); |
||||
ifindex = rtnl_link_get_ifindex(eth); |
||||
|
||||
class_cache = rtnl_class_alloc_cache(nl_handle, ifindex); |
||||
if (!class_cache) |
||||
die("unable to allocate class cache"); |
||||
} |
||||
|
||||
void mirror_stats_cleanup(void) { |
||||
rtnl_link_put(eth); |
||||
nl_cache_free(class_cache); |
||||
nl_cache_free(link_cache); |
||||
nl_close(nl_handle); |
||||
nl_handle_destroy(nl_handle); |
||||
} |
||||
|
@ -1,25 +0,0 @@ |
||||
#include <unistd.h> |
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
#include <inttypes.h> |
||||
#include <libgen.h> |
||||
#include <netlink/route/class.h> |
||||
#include <netlink/route/link.h> |
||||
#include <netlink/cache-api.h> |
||||
#include <netlink/object.h> |
||||
|
||||
struct class_info { |
||||
char *name; |
||||
char *id; |
||||
}; |
||||
|
||||
extern struct class_info cogent_class; |
||||
extern struct class_info orion_class; |
||||
extern struct class_info campus_class; |
||||
|
||||
void mirror_stats_refresh(void); |
||||
void mirror_stats_initialize(void); |
||||
void mirror_stats_cleanup(void); |
||||
void die(const char *); |
||||
uint64_t get_class_byte_count(struct class_info *); |
@ -1,40 +0,0 @@ |
||||
#include "mirror-nl-glue.h" |
||||
#include <rrd.h> |
||||
|
||||
int main(void) { |
||||
char *argv[3]; |
||||
unsigned long packet_count; |
||||
|
||||
switch(fork()) { |
||||
case -1: |
||||
return -1; |
||||
case 0: |
||||
close(0); |
||||
close(1); |
||||
setsid(); |
||||
break; |
||||
default: |
||||
_exit(0); |
||||
}
|
||||
|
||||
mirror_stats_initialize(); |
||||
argv[0] = malloc(1024);
|
||||
for (;;) { |
||||
packet_count = get_class_byte_count(&cogent_class); |
||||
snprintf(argv[0], 1024, "N:%lu", packet_count); |
||||
rrd_update_r("/var/rrdtool/cogent.rrd", NULL, 1, argv); |
||||
packet_count = get_class_byte_count(&orion_class); |
||||
snprintf(argv[0], 1024, "N:%lu", packet_count); |
||||
rrd_update_r("/var/rrdtool/orion.rrd", NULL, 1, argv); |
||||
packet_count = get_class_byte_count(&campus_class); |
||||
snprintf(argv[0], 1024, "N:%lu", packet_count); |
||||
rrd_update_r("/var/rrdtool/campus.rrd", NULL, 1, argv); |
||||
if (rrd_test_error()) { |
||||
fprintf(stderr, "ERROR: %s\n", rrd_get_error()); |
||||
rrd_clear_error(); |
||||
} |
||||
sleep(5); |
||||
mirror_stats_refresh(); |
||||
} |
||||
} |
||||
|
@ -1,39 +0,0 @@ |
||||
#!/bin/sh |
||||
/usr/bin/rrdtool graph /mirror/root/stats_monthly.png \ |
||||
-s -1m \ |
||||
--imgformat=PNG \ |
||||
--title='Mirror Traffic' \ |
||||
--base=1000 \ |
||||
--height=120 \ |
||||
--width=600 \ |
||||
--alt-autoscale-max \ |
||||
--lower-limit=0 \ |
||||
--vertical-label='bits per second' \ |
||||
--slope-mode \ |
||||
--font TITLE:10: \ |
||||
--font AXIS:8: \ |
||||
--font LEGEND:8: \ |
||||
--font UNIT:8: \ |
||||
DEF:a="/var/rrdtool/cogent.rrd":snmp_oid:AVERAGE \ |
||||
DEF:b="/var/rrdtool/orion.rrd":snmp_oid:AVERAGE \ |
||||
DEF:c="/var/rrdtool/campus.rrd":snmp_oid:AVERAGE \ |
||||
CDEF:cdefa=a,8,* \ |
||||
CDEF:cdefe=b,8,* \ |
||||
CDEF:cdefi=c,8,* \ |
||||
CDEF:cdefbc=TIME,1318318854,GT,a,a,UN,0,a,IF,IF,TIME,1318318854,GT,b,b,UN,0,b,IF,IF,TIME,1318318854,GT,c,c,UN,0,c,IF,IF,+,+,8,* \ |
||||
AREA:cdefa#157419FF:"Cogent" \ |
||||
GPRINT:cdefa:LAST:"Current\:%8.2lf%s" \ |
||||
GPRINT:cdefa:AVERAGE:"Average\:%8.2lf%s" \ |
||||
GPRINT:cdefa:MAX:"Maximum\:%8.2lf%s\n" \ |
||||
AREA:cdefe#00CF00FF:"Orion":STACK \ |
||||
GPRINT:cdefe:LAST:" Current\:%8.2lf%s" \ |
||||
GPRINT:cdefe:AVERAGE:"Average\:%8.2lf%s" \ |
||||
GPRINT:cdefe:MAX:"Maximum\:%8.2lf%s\n" \ |
||||
AREA:cdefi#EE5019FF:"Campus":STACK \ |
||||
GPRINT:cdefi:LAST:"Current\:%8.2lf%s" \ |
||||
GPRINT:cdefi:AVERAGE:"Average\:%8.2lf%s" \ |
||||
GPRINT:cdefi:MAX:"Maximum\:%8.2lf%s\n" \ |
||||
LINE1:cdefbc#000000FF:"Total" \ |
||||
GPRINT:cdefbc:LAST:" Current\:%8.2lf%s" \ |
||||
GPRINT:cdefbc:AVERAGE:"Average\:%8.2lf%s" \ |
||||
GPRINT:cdefbc:MAX:"Maximum\:%8.2lf%s\n" >/dev/null 2>/dev/null |
@ -1,39 +0,0 @@ |
||||
#!/bin/sh |
||||
/usr/bin/rrdtool graph /mirror/root/stats_yearly.png \ |
||||
-s -1y \ |
||||
--imgformat=PNG \ |
||||
--title='Mirror Traffic' \ |
||||
--base=1000 \ |
||||
--height=120 \ |
||||
--width=600 \ |
||||
--alt-autoscale-max \ |
||||
--lower-limit=0 \ |
||||
--vertical-label='bits per second' \ |
||||
--slope-mode \ |
||||
--font TITLE:10: \ |
||||
--font AXIS:8: \ |
||||
--font LEGEND:8: \ |
||||
--font UNIT:8: \ |
||||
DEF:a="/var/rrdtool/cogent.rrd":snmp_oid:AVERAGE \ |
||||
DEF:b="/var/rrdtool/orion.rrd":snmp_oid:AVERAGE \ |
||||
DEF:c="/var/rrdtool/campus.rrd":snmp_oid:AVERAGE \ |
||||
CDEF:cdefa=a,8,* \ |
||||
CDEF:cdefe=b,8,* \ |
||||
CDEF:cdefi=c,8,* \ |
||||
CDEF:cdefbc=TIME,1318318854,GT,a,a,UN,0,a,IF,IF,TIME,1318318854,GT,b,b,UN,0,b,IF,IF,TIME,1318318854,GT,c,c,UN,0,c,IF,IF,+,+,8,* \ |
||||
AREA:cdefa#157419FF:"Cogent" \ |
||||
GPRINT:cdefa:LAST:"Current\:%8.2lf%s" \ |
||||
GPRINT:cdefa:AVERAGE:"Average\:%8.2lf%s" \ |
||||
GPRINT:cdefa:MAX:"Maximum\:%8.2lf%s\n" \ |
||||
AREA:cdefe#00CF00FF:"Orion":STACK \ |
||||
GPRINT:cdefe:LAST:" Current\:%8.2lf%s" \ |
||||
GPRINT:cdefe:AVERAGE:"Average\:%8.2lf%s" \ |
||||
GPRINT:cdefe:MAX:"Maximum\:%8.2lf%s\n" \ |
||||
AREA:cdefi#EE5019FF:"Campus":STACK \ |
||||
GPRINT:cdefi:LAST:"Current\:%8.2lf%s" \ |
||||
GPRINT:cdefi:AVERAGE:"Average\:%8.2lf%s" \ |
||||
GPRINT:cdefi:MAX:"Maximum\:%8.2lf%s\n" \ |
||||
LINE1:cdefbc#000000FF:"Total" \ |
||||
GPRINT:cdefbc:LAST:" Current\:%8.2lf%s" \ |
||||
GPRINT:cdefbc:AVERAGE:"Average\:%8.2lf%s" \ |
||||
GPRINT:cdefbc:MAX:"Maximum\:%8.2lf%s\n" >/dev/null 2>/dev/null |
@ -1,38 +0,0 @@ |
||||
#!/bin/sh |
||||
/usr/bin/rrdtool graph /mirror/root/stats.png \ |
||||
--imgformat=PNG \ |
||||
--title='Mirror Traffic' \ |
||||
--base=1000 \ |
||||
--height=120 \ |
||||
--width=600 \ |
||||
--alt-autoscale-max \ |
||||
--lower-limit=0 \ |
||||
--vertical-label='bits per second' \ |
||||
--slope-mode \ |
||||
--font TITLE:10: \ |
||||
--font AXIS:8: \ |
||||
--font LEGEND:8: \ |
||||
--font UNIT:8: \ |
||||
DEF:a="/var/rrdtool/cogent.rrd":snmp_oid:AVERAGE \ |
||||
DEF:b="/var/rrdtool/orion.rrd":snmp_oid:AVERAGE \ |
||||
DEF:c="/var/rrdtool/campus.rrd":snmp_oid:AVERAGE \ |
||||
CDEF:cdefa=a,8,* \ |
||||
CDEF:cdefe=b,8,* \ |
||||
CDEF:cdefi=c,8,* \ |
||||
CDEF:cdefbc=TIME,1318318854,GT,a,a,UN,0,a,IF,IF,TIME,1318318854,GT,b,b,UN,0,b,IF,IF,TIME,1318318854,GT,c,c,UN,0,c,IF,IF,+,+,8,* \ |
||||
AREA:cdefa#157419FF:"Cogent" \ |
||||
GPRINT:cdefa:LAST:"Current\:%8.2lf%s" \ |
||||
GPRINT:cdefa:AVERAGE:"Average\:%8.2lf%s" \ |
||||
GPRINT:cdefa:MAX:"Maximum\:%8.2lf%s\n" \ |
||||
AREA:cdefe#00CF00FF:"Orion":STACK \ |
||||
GPRINT:cdefe:LAST:" Current\:%8.2lf%s" \ |
||||
GPRINT:cdefe:AVERAGE:"Average\:%8.2lf%s" \ |
||||
GPRINT:cdefe:MAX:"Maximum\:%8.2lf%s\n" \ |
||||
AREA:cdefi#EE5019FF:"Campus":STACK \ |
||||
GPRINT:cdefi:LAST:"Current\:%8.2lf%s" \ |
||||
GPRINT:cdefi:AVERAGE:"Average\:%8.2lf%s" \ |
||||
GPRINT:cdefi:MAX:"Maximum\:%8.2lf%s\n" \ |
||||
LINE1:cdefbc#000000FF:"Total" \ |
||||
GPRINT:cdefbc:LAST:" Current\:%8.2lf%s" \ |
||||
GPRINT:cdefbc:AVERAGE:"Average\:%8.2lf%s" \ |
||||
GPRINT:cdefbc:MAX:"Maximum\:%8.2lf%s\n" >/dev/null 2>/dev/null |
@ -1,3 +0,0 @@ |
||||
/csc-snmp-subagent |
||||
/mirror-stats |
||||
*.o |
@ -1,49 +0,0 @@ |
||||
# this file goes at /etc/csc/mibs/CSC-MIB.txt |
||||
# and make sure to copy snmp.conf |
||||
|
||||
CSC-MIB DEFINITIONS ::= BEGIN |
||||
|
||||
IMPORTS |
||||
MODULE-IDENTITY, OBJECT-TYPE, Counter32, Gauge32, Counter64, |
||||
Integer32, TimeTicks, mib-2, enterprises, |
||||
NOTIFICATION-TYPE FROM SNMPv2-SMI |
||||
TEXTUAL-CONVENTION, DisplayString, |
||||
PhysAddress, TruthValue, RowStatus, |
||||
TimeStamp, AutonomousType, TestAndIncr FROM SNMPv2-TC |
||||
MODULE-COMPLIANCE, OBJECT-GROUP, |
||||
NOTIFICATION-GROUP FROM SNMPv2-CONF |
||||
snmpTraps FROM SNMPv2-MIB |
||||
IANAifType FROM IANAifType-MIB; |
||||
|
||||
csclub OBJECT IDENTIFIER ::= { enterprises 27934 } |
||||
|
||||
cscMIB MODULE-IDENTITY |
||||
LAST-UPDATED "200905080000Z" |
||||
ORGANIZATION "University of Waterloo Computer Science Club" |
||||
CONTACT-INFO "systems-committee@csclub.uwaterloo.ca" |
||||
DESCRIPTION "Computer Science Club Local MIBs" |
||||
REVISION "200905080000Z" |
||||
DESCRIPTION "Initial revision" |
||||
::= { csclub 2 } |
||||
|
||||
mirror OBJECT IDENTIFIER ::= { cscMIB 2 } |
||||
|
||||
cogentBytes OBJECT-TYPE |
||||
SYNTAX Counter64 |
||||
MAX-ACCESS read-only |
||||
STATUS current |
||||
::= { mirror 1 } |
||||
|
||||
orionBytes OBJECT-TYPE |
||||
SYNTAX Counter64 |
||||
MAX-ACCESS read-only |
||||
STATUS current |
||||
::= { mirror 2 } |
||||
|
||||
campusBytes OBJECT-TYPE |
||||
SYNTAX Counter64 |
||||
MAX-ACCESS read-only |
||||
STATUS current |
||||
::= { mirror 3 } |
||||
|
||||
END |
@ -1,11 +0,0 @@ |
||||
LDFLAGS := -lnl $(shell net-snmp-config --base-agent-libs)
|
||||
CFLAGS := -g3 -O2 -Wall
|
||||
|
||||
all: mirror-stats csc-snmp-subagent |
||||
|
||||
mirror-stats: mirror-stats.o mirror-nl-glue.o |
||||
|
||||
csc-snmp-subagent: csc-snmp-subagent.o mirror-mib.o mirror-nl-glue.o |
||||
|
||||
clean: |
||||
rm -f *.o mirror-stats csc-snmp-subagent
|
@ -1,221 +0,0 @@ |
||||
/* generated from net-snmp-config */ |
||||
#include <net-snmp/net-snmp-config.h> |
||||
#ifdef HAVE_SIGNAL |
||||
#include <signal.h> |
||||
#endif /* HAVE_SIGNAL */ |
||||
#include <net-snmp/net-snmp-includes.h> |
||||
#include <net-snmp/agent/net-snmp-agent-includes.h> |
||||
#include "mirror-mib.h" |
||||
const char *app_name = "cscMIB"; |
||||
|
||||
extern int netsnmp_running; |
||||
|
||||
#ifdef __GNUC__ |
||||
#define UNUSED __attribute__((unused)) |
||||
#else |
||||
#define UNUSED |
||||
#endif |
||||
|
||||
RETSIGTYPE |
||||
stop_server(UNUSED int a) { |
||||
netsnmp_running = 0; |
||||
} |
||||
|
||||
static void |
||||
usage(const char *prog) |
||||
{ |
||||
fprintf(stderr, |
||||
"USAGE: %s [OPTIONS]\n" |
||||
"\n" |
||||
"OPTIONS:\n", prog); |
||||
|
||||
fprintf(stderr, |
||||
" -d\t\t\tdump all traffic\n" |
||||
" -D TOKEN[,...]\tturn on debugging output for the specified " |
||||
"TOKENs\n" |
||||
"\t\t\t (ALL gives extremely verbose debugging output)\n" |
||||
" -f\t\t\tDo not fork() from the calling shell.\n" |
||||
" -h\t\t\tdisplay this help message\n" |
||||
" -H\t\t\tdisplay a list of configuration file directives\n" |
||||
" -L LOGOPTS\t\tToggle various defaults controlling logging:\n"); |
||||
snmp_log_options_usage("\t\t\t ", stderr); |
||||
#ifndef DISABLE_MIB_LOADING |
||||
fprintf(stderr, |
||||
" -m MIB[:...]\t\tload given list of MIBs (ALL loads " |
||||
"everything)\n" |
||||
" -M DIR[:...]\t\tlook in given list of directories for MIBs\n"); |
||||
#endif /* DISABLE_MIB_LOADING */ |
||||
#ifndef DISABLE_MIB_LOADING |
||||
fprintf(stderr, |
||||
" -P MIBOPTS\t\tToggle various defaults controlling mib " |
||||
"parsing:\n"); |
||||
snmp_mib_toggle_options_usage("\t\t\t ", stderr); |
||||
#endif /* DISABLE_MIB_LOADING */ |
||||
fprintf(stderr, |
||||
" -v\t\t\tdisplay package version number\n" |
||||
" -x TRANSPORT\tconnect to master agent using TRANSPORT\n"); |
||||
exit(1); |
||||
} |
||||
|
||||
static void |
||||
version(void) |
||||
{ |
||||
fprintf(stderr, "NET-SNMP version: %s\n", netsnmp_get_version()); |
||||
exit(0); |
||||
} |
||||
|
||||
int |
||||
main (int argc, char **argv) |
||||
{ |
||||
int arg; |
||||
char* cp = NULL; |
||||
int dont_fork = 0, do_help = 0; |
||||
|
||||
while ((arg = getopt(argc, argv, "dD:fhHL:" |
||||
#ifndef DISABLE_MIB_LOADING |
||||
"m:M:" |
||||
#endif /* DISABLE_MIB_LOADING */ |
||||
"n:" |
||||
#ifndef DISABLE_MIB_LOADING |
||||
"P:" |
||||
#endif /* DISABLE_MIB_LOADING */ |
||||
"vx:")) != EOF) { |
||||
switch (arg) { |
||||
case 'd': |
||||
netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, |
||||
NETSNMP_DS_LIB_DUMP_PACKET, 1); |
||||
break; |
||||
|
||||
case 'D': |
||||
debug_register_tokens(optarg); |
||||
snmp_set_do_debugging(1); |
||||
break; |
||||
|
||||
case 'f': |
||||
dont_fork = 1; |
||||
break; |
||||
|
||||
case 'h': |
||||
usage(argv[0]); |
||||
break; |
||||
|
||||
case 'H': |
||||
do_help = 1; |
||||
break; |
||||
|
||||
case 'L': |
||||
if (snmp_log_options(optarg, argc, argv) < 0) { |
||||
exit(1); |
||||
} |
||||
break; |
||||
|
||||
#ifndef DISABLE_MIB_LOADING |
||||
case 'm': |
||||
if (optarg != NULL) { |
||||
setenv("MIBS", optarg, 1); |
||||
} else { |
||||
usage(argv[0]); |
||||
} |
||||
break; |
||||
|
||||
case 'M': |
||||
if (optarg != NULL) { |
||||
setenv("MIBDIRS", optarg, 1); |
||||
} else { |
||||
usage(argv[0]); |
||||
} |
||||
break; |
||||
#endif /* DISABLE_MIB_LOADING */ |
||||
|
||||
case 'n': |
||||
if (optarg != NULL) { |
||||
app_name = optarg; |
||||
netsnmp_ds_set_string(NETSNMP_DS_LIBRARY_ID, |
||||
NETSNMP_DS_LIB_APPTYPE, app_name); |
||||
} else { |
||||
usage(argv[0]); |
||||
} |
||||
break; |
||||
|
||||
#ifndef DISABLE_MIB_LOADING |
||||
case 'P': |
||||
cp = snmp_mib_toggle_options(optarg); |
||||
if (cp != NULL) { |
||||
fprintf(stderr, "Unknown parser option to -P: %c.\n", *cp); |
||||
usage(argv[0]); |
||||
} |
||||
break; |
||||
#endif /* DISABLE_MIB_LOADING */ |
||||
|
||||
case 'v': |
||||
version(); |
||||
break; |
||||
|
||||
case 'x': |
||||
if (optarg != NULL) { |
||||
netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID, |
||||
NETSNMP_DS_AGENT_X_SOCKET, optarg); |
||||
} else { |
||||
usage(argv[0]); |
||||
} |
||||
break; |
||||
|
||||
default: |
||||
fprintf(stderr, "invalid option: -%c\n", arg); |
||||
usage(argv[0]); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
if (do_help) { |
||||
netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, |
||||
NETSNMP_DS_AGENT_NO_ROOT_ACCESS, 1); |
||||
} else { |
||||
/* we are a subagent */ |
||||
netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, |
||||
NETSNMP_DS_AGENT_ROLE, 1); |
||||
|
||||
if (!dont_fork) { |
||||
if (netsnmp_daemonize(1, snmp_stderrlog_status()) != 0) |
||||
exit(1); |
||||
} |
||||
|
||||
/* initialize tcpip, if necessary */ |
||||
SOCK_STARTUP; |
||||
} |
||||
|
||||
/* initialize the agent library */ |
||||
init_agent(app_name); |
||||
|
||||
/* initialize your mib code here */ |
||||
init_mirror_mib(); |
||||
|
||||
/* cscMIB will be used to read cscMIB.conf files. */ |
||||
init_snmp("cscMIB"); |
||||
|
||||
if (do_help) { |
||||
fprintf(stderr, "Configuration directives understood:\n"); |
||||
read_config_print_usage(" "); |
||||
exit(0); |
||||
} |
||||
|
||||
/* In case we received a request to stop (kill -TERM or kill -INT) */ |
||||
netsnmp_running = 1; |
||||
#ifdef SIGTERM |
||||
signal(SIGTERM, stop_server); |
||||
#endif |
||||
#ifdef SIGINT |
||||
signal(SIGINT, stop_server); |
||||
#endif |
||||
|
||||
/* main loop here... */ |
||||
while(netsnmp_running) { |
||||
agent_check_and_process(1); |
||||
} |
||||
|
||||
/* at shutdown time */ |
||||
snmp_shutdown(app_name); |
||||
SOCK_CLEANUP; |
||||
exit(0); |
||||
} |
||||
|
@ -1,109 +0,0 @@ |
||||
/*
|
||||
* Note: this file originally auto-generated by mib2c using |
||||
* : mib2c.scalar.conf 11805 2005-01-07 09:37:18Z dts12 $ |
||||
*/ |
||||
|
||||
#include <net-snmp/net-snmp-config.h> |
||||
#include <net-snmp/net-snmp-includes.h> |
||||
#include <net-snmp/agent/net-snmp-agent-includes.h> |
||||
#include "mirror-mib.h" |
||||
#include "mirror-nl-glue.h" |
||||
|
||||
void |
||||
init_mirror_mib(void) |
||||
{ |
||||
static oid cogentBytes_oid[] = |
||||
{ 1, 3, 6, 1, 4, 1, 27934, 2, 2, 1 }; |
||||
static oid orionBytes_oid[] = |
||||
{ 1, 3, 6, 1, 4, 1, 27934, 2, 2, 2 }; |
||||
static oid campusBytes_oid[] = |
||||
{ 1, 3, 6, 1, 4, 1, 27934, 2, 2, 3 }; |
||||
|
||||
DEBUGMSGTL(("mirror_mib", "Initializing\n")); |
||||
|
||||
mirror_stats_initialize(); |
||||
|
||||
netsnmp_register_scalar(netsnmp_create_handler_registration |
||||
("cogentBytes", handle_cogentBytes, |
||||
cogentBytes_oid, OID_LENGTH(cogentBytes_oid), |
||||
HANDLER_CAN_RONLY)); |
||||
netsnmp_register_scalar(netsnmp_create_handler_registration |
||||
("orionBytes", handle_orionBytes, |
||||
orionBytes_oid, OID_LENGTH(orionBytes_oid), |
||||
HANDLER_CAN_RONLY)); |
||||
netsnmp_register_scalar(netsnmp_create_handler_registration |
||||
("campusBytes", handle_campusBytes, |
||||
campusBytes_oid, OID_LENGTH(campusBytes_oid), |
||||
HANDLER_CAN_RONLY)); |
||||
} |
||||
|
||||
void explode_counter64(uint64_t num, struct counter64 *counter) { |
||||
counter->low = num & 0xFFFFFFFF; |
||||
counter->high = (num >> 32) & 0xFFFFFFFF; |
||||
} |
||||
|
||||
int |
||||
handle_cogentBytes(netsnmp_mib_handler *handler, |
||||
netsnmp_handler_registration *reginfo, |
||||
netsnmp_agent_request_info *reqinfo, |
||||
netsnmp_request_info *requests) |
||||
{ |
||||
struct counter64 counter; |
||||
mirror_stats_refresh(); |
||||
explode_counter64(get_class_byte_count(&cogent_class), &counter); |
||||
|
||||
switch (reqinfo->mode) { |
||||
case MODE_GET: |
||||
snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER64, |
||||
(u_char *)&counter, sizeof(counter)); |
||||
break; |
||||
default: |
||||
die("unknown mode"); |
||||
} |
||||
|
||||
return SNMP_ERR_NOERROR; |
||||
} |
||||
|
||||
int |
||||
handle_orionBytes(netsnmp_mib_handler *handler, |
||||
netsnmp_handler_registration *reginfo, |
||||
netsnmp_agent_request_info *reqinfo, |
||||
netsnmp_request_info *requests) |
||||
{ |
||||
struct counter64 counter; |
||||
mirror_stats_refresh(); |
||||
explode_counter64(get_class_byte_count(&orion_class), &counter); |
||||
|
||||
switch (reqinfo->mode) { |
||||
case MODE_GET: |
||||
snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER64, |
||||
(u_char *)&counter, sizeof(counter)); |
||||
break; |
||||
default: |
||||
die("unknown mode"); |
||||
} |
||||
|
||||
return SNMP_ERR_NOERROR; |
||||
} |
||||
|
||||
int |
||||
handle_campusBytes(netsnmp_mib_handler *handler, |
||||
netsnmp_handler_registration *reginfo, |
||||
netsnmp_agent_request_info *reqinfo, |
||||
netsnmp_request_info *requests) |
||||
{ |
||||
struct counter64 counter; |
||||
mirror_stats_refresh(); |
||||
explode_counter64(get_class_byte_count(&campus_class), &counter); |
||||
|
||||
switch (reqinfo->mode) { |
||||
case MODE_GET: |
||||
snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER64, |
||||
(u_char *)&counter, sizeof(counter)); |
||||
break; |
||||
default: |
||||
die("unknown mode"); |
||||
} |
||||
|
||||
return SNMP_ERR_NOERROR; |
||||
} |
@ -1,9 +0,0 @@ |
||||
#ifndef MIRRORMIB_H |
||||
#define MIRRORMIB_H |
||||
|
||||
void init_mirror_mib(void); |
||||
Netsnmp_Node_Handler handle_cogentBytes; |
||||
Netsnmp_Node_Handler handle_orionBytes; |
||||
Netsnmp_Node_Handler handle_campusBytes; |
||||
|
||||
#endif |
@ -1,102 +0,0 @@ |
||||
#include <unistd.h> |
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
#include <inttypes.h> |
||||
#include <libgen.h> |
||||
#include <netlink/route/class.h> |
||||
#include <netlink/route/link.h> |
||||
#include <netlink/cache-api.h> |
||||
#include <netlink/object.h> |
||||
#include "mirror-nl-glue.h" |
||||
|
||||
static struct nl_cache *link_cache, *class_cache; |
||||
static struct rtnl_link *eth; |
||||
static int ifindex; |
||||
|
||||
struct class_info cogent_class = { "cogent", "01:02", }; |
||||
struct class_info orion_class = { "orion", "01:03", }; |
||||
struct class_info campus_class = { "campus", "01:04", }; |
||||
|
||||
static struct nl_handle *nl_handle; |
||||
|
||||
void die(const char *message) { |
||||
fprintf(stderr, "fatal: %s\n", message); |
||||
exit(1); |
||||
} |
||||
|
||||
static void match_obj(struct nl_object *obj, void *arg) { |
||||
struct nl_object *needle = *(struct nl_object **)arg; |
||||
struct nl_object **ret = (struct nl_object **)arg + 1; |
||||
|
||||
if (!*ret && nl_object_identical(obj, needle)) { |
||||
nl_object_get(obj); |
||||
*ret = obj; |
||||
} |
||||
} |
||||
|
||||
static struct rtnl_class *get_class_by_id(char *id, int ifindex) { |
||||
uint32_t handle; |
||||
struct rtnl_class *needle; |
||||
struct nl_object *magic[2]; |
||||
|
||||
if (rtnl_tc_str2handle(id, &handle)) |
||||
die("invalid id"); |
||||
|
||||
needle = rtnl_class_alloc(); |
||||
rtnl_class_set_ifindex(needle, ifindex); |
||||
rtnl_class_set_handle(needle, handle); |
||||
|
||||
magic[0] = (struct nl_object *)needle; |
||||
magic[1] = (struct nl_object *)NULL; |
||||
|
||||
nl_cache_foreach(class_cache, match_obj, magic); |
||||
|
||||
rtnl_class_put(needle); |
||||
return (struct rtnl_class *)magic[1]; |
||||
} |
||||
|
||||
uint64_t get_class_byte_count(struct class_info *info) { |
||||
struct rtnl_class *class = get_class_by_id(info->id, ifindex); |
||||
uint64_t bytes; |
||||
if (!class) |
||||
die("class not found"); |
||||
bytes = rtnl_class_get_stat(class, RTNL_TC_BYTES); |
||||
rtnl_class_put(class); |
||||
return bytes; |
||||
} |
||||
|
||||
void mirror_stats_refresh(void) { |
||||
nl_cache_refill(nl_handle, class_cache); |
||||
} |
||||
|
||||
void mirror_stats_initialize(void) { |
||||
nl_handle = nl_handle_alloc(); |
||||
if (!nl_handle) |
||||
die("unable to allocate handle"); |
||||
|
||||
if (nl_connect(nl_handle, NETLINK_ROUTE) < 0) |
||||
die("unable to connect to netlink"); |
||||
|
||||
link_cache = rtnl_link_alloc_cache(nl_handle); |
||||
if (!link_cache) |
||||
die("unable to allocate link cache"); |
||||
|
||||
eth = rtnl_link_get_by_name(link_cache, "eth0"); |
||||
if (!eth) |
||||
die("unable to acquire eth0"); |
||||
ifindex = rtnl_link_get_ifindex(eth); |
||||
|
||||
class_cache = rtnl_class_alloc_cache(nl_handle, ifindex); |
||||
if (!class_cache) |
||||
die("unable to allocate class cache"); |
||||
} |
||||
|
||||
void mirror_stats_cleanup(void) { |
||||
rtnl_link_put(eth); |
||||
nl_cache_free(class_cache); |
||||
nl_cache_free(link_cache); |
||||
nl_close(nl_handle); |
||||
nl_handle_destroy(nl_handle); |
||||
} |
||||
|
@ -1,25 +0,0 @@ |
||||
#include <unistd.h> |
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
#include <inttypes.h> |
||||
#include <libgen.h> |
||||
#include <netlink/route/class.h> |
||||
#include <netlink/route/link.h> |
||||
#include <netlink/cache-api.h> |
||||
#include <netlink/object.h> |
||||
|
||||
struct class_info { |
||||
char *name; |
||||
char *id; |
||||
}; |
||||
|
||||
extern struct class_info cogent_class; |
||||
extern struct class_info orion_class; |
||||
extern struct class_info campus_class; |
||||
|
||||
void mirror_stats_refresh(void); |
||||
void mirror_stats_initialize(void); |
||||
void mirror_stats_cleanup(void); |
||||
void die(const char *); |
||||
uint64_t get_class_byte_count(struct class_info *); |
@ -1,12 +0,0 @@ |
||||
#include "mirror-nl-glue.h" |
||||
|
||||
int main(int argc, char *argv[]) { |
||||
mirror_stats_initialize(); |
||||
for (;;) { |
||||
printf("%s %"PRIu64"\n", cogent_class.id, get_class_byte_count(&cogent_class)); |
||||
printf("%s %"PRIu64"\n", orion_class.id, get_class_byte_count(&orion_class)); |
||||
printf("%s %"PRIu64"\n", campus_class.id, get_class_byte_count(&campus_class)); |
||||
sleep(1); |
||||
mirror_stats_refresh(); |
||||
} |
||||
} |
@ -1 +0,0 @@ |
||||
snmpwalk -v2c -cpublic mirror 1.3.6.1.4.1.27934.2.2 |
@ -1,2 +0,0 @@ |
||||
mibdirs /etc/csc/mibs:/usr/share/snmp/mibs |
||||
mibs ALL |
@ -1,56 +0,0 @@ |
||||
#!/bin/sh |
||||
|
||||
. /lib/lsb/init-functions |
||||
|
||||
PATH=$PATH:/bin:/usr/bin:/sbin:/usr/sbin |
||||
NAME=rtorrent |
||||
PIDFILE=/var/run/$NAME.screen |
||||
CHUSER=$NAME |
||||
DAEMON=/usr/bin/rtorrent |
||||
DAEMON_ARGS="-n -o try_import=/etc/rtorrent.rc" |
||||
|
||||