Slice creation and deletion now working

This commit is contained in:
Jamie Cameron
2013-03-27 17:06:33 -07:00
parent 16a668c093
commit e6a5fa4448
4 changed files with 83 additions and 6 deletions

View File

@@ -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
View 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'});

View File

@@ -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

View File

@@ -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'},