Wednesday, December 31, 2008

The great PC rebuild

Its that time of year when its after Christmas and I still have a week before classes start. This is the time when I start to break things and then rebuild them. This year I got some new cooling stuff for my PC and instead of just adding it I decided to tear down the whole system and start from scratch. I have tried to document the process a little bit but pictures cant describe how much work went into this. I am proud of the job I have done.
Here are the parts I will be using.

COOLER MASTER COSMOS 1010 Full Tower Computer Case
EVGA 132-CK-NF78-A1 LGA 775 NVIDIA nForce 780i SLI ATX Intel Motherboard
G.SKILL 4GB (2 x 2GB) 240-Pin DDR2 SDRAM DDR2 Dual Channel Kit Desktop Memory
Intel Q6600 quadcore cpu
Asus cd/dvd drive
Western Digital 300 gig Raptor drive
2 Nvidia 8800 gt cards
2 swifttech obsidian waterblocks with the Mosfet heatsinks
H20-220 Apex Ultima CPU liquid cooling kit
800w power supply
Lots of red LED Antek 3 speed fans.

Here is what I started out with. As you can see I completely stripped the box because I had to remove some pieces of the hard drive enclosure in order to allow all the things to fit. The goal I was going for was to create two independent loops of watercooling. One loop for the cpu and one loop for the two nvidia 8800gt's I have. What I planned to do was use the swifttech dual radiator for the gpus and the new quad Blackice GTX480 radiator for the cpus. Here is a pic of the swifttech radiator.

Here is a picture of the monster Blackice 480GTX

The first order of business was to rebuild the case. As you can see I removed the whole hard drive area. I will be moving the hard drive up to the 5 1/2 inch bay area in order to get some more space. I will be mounting the blackice rad on top of the box however I was hard pressed to find a location for the swifttech one but I finally decided on the bottom where the fans used to be and there was already holes for two fans to flow outward. You cant see it in this picture but there are some bars the box sits on to allow airflow underneath. I also decided to paint the box black at the same time. I never really liked the silver much anyway. Here is the modded and painted box with the radiators installed.

Next I installed my swifttech pump and my evga 780i mother board. I also started adding the tubing and planning out my waterflow pattern as I was installing the parts.

Next I added the power supply, the cd/dvd drive and my 300 gig raptor hardrive.

Next I started on the gpu waterblocks. I have two nvidia 880gt's. I run a 4 monitor system so I need the cards running independent and not in SLI. Aircooled my cards ran in the 50c to 70c range depending on the fan speed so I am hoping to knock 10 degrees or so off of that with watercooling. I selected the swifttech obsidian waterblock with the add on mosfet heatsink which is pictured here all put together.

Here is another close up

My work area...

Here I have added the second videocard and all the little odds and ends I forgot. I have filled the entire system with water and turned it on. Everything seems to be working pretty well so far.
My GPU cards are now running at about 29-30 degrees Celcius which is a vast improvement over the 50-60 they were running before.
At the moment I'm still running at a stock 2.4 GHz but I'm going to be going back up to at least 3.6, and maybe more. Here is my sensors output.
pwnsauce ~ # sensors
Adapter: ISA adapter
VCore: +1.27 V (min = +0.00 V, max = +1.74 V)
in1: +9.93 V (min = +7.18 V, max = +0.42 V) ALARM
AVCC: +3.25 V (min = +2.05 V, max = +0.00 V) ALARM
3VCC: +3.25 V (min = +0.86 V, max = +1.63 V) ALARM
in4: +1.19 V (min = +0.78 V, max = +1.17 V) ALARM
in5: +1.61 V (min = +0.66 V, max = +0.65 V) ALARM
in6: +5.94 V (min = +1.08 V, max = +0.00 V) ALARM
VSB: +3.25 V (min = +2.05 V, max = +1.55 V) ALARM
VBAT: +3.01 V (min = +0.51 V, max = +2.86 V) ALARM
Case Fan: 0 RPM (min = 22500 RPM, div = 4) ALARM
CPU Fan: 0 RPM (min = 869 RPM, div = 16) ALARM
Aux Fan: 0 RPM (min = 6367 RPM, div = 4) ALARM
fan4: 4326 RPM (min = 6490 RPM, div = 8) ALARM
fan5: 0 RPM (min = 21093 RPM, div = 2) ALARM
Sys Temp: -2 C (high = +0 C, hyst = +127 C) [CPU diode ]
CPU Temp: +33.0 C (high = +127.0 C, hyst = +0.0 C) [CPU diode ] ALARM
AUX Temp: +38.5 C (high = +127.0 C, hyst = +0.0 C) [thermistor]
vid: +1.300 V

