diff --git a/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerAnswer.java b/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerAnswer.java index 94d1b284667..b231529f1f0 100644 --- a/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerAnswer.java +++ b/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerAnswer.java @@ -9,6 +9,5 @@ public class PrepareLinMinPxeServerAnswer extends Answer { public PrepareLinMinPxeServerAnswer(PrepareLinMinPxeServerCommand cmd, String details) { super(cmd, false, details); - } - + } } diff --git a/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerCommand.java b/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerCommand.java index 33a65377eff..b9a66473f39 100644 --- a/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerCommand.java +++ b/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerCommand.java @@ -2,62 +2,9 @@ package com.cloud.agent.api.baremetal; import com.cloud.agent.api.Command; -public class PrepareLinMinPxeServerCommand extends Command { - String ip; - String mac; - String netMask; - String gateway; - String dns; - String template; - String vmName; - String hostName; - - @Override - public boolean executeInSequence() { - return true; - } - +public class PrepareLinMinPxeServerCommand extends PreparePxeServerCommand { + public PrepareLinMinPxeServerCommand(String ip, String mac, String netMask, String gateway, String dns, String template, String vmName, String hostName) { - this.ip = ip; - this.mac = mac; - this.netMask = netMask; - this.gateway = gateway; - this.dns = dns; - this.template = template; - this.vmName = vmName; - this.hostName = hostName; + super(ip, mac, netMask, gateway, dns, template, vmName, hostName); } - - public String getIp() { - return ip; - } - - public String getMac() { - return mac; - } - - public String getNetMask() { - return netMask; - } - - public String getGateWay() { - return gateway; - } - - public String getDns() { - return dns; - } - - public String getTemplate() { - return template; - } - - public String getVmName() { - return vmName; - } - - public String getHostName() { - return hostName; - } - } diff --git a/api/src/com/cloud/agent/api/baremetal/PreparePxeServerAnswer.java b/api/src/com/cloud/agent/api/baremetal/PreparePxeServerAnswer.java new file mode 100644 index 00000000000..06066b85d87 --- /dev/null +++ b/api/src/com/cloud/agent/api/baremetal/PreparePxeServerAnswer.java @@ -0,0 +1,13 @@ +package com.cloud.agent.api.baremetal; + +import com.cloud.agent.api.Answer; + +public class PreparePxeServerAnswer extends Answer { + public PreparePxeServerAnswer(PreparePxeServerCommand cmd) { + super(cmd, true, "SUCCESS"); + } + + public PreparePxeServerAnswer(PreparePxeServerCommand cmd, String details) { + super(cmd, false, details); + } +} diff --git a/api/src/com/cloud/agent/api/baremetal/PreparePxeServerCommand.java b/api/src/com/cloud/agent/api/baremetal/PreparePxeServerCommand.java new file mode 100644 index 00000000000..a7bb84475e0 --- /dev/null +++ b/api/src/com/cloud/agent/api/baremetal/PreparePxeServerCommand.java @@ -0,0 +1,64 @@ +package com.cloud.agent.api.baremetal; + +import com.cloud.agent.api.Command; + +public class PreparePxeServerCommand extends Command { + + String ip; + String mac; + String netMask; + String gateway; + String dns; + String template; + String vmName; + String hostName; + + @Override + public boolean executeInSequence() { + return true; + } + + public PreparePxeServerCommand(String ip, String mac, String netMask, String gateway, String dns, String template, String vmName, String hostName) { + this.ip = ip; + this.mac = mac; + this.netMask = netMask; + this.gateway = gateway; + this.dns = dns; + this.template = template; + this.vmName = vmName; + this.hostName = hostName; + } + + public String getIp() { + return ip; + } + + public String getMac() { + return mac; + } + + public String getNetMask() { + return netMask; + } + + public String getGateWay() { + return gateway; + } + + public String getDns() { + return dns; + } + + public String getTemplate() { + return template; + } + + public String getVmName() { + return vmName; + } + + public String getHostName() { + return hostName; + } + +} diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index ba701394dc1..2c1a2c2aa8a 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -213,5 +213,10 @@ public class ApiConstants { public static final String PRIVATE_NETMASK = "privatenetmask"; public static final String PRIVATE_NETWORK_ID = "privatenetworkid"; public static final String USE_EXTERNAL_DHCP = "useexternaldhcp"; + public static final String PING_STORAGE_SERVER_IP = "pingstorageserverip"; + public static final String PING_DIR = "pingdir"; + public static final String TFTP_DIR = "tftpdir"; + public static final String PING_CIFS_USERNAME = "pingcifsusername"; + public static final String PING_CIFS_PASSWORD = "pingcifspassword"; } diff --git a/build/build-cloud.xml b/build/build-cloud.xml index f2e531008ce..5cdaa0b5f09 100755 --- a/build/build-cloud.xml +++ b/build/build-cloud.xml @@ -212,6 +212,7 @@ + @@ -222,7 +223,8 @@ - + + diff --git a/scripts/network/exdhcp/dhcpd_edithosts.py b/scripts/network/exdhcp/dhcpd_edithosts.py index c46f5975a72..652cdbeb3b1 100644 --- a/scripts/network/exdhcp/dhcpd_edithosts.py +++ b/scripts/network/exdhcp/dhcpd_edithosts.py @@ -10,8 +10,8 @@ usage = '''dhcpd_edithosts.py mac ip hostname dns gateway nextserver''' conf_path = "/etc/dhcpd.conf" file_lock = "/etc/dhcpd.conf_locked" sleep_max = 20 -host_entry = 'host %s { hardware ethernet %s; fixed-address %s; option domain-name-servers %s; option domain-name "%s"; option routers %s; default-lease-time infinite; max-lease-time infinite; min-lease-time infinite;}' -host_entry1 = 'host %s { hardware ethernet %s; fixed-address %s; option domain-name-servers %s; option domain-name "%s"; option routers %s; default-lease-time infinite; max-lease-time infinite; min-lease-time infinite; next-server %s;}' +host_entry = 'host %s { hardware ethernet %s; fixed-address %s; option domain-name-servers %s; option domain-name "%s"; option routers %s; default-lease-time infinite; max-lease-time infinite; min-lease-time infinite; filename "pxelinux.0";}' +host_entry1 = 'host %s { hardware ethernet %s; fixed-address %s; option domain-name-servers %s; option domain-name "%s"; option routers %s; default-lease-time infinite; max-lease-time infinite; min-lease-time infinite; next-server %s; filename "pxelinux.0";}' def lock(): if exists(file_lock): count = 0 @@ -95,6 +95,12 @@ if __name__ == "__main__": gateway = sys.argv[5] next_server = sys.argv[6] + if exists(conf_path) == False: + conf_path = "/etc/dhcp/dhcpd.conf" + if exists(conf_path) == False: + print "Cannot find dhcpd.conf" + sys.exit(1) + ret = insert_host_entry(mac, ip, hostname, dns, gateway, next_server) sys.exit(ret) diff --git a/scripts/network/ping/ping.tar.bz2 b/scripts/network/ping/ping.tar.bz2 new file mode 100644 index 00000000000..97bcfeea88e Binary files /dev/null and b/scripts/network/ping/ping.tar.bz2 differ diff --git a/scripts/network/ping/prepare_ping.sh b/scripts/network/ping/prepare_ping.sh new file mode 100644 index 00000000000..a9d868065e7 --- /dev/null +++ b/scripts/network/ping/prepare_ping.sh @@ -0,0 +1,64 @@ +#!/bin/sh +# usage prepare_ping.sh subnet tftp_dir + +dhcpd_conf= +subnet=$1 +tftp_dir=$2 + +exit_with_error() { + echo $1 + exit 1 +} + +exit_if_fail() { + [ $? -ne 0 ] && exit_with_error "$*" +} + +config_dhcpd() { + echo "$*" >> $dhcpd_conf + [ $? -ne 0 ] && exit_with_error "echo $* failed" +} + +[ $# -ne 2 ] && exit_with_error "Usage:prepare_ping.sh subnet tftp_dir" + +if [ -f "/etc/dhcp/dhcpd.conf" ]; then + dhcpd_conf="/etc/dhcp/dhcpd.conf" +fi + +if [ x"$dhcpd_conf" == "x" ] && [ -f "/etc/dhcpd.conf" ]; then + dhcpd_conf="/etc/dhcpd.conf" +fi + +if [ x"$dhcpd_conf" == "x" ]; then + exit_with_error "Cannot find dhcpd.conf" +fi + +signature=`head -n 1 $dhcpd_conf` +if [ x"$signature" != x"# CloudStack" ]; then + # prepare dhcpd + cp $dhcpd_conf /etc/dhcpd.conf.bak -f + exit_if_fail "Cannot back dhcpd.conf" + echo "# CloudStack" > $dhcpd_conf + echo "# This is produced by CloudStack" >> $dhcpd_conf + config_dhcpd ddns-update-style interim\; + config_dhcpd subnet $subnet netmask 255.255.255.0 {} + config_dhcpd allow booting\; + config_dhcpd allow bootp\; +fi + +# prepare tftp +pushd $tftp_dir $>/dev/null +[ -f ping.tar.bz2 ] || exit_with_error "Cannot find ping.tar.bz2 at $tftp_dir" +tar xjf ping.tar.bz2 +exit_if_fail "tar xjf ping.tar.bz2 failed" +#rm ping.tar.bz2 -f +#exit_if_fail "rm ping.tar.bz2 failed" +if [ ! -d pxelinux.cfg ]; then + mkdir pxelinux.cfg + exit_if_fail "Cannot create pxelinux.cfg" +fi +popd + +service dhcpd restart +exit_if_fail "service dhcpd restart failed" +exit 0 diff --git a/scripts/network/ping/prepare_tftp_bootfile.py b/scripts/network/ping/prepare_tftp_bootfile.py new file mode 100644 index 00000000000..581ddd82b65 --- /dev/null +++ b/scripts/network/ping/prepare_tftp_bootfile.py @@ -0,0 +1,58 @@ +#!/usr/bin/python +# Usage: prepare_tftp_bootfile.py tftp_dir mac cifs_server share directory image_to_restore cifs_username cifs_password +import os, sys +from sys import exit +from os import makedirs +from os.path import exists, join + +template = '''DEFAULT default +PROMPT 1 +TIMEOUT 26 +DISPLAY boot.msg +LABEL default +KERNEL kernel +APPEND vga=normal devfs=nomount pxe ramdisk_size=66000 load_ramdisk=1 init=/linuxrc prompt_ramdisk=0 initrd=initrd.gz root=/dev/ram0 rw noapic nolapic lba combined_mode=libata ide0=noprobe nomce pci=nomsi irqpoll quiet Server="%s" Share="%s" Directory="%s" Image_To_Restore="%s" After_Completion="Reboot" CIFS_Preferred="Y" Zsplit_Preferred="Y" AUTO="Y" User="%s" Passwd="%s" Extend_Parts_Whenever_Possible="N" Replace_BIOS="N" +''' + +tftp_dir = '' +mac = '' +cifs_server = '' +share = '' +directory = '' +image_to_restore = '' +cifs_username = '' +cifs_password = '' + +def prepare_boot_file(): + try: + pxelinux = join(tftp_dir, "pxelinux.cfg") + if exists(pxelinux) == False: + makedirs(pxelinux) + + cfg_name = "01-" + mac.replace(':','-') + cfg_path = join(pxelinux, cfg_name) + f = open(cfg_path, "w") + stuff = template % (cifs_server, share, directory, image_to_restore, cifs_username, cifs_password) + f.write(stuff) + f.close() + return 0 + except IOError, e: + print e + return 1 + +if __name__ == "__main__": + if len(sys.argv) < 9: + print "Usage: prepare_tftp_bootfile.py tftp_dir mac cifs_server share directory image_to_restor cifs_username cifs_password" + exit(1) + + tftp_dir = sys.argv[1] + mac = sys.argv[2] + cifs_server = sys.argv[3] + share = sys.argv[4] + directory = sys.argv[5] + image_to_restore = sys.argv[6] + cifs_username = sys.argv[7] + cifs_password = sys.argv[8] + + ret = prepare_boot_file() + exit(ret)