#!/usr/bin/perl # Simon Chudley (sly@slyware.com) # TMip Project (tmip.sourceforge.net) # You will have to change all these settings to get it to work on # your network. Basically it is just a list of CNs, with access # points, and a list of virtual hosts. # host_emulate.pl allarrive home # host_emulate.pl switch HOSTNAME # host_emulate.pl walk host HOSTNAME # host_emulate.pl walk random # host_emulate.pl migrate HOSTNAME CNNAME $if = "wi0"; $netmask = "255.255.255.252"; $ping = "10.13.0.250"; # The access points running CNs my %networks = ( 'cn0' => { ssid => "tmip1", cn => "10.13.100.1" }, 'cn1' => { ssid => "tmip2", cn => "10.13.13.1" }, 'cn2' => { ssid => "tmip3", cn => "10.13.7.1" }, 'cn3' => { ssid => "tmip4", cn => "10.13.101.1" } ); # The virtual hosts my %macs = ( 'host0' => { mac => '00:01:f4:ee:90:44', ip => '10.13.100.9', gw => '10.13.100.10', cn => 'cn0' }, 'host1' => { mac => '00:02:f4:ee:90:88', ip => '10.13.100.5', gw => '10.13.100.6', cn => 'cn0' }, 'host2' => { mac => '00:03:f4:ee:90:88', ip => '10.13.100.13', gw => '10.13.100.14', cn => 'cn0' }, 'host3' => { mac => '00:04:f4:ee:90:88', ip => '10.13.100.17', gw => '10.13.100.18', cn => 'cn0' }, 'host4' => { mac => '00:05:f4:ee:90:88', ip => '10.13.100.21', gw => '10.13.100.22', cn => 'cn0' }, 'host5' => { mac => '00:06:f4:ee:90:88', ip => '10.13.100.25', gw => '10.13.100.26', cn => 'cn0' }, 'host6' => { mac => '00:07:f4:ee:90:88', ip => '10.13.100.29', gw => '10.13.100.30', cn => 'cn0' }, 'host7' => { mac => '00:08:f4:ee:90:88', ip => '10.13.100.33', gw => '10.13.100.34', cn => 'cn0' }, 'host8' => { mac => '00:09:f4:ee:90:88', ip => '10.13.100.37', gw => '10.13.100.38', cn => 'cn0' }, 'host9' => { mac => '00:10:f4:ee:90:88', ip => '10.13.100.41', gw => '10.13.100.42', cn => 'cn0' }, 'host10' => { mac => '00:11:f4:ee:90:88', ip => '10.13.100.45', gw => '10.13.100.46', cn => 'cn0' }, 'host11' => { mac => '00:12:f4:ee:90:88', ip => '10.13.101.41', gw => '10.13.101.42', cn => 'cn3' }, 'host12' => { mac => '00:13:f4:ee:90:88', ip => '10.13.101.21', gw => '10.13.101.22', cn => 'cn3' }, 'host13' => { mac => '00:14:f4:ee:90:88', ip => '10.13.101.25', gw => '10.13.101.26', cn => 'cn3' }, 'host14' => { mac => '00:15:f4:ee:90:88', ip => '10.13.101.29', gw => '10.13.101.30', cn => 'cn3' }, 'host15' => { mac => '00:16:f4:ee:90:88', ip => '10.13.101.33', gw => '10.13.101.34', cn => 'cn3' }, 'host16' => { mac => '00:17:f4:ee:90:88', ip => '10.13.101.37', gw => '10.13.101.38', cn => 'cn3' } ); if ($ARGV[0] eq "allarrive" and $ARGV[1] eq "home") { foreach (keys %macs) { # Become them do_mutate($_); # Migrate to their home do_migrate($_, $macs{$_}->{'cn'}); `sleep 2`; } } if ($ARGV[0] eq "switch" and $ARGV[1] ne "") { do_mutate($ARGV[1]); } # walk host [host_name] if ($ARGV[0] eq "walk" and $ARGV[1] eq "host" and $ARGV[2] ne "") { # Turn into them first do_mutate($ARGV[2]); while (1) { # Pick a CN $cn = "cn" . int rand(4); # Now migrate if ($cn ne "cn2") { do_migrate($ARGV[2], $cn); } `sleep 3`; } } # walk random if ($ARGV[0] eq "walk" and $ARGV[1] eq "random") { while (1) { # Pick a host $host = "host" . int rand(16); # Turn into them first do_mutate($host); # Pick a CN $cn = "cn" . int rand(4); # Now migrate if ($cn ne "cn2") { do_migrate($host, $cn); } `sleep 3`; } } if ($ARGV[0] eq "migrate" and $ARGV[1] ne "" and $ARGV[2] ne "") { # Turn into them first do_mutate($ARGV[1]); # Now migrate do_migrate($ARGV[1], $ARGV[2]); } sub do_migrate { my($host, $new_cn) = @_; $mac = $macs{$host}->{'mac'}; $ip = $macs{$host}->{'ip'}; $old = $macs{$host}->{'cn'}; $ssid = $networks{$new_cn}->{'ssid'}; $old_i = $networks{$old}->{'cn'}; $new_cn_i = $networks{$new_cn}->{'cn'}; print "Migrating host [$mac] with $ip from $old_i --> $new_cn_i ($ssid)\n"; `ifconfig $if down`; `wicontrol $if -n $ssid`; `ifconfig $if up`; $macs{$host}->{'cn'} = $new_cn; } sub do_mutate { my($host) = @_; $mac = $macs{$host}->{'mac'}; $ip = $macs{$host}->{'ip'}; $gw = $macs{$host}->{'gw'}; print "Becoming host [$mac] with $ip\n"; `ifconfig $if down`; `route delete default`; `ifconfig $if link $mac`; `ifconfig $if $ip netmask $netmask`; `ifconfig $if up`; `route add default $gw`; }