Here’s a collection of scripts that I’ve created and use in my capacity as a Systems Engineer. Hopefully, they may be useful to someone else out there.
Render simulator A shell script to simulate renders
genip Python script to generate zones and ips on a windows DNS server
- Render simulator This is a shell script used to simulate renders. It’s great for testing schedular performance. It has options for adjusting memory, running local disk i/o, and can stagger the start and stop time. If you want it to also stress the cpu, uncomment the md5sum.
#!/bin/sh
# source function library
. /etc/rc.d/init.d/functions
proc="memtester"
THREADS=1
MEMTOTAL=`free | grep "^Mem" | awk '{print $2}'`
MEM=1920
SEC=600
BONNIE=0
RETVAL=0
RAN=0
TFRAME=20
do_usage()
{
echo "usage $0: -t [threads] -m [memory] -s [seconds] -r [seconds] -b"
echo -e "\t-t: [optional] set number of processes to run (default 1) "
echo -e "\t-m: [optional] set memory per thread (default 1920)"
echo -e "\t-b: [optional] run bonnie on localdisk"
echo -e "\t-r: [optional] randomize finish time by number of seconds"
}
set_sleep() {
echo $[ ( $RANDOM % $DIE_SIDES ) + 1 ]
}
while [ $# -gt 0 ]
do
case $1
in
-t)
THREADS=$2
shift 2
;;
-m)
MEM=$2
shift 2
;;
-s)
SEC=$2
shift 2
;;
-b)
BONNIE=1
shift
;;
-h)
do_usage
exit 1
;;
-r)
RAN=1
TFRAME=$2
shift 2
;;
esac
done
echo "$THREADS memtesters using $MEM per test"
for ((i=1;i<=$THREADS;i+=1)); do
#md5sum < /dev/urandom &
PID_NAME="sanity-$$-${i}"
PID_FILE="/var/run/${PID_NAME}.pid"
memtester $MEM 100 >/dev/null &
echo "$!" > $PID_FILE
done
if [ $BONNIE -eq 1 ]; then
echo "running bonnie"
PID_NAME="sanity-$$-bonnie"
PID_FILE="/var/run/${PID_NAME}.pid"
if [ -e /tmp/foo ]; then
/usr/sbin/bonnie++ -d /tmp/foo -u nobody:nobody -x 1000 >/dev/null &
echo "$!" > $PID_FILE
else
mkdir /tmp/foo
chmod 777 /tmp/foo
/usr/sbin/bonnie++ -d /tmp/foo -u nobody:nobody -x 1000 >/dev/null &
echo "$!" > $PID_FILE
fi
fi
cat /var/run/sanity-$$-*
if [ $RAN -eq 1 ]; then
MYTIME=`expr \( $RANDOM % $TFRAME \) + 1`
SIGN=`expr \( $RANDOM % 2 \)`
if [ $SIGN -eq 1 ]; then
SEC=`expr $SEC - $MYTIME`
else
SEC=`expr $SEC + $MYTIME`
fi
echo "Random time $SEC"
fi
sleep $SEC
for PID in `cat /var/run/sanity-$$-*`;
do
echo "killing $PID"
kill $PID
done
rm -rf /var/run/sanity-$$-*
exit 0
- genip is a python script I used to generate series of IPs and zones on a windows dns server. This is mainly used when adding new racks of render blades.
#!/usr/bin/env python
import os
import sys
import getopt
import array
import re
def usage():
print("usage: genip -b [blade name] -n [nest name] -c [number of blades{16|32}] -d -l [blade start num] -s [gateway/type] -i -t\n\n")
print("example: genip -b imd-render -n 141 -c 16 -s 10.216.35.0/26\n")
print("\t-d is optional, define nodes as doublewide which require A/B syntax")
print("\t-l is optional, defaults to 1")
print("\t-i is optional, if set, add a -c to the end of the name")
print("\t-t is optional, test mode, show commands which would be run without running them")
def parseargs():
global bladestart
bladestart = 1
global bladeletter
# 0 is off, 1 is on
bladeletter = 0
global test
test = 0
global doublewide
doublewide = 0
global ilo
ilo = 0
try:
opts, args = getopt.getopt(sys.argv[1:], "h:b:n:c:s:l:tdi", ["help"])
except getopt.GetoptError:
usage()
sys.exit(2)
for opt, arg in opts:
if opt in ("-h", "--help"):
usage()
sys.exit()
elif opt == "-b":
global bladename
bladename = arg
elif opt == "-n":
global nestname
nestname = arg
elif opt == "-c":
global numblades
numblades = arg
elif opt == "-s":
global subnet
subnet = arg
elif opt == "-l":
bladestart = arg
bladestart = int(bladestart)
elif opt == "-t":
test = 1
elif opt == "-i":
ilo = 1
elif opt == "-d":
doublewide = 1
try:
bladename
nestname
numblades
subnet
except:
print "\nsome options were not set"
print "bladename %s"%bladename
print "nestname %s"%nestname
print "numblades %s"%numblades
print "subnet %s\n"%subnet
usage()
sys.exit()
if int(numblades) != 16:
if int(numblades) != 32:
print "\nnumber of blades %s is not 16 or 32\n"%numblades
usage()
sys.exit()
if int(numblades) == 32:
bladeletter = 1
elif doublewide == 1:
bladeletter = 1
def parsesubnet():
subparts = []
subparts = subnet.split("/")
global subbase
subbase = subparts[0]
global subtype
subtype = subparts[1]
subocts = subbase.split(".")
global sub
sub = subocts[0] + "." + subocts[1] + "." + subocts[2]
global subreverse
subreverse = subocts[2] + "." + subocts[1] + "." + subocts[0]
global substart
substart = int(subocts[3]) + 1
global numips
if subtype == '30':
numips = 4
elif subtype == '29':
numips = 8
elif subtype == '28':
numips = 16
elif subtype == '27':
numips = 32
elif subtype == '26':
numips = 64
elif subtype == '25':
numips = 128
elif subtype == '24':
numips = 256
else:
print "subtype of %s not understood or in range" %subtype
print "supported subtypes are 24-30"
usage()
sys.exit()
#print "subbase %s subtype %s substart %d numips %d" % (subbase, subtype, substart, numips)
subgate = int(subocts[3]) + 1
def zonetest():
command = "dnscmd /zoneinfo " + subreverse + ".in-addr.arpa"
if re.search('failed', os.popen(command, 'r').readline() ):
print "======== %s zone does not exist, creating =======" %subreverse
command = "dnscmd /ZoneAdd " + subreverse + ".in-addr.arpa /dsprimary"
if test == 1:
print command
else:
os.popen(command, 'r')
else:
print "%s zone already created" %subreverse
def dnshost(bladename, nestname, bladenum, letter, sub, ip):
if ilo == 1:
commande = "dnscmd /enumrecords imagemoversdigital.com %s%s%02d%s-c"%(bladename, nestname, bladenum, letter)
else:
commande = "dnscmd /enumrecords imagemoversdigital.com %s%s%02d%s"%(bladename, nestname, bladenum, letter)
#print commande
if re.search('failed', os.popen(commande, 'r').readline() ):
adddnshost(bladename, nestname, bladenum, letter, sub, ip)
else:
if ilo == 1:
commandee = "dnscmd /enumrecords imagemoversdigital.com %s%s%02d%s-c"%(bladename, nestname, bladenum, letter)
else:
commandee = "dnscmd /enumrecords imagemoversdigital.com %s%s%02d%s"%(bladename, nestname, bladenum, letter)
#print commandee
commandreturn = os.popen(commandee, 'r').readlines()
ipinfo = commandreturn[1].split()
#sometimes, /enumrecords will return sucessfull even though there is no IP
if ipinfo[0] == "Command":
print "!!! Warning %s%s%02d%s exist but no ip is associated with it, trying anyway" %(bladename, nestname, bladenum, letter)
adddnshost(bladename, nestname, bladenum, letter, sub, ip)
else:
curip = ipinfo[3]
deletednshost(bladename, nestname, bladenum, letter, curip)
adddnshost(bladename, nestname, bladenum, letter, sub, ip)
def adddnshost(bladename, nestname, bladenum, letter, sub, ip):
if ilo == 1:
commanda = "dnscmd /recordadd imagemoversdigital.com %s%s%02d%s-c A %s.%s"%(bladename, nestname, bladenum, letter ,sub ,ip)
commandp = "dnscmd /recordadd %s.in-addr.arpa. %s PTR %s%s%02d%s-c.imagemoversdigital.com"%(subreverse, ip, bladename, nestname, bladenum, letter)
else:
commanda = "dnscmd /recordadd imagemoversdigital.com %s%s%02d%s A %s.%s"%(bladename, nestname, bladenum, letter ,sub ,ip)
commandp = "dnscmd /recordadd %s.in-addr.arpa. %s PTR %s%s%02d%s.imagemoversdigital.com"%(subreverse, ip, bladename, nestname, bladenum, letter)
if test == 1:
print commanda
print commandp
else:
os.popen(commanda, 'r')
os.popen(commandp, 'r')
def deletednshost(bladename, nestname, bladenum, letter, curip):
if ilo == 1:
print "\t**** removing old ip %s for %s%s%02d%s-c ****"%(curip, bladename, nestname, bladenum, letter)
commandd = "dnscmd /recorddelete imagemoversdigital.com %s%s%02d%s-c A %s /f"%(bladename, nestname, bladenum, letter, curip)
else:
print "\t**** removing old ip %s for %s%s%02d%s ****"%(curip, bladename, nestname, bladenum, letter)
commandd = "dnscmd /recorddelete imagemoversdigital.com %s%s%02d%s A %s /f"%(bladename, nestname, bladenum, letter, curip)
if test == 1:
print commandd
else:
os.popen(commandd, 'r')
def genip():
parseargs()
parsesubnet()
#print "bladename %s nestname %s numblades %s subnet %s substart %d numips %d" %(bladename, nestname, numblades, sub, substart, numips)
intblades = int(numblades)
numend = substart + intblades
if intblades > numips:
print "you asked to create %s dns entries with a /%s network which only has %d ips available,\nplease check your logic"%(numblades, subtype, numips)
sys.exit()
elif numend > 254:
print "you asked to create %s starting at an ip of %d which is greater then 254 ips,\nplease rerun limited to a class c network"%(numblades, substart)
sys.exit()
zonetest()
print "========== nest %s =========="%nestname
if bladeletter == 1:
letter = "A"
# if a double wide blade, then hold on cycle num for 2 loops
else:
letter = ""
cyclenum = 0
bladenum = bladestart
for ip in range(substart, numend):
print "==== adding %s%s%02d%s %s.%s to dns ===="%(bladename, nestname, bladenum, letter, sub, ip)
dnshost(bladename, nestname, bladenum, letter, sub, ip)
if bladeletter == 1:
if cyclenum == 0:
letter = "B"
cyclenum = int(cyclenum) + 1
else:
letter = "A"
cyclenum = 0
bladenum = int(bladenum) + 1
else:
bladenum = int(bladenum) + 1
genip()