Handle hostnames with upper-case letters
[webmin.git] / zones / create_zone.cgi
1 #!/usr/local/bin/perl
2 # Actually creates a new zone
3
4 require './zones-lib.pl';
5 do 'forms-lib.pl';
6 &ReadParse();
7 &error_setup($text{'create_err'});
8 &foreign_require("time", "time-lib.pl");
9 &foreign_require("useradmin", "user-lib.pl");
10
11 # Validate inputs
12 $form = &get_create_form(\%in);
13 $form->validate_redirect("create_form.cgi");
14 $path = $form->get_value("path") || "$config{'base_dir'}/$in{'name'}";
15 mkdir($config{'base_dir'}, 0700);
16 -d $path && $form->validate_redirect("create_form.cgi",
17                 [ [ "path", &text('create_epath2', $path) ] ]);
18 @pkgs = split(/[\r\n]+/, $form->get_value("pkgs"));
19 if ($in{'webmin'}) {
20         push(@pkgs, $root_directory);
21         }
22 if ($in{'cfg'}) {
23         # Validate initial configuration fields, and create sysidcfg
24         @sysidcfg = ( );
25         if ($in{'root_def'}) {
26                 ($root) = grep { $_->{'user'} eq 'root' }
27                           &useradmin::list_users();
28                 $root || &error($text{'create_eroot'});
29                 push(@sysidcfg, [ 'root_password' => $root->{'pass'} ]);
30                 }
31         else {
32                 push(@sysidcfg, [ 'root_password' =>
33                                 &useradmin::encrypt_password(
34                                         $form->get_value("root")) ]);
35                 }
36         if ($in{'timezone_def'}) {
37                 push(@sysidcfg, [ 'timezone' =>
38                                    &time::get_current_timezone() ]);
39                 }
40         else {
41                 push(@sysidcfg, [ 'timezone' => $form->get_value('timezone') ]);
42                 }
43         if ($in{'locale_def'}) {
44                 push(@sysidcfg, [ 'system_locale' => &get_global_locale() ]);
45                 }
46         else {
47                 push(@sysidcfg, [ 'system_locale' => $form->get_value('locale') ]);
48                 }
49         if ($in{'terminal_def'}) {
50                 push(@sysidcfg, [ 'terminal' => 'vt100' ]);
51                 }
52         else {
53                 push(@sysidcfg, [ 'terminal' => $form->get_value('terminal') ]);
54                 }
55
56         # Setup DNS or NIS resolution
57         $ns = [ uc($form->get_value('resolv')) ];
58         if ($form->get_value('resolv') ne 'none') {
59                 push(@$ns, [ 'domain_name' => $form->get_value("domain") ]);
60                 foreach $n (split(/\s+/, $in{'server'})) {
61                         $ip = &to_ipaddress($n);
62                         push(@$ns, [ 'name_server' => "$n($ip)" ]);
63                         }
64                 }
65         push(@sysidcfg, [ 'name_service' => $ns ]);
66         
67         # Set the NFS4 Domain as dynamic so that
68     # upon first boot we don't get asked
69         push(@sysidcfg, ['nfs4_domain' => "dynamic"]);
70
71         # Setup network interface config
72         push(@sysidcfg, [ 'security_policy' => 'NONE' ]);
73         if ($in{'hostname_def'}) {
74                 $hostname = $form->get_value("name");
75                 }
76         else {
77                 $hostname = $form->get_value("hostname");
78                 }
79         if ($in{'address_def'}) {
80                 push(@sysidcfg, [ 'network_interface' =>
81                         [ "none", [ 'hostname' => $hostname ] ] ]);
82                 }
83         else {
84                 &to_ipaddress($hostname) ||
85                         $form->validate_redirect("create_form.cgi",
86                             [ [ "hostname", $text{'create_eresolvname'} ] ]);
87                 push(@sysidcfg, [ 'network_interface' =>
88                         [ "primary", [ 'hostname' => $hostname ],
89                                      [ 'ip_address' => $in{'address'} ],
90                             $in{'router_def'} ? ( ) : (
91                                 [ 'default_route' => $in{'router'} ] ) ] ]);
92                 }
93         }
94
95 $p = new Webmin::Page(undef, $text{'create_title'});
96
97 $d1 = new Webmin::DynamicHTML(\&execute_create, undef, $text{'create_adding'});
98 $p->add_form($d1);
99 sub execute_create
100 {
101 $zinfo = &create_zone($form->get_value("name"), $path);
102 $p->add_message_after($d1, $text{'create_done'});
103 }
104
105 if (!$in{'address_def'}) {
106         # Set initial network address
107         $d2 = new Webmin::DynamicHTML(\&execute_address, undef, $text{'create_addingnet'});
108         $p->add_form($d2);
109           sub execute_address
110           {
111           $net = { 'keytype' => 'net',
112                  'address' => $in{'address'},
113                  'physical' => $in{'physical'} };
114           &create_zone_object($zinfo, $net);
115           $p->add_message_after($d2, $text{'create_done'});
116           }
117         }
118
119 # Add or remove extra package directories
120 # add for sparse root zone and remove for whole root zone
121 if ($in{'inherit'} eq '0' ) {
122         $d3 = new Webmin::DynamicHTML(\&remove_pkgs, undef, $text{'create_removingpkgs'});
123                 $p->add_form($d3);
124         sub remove_pkgs
125         {
126                 $pkg = { 'keytype' => 'inherit-pkg-dir' };
127                 &delete_zone_object($zinfo,$pkg);
128                 $p->add_message_after($d3, $text{'create_done'});
129         }
130 }
131   else {
132         if (@pkgs) {
133                 $d3 = new Webmin::DynamicHTML(\&execute_pkgs, undef, $text{'create_addingpkgs'});
134                 $p->add_form($d3);
135                   sub execute_pkgs
136                   {
137                   foreach $p (@pkgs) {
138                         $pkg = { 'keytype' => 'inherit-pkg-dir',
139                                  'dir' => $p };
140                         &create_zone_object($zinfo, $pkg);
141                         }
142                   $p->add_message_after($d3, $text{'create_done'});
143                   }
144                 }
145         }
146
147 #set the brand
148 if ($in{'brand'}) {
149         $d4 = new Webmin::DynamicHTML(\&create_brand,undef, $text{'create_brandmsg'});
150         $p->add_form($d4);
151         
152         sub create_brand
153         {
154                 &set_zone_variable($zinfo,"brand",$form->get_value("brand"));
155                 $p->add_message_after($d4, $text{'create_done'});
156         }
157 }
158
159 if ($in{'install'}) {
160         # Install software
161         $d5 = new Webmin::DynamicText(\&execute_install);
162         $p->add_form($d5);
163         $d5->set_message($text{'create_installing'});
164         $d5->set_wait(1);
165           sub execute_install
166           {
167           local $ok = &callback_zone_command($zinfo, "install",
168                                 \&Webmin::DynamicText::add_line, [ $d5 ]);
169           if ($ok) {
170                 $p->add_message_after($d5, $text{'create_done'});
171                 }
172           else {
173                 $p->add_error_after($d5, $text{'create_failed'});
174                 }
175
176           if (@sysidcfg) {
177                 # Save the sysidcfg file
178                 &save_sysidcfg(\@sysidcfg, "$path/root/etc/sysidcfg");
179                 }
180                 if (-e "$path/root/etc/.UNCONFIGURED") {
181                 # If the file .UNCONFIGURED is there remove it
182                         &system_logged("rm -f $path/root/etc/.UNCONFIGUREED");
183                 }
184           &config_zone_nfs($zinfo);
185           &run_zone_command($zinfo, "boot");
186           }
187         }
188 else {
189         # Save sysidcfg for later install
190         if (@sysidcfg) {
191                 &save_sysidcfg(\@sysidcfg, &zone_sysidcfg_file($in{'name'}));
192                 }
193         }
194
195 if ($in{'install'} && $in{'webmin'}) {
196         # Create a Webmin setup script and run it
197         $d6 = new Webmin::DynamicText(\&execute_webmin);
198         $p->add_form($d6);
199         $d6->set_message($text{'create_webmining'});
200         $d6->set_wait(1);
201
202         sub execute_webmin
203         {
204         $script = &get_zone_root($zinfo)."/tmp/install-webmin";
205         $err = &create_webmin_install_script($zinfo, $script);
206         if ($err) {
207                 $p->add_error_after($d6, &text('created_wfailed', $err));
208                 }
209         else {
210                 $ex = &run_in_zone_callback($zinfo, "/tmp/install-webmin",
211                                 \&Webmin::DynamicText::add_line, [ $d ]);
212                 if (!$ex) {
213                         $p->add_message($text{'create_done'});
214                         &post_webmin_install($zinfo);
215                         }
216                 else {
217                         $p->add_error($text{'create_failed'});
218                         }
219                 }
220         }
221         }
222
223 $p->add_footer("index.cgi", $text{'index_return'});
224 $p->print();
225 &webmin_log("create", "zone", $in{'name'});
226