sub generate_configdrive2 {
my ($conf, $vmid, $drive, $volname, $storeid) = @_;
- my ($user_data, $network_data, $meta_data) = get_custom_cloudinit_files($conf);
+ my ($user_data, $network_data, $meta_data, $vendor_data) = get_custom_cloudinit_files($conf);
$user_data = cloudinit_userdata($conf, $vmid) if !defined($user_data);
$network_data = configdrive2_network($conf) if !defined($network_data);
if (!defined($meta_data)) {
$meta_data = configdrive2_gen_metadata($user_data, $network_data);
}
+
+ my $sum = length($user_data) + length($network_data) + length($meta_data) + length($vendor_data);
+ die "Cloud-Init sum of snippets too big (> 3 MiB)\n" if $sum > (3 * 1024 * 1024);
+
my $files = {
'/openstack/latest/user_data' => $user_data,
'/openstack/content/0000' => $network_data,
- '/openstack/latest/meta_data.json' => $meta_data
+ '/openstack/latest/meta_data.json' => $meta_data,
+ '/openstack/latest/vendor_data.json' => $vendor_data
};
commit_cloudinit_disk($conf, $vmid, $drive, $volname, $storeid, $files, 'config-2');
}
sub generate_opennebula {
my ($conf, $vmid, $drive, $volname, $storeid) = @_;
- my ($hostname, $fqdn) = get_hostname_fqdn($conf, $vmid);
-
my $content = "";
my $username = $conf->{ciuser} || "root";
- my $password = encode_base64($conf->{cipassword}) if defined($conf->{cipassword});
-
$content .= "USERNAME=$username\n" if defined($username);
- $content .= "CRYPTED_PASSWORD_BASE64=$password\n" if defined($password);
-
- if (defined(my $keys = $conf->{sshkeys})) {
- $keys = URI::Escape::uri_unescape($keys);
- $keys = [map { my $key = $_; chomp $key; $key } split(/\n/, $keys)];
- $keys = [grep { /\S/ } @$keys];
- $content .= "SSH_PUBLIC_KEY=\"";
-
- foreach my $k (@$keys) {
- $content .= "$k\n";
- }
- $content .= "\"\n";
+ if (defined(my $password = $conf->{cipassword})) {
+ $content .= "CRYPTED_PASSWORD_BASE64=". encode_base64($password) ."\n";
}
- my ($searchdomains, $nameservers) = get_dns_conf($conf);
- if ($nameservers && @$nameservers) {
- $nameservers = join(' ', @$nameservers);
- $content .= "DNS=\"$nameservers\"\n";
+ if (defined($conf->{sshkeys})) {
+ my $keys = [ split(/\s*\n\s*/, URI::Escape::uri_unescape($conf->{sshkeys})) ];
+ $content .= "SSH_PUBLIC_KEY=\"". join("\n", $keys->@*) ."\"\n";
}
+ my ($hostname, $fqdn) = get_hostname_fqdn($conf, $vmid);
$content .= "SET_HOSTNAME=$hostname\n";
- if ($searchdomains && @$searchdomains) {
- $searchdomains = join(' ', @$searchdomains);
- $content .= "SEARCH_DOMAIN=\"$searchdomains\"\n";
- }
+ my ($searchdomains, $nameservers) = get_dns_conf($conf);
+ $content .= 'DNS="' . join(' ', @$nameservers) ."\"\n" if $nameservers && @$nameservers;
+ $content .= 'SEARCH_DOMAIN="'. join(' ', @$searchdomains) ."\"\n" if $searchdomains && @$searchdomains;
my $networkenabled = undef;
my @ifaces = grep { /^net(\d+)$/ } keys %$conf;
$networkenabled = 1;
if ($ipconfig->{ip} eq 'dhcp') {
- $content .= $ethid."_DHCP=YES\n";
+ $content .= "${ethid}_DHCP=YES\n";
} else {
my ($addr, $mask) = split_ip4($ipconfig->{ip});
- $content .= $ethid."_IP=$addr\n";
- $content .= $ethid."_MASK=$mask\n";
- $content .= $ethid."_MAC=$mac\n";
- $content .= $ethid."_GATEWAY=$ipconfig->{gw}\n" if $ipconfig->{gw};
+ $content .= "${ethid}_IP=$addr\n";
+ $content .= "${ethid}_MASK=$mask\n";
+ $content .= "${ethid}_MAC=$mac\n";
+ $content .= "${ethid}_GATEWAY=$ipconfig->{gw}\n" if $ipconfig->{gw};
}
- $content .= $ethid."_MTU=$net->{mtu}\n" if $net->{mtu};
+ $content .= "${ethid}_MTU=$net->{mtu}\n" if $net->{mtu};
}
if ($ipconfig->{ip6}) {
$networkenabled = 1;
if ($ipconfig->{ip6} eq 'dhcp') {
- $content .= $ethid."_DHCP6=YES\n";
+ $content .= "${ethid}_DHCP6=YES\n";
} elsif ($ipconfig->{ip6} eq 'auto') {
- $content .= $ethid."_AUTO6=YES\n";
+ $content .= "${ethid}_AUTO6=YES\n";
} else {
my ($addr, $mask) = split('/', $ipconfig->{ip6});
- $content .= $ethid."_IP6=$addr\n";
- $content .= $ethid."_MASK6=$mask\n";
- $content .= $ethid."_MAC6=$mac\n";
- $content .= $ethid."_GATEWAY6=$ipconfig->{gw6}\n" if $ipconfig->{gw6};
+ $content .= "${ethid}_IP6=$addr\n";
+ $content .= "${ethid}_MASK6=$mask\n";
+ $content .= "${ethid}_MAC6=$mac\n";
+ $content .= "${ethid}_GATEWAY6=$ipconfig->{gw6}\n" if $ipconfig->{gw6};
}
- $content .= $ethid."_MTU=$net->{mtu}\n" if $net->{mtu};
+ $content .= "${ethid}_MTU=$net->{mtu}\n" if $net->{mtu};
}
}
$content .= "NETWORK=YES\n" if $networkenabled;
- my $files = {
- '/context.sh' => $content,
- };
+ my $files = { '/context.sh' => $content };
commit_cloudinit_disk($conf, $vmid, $drive, $volname, $storeid, $files, 'CONTEXT');
}
sub generate_nocloud {
my ($conf, $vmid, $drive, $volname, $storeid) = @_;
- my ($user_data, $network_data, $meta_data) = get_custom_cloudinit_files($conf);
+ my ($user_data, $network_data, $meta_data, $vendor_data) = get_custom_cloudinit_files($conf);
$user_data = cloudinit_userdata($conf, $vmid) if !defined($user_data);
$network_data = nocloud_network($conf) if !defined($network_data);
$meta_data = nocloud_gen_metadata($user_data, $network_data);
}
+ my $sum = length($user_data) + length($network_data) + length($meta_data) + length($vendor_data);
+ die "Cloud-Init sum of snippets too big (> 3 MiB)\n" if $sum > (3 * 1024 * 1024);
+
my $files = {
'/user-data' => $user_data,
'/network-config' => $network_data,
- '/meta-data' => $meta_data
+ '/meta-data' => $meta_data,
+ '/vendor-data' => $vendor_data
};
commit_cloudinit_disk($conf, $vmid, $drive, $volname, $storeid, $files, 'cidata');
}
my $network_volid = $files->{network};
my $user_volid = $files->{user};
my $meta_volid = $files->{meta};
+ my $vendor_volid = $files->{vendor};
my $storage_conf = PVE::Storage::config();
$meta_data = read_cloudinit_snippets_file($storage_conf, $meta_volid);
}
- return ($user_data, $network_data, $meta_data);
+ my $vendor_data;
+ if ($vendor_volid) {
+ $vendor_data = read_cloudinit_snippets_file($storage_conf, $vendor_volid);
+ }
+
+ return ($user_data, $network_data, $meta_data, $vendor_data);
}
sub read_cloudinit_snippets_file {