Adapter: ISA adapter
Core 0: +28 C (high = +100 C)

Adapter: ISA adapter
Core 1: +23 C (high = +100 C)

Adapter: ISA adapter
Core 2: +26 C (high = +100 C)

Adapter: ISA adapter
Core 3: +28 C (high = +100 C)

Tuesday, December 23, 2008


I use some scripts in my rc.lua file which I guess I need to post in order for some of the widgets to work. These are not my original work, I got them from various sources on the inturwub. I cant remember where so I cant give the credit where it is due.

The first one tells you the current or last emerged package.

tac /var/log/emerge.log |\
grep 'Compiling' |\
head |\
sed -e 's/.*(//' |\
sed -e 's/::.*)//' |\
head -n 1 |\
cut -d \) -f 1

The next one tells the progress in percentage.

# This script will report the progress of the last emerge command run.
tail -n 50 /var/log/emerge.log |\
tac |\
grep -v "Starting retry" |\
grep -iE '([0-9]* of [0-9]*)' -o -m 1 |\
sed -e 's/\(.*\) of \(.*\)/\1 \2/' |\
awk '{print 100.0*$1/$2}'

The next one tells us the status of the current package being emerged.


STATUS=`tail -n 15 /var/log/emerge.log |\
grep -iE "Compiling|Cleaning|AUTOCLEAN|completed|search|terminating|rsync" |\
cut -d ' ' -f "2-" |\
grep -Ev 'Finished\.|Cleaning up\.\.\.' |\
tail -n 1`

#echo "$STATUS"

if [ "`echo "$STATUS" | grep -i compiling`" != "" ]; then echo Compiling
elif [ "`echo "$STATUS" | grep -i cleaning`" != "" ]; then echo Cleaning
elif [ "`echo "$STATUS" | grep -i autoclean`" != "" ]; then echo Autoclean
elif [ "`echo "$STATUS" | grep -i sync`" != "" ]; then echo Syncing
elif [ "`echo "$STATUS" | grep -i search`" != "" ]; then echo Searching
elif [ "`echo "$STATUS" | grep -i completed`" != "" ]; then echo Completed
elif [ "`echo "$STATUS" | grep -i terminating`" != "" ]; then echo Completed
else echo Script Error!

And the final one will show us when the last-sync was. (This one requires the Date::Manip perl module)

use Date::Manip;

$date = `grep "Sync completed" /var/log/emerge.log | tail -n1 | cut -c-10`;
$date = &DateCalc("Jan 1, 1970 00:00:00 GMT",$date);
$date = UnixDate("$date","%A %H:%M");
print "$date";

I also use a little script to show my current ip.

wget -q -O -|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'

And finally I use a script to download a image of the world with the current state of darkness and use it as my desktop. You will have to edit this one to suit your resolution. I have this set as a cron job which executes once a hour to get me the latest desktop picture.

# Save this script to somewhere like "/home/(user)", "chmod a+x" it,
# edit it to change the correct IMAGEFILE for your screen size,
# then run "crontab -e" and add a line like this:
# 0 * * * * DISPLAY:0 /home/(user)/



[ -f $HOME/.exports ] && . $HOME/.exports

[ -d $tmpdir ] || mkdir $tmpdir
cd $tmpdir

if wget -qN $MIRROR/$IMAGEFILE ; then
feh --bg-scale $IMAGEFILE

Monday, December 15, 2008

Awesome Window Manager

I have recently discovered the awesome window manager. It is a tiling window manager which is very light and easy to use. Theres is some documentation at their website and they also have a excellent wiki. The one problem I had was finding rc.lua files which worked for the newer versions so I decided to post mine so maybe it will be helpful to others. Its still a work in progress as I learn more but heres what it is as of now.

