public function remove_member($mac)
 {
     $id = $this->id;
     if (($mac = validate_mac($mac)) === 0) {
         die("invalid MAC passed to HardwareClass::remove_member");
     }
     $mac = mysql_escape_string($mac);
     mysql_query("delete from class_map where class_id={$id} and mac='{$mac}'") or die("query to delete member {$mac} from class {$id} failed:" . mysql_error());
 }
# possibilities for individualized configuration.
# These are documented below.
# system_mac:$mac - echoes back the MAC of the requesting system
# hardware_class:$class - echoes the numeric class ID of the requestor
# config_override:$path:$sig:$url - a configuration file override.
# This is followed by a URL where the override can be retrieved,
# and a base64-encoded RSA signature of the file.
# kernel:$sig:$url - location and signature of the latest kernel image
# image:$sig:$url - location and signature of the latest software image
require_once "dbfuncs.php";
init_db();
if (!array_key_exists("mac", $_REQUEST)) {
    die("MAC address unspecified");
}
$mac = $_REQUEST["mac"];
if (($mac = validate_mac($mac)) === 0) {
    die("invalid MAC address");
}
if (($class = HardwareClass::find_from_mac($mac)) == 0) {
    print "system_mac:{$mac}\n";
    print "system_unregistered\n";
    die;
}
print "system_mac:{$mac}\n";
print "hardware_class:" . $class->get_id() . "\n";
foreach ($class->list_overrides() as $path) {
    print "config_override:{$path}";
    print ":" . $class->get_override_sig($path) . ":";
    print BASE_URL;
    print "/get_config.php?class=" . $class->get_id() . "&path=";
    print urlencode($path);