Wednesday, December 31, 2008

Setting up BIND on Fedora 10 with wildcard subdomains

Here is how I set up a domain name server with BIND on Linux Fedora 10.

One of the features many websites use to personalize their content is to give users their own domain name, for example or This technique is called wildcard subdomains. In this tutorial, I'll be explaning how you can configure a nameserver to resolve all these addresses to the same server. You'll need to use mod_rewrite and .htaccess to parse the data, and the scripting language of your choice to refine the arguments even more. (I'll write these later ones when I have some time.

Tested on:
Linux LAMP Server (I'm using Fedora 10) as a guest OS on VMware
VMWare Server 2.0 is on Windows XP

Using yum or any GUI add/remove software program, install these rpm's:
  • bind-chroot

  • rpm dependancies should automatically add the bind rpm's

  • system-config-bind - a not so intuitive gnome tool to setup your DNS server. I'll paste the output files that it produces in case you want to do it all by hand.

Files and directories that will be modified:
/etc/named.conf - contains the zone, ie the domain we'll be working with
/etc/resolve.conf - the address of the nameserver we'll be using
/var/named/chroot/var/named/ - directory of where the system-config-bind writes all the zone files to. is the domain I'm going to use to refer to my server.

Step 1
Make sure your firewall has port 53 open and you can connect to the internet. Start and stop your DNS server by running the command
service named restart. You should receive OK messages.

Step 2
run system-config-bind - here's a picture of the GUI

Step 3
What we want to do next is to get our domain name server to resolve to an IP of our choice. I'm going with my lan IP as I'm using this for testing. -> . (No disrespect to the real as we'll be redirect users to your own server - people must be using your dns server for that to happen)

Highlight DNS Server and click on New -> Zone
A new window will pop up.
Click on the two OK's at the top. Your options should be
Class In Internet and
Origin Type Forward

You will get this window.
Enter your domain. In our case:
Make sure has a period after the com.
Click on OK.

Take note that the period is added to the end of
Click on OK

The last field has this will contain your zone and ip information for your server which may be found in /var/named/chroot/var/named/

On the main GUI click and the Save Button. The .db file will be written.

Step 4
Associate our name server to an IP.
On the main GUI, make sure is highlighted. Click on New and choose:
A IPv4 address. The pop up on the right will appear. Enter your ip address. Note that the domain name has a period on the end too. We select Create Reverse Mapping record for our ip and a zone will be created for it on our name server.

On the main GUI click on the Save button.

Step 5
We now have our name server setup and we should be able to ping and nslookup

Here is how the main GUI now looks

Step 6
Finally the wildcard setup. Right click on, add a new A IPv4 Address. Fill in the info with a wildcard and deselect Create Reverse Mapping Record. Refer to the image on the right.

Save and run
service named restart

Step 7
Make sure you edit /etc/resolve.conf to use your name server
I have
search localhost
Note: if you're using network manager or system-config-network, add as your name server.

You should now be able to ping and nslookup or and be directed to As long as those computers use this nameserver.

Next time I'll go mod_rewrite and htaccess that will help you setup wildcard subdomains

As promised before here are the configs in the conf and zone files.
// named.conf
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
// See /usr/share/doc/bind*/sample/ for example named configuration files.

options {
listen-on port 53 {; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { localhost; };
recursion yes;

logging {
channel default_debug {
file "data/";
severity dynamic;
zone "100.168.192.IN-ADDR.ARPA." IN {
type master;
file "192.168.100.db";
zone "" IN {
type master;
file "";
zone "." IN {
type hint;
file "";

include "/etc/named.rfc1912.zones";

@ SOA @ root ( 4
1H )
NS @
* IN 1H A

@ SOA (3
1H )
10 PTR
That's all.

Friday, November 7, 2008

Fedora 9 and mouse clicking problems

After a recent yum update around early November 2008, my mouse clicking started to have problems. Clicking on icons in the panel would not launch xterm, and clicking on the title bar of windows would maximize them. I also clicked on the Application menu in the panel and they would instantly close.

This was odd mouse behavior.

What I finally discovered is that although I was single clicking, linux was registering them as double clicks.

Changing nautilus or gnome settings didn't affect anything.

After reading this post

they suggested that x was registering clicks on multiple mouse devices. For me it was /dev/input/mice an /dev/input/mouse0. This caused a single mouse click to be repeated.

in my xorg.conf i had the line
Option "Device" "/dev/input/mice"

I changed it to

Option "Device" "/dev/input/mouse0"

and it solved the problem.


Sunday, October 5, 2008

Formatting the result returned from a custom query in cakephp.

When you do custom queries with cakephp, the data is returned in mysql's format

For example

$this->User->query('Select * from cars as Car');

[0] => array('Car' => array('name' => 'ford',
        'colour' => 'yellow')),
[1] => array('Car' => array('name' => 'toyota',
        'colour' => 'green')),
[2] => array('Car' => array('name' => 'nissan',
        'colour' => 'pink')))

What we want though is a more cakephp result set that looks like what we would get from a ->find('all') query:
array('Car' => array(0 => array('name' => 'ford',
        'colour' => 'yellow'),
1 => array('name' => 'toyota',
        'colour' => 'green'),
2 => array('name' => 'nissan',
        'colour' => 'pink')) );

Use the set extract function and assign it to a string

array('Car' => Set::extract($this->User->query($sql), '{n}.Car'))

Friday, September 26, 2008

VMware Server 2.0 Problems with mouse tracking in linux fedora 9

After installing the vmware 2.0 server I thought I'd check if there was a change with the vmware-toolbox.

You can install it by going to:
Installation -> Fedora 9 -> right hand menu called Status

Click on Upgrade/Install VMware Tools

This will bring up the vmware tools rpm, install it and run /usr/bin/

Select all the default settings (if you mess up I think you can select -c and it will try to compile it for your kernel).


After all of that I found my mouse wasn't clicking where the cursor was. It was off by an inch depending on which side I entered the linux window. If I dragged and selected, the selection box was on another part of the screen.

Look at /etc/X11/xorg.conf There are a bunch of new vmware settings that weren't in the previous versions. I don't have time to take apart the settings, but it looks like something is up with the vmware mouse drivers.

I copied an old xorg.conf.old.1 (probably auto backed up by vmware-config) into xorg.conf and it cleared up the problem.

Downside is if you don't use the vmware settings in xorg.conf, your system will automatically boot with vmware-toolbox and take up a spot on your toolbar. Using the vmware settings in xorg.conf seems makes everything automatic.

Thursday, August 28, 2008

HABTM cakephp and pagination with fields in the join table

Paginating HABTM: Brief version.

What I needed to do was to figure out how to paginate based on data within a join table. Most join tables contain two foreign keys referencing the two parent tables. I had a third field called type_id that I used to state what kind of role each user played.

We have three tables

CREATE TABLE `users` (
`id` int(11) NOT NULL default '0',
`name` varchar(50) default NULL,

CREATE TABLE `groups` (
`id` int(11) NOT NULL default '0',
`name` varchar(50) default NULL,

Which has a has and belong join table called:

CREATE TABLE `users_groups` (
`user_id` int(11) default NULL,
`group_id` int(11) default NULL,
`type_id` int(10) unsigned NOT NULL,
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`),
FOREIGN KEY (`group_id`) REFERENCES `groups` (`id`)

At this point we have the typical model files for groups and users. Which is enough to do queries between the two tables. Cakephp will automatically query the join table when doing pagination.

A problem arises now if we want to query the type_id as one of our conditions.

we have Bob
User - Bob who's in Group 'Car Group' and is an 'advisor type'. ie his type_id is 3.
User - Bob is also in Group 'Truck Group' and is a 'guest type' and type_id = 4

Some solutions have been:
1) change the users_groups join table and add an 'id'. This allows you to treat it as a model and paginate it. You also create a file in ./models/users_groups.php.
2) Instead of adding an 'id' and preserving the 'join' tableness of users_groups, you write a custom paginate() and paginateCount() query.

function paginate ($condition, ...) { $sql = 'Select....'; return $this->query($sql)}

My Solution:
create a file ./models/users_groups.php
class UsersGroup extends AppModel {

var $name = 'UsersGroup';

var $belongsTo = array('User', 'Group');
public $actsAs = array('Containable');

In your controller

function index() {
$this->paginate = array('UsersGroup' => array( 'contain' => 'Group', 'fields' => array('Group.*')) );

pr($this->paginate($this->User->UsersGroup, array('UsersGroup.user_id' => 1, 'UsersGroup.type_id' => 3)));


That's it. Now you be able to find what groups bob is an advisor in.