--Include awesome libraries, with lots of useful function!

-- {{{ Variable definitions
theme_path = "/home/purehate/.config/awesome/themes/my_theme"

-- Actually load theme

-- defaults.
terminal = "Eterm -O --tint grey 50 --cmod 100 -x --scrollbar-popup --buttonbar no --font-fx none -f white -c white --font '-Adobe-Courier-Medium-R-Normal--14-100-100-100-M-90-ISO8859-1' "
editor = os.getenv("EDITOR") or "nano"
editor_cmd = terminal .. " -e " .. editor

--set function
function setFg(color, text)
return "" .. text .. ""

-- Default modkey.
modkey = "Mod4"

-- Table of layouts to cover with, order matters.
layouts =

-- Table of clients that should be set floating.
floatapps =
-- by class
["MPlayer"] = true,
["gimp"] = true,
["aterm"] = true,

-- by instance


-- Applications to be moved to a pre-defined tag by class or instance.
-- Use the screen and tags indices.
apptags =
["Firefox"] = { screen = 1, tag = 1 },

-- Define if we want to use titlebar on all applications.
use_titlebar = false
-- }}}

-- {{{ Tags
-- Define tags table.
tags = {}
for s = 1, screen.count() do
-- Each screen has its own tag table.
tags[s] = {}
-- Create 9 tags per screen.
for tagnumber = 1, 9 do
tags[s][tagnumber] = tag({ name = tagnumber, layout = layouts[1] })
-- Add tags to screen one by one
tags[s][tagnumber].screen = s
-- I'm sure you want to see at least one tag.
tags[s][1].selected = true
-- }}}

