mirror of
https://github.com/webmin/webmin.git
synced 2026-06-20 19:30:30 +01:00
Slice creation and deletion now working
This commit is contained in:
@@ -220,11 +220,12 @@ sub execute_fdisk_commands
|
||||
{
|
||||
my ($disk, $cmds) = @_;
|
||||
my $temp = &transname();
|
||||
&open_tempfile(TEMP, ">$temp");
|
||||
my $fh = "TEMP";
|
||||
&open_tempfile($fh, ">$temp");
|
||||
foreach my $c (@$cmds) {
|
||||
&print_tempfile(TEMP, $c."\n");
|
||||
&print_tempfile($fh, $c."\n");
|
||||
}
|
||||
&close_tempfile(TEMP);
|
||||
&close_tempfile($fh);
|
||||
my $out = &backquote_logged("fdisk -f $temp $disk->{'device'} </dev/null 2>&1");
|
||||
my $ex = $?;
|
||||
&unlink_file($temp);
|
||||
@@ -240,4 +241,17 @@ return &execute_fdisk_commands($disk,
|
||||
[ "p $slice->{'number'} 0 0 0" ]);
|
||||
}
|
||||
|
||||
# create_slice(&disk, &slice)
|
||||
# Add a slice to a disk
|
||||
sub create_slice
|
||||
{
|
||||
my ($disk, $slice) = @_;
|
||||
my $type = hex($slice->{'type'});
|
||||
my $start = int(($slice->{'startblock'} * $disk->{'blocksize'}) / 1024);
|
||||
my $end = int((($slice->{'startblock'} + $slice->{'blocks'}) *
|
||||
$disk->{'blocksize'}) / 1024);
|
||||
return &execute_fdisk_commands($disk,
|
||||
[ "p $slice->{'number'} $type ${start}K ${end}K" ]);
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
52
bsdfdisk/create_slice.cgi
Normal file
52
bsdfdisk/create_slice.cgi
Normal file
@@ -0,0 +1,52 @@
|
||||
#!/usr/local/bin/perl
|
||||
# Actually create a new slice
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
require './bsdfdisk-lib.pl';
|
||||
our (%in, %text, $module_name);
|
||||
&ReadParse();
|
||||
&error_setup($text{'nslice_err'});
|
||||
|
||||
# Get the disk
|
||||
my @disks = &list_disks_partitions();
|
||||
my ($disk) = grep { $_->{'device'} eq $in{'device'} } @disks;
|
||||
$disk || &error($text{'disk_egone'});
|
||||
|
||||
# Validate inputs, starting with slice number
|
||||
my $slice = { };
|
||||
$in{'number'} =~ /^\d+$/ || &error($text{'nslice_enumber'});
|
||||
my ($clash) = grep { $_->{'number'} == $in{'number'} } @{$disk->{'slices'}};
|
||||
$clash && &error(&text('nslice_eclash', $in{'number'}));
|
||||
$slice->{'number'} = $in{'number'};
|
||||
|
||||
# Start and end blocks
|
||||
$in{'start'} =~ /^\d+$/ || &error($text{'nslice_estart'});
|
||||
$in{'end'} =~ /^\d+$/ || &error($text{'nslice_eend'});
|
||||
$in{'start'} < $in{'end'} || &error($text{'nslice_erange'});
|
||||
$slice->{'startblock'} = $in{'start'};
|
||||
$slice->{'blocks'} = $in{'end'} - $in{'start'};
|
||||
|
||||
# Slice type
|
||||
$slice->{'type'} = $in{'type'};
|
||||
|
||||
# Do the creation
|
||||
&ui_print_header($disk->{'desc'}, $text{'nslice_title'}, "");
|
||||
|
||||
print &text('nslice_creating', $in{'number'}, $disk->{'desc'}),"<p>\n";
|
||||
my $err = &create_slice($disk, $slice);
|
||||
if ($err) {
|
||||
print &text('nslice_failed', $err),"<p>\n";
|
||||
}
|
||||
else {
|
||||
print &text('nslice_done'),"<p>\n";
|
||||
}
|
||||
|
||||
if (!$err && $in{'makepart'}) {
|
||||
# Also create a partition
|
||||
# XXX
|
||||
}
|
||||
|
||||
&ui_print_footer("edit_disk.cgi?device=$in{'device'}",
|
||||
$text{'disk_return'});
|
||||
|
||||
@@ -24,6 +24,7 @@ disk_size=Size
|
||||
disk_dsize=<b>Disk size:</b> $1
|
||||
disk_model=<b>Make and model:</b> $1
|
||||
disk_cylinders=<b>Cylinders:</b> $1
|
||||
disk_blocks=<b>Blocks:</b> $1
|
||||
disk_device=<b>Device file:</b> $1
|
||||
disk_return=list of slices
|
||||
disk_add=Create a new slice.
|
||||
@@ -66,3 +67,13 @@ nslice_start=Starting block
|
||||
nslice_end=Ending block
|
||||
nslice_type=New slice type
|
||||
nslice_makepart=Also create partition?
|
||||
nslice_err=Failed to create slice
|
||||
nslice_enumber=Missing or non-numeric slice number
|
||||
nslice_eclash=A slice with number $1 already exists
|
||||
nslice_estart=Starting block must be a number
|
||||
nslice_eend=Ending block must be a number
|
||||
nslice_erange=Starting block must be lower than the ending block
|
||||
nslice_emax=Ending block cannot be larger than the disk size of $1 blocks
|
||||
nslice_creating=Creating slice $1 on $2 ..
|
||||
nslice_failed=.. slice creation failed : $1
|
||||
nslice_done=.. slice added
|
||||
|
||||
@@ -15,11 +15,12 @@ $disk || &error($text{'disk_egone'});
|
||||
&ui_print_header($disk->{'desc'}, $text{'nslice_title'}, "");
|
||||
|
||||
print &ui_form_start("create_slice.cgi", "post");
|
||||
print &ui_hidden("device", $in{'device'});
|
||||
print &ui_table_start($text{'nslice_header'}, undef, 2);
|
||||
|
||||
# Slice number (first free)
|
||||
my %used = map { $_->{'number'}, $_ } @{$disk->{'slices'}};
|
||||
my $n = 0;
|
||||
my $n = 1;
|
||||
while($used{$n}) {
|
||||
$n++;
|
||||
}
|
||||
@@ -31,12 +32,11 @@ print &ui_table_row($text{'nslice_diskblocks'},
|
||||
$disk->{'blocks'});
|
||||
|
||||
# Start and end blocks (defaults to last slice+1)
|
||||
my ($start, $end);
|
||||
my ($start, $end) = (0, $disk->{'blocks'});
|
||||
foreach my $s (sort { $a->{'startblock'} cmp $b->{'startblock'} }
|
||||
@{$disk->{'slices'}}) {
|
||||
$start = $s->{'startblock'} + $s->{'blocks'} + 1;
|
||||
}
|
||||
$end = $disk->{'blocks'} - 1;
|
||||
print &ui_table_row($text{'nslice_start'},
|
||||
&ui_textbox("start", $start, 10));
|
||||
print &ui_table_row($text{'nslice_end'},
|
||||
|
||||
Reference in New Issue
Block a user