GitHub + Rebasing from upstream/master to origin/master

So, every now and then on a PR I need to rebase and fix things so I can retest etc. – I always forget this so blogging it to remember.


I have a diff on origin/master on my forked repo and I need a rebase from upstream/master (where I forked from).

Github recommends merging (, this is not always the best way. I do the following:

  1. git remote add upstream
  2. git fetch upstream master
  3. git rebase upstream/master (no space here ‘/’ instead)

I hope this saves you some time as I continually waste time here.

IPv6 Tacacs+ Support (tac_plus)

Recently @ Facebook we found that we required IPv6 access to TACACS for auth (AAA) for the majority of our production Network Equipment. Tacacs+ (tac_plus) is an old daemon released by Cisco in the late 90s. It still works (even at our scale) and the config was doing what we required, so it was decided that we should add IPv6 Support to it to move forwards until we no longer require TACACS for authentication, authorization and accounting.

IPv6 has been added in true dirty 90s C code style via pre-processor macros. The source is publicly available via a GitHub Repository.

This version is based off F4.0.4.19 with the following patches (full history can be seen in the Git Repository):

  • Logging modifications
  • PAM Support
  • MD5 support
  • IPv6 (AF_INET6) Socket Listening has most of the information you require to build the software and I have included RPM .spec files (that have been tested on CentOS 6). The specs generate two RPMS with tacacs+6 relying on the tacacs+ rpm to be installed for libraries and man pages.

RPMS Build on CentOS 6.5 x86_64 + SRC rpms avaliable here:

Usage Tips:

  • Do not add listen directives into tac_plus.conf so that each daemon can load the same conf file (for consistency)
  • Logging:
    • /var/log/tac_plus.acct and tac_plus6.acct are where accounting information will go (as well as syslog) Logrotate time …
    • /var/log/tac_plus.log and tac_plus6.log is where default debug logs will go
  • Configure syslog to send the LOG_LOCAL3 somewhere useful (this will get both tac_plus and tac_plus6 log information)
  • Pid Files will live in /var/run/ and
  • The RPM does not /sbin/chkconfig –add or enable, so be sure to enable the version of tac_plus you require.

Tested Support on Vendor Hardware

  • Arista EoS (4.13.3F): need to use ‘ipv6 host name ::1’ as TACACS conf can’t handle raw IPv6 addresses (lame) 
  • Cisco NXOS (6.0(2)U2(4) [build 6.0(2)U2(3.6)]):
    feature tacacs+
    tacacs-server key 7 “c00p3rIstheMan”
    tacacs-server host a:cafe::1
    tacacs-server host b:b00c::2
    aaa group server tacacs+ TACACS
    server a:cafe::1
    server b:b00c::2
    source-interface Vlan2001 (ensure what IP request will come from)
  • Juniper: >= Junos 13.3R2.7 required for IPv6 Tacacs (Tested on MX)

I know it’s old school code but please feel free to submit bug patches / enhancements. This should allow us to keep this beast running until we can deprecate it’s need …

VMWare Guest Consoles over a WAN with Latency

Have you ever used the VMWare console over a WAN with latency and it enters multiple key strokes into the console and makes using the console super annoying! It makes me HATE VMWare and want to smash it into 10000 pieces with a baseball bat.

Well the answer is to add a line to your VMs VMX file to allow it to be ‘laggier’. For example the following will give you 2 second between key strokes:

  • keyboard.typematicMinDelay = “2000000”

For more information:

IPERF CSV Data Summary Script

Recently I was required to do a network performance test between a Head Office and a WAN site. I knocked up this quick python script to parse the data collect to see the results. Thought it could be handy for others so here it is to download / share.

Download Script

Sample Output:

cooper@dfbit:~/scripts/iperf-parse$ ./
— IPERF CSV Summariser —
— Cooper Lees < —
– 20111212103043 to 20120103090052
– 1004 runs of IPERF
– Averages:
– Average Sent = 2.64M
– Average Received = 2.28M
– Average Send Bandwidth = 985.75K
– Average Receive Bandwidth = 805.12K
– Max Send Bandwidth = 1.08M (at 20111230183021)
– Max Receive Bandwidth = 837.16K (at 20120102113052)



# date,sender-ip,sender-port,receiver-ip,receiver-port,id,interval,transfer,bandwidth
# 20111212103043,,45020,,5001,5,0.0-21.4,2490368,931080
# 20111212103109,,5001,,57022,4,0.0-24.2,2228224,736145

FILENAME = ‘client-iperf.log’

RUNS = 1




def convert_bytes(bytes):
bytes = float(bytes)
if bytes >= 1099511627776:
terabytes = bytes / 1099511627776
size = ‘%.2fT’ % terabytes
elif bytes >= 1073741824:
gigabytes = bytes / 1073741824
size = ‘%.2fG’ % gigabytes
elif bytes >= 1048576:
megabytes = bytes / 1048576
size = ‘%.2fM’ % megabytes
elif bytes >= 1024:
kilobytes = bytes / 1024
size = ‘%.2fK’ % kilobytes
size = ‘%.2fb’ % bytes
return size

f = open(FILENAME)
l1 = f.readline().strip().split(‘,’)
l2 = f.readline().strip().split(‘,’)
while l2 and l2[0] != ”:
if RUNS == 1:
START = l1[0]

BW_SENT = int(l1[8])
BW_RECEIVED = int(l2[8])

TOTAL_SENT = TOTAL_SENT + int(l1[7])




END = l2[0]
l1 = f.readline().strip().split(‘,’)
l2 = f.readline().strip().split(‘,’)


print "————————————"
print " — IPERF CSV Summariser — "
print "– Cooper Lees < –"
print "————————————"
print "– SUMMARY –"
print "- %s to %s" % ( START, END )
print "- %d runs of IPERF" % RUNS
print "- Averages:"
print "-tAverage Sentttt= %s" % convert_bytes((TOTAL_SENT / RUNS))
print "-tAverage Receivedtt= %s" % convert_bytes((TOTAL_RECEIVED / RUNS))
print "-tAverage Send Bandwidthtt= %s" % convert_bytes((TOTAL_BANDWIDTH_SENT / RUNS))
print "-tAverage Receive Bandwidtht= %s" % convert_bytes((TOTAL_BANDWIDTH_RECEIVED / RUNS))
print "-tMax Send Bandwidthtt= %s (at %s)" % (convert_bytes((MAX_BANDWIDTH_SENT)), MAX_BANDWIDTH_SENT_DATE)
print "-tMax Receive Bandwidthtt= %s (at %s)" % (convert_bytes((MAX_BANDWIDTH_RECEIVED)), MAX_BANDWIDTH_RECEIVED_DATE)
print "————————————"

Cron Job Script to Collect Data:



echo "–> Starting iperf client @ $(date) …" | tee -a $LOG

if [ "$1" == "-v" ]; then
iperf -t $TIME -c $SERVER -r -y C | tee -a $LOG
iperf -t $TIME -c $SERVER -r -y C >> $LOG

echo "–> Finished iperf client @ $(date)" | tee -a $LOG

Mac OS X 10.7 Lion + ATEN UC232A USB to Serial Adapter

32- and 64-bit PL2303 drivers for OS X 10.6 are available here.

You’ll need to modify, as root, the ‘/System/Library/Extensions/ProlificUsbSerial.kext/Contents/Info.plist ‘ file after installing the driver to suit the USB manufacturer and device ID. For the ATEN UC232A, examples below appear to work for it (for me in 10.7).

To obtain the IDs, Wayne Roberts (who informed my via the SAGE-AU mailing lists), used ‘USB’ which comes with the developer tools/XCode.

Modify the current lines of the XML:

# <key> can be the Hex values as ‘Vendor’_’Product’, Wayne thinks this is more cosmetic however.


# <idProduct> and <idVendor> should be the decimal of the respective values, as per USB

Once you’ve done this, either restart the machine or run ‘kextunload’ and ‘kextload’ on ProlificUsbSerial.kext and it should show up as /dev/tty.usbserial.

** If you have installed the UC232A Drivers, either rm or mv the ‘UC-232AC.kext’ before the reboot to avoid conflicts **

GPU Upgrade – 9800gt to 280gtx

So I have parted my cheeks and bought a new Nvidia GTX 280gtx for my Hackintosh / Win7 i7 920 6gb of memory desktop machine. It also caused me to buy a new Coomaster 650W PSU to power the power hungry fella and Zalman 10x Quiet CPU Cooler. Dam it’s a nice GPU, despite it requiring 40 amps on the 12v rail !

So I did some benchmarking …

Nvidia 9800gt 3d Mark Score
Nvidia 9800gt 3d Mark Score
Nvidia 280tgtx 3d Mark Score
Nvidia 280tgtx 3d Mark Score

So we can see a small increase there, especially on the raw GPU score … 🙂

And apparently my Windows experience is now better !

Windows with a 9800gt
Windows with a 9800gt
Windows with a 280gtx
Windows with a 280gtx

So, time for me to get Steam again and come back to some online gaming … Let me know what I should be playing 🙂