summaryrefslogtreecommitdiffstats
path: root/lib/MGA/DrakISO/Media.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/MGA/DrakISO/Media.pm')
-rw-r--r--lib/MGA/DrakISO/Media.pm88
1 files changed, 88 insertions, 0 deletions
diff --git a/lib/MGA/DrakISO/Media.pm b/lib/MGA/DrakISO/Media.pm
new file mode 100644
index 0000000..97e21ab
--- /dev/null
+++ b/lib/MGA/DrakISO/Media.pm
@@ -0,0 +1,88 @@
+package MGA::DrakISO::Media;
+
+use MDK::Common;
+use MGA::DrakISO::Storage;
+use POSIX;
+use common;
+
+sub new {
+ my ($media) = @_;
+
+ bless $media, 'MGA::DrakISO::Media';
+
+ $media->{partitions} ||= [ { mntpoint => '/' } ];
+
+ foreach my $mntpoint (qw(/ OEM_RESCUE)) {
+ my $part = find { $_->{mntpoint} eq $mntpoint } @{$media->{partitions}};
+ $part->{fs_type} ||= $media->get_media_setting('fs');
+ if (my $label = $mntpoint eq '/' && $media->get_media_label) {
+ $part->{device_LABEL} ||= $label;
+ }
+ }
+
+ $media->{boot_entries} ||= [ '' => '' ];
+
+ $media;
+}
+
+sub get_initrd_path {
+ my ($media) = @_;
+ '/' . $media->{storage} . '/initrd.gz';
+}
+
+#- mainly for storage-specific subroutines
+sub get_storage_setting {
+ my ($media, $setting) = @_;
+ $MGA::DrakISO::Storage::storage_types{$media->{storage}}{$setting};
+}
+
+#- for actions that support an optional boot storage type
+sub get_boot_setting {
+ my ($media, $setting, $opts) = @_;
+ $opts->{boot} ? $MGA::DrakISO::Storage::storage_types{$opts->{boot}}{$setting} : get_media_setting($media, $setting);
+}
+
+#- for user-customisable media setting, that can override storage setting
+sub get_media_setting {
+ my ($media, $setting) = @_;
+ $media->{$setting} || $media->get_storage_setting($setting);
+}
+
+sub get_media_fs_module {
+ my ($media) = @_;
+ my $fs = $media->get_media_setting('fs');
+ $fs eq 'iso9660' ? 'isofs' : $fs eq 'ext2' ? @{[]} : $fs;
+}
+
+sub get_media_label {
+ my ($media) = @_;
+ first($media->get_media_setting('source') =~ /^LABEL=(.*)$/);
+}
+
+sub get_media_source_for_nash {
+ my ($media) = @_;
+ my $label = $media->get_media_label;
+ #- strip vfat labels to 11 chars and upper-case it
+ $label && $media->get_media_setting('fs') eq 'vfat' ?
+ 'LABEL=' . uc(substr($label, 0, 11)) :
+ $media->get_media_setting('source');
+}
+
+sub find_partition_index {
+ my ($media, $mntpoint) = @_;
+ eval { find_index { $_->{mntpoint} eq $mntpoint } @{$media->{partitions}} };
+}
+
+sub find_boot_partition_index {
+ my ($media) = @_;
+ $media->find_partition_index('/boot') || $media->find_partition_index('/');
+}
+
+sub supplement_slash_size {
+ my ($media, $total_size) = @_;
+ my $correction = 1.2;
+ my $slash = find { $_->{mntpoint} eq '/' } @{$media->{partitions}};
+ $slash->{size} ||= POSIX::ceil($total_size * $correction / $common::SECTORSIZE);
+}
+
+1;