-- {{{ Wibox
-- Create a textbox widget
mytextbox = widget({ type = "textbox", align = "right" })
-- Set the default text in textbox
mytextbox.text = " " .. .. " "
-- Create a laucher widget and a main menu
mymainmenu ={ items =
{"firefox", "firefox" },
{"Alpine", terminal .. "-e alpine" },
{"vmware", "vmware" },
{"K3B", "k3b" },
{"mc", terminal .. "-e mc" },
{"rss feeds", terminal .. " -e newsbeuter" },
{"konqueror", "konqueror" },
{"mrxvt", "mrxvt -tr -shade 75 +trt -fg white -cr white" },
{"openoffice", "ooffice" },
{"kate", "kate" },
{"aterm", " aterm -sl 3000 -tr +sb -si -sk -fade 70 -sh 60 -fn -misc-fixed-medium-r-normal-*-*-120-*-*-c-*-iso8859-2 -g 130x50+20-0 -fg white" },
{"rootXterm", "sudo xterm" },
{"Mplayer", "kmplayer" },
{"vlc", "vlc" },
{"amarok", "amarok" },
{"lynx", terminal .. " -e lynx" },
{"gimp", "gimp" },
{"pidgin", "pidgin" },
{"Transmission", "transmission" },
{"Hack_songs", terminal .. "-e mpg123 -z --list /media/Hack_songs/List.lst" },
{"backtrack", terminal .. "-e ssh root@" },
{"wireshark", "wireshark" },
{"edit config", editor_cmd .. " " .. awful.util.getdir("config") .. "/rc.lua" },
{"restart", "sudo reboot" },
{"shutdown", "sudo poweroff" },
{"close menu", function ()"mymainmenu") end }

mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon,
menu = mymainmenu })

-- Create a systray
mysystray = widget({ type = "systray", align = "right" })

--- Create a cpu widget
cpuwidget = widget({
type = 'textbox',
name = 'cpuwidget'

wicked.register(cpuwidget, wicked.widgets.cpu,
' CPU: $1%')

--and then create a cpu graph
cpugraphwidget = widget({
type = 'graph',
name = 'cpugraphwidget',


cpugraphwidget.height = 0.85
cpugraphwidget.width = 80 = '#333333'
cpugraphwidget.border_color = '#0a0a0a'
cpugraphwidget.grow = 'left'

cpugraphwidget:plot_properties_set('cpu', {
fg = '#AEC6D8',
fg_center = '#285577',
fg_end = '#285577',
vertical_gradient = false

wicked.register(cpugraphwidget, wicked.widgets.cpu, '$1', 1, 'cpu')

--mem widget
memwidget = widget({
type = 'textbox',
name = 'memwidget'

wicked.register(memwidget, wicked.widgets.mem,
' Memory: $1 ($2Mb/$3Mb)',
nil, nil, {2, 4, 4})

--Add mem widgit
membarwidget = widget({
type = 'progressbar',
name = 'membarwidget'

membarwidget.height = 0.85
membarwidget.width = 80 = '#333333'
membarwidget.border_color = '#0a0a0a'
membarwidget.grow = 'left'

membarwidget:bar_properties_set('mem', {
bg = '#222222',
fg = '#285577',
fg_center = '#285577',
fg_end = '#285577',
fg_off = '#222222',
reverse = false,
min_value = 0,
max_value = 100

wicked.register(membarwidget, wicked.widgets.mem, '$1', 1, 'mem')

--start emerge widgets
--last sync
lastsync = widget({
type = 'textbox',
name = 'lastsync'

function run_script()
local filedescriptor = io.popen('sudo /home/purehate/scripts/')
local value = filedescriptor:read()

return {value}
wicked.register(lastsync, run_script,
' Last-Sync: $1', 10)

---emerge current
current = widget({
type = 'textbox',
name = 'current'

function run_script()
local filedescriptor = io.popen('sudo /home/purehate/scripts/')
local value = filedescriptor:read()

return {value}
wicked.register(current, run_script,
' Current Package: $1', 10)

--emerge progress
progress = widget({
type = 'textbox',
name = 'progress'

function run_script()
local filedescriptor = io.popen('sudo /home/purehate/scripts/')
local value = filedescriptor:read()

return {value}
wicked.register(progress, run_script,
' Progress: $1', 10)

--emerge status
status = widget({
type = 'textbox',
name = 'status'

function run_script()
local filedescriptor = io.popen('sudo /home/purehate/scripts/')
local value = filedescriptor:read()

return {value}
wicked.register(status, run_script,
' Status: $1', 10)

--net widget
netwidget = widget({
type = 'textbox',
name = 'netwidget'

' Net: ${eth0 down} / ${eth0 up} [ ${eth0 rx} // ${eth0 tx} ]',
nil, nil, 3)

-----file system widget
fswidget = widget({
type = 'textbox',
name = 'fswidget'

wicked.register(fswidget, wicked.widgets.fs,
' FS: ${/ used}/${/ size} (${/ usep} used)', 120)

--Emerge text widget
emerge = widget({
type = "textbox",
name = "emerge"
emerge.text = "Emerge Status: "

--Show our IP
ip = widget({
type = 'textbox',
name = 'ip'

function run_script()
local filedescriptor = io.popen('sudo /home/purehate/scripts/')
local value = filedescriptor:read()

return {value}
wicked.register(ip, run_script,
' Current IP: $1', 10)

-- Create a wibox for each screen and add it
mywibox = {}
mypromptbox = {}
mylayoutbox = {}
mytaglist = {}
mytaglist.buttons = { button({ }, 1, awful.tag.viewonly),
button({ modkey }, 1, awful.client.movetotag),
button({ }, 3, function (tag) tag.selected = not tag.selected end),
button({ modkey }, 3, awful.client.toggletag),
button({ }, 4, awful.tag.viewnext),
button({ }, 5, awful.tag.viewprev) }
mytasklist = {}
mytasklist.buttons = { button({ }, 1, function (c) client.focus = c; c:raise() end),
button({ }, 3, function (){ width=250 }) end),
button({ }, 4, function () awful.client.focus.byidx(1) end),
button({ }, 5, function () awful.client.focus.byidx(-1) end) }

for s = 1, screen.count() do
-- Create a promptbox for each screen
mypromptbox[s] = widget({ type = "textbox", align = "left" })
-- Create an imagebox widget which will contains an icon indicating which layout we're using.
-- We need one layoutbox per screen.
mylayoutbox[s] = widget({ type = "imagebox", align = "right" })
mylayoutbox[s]:buttons({ button({ }, 1, function (), 1) end),
button({ }, 3, function (), -1) end),
button({ }, 4, function (), 1) end),
button({ }, 5, function (), -1) end) })
-- Create a taglist widget
mytaglist[s] =, awful.widget.taglist.label.all, mytaglist.buttons)

-- Create a tasklist widget
mytasklist[s] =
return awful.widget.tasklist.label.currenttags(c, s)
end, mytasklist.buttons)

-- Create the wibox
mywibox[s] = {}
mywibox[s][1] = wibox({ position = "top", fg = beautiful.fg_normal, bg = beautiful.bg_normal })

-- Add widgets to the wibox - order matters
mywibox[s][1].widgets = { mylauncher,
s == 1 and mysystray or nil }
mywibox[s][1].screen = s
-- Create the second wibox
mywibox[s][2] = wibox({ position = "bottom", fg = beautiful.fg_normal, bg = beautiful.bg_normal })

-- Add widgets to the wibox - order matters
mywibox[s][2].widgets = { emerge,
mywibox[s][2].screen = s
-- }}}

-- {{{ Mouse bindings
button({ }, 3, function () mymainmenu:toggle() end),
button({ }, 4, function() awful.spawn(settings.apps.terminal) end),
button({ }, 5, awful.tag.viewprev)
-- }}}

-- {{{ Key bindings

-- Bind keyboard digits
-- Compute the maximum number of digit we need, limited to 9
keynumber = 0
for s = 1, screen.count() do
keynumber = math.min(9, math.max(#tags[s], keynumber));

for i = 1, keynumber do
keybinding({ modkey }, i,
function ()
local screen = mouse.screen
if tags[screen][i] then
keybinding({ modkey, "Control" }, i,
function ()
local screen = mouse.screen
if tags[screen][i] then
tags[screen][i].selected = not tags[screen][i].selected
keybinding({ modkey, "Shift" }, i,
function ()
if client.focus then
if tags[client.focus.screen][i] then
keybinding({ modkey, "Control", "Shift" }, i,
function ()
if client.focus then
if tags[client.focus.screen][i] then

keybinding({ modkey }, "Left", awful.tag.viewprev):add()
keybinding({ modkey }, "Right", awful.tag.viewnext):add()
keybinding({ modkey }, "Escape", awful.tag.history.restore):add()

-- Standard program
keybinding({ modkey }, "Return", function () awful.util.spawn(terminal) end):add()

keybinding({ modkey, "Control" }, "r", function ()
mypromptbox[mouse.screen].text =
keybinding({ modkey, "Shift" }, "q", awesome.quit):add()

-- Client manipulation
keybinding({ modkey }, "m", awful.client.maximize):add()
keybinding({ modkey }, "f", function () client.focus.fullscreen = not client.focus.fullscreen end):add()
keybinding({ modkey, "Shift" }, "c", function () client.focus:kill() end):add()
keybinding({ modkey }, "j", function () awful.client.focus.byidx(1); client.focus:raise() end):add()
keybinding({ modkey }, "k", function () awful.client.focus.byidx(-1); client.focus:raise() end):add()
keybinding({ modkey, "Shift" }, "j", function () awful.client.swap.byidx(1) end):add()
keybinding({ modkey, "Shift" }, "k", function () awful.client.swap(-1) end):add()
keybinding({ modkey, "Control" }, "j", function () awful.screen.focus(1) end):add()
keybinding({ modkey, "Control" }, "k", function () awful.screen.focus(-1) end):add()
keybinding({ modkey, "Control" }, "space", awful.client.togglefloating):add()
keybinding({ modkey, "Control" }, "Return", function () client.focus:swap(awful.client.getmaster()) end):add()
keybinding({ modkey }, "o", awful.client.movetoscreen):add()
keybinding({ modkey }, "Tab", awful.client.focus.history.previous):add()
keybinding({ modkey }, "u", awful.client.urgent.jumpto):add()
keybinding({ modkey, "Shift" }, "r", function () client.focus:redraw() end):add()
-- Layout manipulation
keybinding({ modkey }, "l", function () awful.tag.incmwfact(0.05) end):add()
keybinding({ modkey }, "h", function () awful.tag.incmwfact(-0.05) end):add()
keybinding({ modkey, "Shift" }, "h", function () awful.tag.incnmaster(1) end):add()
keybinding({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end):add()
keybinding({ modkey, "Control" }, "h", function () awful.tag.incncol(1) end):add()
keybinding({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end):add()
keybinding({ modkey }, "space", function (), 1) end):add()
keybinding({ modkey, "Shift" }, "space", function (), -1) end):add()

-- Prompt
keybinding({ modkey }, "F1", function (){ prompt = "Run: " }, mypromptbox[mouse.screen], awful.util.spawn, awful.completion.bash,
awful.util.getdir("cache") .. "/history")
keybinding({ modkey }, "F4", function (){ prompt = "Run Lua code: " }, mypromptbox[mouse.screen], awful.util.eval, awful.prompt.bash,
awful.util.getdir("cache") .. "/history_eval")

keybinding({ modkey, "Ctrl" }, "i", function ()
local s = mouse.screen
if mypromptbox[s].text then
mypromptbox[s].text = nil
mypromptbox[s].text = nil
if client.focus.class then
mypromptbox[s].text = "Class: " .. client.focus.class .. " "
if client.focus.instance then
mypromptbox[s].text = mypromptbox[s].text .. "Instance: ".. client.focus.instance .. " "
if client.focus.role then
mypromptbox[s].text = mypromptbox[s].text .. "Role: ".. client.focus.role

-- Client awful tagging: this is useful to tag some clients and then do stuff like move to tag on them
keybinding({ modkey }, "t", awful.client.togglemarked):add()

for i = 1, keynumber do
keybinding({ modkey, "Shift" }, "F" .. i,
function ()
local screen = mouse.screen
if tags[screen][i] then
for k, c in pairs(awful.client.getmarked()) do
awful.client.movetotag(tags[screen][i], c)
-- }}}

-- {{{ Hooks
-- Hook function to execute when focusing a client.
awful.hooks.focus.register(function (c)
if not awful.client.ismarked(c) then
c.border_color = beautiful.border_focus

-- Hook function to execute when unfocusing a client.
awful.hooks.unfocus.register(function (c)
if not awful.client.ismarked(c) then
c.border_color = beautiful.border_normal

-- Hook function to execute when marking a client
awful.hooks.marked.register(function (c)
c.border_color = beautiful.border_marked

-- Hook function to execute when unmarking a client.
awful.hooks.unmarked.register(function (c)
c.border_color = beautiful.border_focus

-- Hook function to execute when the mouse enters a client.
awful.hooks.mouse_enter.register(function (c)
-- Sloppy focus, but disabled for magnifier layout
if awful.layout.get(c.screen) ~= "magnifier"
and awful.client.focus.filter(c) then
client.focus = c

-- Hook function to execute when a new client appears.
awful.hooks.manage.register(function (c)
if use_titlebar then
-- Add a titlebar
awful.titlebar.add(c, { modkey = modkey })
-- Add mouse bindings
button({ }, 1, function (c) client.focus = c; c:raise() end),
button({ modkey }, 1, function (c) c:mouse_move() end),
button({ modkey }, 3, function (c) c:mouse_resize() end)
-- New client may not receive focus
-- if they're not focusable, so set border anyway.
c.border_width = beautiful.border_width
c.border_color = beautiful.border_normal
client.focus = c

-- Check if the application should be floating.
local cls = c.class
local inst = c.instance
if floatapps[cls] then
c.floating = floatapps[cls]
elseif floatapps[inst] then
c.floating = floatapps[inst]

-- Check application->screen/tag mappings.
local target
if apptags[cls] then
target = apptags[cls]
elseif apptags[inst] then
target = apptags[inst]
if target then
c.screen = target.screen
awful.client.movetotag(tags[target.screen][target.tag], c)

-- Set the windows at the slave,
-- i.e. put it at the end of others instead of setting it master.
-- awful.client.setslave(c)

-- Honor size hints: if you want to drop the gaps between windows, set this to false.
-- c.honorsizehints = false

-- Hook function to execute when arranging the screen.
-- (tag switch, new client, etc)
awful.hooks.arrange.register(function (screen)
local layout = awful.layout.get(screen)
if layout then
mylayoutbox[screen].image = image(beautiful["layout_" .. layout])
mylayoutbox[screen].image = nil

-- Give focus to the latest client in history if no window has focus
-- or if the current window is a desktop or a dock one.
if not client.focus then
local c = awful.client.focus.history.get(screen, 0)
if c then client.focus = c end

-- Uncomment if you want mouse warping
if client.focus then
local c_c = client.focus:fullgeometry()
local m_c = mouse.coords()

if m_c.x <>= c_c.x + c_c.width or
m_c.y <>= c_c.y + c_c.height then
if table.maxn(m_c.buttons) == 0 then
mouse.coords({ x = c_c.x + 5, y = c_c.y + 5})

-- }}}

Wednesday, April 9, 2008

Fischer Price "My First FireWall"

We had an assignment in class this week to write our own personal firewall for a personal PC. We had to use variables and have a least a few outside services running. I thought I may as a well post it here since by default Backtrack does not have a firewall or even IPtables running when it starts up. In the past I'll be honest I've always cheated with a GUI firewall program like Guard Dog or Firestarter but now I am slowly learning to write one from scratch. If you would like to use it just copy and paste it in a file called Give it exec permissions and start it with ./ and stop it with ./ stop. Special thanks to linuxchuck for his help with iptable'fu.

#Fischer Price "My First Firewall"
#define variables
SERVICES="ftp ssh"
if [ "$1" = "start" ]
echo "Starting firewall..."
# Flush all existing chains and erase personal chains
CHAINS=$(cat /proc/net/ip_tables_names 2>/dev/null)
for i in $CHAINS;
$IPT -t $i -F
for i in $CHAINS;
$IPT -t $i -X
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
#creating rules
iptables -P INPUT REJECT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#enable services
for x in ${SERVICES}
iptables -A INPUT -p tcp --dport ${x} -m state --state NEW -j ACCEPT

iptables -A INPUT -p udp -i ${EXT}-j REJECT --reject-with icmp-port-unreachable
#hide our firewall
iptables -A INPUT -p tcp -i ${EXT}-j REJECT --reject-with tcp-reset
iptables -A INPUT -p udp -i ${EXT} -j REJECT --reject-with icmp-port-unreachable

# disable ECN
if [ -e /proc/sys/net/ipv4/tcp_ecn ]
echo 0 > /proc/sys/net/ipv4/tcp_ecn

#disable spoofing on all interfaces
for x in ${INT} ${EXT}
echo 1 > /proc/sys/net/ipv4/conf/${x}/rp_filter

echo 1 > /proc/sys/net/ipv4/ip_forward
#ping rules
PERMIT_ICMP="destination-unreachable echo-reply time-exceeded"
for i in ${PERMIT_ICMP}
iptables -A INPUT -p icmp --icmp-type ${i} -j ACCEPT
elif [ "$1" = "stop" ]
echo "Stopping firewall..."
iptables -F INPUT
iptables -P INPUT ACCEPT

Sunday, February 24, 2008

Project Evil AP

My new project these days is wireless routers and all the mods that can be done to them. I know some of this stuff is a little old and has "been done" however it is new to me and I am having quite a bit of fun with it.

I started with a linksys WRT54GL wireless router which is the newest Linux version of their router. ost of the info on the web is for modding the older routers but I did find some for the L including this book.

I highly recommend the book if you are planning on hacking up your router. I will be slowly adding to the blog as I go with pictures.

The first thing I did was upgrade to the latest dd-wrt release. Later on I may switch to open-wrt but at this time dd-wrt had some features I liked. The next thing I did was order a couple of 9db antennas from fab-corp to amp up the my signal a little. At this point I decide to preform the SD card mod which I found in the book I mentioned above. I'm not going to go into the actuall install because there is plenty of info in the book and on the web. This gave me a extra 1.9 gigs of memory.

Now for the software. I configured the router to be a wireless repeater which would repeat the strongest wi-fi signal it could find. I then found a script called Auto AP which takes it one step further. It actively searches out the strongest signal by itself at boot and continues to re scan and stay connected to the strongest open signal. The script can be modified to accept wep keys and preffered essid's.

Since the start of the project I have switched the router to use open-wrt firmware. It is a much smaller app and suites my needs alot better. dd-wrt is great firmware however I felp it was a little boloated with apps I didn't need (kinda like Vista). Anyway I am in the process of getting it built back up into a fully functional MITM type machine.