summaryrefslogtreecommitdiffstats
path: root/rescue/tree
diff options
context:
space:
mode:
Diffstat (limited to 'rescue/tree')
-rwxr-xr-xrescue/tree/bin/insmod3
-rw-r--r--rescue/tree/boot/grub/menu.lst5
-rw-r--r--rescue/tree/etc/hostname1
-rw-r--r--rescue/tree/etc/hosts2
-rw-r--r--rescue/tree/etc/inittab14
-rw-r--r--rescue/tree/etc/issue8
-rwxr-xr-xrescue/tree/etc/oem570
-rw-r--r--rescue/tree/etc/passwd5
-rw-r--r--rescue/tree/etc/profile4
-rwxr-xr-xrescue/tree/etc/rc.reboot8
-rwxr-xr-xrescue/tree/etc/rc.sysinit38
-rwxr-xr-xrescue/tree/sbin/modprobe40
-rwxr-xr-xrescue/tree/usr/bin/login (renamed from rescue/tree/bin/login)0
-rwxr-xr-xrescue/tree/usr/bin/mageia-rescue42
-rw-r--r--rescue/tree/usr/lib/CVS.0
-rw-r--r--rescue/tree/usr/lib/modules-load.d/mageia-rescue.conf8
-rwxr-xr-xrescue/tree/usr/lib/restore-image-lib.sh80
-rw-r--r--rescue/tree/usr/lib/systemd/system/rescue.service20
-rw-r--r--rescue/tree/usr/lib/systemd/system/systemd-udevd.service.d/dracut-rules.conf1
-rwxr-xr-xrescue/tree/usr/sbin/diskdrake-resize29
-rwxr-xr-xrescue/tree/usr/sbin/genpasswd13
-rwxr-xr-xrescue/tree/usr/sbin/grabjournallogs51
-rwxr-xr-xrescue/tree/usr/sbin/restore-image.sh412
-rwxr-xr-xrescue/tree/usr/sbin/startssh27
24 files changed, 695 insertions, 686 deletions
diff --git a/rescue/tree/bin/insmod b/rescue/tree/bin/insmod
deleted file mode 100755
index 717dc39e1..000000000
--- a/rescue/tree/bin/insmod
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-echo "Use modprobe instead"
-echo "Or even better use autoprobe"
diff --git a/rescue/tree/boot/grub/menu.lst b/rescue/tree/boot/grub/menu.lst
deleted file mode 100644
index 1af0c85e3..000000000
--- a/rescue/tree/boot/grub/menu.lst
+++ /dev/null
@@ -1,5 +0,0 @@
-timeout 0
-
-title oem
-kernel (hd0,0)/boot/vmlinuz ramdisk_size=32000 hd vga=788 fbeginner oem
-initrd (hd0,0)/boot/hd.rdz
diff --git a/rescue/tree/etc/hostname b/rescue/tree/etc/hostname
new file mode 100644
index 000000000..344f71bc8
--- /dev/null
+++ b/rescue/tree/etc/hostname
@@ -0,0 +1 @@
+rescue
diff --git a/rescue/tree/etc/hosts b/rescue/tree/etc/hosts
index a9bbdee7f..d02c36416 100644
--- a/rescue/tree/etc/hosts
+++ b/rescue/tree/etc/hosts
@@ -1 +1 @@
-127.0.0.1 mandrake-rescue
+127.0.0.1 mageia-rescue
diff --git a/rescue/tree/etc/inittab b/rescue/tree/etc/inittab
deleted file mode 100644
index 0ee36784f..000000000
--- a/rescue/tree/etc/inittab
+++ /dev/null
@@ -1,14 +0,0 @@
-#Inittab for Mandrake Rescue Disk
-#Author: Daouda Lo <daouda@mandrakesoft.com>
-id:3:initdefault:
-
-si::sysinit:/etc/rc.sysinit
-re:6:wait:/etc/rc.reboot
-ca:12345:ctrlaltdel:/sbin/init 6
-
-1:12345:respawn:/bin/bash --login
-2:23:respawn:/sbin/mingetty tty2
-3:23:respawn:/sbin/mingetty tty3
-4:23:respawn:/sbin/mingetty tty4
-5:23:respawn:/sbin/mingetty tty5
-6:23:respawn:/sbin/mingetty tty6
diff --git a/rescue/tree/etc/issue b/rescue/tree/etc/issue
index b1692cb15..11f9f3102 100644
--- a/rescue/tree/etc/issue
+++ b/rescue/tree/etc/issue
@@ -11,16 +11,20 @@
     [2[1;37;4
     
    
-    Linux-Mandrake Rescue Disk
+    Mageia Linux Rescue Disk
     
     
    
      

-Linux Mandrake release 8.0 (Cooker)
+DISTRIB_DESCR
Use loadkeys to change your keyboard layout (eg: loadkeys fr)
Use modprobe to load modules (eg: modprobe snd-card-fm801)
Use drvinst to install drivers according to detected devices
+Use lsparts to list your partitions with types
+Use startssh to start an ssh daemon
+Use rescue-gui to go back to the rescue menu
+Use grabjournallogs to grab the last 24 hours of journal logs
diff --git a/rescue/tree/etc/oem b/rescue/tree/etc/oem
deleted file mode 100755
index 823a0553f..000000000
--- a/rescue/tree/etc/oem
+++ /dev/null
@@ -1,570 +0,0 @@
-#!/usr/bin/perl
-
-if ($ARGV[0] ne '-f') {
- print "Call it with option -f, but don't fear loosing all your data, this command is dangerous!";
- exit 1;
-}
-
-my ($yes, $hd, $cd);
-do {
- print "
-
-I'm going to install the OEM version on your hard drive
-!!ALL DATA WILL BE LOST!!
-
-Type \`\`yes'' and [enter] to go on\n"
-} while (($yes = <STDIN>) !~ /^\s*yes\s*$/i);
-
-#- avoid globing as it is not available in rescue ramdisk.
-foreach my $device (split ' ', `/bin/ls -d /proc/ide/hd*`) {
- open F, "$device/media" or next;
- foreach (<F>) {
- /disk/ and do { $hd = $device; $hd =~ s,/proc/ide/,,; };
- /cdrom/ and do { $cd = $device; $cd =~ s,/proc/ide/,,; };
- }
- close F;
-}
--e "/dev/$hd" && -e "/dev/$cd" or die "unable to access hard disk or local cdrom";
-print "hd: $hd\ncd: $cd\n";
-
-#- find a cdrom (like) image, normally a true cdrom but if nfs install is running, use it instead.
-mkdir "/cdrom";
-open F, "/proc/cmdline";
-while (<F>) {
- /automatic=method:nfs,.*server:([^\s,]*),.*directory:([^\s,]*)/
- and system "mount", "-r", "-t", "nfs", "$1:$2", "/cdrom", "-o", "nolock";
-}
-close F;
--e "/cdrom/VERSION"
- or system "mount", "-r", "-t", "iso9660", "/dev/$cd", "/cdrom";
-
-#- detect language used.
-my ($lang, $flang);
-open F, "/cdrom/VERSION" or die "no installation cdrom found on $cd";
-while (<F>) {
- /[\s-]fr/ and ($lang, $flang) = ("fr", "fr_FR");
-}
-close F;
-#- default language fall to english ?
-$lang or ($lang, $flang) = ("en", "en_US");
-print "Found lang $lang\n";
-
-#- check for already existing partition table, if none are found
-#- create 3 partitions (one for install, one for swap and one for root).
-#- if only a fat partition is found, resize it do include the above partition.
-#- other combination are really dangerous and are not supported, ask
-#- the user that all data on the disk will be erased and go on.
-my ($hd_size, @hd_parts);
-for (1..2) {
- open F, "parted /dev/$hd print |";
- while (<F>) {
- /^Disk geometry [^:]*:\s*([\d\.]+)-([\d\.]+)/ and do { $hd_size = $2 - $1 };
- #/^Disk label type:\s*msdos/ and do { $hd_type = 'msdos' };
- /^(\d+)\s+([\d\.]+)\s+([\d\.]+)\s+(primary|logical|extended)\s*(\S*)/ and do {
- #- this automatically drops extended partition here!
- push @hd_parts, { minor => $1, start => $2, end => $3, type => $4, fstype => $5 };
- };
- }
- close F;
- $hd_size and last;
- print "Unable to detect partition on disk, trying with new label\n";
- system "parted", "/dev/$hd", "mklabel", "msdos";
-}
-my ($min_size, $def_size, $trigger_size, $inst_size, $swap_size) = (1700, 2700, 4000, 200, 128);
-$hd_size > $min_size or die "hard disk is too small to contain oem install (${hd_size}MB found, need $min_size at least)";
-
-my ($fat_pos, $resize_fat_size, $root_size);
-if (@hd_parts == 1 && $hd_parts[$fat_pos = 0]{fstype} eq 'FAT' ||
- @hd_parts == 2 && $hd_parts[0]{type} eq 'extended' && $hd_parts[$fat_pos = 1]{fstype} eq 'FAT') {
- if ($hd_size - $hd_parts[$fat_pos]{end} > $min_size) {
- #- check first if there are some available space left on the disk.
- #- so we are using it, root_size is fixed to match hard disk size.
- $resize_fat_size = 0;
- $root_size = $hd_size - $hd_parts[$fat_pos]{end} - $inst_size - $swap_size;
- $root_size > $trigger_size and $root_size = $def_size;
- } elsif ($hd_size > 2*$min_size) {
- #- resize this fat partition.
- $resize_fat_size = 0.5 * $hd_size;
- $root_size = $hd_size - $resize_fat_size - $inst_size - $swap_size;
- $root_size > $trigger_size and $root_size = $def_size;
- }
-}
-unless ($root_size) {
- #- there have not been defined above, so remove everything and start from
- #- a blank partition.
- $resize_fat_size = undef;
- $root_size = $hd_size - $resize_fat_size - $inst_size - $swap_size;
- $root_size > $trigger_size and $root_size = $def_size;
-}
-
-#- launch parted to edit partition table, start at minor.
-#- point define where we start.
-my $minor = defined $resize_fat_size && $fat_pos > 0 ? 6 : 5;
-my $point = 0.0;
-
-open F, "| parted -s /dev/$hd";
-if (defined $resize_fat_size) {
- #- keep the current partition table, and try to resize the fat partition
- #- if the size is not 0.
- #- KEEP IN MIND there is only one partition defined.
- $point = $hd_parts[$fat_pos]{start} + $resize_fat_size;
- printf F "resize %d %s %s\n", $hd_parts[$fat_pos]{minor}, $hd_parts[$fat_pos]{start}, $point;
-} else {
- #- build a new disk label here.
- print F "mklabel msdos\n";
-}
-#- all linux partition are stored inside an extended partition, this is easier to manipulate after.
-if ($minor == 5) {
- print F "mkpart extended $point $hd_size\n";
-} else {
- $hd_parts[0]{type} eq 'extended' or die "first partition assumed to be extended";
- $point = $hd_parts[0]{start};
- print F "resize $hd_parts[0]{minor} $point $hd_size\n";
-}
-printf F "mkpart logical ext2 %s %s\n", $point, $point+$inst_size; $point+=$inst_size;
-printf F "mkpart logical linux-swap %s %s\n", $point, $point+$swap_size; $point+=$inst_size;
-printf F "mkpart logical ext2 %s %s\n", $point, $point+$root_size < $hd_size ? $point+$root_size : $hd_size;
-print F "quit\n";
-close F or die "unable to partition the disk $hd";
-
-#- at this point, the partition are created.
-my ($instz, $inst, $swap, $root) = ($minor-1, $minor, $minor+1, $minor+2);
-
-#- we have to build swap and mount it.
-print "Setting swap\n";
-system "mkswap", "/dev/$hd$swap";
-system "swapon", "/dev/$hd$swap";
-
-#- we have
-print "Formatting /dev/$hd$inst partition\n";
-system "mkfs.ext2", "/dev/$hd$inst";
-print "Formatting /dev/$hd$root partition\n";
-system "mkfs.ext2", "/dev/$hd$root";
-
-print "Mounting partitions\n";
-mkdir "/hd";
-system "mount", "-t", "ext2", "/dev/$hd$inst", "/hd";
-mkdir "/mnt";
-system "mount", "-t", "ext2", "/dev/$hd$root", "/mnt";
-
-print "Copying installation on hard drive\n";
-if (-e "/boot/vmlinuz" && -e "/boot/hd.rdz" || -e "/cdrom/boot/vmlinuz" && -e "/cdrom/boot/hd.rdz") {
- system "cp", "-a", "/boot", "/cdrom/boot", "/hd";
-} else {
- mkdir "/hd/boot";
- unless (-e "/tmp/hd/vmlinuz" && -e "/tmp/hd/hd.rdz") {
- system "cp", "/cdrom/images/hd.img", "/hd/hd.img";
- mkdir "/tmp/hd";
- system "modprobe", "loop";
- system "mount", "/hd/hd.img", "/tmp/hd", "-o", "loop";
- }
- system "cp", "-a", "/tmp/hd/vmlinuz", "/tmp/hd/hd.rdz", "/hd/boot";
-}
-
-mkdir "/hd/Mandrake";
-mkdir "/hd/Mandrake/RPMS";
-system "cp", "-a", "/cdrom/Mandrake/base", "/cdrom/Mandrake/mdkinst", "/hd/Mandrake";
-
-print "Setting bootloader\n";
-mkdir "/hd/boot/grub";
-foreach (1..2) {
- -e "/hd/boot/grub/stage$_" or system "cp", "-a", "/boot/grub/stage$_", "/hd/boot/grub";
-}
-open F, ">/hd/boot/grub/menu.lst";
-if (defined $resize_fat_size) {
- print F "timeout 5\n";
- print F "color black/cyan yellow/cyan\n\n";
- print F "title linux\n";
-} else {
- print F "timeout 0\n\n";
- print F "title oem\n";
-}
-print F "kernel (hd0,$instz)/boot/vmlinuz ramdisk_size=32000 automatic=method:disk,disk:$hd,partition:$hd$inst,directory:/ hd vga=788 fbeginner oem\n";
-print F "initrd (hd0,$instz)/boot/hd.rdz\n";
-#- if a windows partition is available, add an entrie for it.
-if (defined $resize_fat_size) {
- print F "\ntitle windows\n";
- printf F "rootnoverify (hd0,%s)\n", $hd_parts[$fat_pos]{minor}-1;
- print F "makeactive\n";
- print F "chainloader +1\n";
-}
-close F;
-open F, "| grub --device-map=/hd/boot/grub/device.map --batch";
-print F "install (hd0,$instz)/boot/grub/stage1 d (hd0) (hd0,$instz)/boot/grub/stage2 p (hd0,$instz)/boot/grub/menu.lst\n";
-print F "quit\n";
-close F or die "error while executing grub";
-
-my $packages = select_packages("/cdrom", $lang);
-
-my @media;
-open F, "/cdrom/Mandrake/base/hdlists";
-foreach (<F>) {
- chomp;
- s/\s*#.*$//;
- /^\s*$/ and next;
- m/^\s*(hdlist\S*\.cz2?)\s+(\S+)\s*(.*)$/ or die "invalid hdlist description \"$_\" in hdlists file";
-
- push @media, { rpmsdir => $2, descr => $3 };
-}
-close F;
-
-#- initialize installation.
-$ENV{DURING_INSTALL} = 1;
-$ENV{RPM_INSTALL_LANG} = $lang;
-$ENV{LD_LIBRARY_PATH} = "/usr/X11R6/lib";
-$ENV{SECURE_LEVEL} = 2;
-foreach (qw(/etc /var /var/lib /var/lib/rpm /proc)) {
- mkdir "/mnt/$_";
-}
-system "mount", "-t", "proc", "proc", "/mnt/proc";
-open F, ">/mnt/etc/fstab";
-print F "/dev/$hd$root / ext2 defaults 1 1\n";
-close F;
-system "rpm", "--root", "/mnt", "--initdb";
-
-#- copy and install from each cd image.
-foreach my $medium (@media) {
- while (! -d "/cdrom/$medium->{rpmsdir}") {
- system "unmount", "/dev/$cd";
- system "eject", "/dev/$cd";
- print "Please insert the cdrom labeled \"$medium->{descr}\"\n and press [enter] when done\n";
- $yes = <STDIN>;
- system "mount", "-r", "-t", "iso9660", "/dev/$cd", "/cdrom";
- }
-
- print "Copying packages from medium labeled \"$medium->{descr}\" to hard disk\n";
- system "mkdir", "-p", "/hd/$medium->{rpmsdir}";
- foreach my $pkg (@{$packages->{depslist}}) {
- $pkg->{closure} && !$pkg->{selected} or next;
- foreach (qw(i586 noarch)) {
- my $file = "/cdrom/$medium->{rpmsdir}/$pkg->{name}.$_.rpm";
- -e $file or next;
- print " copying $pkg->{name}.$_.rpm\n";
- system "cp", "-a", $file, "/hd/$medium->{rpmsdir}";
- delete $pkg->{closure};
- last;
- }
- }
-
- print "Installing packages from medium labeled \"$medium->{descr}\"\n";
- if (my $pkg = pkgs::packageByName($packages, 'glibc')) { #- HACK FOR GLIBC
- if (delete $pkg->{selected}) {
- foreach (qw(i586 noarch)) {
- my $file = "/cdrom/$medium->{rpmsdir}/$pkg->{name}.$_.rpm";
- -e $file or next;
- system "rpm", "--root", "/mnt", "--nodeps", "--force", "--noscripts", "-ivh", $file;
- last; #- update glibc twice, in case.
- }
- }
- } else {
- die "no glibc package found";
- }
- my @files;
- foreach my $pkg (@{$packages->{depslist}}) {
- $pkg->{selected} or next;
- foreach (qw(i586 noarch)) {
- my $file = "/cdrom/$medium->{rpmsdir}/$pkg->{name}.$_.rpm";
- -e $file or next;
- push @files, $file;
- delete $pkg->{selected};
- last;
- }
- }
- system "rpm", "--root", "/mnt", "--nodeps", "--force", "-ivh", @files;
- print "Installed " . scalar(@files) . " packages\n";
-
- scalar(grep { $_->{selected} || $_->{closure} } @{$packages->{depslist}}) == 0 and last;
-}
-
-system "umount", "/mnt/proc";
-system "umount", "-a", "-f", "-t", "noproc";
-system "eject", "/dev/$cd";
-
-print "
-Done. OEM hard drive ready!
-The hard drive is now ready for a customer.
-System is now halted.\n\n";
-
-system "halt";
-
-#- provide package fullname that have to be installed and copied.
-sub select_packages {
- my ($dir, $lang) = @_;
- my $o = { packages => read_depslist("$dir/Mandrake/base/depslist.ordered") };
-
- #- DO NOT FORGET TO UPDATE HERE ACCORDING TO gi/perl-install/install_any.pm
- my @pkgs = qw(XFree86 XFree86-glide-module Device3Dfx Glide_V3-DRI Glide_V5 Mesa
- dhcpcd pump dhcpxd dhcp-client isdn4net isdn4k-utils dev pptp-adsl-fr rp-pppoe ppp ypbind
- rhs-printfilters lpr cups cups-drivers samba ncpfs ghostscript-utils
- kernel-pcmcia-cs apmd cdrecord
- );
- push @pkgs, "XFree86-$_" foreach qw(3DLabs 3dfx 8514 AGX FBDev I128 Mach8 Mach32 Mach64 Mono P9000 Rage128 S3 S3V SVGA VGA16 W32);
- foreach (@pkgs) {
- my $pkg = pkgs::packageByName($o->{packages}, $_);
- $pkg and pkgs::selectPackage($o->{packages}, $pkg);
- }
- foreach my $pkg (@{$o->{packages}{depslist}}) {
- delete $pkg->{selected} and $pkg->{closure} = 1;
- }
- foreach (qw(Mesa-common xpp libqtcups2 qtcups kups)) {
- my $pkg = pkgs::packageByName($o->{packages}, $_);
- $pkg and $pkg->{closure} = 1;
- }
-
- #- act as DrakX will do to select packages.
- pkgs::selectPackage($o->{packages}, pkgs::packageByName($o->{packages}, 'basesystem') || die "no basesystem package found");
- pkgs::read_rpmsrate($o->{packages}, install_any::getFile("Mandrake/base/rpmsrate") || die "unable to read rpmsrate");
- ($o->{compssUsers}, $o->{compssUsersSorted}, $o->{compssUsersIcons}, $o->{compssUsersDescr}) =
- pkgs::readCompssUsers($o->{packages}, $o->{meta_class});
-
- $o->{compssUsersChoice}{$_} = 1 foreach map { @{$o->{compssUsers}{$_}} } @{$o->{compssUsersSorted}};
- $o->{compssUsersChoice}{SYSTEM} = 1;
- $o->{compssUsersChoice}{SERVER} = 0;
-
- my $lang_pkg = $lang && pkgs::packageByName($o->{packages}, "locales-$lang");
- if ($lang_pkg) {
- pkgs::selectPackage($o->{packages}, $lang_pkg);
- $o->{compssUsersChoice}{qq(LOCALES"$_")} = 1;
- }
-
- pkgs::setSelectedFromCompssList($o->{packages}, $o->{compssUsersChoice}, 2, 0);
-
- #- package that have to selected here as a bonus for oem install.
- foreach (qw(cups cups-drivers drakprofile draksync irda-utils numlock raidtools reiserfs-utils
- Mesa Mesa-demos alsa alsa-utils
- Aurora xawtv kwintv xscreensaver-gl Mesa-demos xmms-mesa bzflag csmash gltron spacecup chromium tuxracer
- glibc vim-minimal kernel22
- )) {
- my $pkg = pkgs::packageByName($o->{packages}, $_);
- $pkg and pkgs::selectPackage($o->{packages}, $pkg);
- }
-
- #- special packages that are to be move to closure always ...
- foreach (qw(kernel-smp kernel-linus kernel-secure hackkernel-smp hackkernel-linus hackkernel-secure
- Aurora xawtv kwintv xscreensaver-gl xmms-mesa bzflag csmash gltron spacecup chromium tuxracer
- kernel22-secure alsa imwheel nfs-utils-clients lvm usbd reiserfsprogs
- )) {
- my $pkg = pkgs::packageByName($o->{packages}, $_);
- $pkg and $pkg->{closure} = 1, delete $pkg->{selected};
- }
-
- $o->{packages};
-}
-
-sub chop_version($) {
- ($_[0] =~ /(.*)-[^-]+-[^-]+/)[0] || $_[0];
-}
-
-sub read_depslist {
- my ($file) = @_;
- my $packages = { depslist => [], names => {} };
-
- #- read depslist.oredered file.
- my $id = 0;
-
- open F, "$file" or die "unable to open ordered dependencies list file";
- while (<F>) {
- my ($name, $size, @deps) = split;
- push @{$packages->{depslist}}, { id => $id++, name => $name, size => $size, deps => \@deps };
- }
- close F;
-
- foreach (@{$packages->{depslist}}) {
- $packages->{names}{chop_version($_->{name})} = $_;
- }
-
- print STDERR "read " . scalar(@{$packages->{depslist}}) . " package dependancies\n";
- $packages;
-}
-
-#- compability method for the below ones, wrap DrakX code extracted.
-package log;
-sub l {}
-
-package detect_devices;
-sub matching_desc { 0 }
-
-package install_any;
-sub getFile { open FILE, "/cdrom/$_[0]" or return; \*FILE }
-
-package pkgs;
-sub formatXiB { $_[0] } #- NOP
-sub packageSize { $_[0]{size} }
-sub packageRate { $_[0]{values}[0] }
-sub packageByName {
- my ($packages, $name) = @_;
- $packages->{names}{$name};
-}
-sub selectedSize {
- my ($packages) = @_;
- my $size = 0;
- foreach (@{$packages->{depslist}}) {
- $_->{selected} and $size += $_->{size};
- }
- $size;
-}
-my @preferred = qw(perl-GTK postfix wu-ftpd ghostscript-X vim-minimal kernel ispell-en);
-sub selectPackage {
- my ($packages, $pkg, $base, $otherOnly, $check_recursion) = @_;
-
- #- avoid infinite recursion (mainly against badly generated depslist.ordered).
- $check_recursion ||= {}; exists $check_recursion->{$pkg->{name}} and return; $check_recursion->{$pkg->{name}} = undef;
-
- #- make sure base package are set even if already selected.
- $base and $pkg->{base} = 1;
-
- #- select package and dependancies, otherOnly may be a reference
- #- to a hash to indicate package that will strictly be selected
- #- when value is true, may be selected when value is false (this
- #- is only used for unselection, not selection)
- unless ($pkg->{selected}) {
- foreach (@{$pkg->{deps}}) {
- my $preferred;
- if (/\|/) {
- #- choice deps should be reselected recursively as no
- #- closure on them is computed, this code is exactly the
- #- same as pixel's one.
- my %preferred; @preferred{@preferred} = ();
- foreach (split '\|') {
- my $dep = $packages->{depslist}[$_] or next;
- $preferred ||= $dep;
- $dep->{selected} and $preferred = $dep, last;
- exists $preferred{::chop_version($dep->{name})} and $preferred = $dep;
- }
- selectPackage($packages, $preferred, $base, $otherOnly, $check_recursion) if $preferred;
- } else {
- #- deps have been closed except for choices, so no need to
- #- recursively apply selection, expand base on it.
- my $dep = $packages->{depslist}[$_];
- $base and $dep->{base} = 1;
- $otherOnly and !$dep->{selected} and $otherOnly->{::chop_version($dep->{name})} = 1;
- $otherOnly or $dep->{selected} += 1;
- }
- }
- }
- $otherOnly and !$pkg->{selected} and $otherOnly->{::chop_version($pkg->{name})} = 1;
- $otherOnly or $pkg->{selected} += 1;
- 1;
-}
-
-#- this code is extracted from DrakX and SHOULD NOT BE MODIFIED, wrapper method exists above to provide a good choice.
-sub read_rpmsrate {
- my ($packages, $f) = @_;
- my $line_nb = 0;
- my (@l);
- while (<$f>) {
- $line_nb++;
- /\t/ and die "tabulations not allowed at line $line_nb\n";
- s/#.*//; # comments
-
- my ($indent, $data) = /(\s*)(.*)/;
- next if !$data; # skip empty lines
-
- @l = grep { $_->[0] < length $indent } @l;
-
- my @m = @l ? @{$l[$#l][1]} : ();
- my ($t, $flag, @l2);
- while ($data =~
- /^((
- [1-5]
- |
- (?: (?: !\s*)? [0-9A-Z_]+(?:".*?")?)
- (?: \s*\|\|\s* (?: !\s*)? [0-9A-Z_]+(?:".*?")?)*
- )
- (?:\s+|$)
- )(.*)/x) {
- ($t, $flag, $data) = ($1,$2,$3);
- while ($flag =~ s,^\s*(("[^"]*"|[^"\s]*)*)\s+,$1,) {
- }
- my $ok = 0;
- $flag = join('||', grep {
- if (my ($inv, $p) = /^(!)?PCI"(.*)"/) {
- ($inv xor detect_devices::matching_desc($p)) and $ok = 1;
- 0;
- } else {
- 1;
- }
- } split '\|\|', $flag);
- push @m, $ok ? 'TRUE' : $flag || 'FALSE';
- push @l2, [ length $indent, [ @m ] ];
- $indent .= $t;
- }
- if ($data) {
- # has packages on same line
- my ($rate) = grep { /^\d$/ } @m or die sprintf qq(missing rate for "%s" at line %d (flags are %s)\n), $data, $line_nb, join('&&', @m);
- foreach (split ' ', $data) {
- if ($packages) {
- my $p = packageByName($packages, $_) or next;
- # $p->[$VALUES] = join("\t", $rate, grep { !/^\d$/ } @m);
- $p->{values} = [ $rate, grep { !/^\d$/ } @m] ; #- LOCALLY MODIFIED FOR OEM
- } else {
- print "$_ = ", join(" && ", @m), "\n";
- }
- }
- push @l, @l2;
- } else {
- push @l, [ $l2[0][0], $l2[$#l2][1] ];
- }
- }
- $line_nb > 0 or die "nothing read in rpmsrate";
-}
-
-sub readCompssUsers {
- my ($packages, $meta_class) = @_;
- my (%compssUsers, %compssUsersIcons, , %compssUsersDescr, @sorted, $l);
- my (%compss);
-
- my $file = 'Mandrake/base/compssUsers';
- my $f = $meta_class && install_any::getFile("$file.$meta_class") || install_any::getFile($file) or die "can't find $file";
- local $_;
- while (<$f>) {
- /^\s*$/ || /^#/ and next;
- s/#.*//;
-
- if (/^(\S.*)/) {
- my ($icon, $descr);
- /^(.*?)\s*\[icon=(.*?)\](.*)/ and $_ = "$1$3", $icon = $2;
- /^(.*?)\s*\[descr=(.*?)\](.*)/ and $_ = "$1$3", $descr = $2;
- $compssUsersIcons{$_} = $icon;
- $compssUsersDescr{$_} = $descr;
- push @sorted, $_;
- $compssUsers{$_} = $l = [];
- } elsif (/^\s+(.*?)\s*$/) {
- push @$l, $1;
- }
- }
- \%compssUsers, \@sorted, \%compssUsersIcons, \%compssUsersDescr;
-}
-
-sub setSelectedFromCompssList {
- my ($packages, $compssUsersChoice, $min_level, $max_size, $install_class) = @_;
- $compssUsersChoice->{TRUE} = 1; #- ensure TRUE is set
- my $nb = selectedSize($packages);
-# foreach my $p (sort { substr($a,0,1) <=> substr($b,0,1) } values %{$packages->{names}}) {
- foreach my $p (sort { $b->{values}[0] <=> $a->{values}[0] } @{$packages->{depslist}}) { #- LOCALLY MODIFIED FOR OEM
-# my ($rate, @flags) = split "\t", $p->[$VALUES];
- my ($rate, @flags) = @{$p->{values}}; #- LOCALLY MODIFIED FOR OEM
- next if !$rate || $rate < $min_level || grep { !grep { /^!(.*)/ ? !$compssUsersChoice->{$1} : $compssUsersChoice->{$_} } split('\|\|') } @flags;
-
- #- determine the packages that will be selected when
- #- selecting $p. the packages are not selected.
- my %newSelection;
- selectPackage($packages, $p, 0, \%newSelection);
-
- #- this enable an incremental total size.
- my $old_nb = $nb;
- foreach (grep { $newSelection{$_} } keys %newSelection) {
- $nb += packageSize($packages->{names}{$_});
- }
- if ($max_size && $nb > $max_size) {
- $nb = $old_nb;
- $min_level = packageRate($p);
- last;
- }
-
- #- at this point the package can safely be selected.
- selectPackage($packages, $p);
- }
- log::l("setSelectedFromCompssList: reached size ", formatXiB($nb), ", up to indice $min_level (less than ", formatXiB($max_size), ")");
- $min_level;
-}
diff --git a/rescue/tree/etc/passwd b/rescue/tree/etc/passwd
index 568451e4e..c0274a116 100644
--- a/rescue/tree/etc/passwd
+++ b/rescue/tree/etc/passwd
@@ -1,3 +1,2 @@
-root::0:0::/:/bin/bash
-shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown
-halt:*:7:0:halt:/sbin:/sbin/halt
+root::0:0::/root:/bin/bash
+messagebus:x:1:1::/:/sbin/nologin
diff --git a/rescue/tree/etc/profile b/rescue/tree/etc/profile
index 3cc1f05c1..17f0700dc 100644
--- a/rescue/tree/etc/profile
+++ b/rescue/tree/etc/profile
@@ -1,12 +1,12 @@
# /etc/profile
-# (c) MandrakeSoft, Chmouel Boudjnah <chmouel@mandrakesoft.com>
+# (c) Mandrakesoft, Chmouel Boudjnah <chmouel>
# System wide environment and startup programs
# Functions and aliases go in /etc/bashrc
PROFILE_LOADED=1
-export PATH=/usr/bin:/bin:/sbin:/usr/sbin:/usr/X11R6/bin:/mnt/disk/sbin:/mnt/disk/bin:/mnt/disk/usr/sbin:/mnt/disk/usr/bin:/mnt/disk/usr/X11R6/bin
+PATH=/usr/bin:/bin:/sbin:/usr/sbin:/mnt/sbin:/mnt/bin:/mnt/usr/sbin:/mnt/usr/bin
PS1="[root@rescue \w]\\$ "
ls () { /bin/ls --color=auto -F "$@";}
diff --git a/rescue/tree/etc/rc.reboot b/rescue/tree/etc/rc.reboot
deleted file mode 100755
index 0b67416f1..000000000
--- a/rescue/tree/etc/rc.reboot
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-
-sleep 1
-/sbin/killall5 -9
-
-umount -a -f -t noproc
-
-reboot -i -d
diff --git a/rescue/tree/etc/rc.sysinit b/rescue/tree/etc/rc.sysinit
deleted file mode 100755
index 78d6cb257..000000000
--- a/rescue/tree/etc/rc.sysinit
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/sh
-
-action() { echo $1; shift; $*; }
-
-export PATH=/bin:/sbin:/usr/bin:/usr/sbin
-
-echo -e "\t\t\tWelcome to Linux \\033[1;36mMandrake\\033[0;39m"
-
-action "Mounting proc filesystem" mount -n -t proc /proc /proc
-action "Remounting root filesystem in read-write mode" mount -n -o remount,rw /
-
->/etc/mtab
-mount -f /
-mount -f /proc
-
-# Set the hostname.
-action "Setting hostname rescue" hostname rescue
-echo rescue > /etc/HOSTNAME
-
-# Loads common modules ( no kerneld :( )
-load() { modprobe $* 2>/dev/null; }
-load ide-mod
-load ide-probe
-load ide-disk
-load ide-cd
-load floppy
-load af_packet
-load isofs
-load vfat
-load reiserfs
-load loop
-load sd_mod
-load sr_mod
-
-grep -q oem /proc/cmdline && exec /etc/oem -f
-
-/sbin/ifconfig lo 127.0.0.1 netmask 255.0.0.0
-/sbin/route add 127.0.0.1 lo
diff --git a/rescue/tree/sbin/modprobe b/rescue/tree/sbin/modprobe
deleted file mode 100755
index 574f8ff56..000000000
--- a/rescue/tree/sbin/modprobe
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/perl
-
-sub cat_ { local *F; open F, $_[0] or $_[1] ? die "cat of file $_[0] failed: $!\n" : return; my @l = <F>; wantarray ? @l : join '', @l }
-
-sub read_already_loaded() {
- foreach (cat_("/proc/modules")) {
- my ($name) = split;
- $conf{$name}{loaded} = 1;
- }
-}
-
-sub load_deps($) {
- my ($file) = @_;
-
- local *F;
- open F, $file or log::l("error opening $file: $!"), return 0;
- foreach (<F>) {
- my ($f, $deps) = split ':';
- push @{$deps{$f}}, split ' ', $deps;
- }
-}
-
-sub load {
- my ($name, @options) = @_;
- $name =~ s/\.o//;
-
- $conf{$name}{loaded} and return;
- eval { load($_, 'prereq') } foreach @{$deps{$name}};
-
- system("packdrake -x /modules/modules.cz* /tmp $name.o");
- -r "/tmp/$name.o" or die "can't find module $name\n";
- system("/sbin/insmod -f /tmp/$name.o"); $? and die("insmod $name failed");
- system("rm /tmp/$name.o");
-}
-
-!@ARGV || $ARGV[0] =~ /-h/ and die "usage: modprobe <module> [<options...>]\n";
-
-read_already_loaded();
-load_deps("/modules/modules.dep");
-load(@ARGV);
diff --git a/rescue/tree/bin/login b/rescue/tree/usr/bin/login
index 4b2816926..4b2816926 100755
--- a/rescue/tree/bin/login
+++ b/rescue/tree/usr/bin/login
diff --git a/rescue/tree/usr/bin/mageia-rescue b/rescue/tree/usr/bin/mageia-rescue
new file mode 100755
index 000000000..7d8bb5135
--- /dev/null
+++ b/rescue/tree/usr/bin/mageia-rescue
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+# Uncomment for debugging:
+# set -x
+
+systemctl start systemd-udevd
+udevadm trigger --type=subsystems --action=add
+udevadm trigger --type=devices --action=add
+
+# disable the weird echoprt in cooked mode for user interaction:
+stty sane
+
+#LANGUAGE (filled by make_rescue_img)
+
+grep -q noauto /proc/cmdline || drvinst SERIAL_USB
+
+partimage_default_dir=/data/box
+partimage_dir=`perl -lne 'print $1 if /BOX=(\S+)/' /proc/cmdline`
+[ -z "$partimage_dir" ] && partimage_dir=$partimage_default_dir
+partimage_server=`perl -lne 'print $1 if /\bpserver=(\S+)/' /proc/cmdline`
+
+LOOP=""
+if grep -q save_all /proc/cmdline; then
+ partimage_whole_disk -s $partimage_server save_all $partimage_default_dir
+elif grep -q rest_all /proc/cmdline; then
+ if [ -d /tmp/image$partimage_dir ]; then
+ partimage_whole_disk rest_all /tmp/image$partimage_dir
+ else
+ partimage_whole_disk -s $partimage_server rest_all $partimage_dir
+ fi
+elif grep -q oem /proc/cmdline; then
+ /tmp/image/oem-rescue.sh
+elif grep -q restore /proc/cmdline; then
+ /usr/sbin/restore-image.sh
+elif ! grep -q expert /proc/cmdline; then
+ rescue-gui && LOOP=y
+fi
+
+while [ "$LOOP" ]; do
+ bash --login
+ rescue-gui
+done
diff --git a/rescue/tree/usr/lib/CVS. b/rescue/tree/usr/lib/CVS.
deleted file mode 100644
index e69de29bb..000000000
--- a/rescue/tree/usr/lib/CVS.
+++ /dev/null
diff --git a/rescue/tree/usr/lib/modules-load.d/mageia-rescue.conf b/rescue/tree/usr/lib/modules-load.d/mageia-rescue.conf
new file mode 100644
index 000000000..9d9850baf
--- /dev/null
+++ b/rescue/tree/usr/lib/modules-load.d/mageia-rescue.conf
@@ -0,0 +1,8 @@
+ide-gd_mod
+ide-cd_mod
+floppy
+af_packet
+loop
+fuse
+sd_mod
+sr_mod
diff --git a/rescue/tree/usr/lib/restore-image-lib.sh b/rescue/tree/usr/lib/restore-image-lib.sh
new file mode 100755
index 000000000..3451f7be5
--- /dev/null
+++ b/rescue/tree/usr/lib/restore-image-lib.sh
@@ -0,0 +1,80 @@
+#!/bin/bash
+
+TITLE="%s Installer"
+BACKTITLE="%s"
+MIN_DISKSIZE=5000000
+
+debug="/dev/null"
+
+function _msgbox()
+{
+ dialog --timeout 60 --backtitle "$BACKTITLE" --title "$TITLE" --msgbox \
+ "$1" 0 0
+
+ return $?
+}
+
+function _infobox()
+{
+ dialog --backtitle "$BACKTITLE" --title "$TITLE" --sleep 2 \
+ --infobox "$1" 0 0
+
+ return $?
+}
+
+function _yesno()
+{
+ dialog --backtitle "$BACKTITLE" --title "$TITLE" \
+ --yes-label "Yes" --no-label "No" --yesno "$1" 0 0
+
+ return $?
+}
+
+function _mount()
+{
+ mount $1 $2 > $debug 2>&1
+
+ return $?
+}
+
+function _umount()
+{
+ umount $1 > $debug 2>&1
+
+ return $?
+}
+
+function _bind()
+{
+ mount --bind $1 $2 > $debug 2>&1
+
+ return $?
+}
+
+function _eject()
+{
+ eject $1 > $debug 2>&1
+
+ return $?
+}
+
+function _shutdown()
+{
+ [ -e /tmp/no-shutdown ] && exit
+ clear
+ sync
+ echo s > /proc/sysrq-trigger
+ echo o > /proc/sysrq-trigger
+ exit
+}
+
+function _reboot()
+{
+ [ -e /tmp/no-shutdown ] && exit
+ clear
+ sync
+ echo s > /proc/sysrq-trigger
+ echo b > /proc/sysrq-trigger
+ exit
+}
+
diff --git a/rescue/tree/usr/lib/systemd/system/rescue.service b/rescue/tree/usr/lib/systemd/system/rescue.service
new file mode 100644
index 000000000..336e06c22
--- /dev/null
+++ b/rescue/tree/usr/lib/systemd/system/rescue.service
@@ -0,0 +1,20 @@
+[Unit]
+Description=Mageia Rescue
+DefaultDependencies=no
+Conflicts=shutdown.target
+After=sysinit.target plymouth-start.service
+Before=shutdown.target
+
+[Service]
+Environment=HOME=/
+WorkingDirectory=/
+ExecStartPre=-/bin/plymouth quit
+ExecStart=/usr/bin/mageia-rescue
+ExecStopPost=-/usr/bin/systemctl --fail --no-block reboot
+Type=idle
+StandardInput=tty-force
+StandardOutput=inherit
+StandardError=inherit
+KillMode=process
+IgnoreSIGPIPE=no
+SendSIGHUP=yes
diff --git a/rescue/tree/usr/lib/systemd/system/systemd-udevd.service.d/dracut-rules.conf b/rescue/tree/usr/lib/systemd/system/systemd-udevd.service.d/dracut-rules.conf
new file mode 100644
index 000000000..b75df2e4e
--- /dev/null
+++ b/rescue/tree/usr/lib/systemd/system/systemd-udevd.service.d/dracut-rules.conf
@@ -0,0 +1 @@
+ExecStartPre=-/usr/bin/rm -f /etc/udev/rules.d/10-console.rules
diff --git a/rescue/tree/usr/sbin/diskdrake-resize b/rescue/tree/usr/sbin/diskdrake-resize
new file mode 100755
index 000000000..88372aac7
--- /dev/null
+++ b/rescue/tree/usr/sbin/diskdrake-resize
@@ -0,0 +1,29 @@
+#!/usr/bin/perl
+
+use lib qw(/usr/lib/libDrakX);
+
+use devices;
+use log;
+use resize_fat::main;
+use diskdrake::resize_ntfs;
+use diskdrake::resize_ext2;
+
+my ($device, $fs_type, $size) = @ARGV
+ or die "usage: $0 <device> <fs type> <size>\n";
+
+my %fs_pkgs = (
+ vfat => 'resize_fat::main',
+ ntfs => 'diskdrake::resize_ntfs',
+ ext2 => 'diskdrake::resize_ext2',
+ ext3 => 'diskdrake::resize_ext2',
+ ext4 => 'diskdrake::resize_ext2',
+);
+
+my $resize_pkg = $fs_pkgs{$fs_type}
+ or die "no support for $fs_type type\n";
+
+log::l("resizing $device to $size");
+
+my $resize = $resize_pkg->new($device, devices::make($device))
+ or die "unable to initialize resize\n";
+$resize->resize($size);
diff --git a/rescue/tree/usr/sbin/genpasswd b/rescue/tree/usr/sbin/genpasswd
new file mode 100755
index 000000000..2f129673d
--- /dev/null
+++ b/rescue/tree/usr/sbin/genpasswd
@@ -0,0 +1,13 @@
+#!/usr/bin/perl
+
+use strict;
+
+system "stty -echo";
+print STDERR "Give a password for ssh access: ";
+chomp(my $word = <STDIN>);
+print STDERR "\n";
+system "stty echo";
+
+my @salt = ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64];
+print crypt($word, join('', @salt));
+print "\n";
diff --git a/rescue/tree/usr/sbin/grabjournallogs b/rescue/tree/usr/sbin/grabjournallogs
new file mode 100755
index 000000000..ef2ea4a1d
--- /dev/null
+++ b/rescue/tree/usr/sbin/grabjournallogs
@@ -0,0 +1,51 @@
+#!/bin/bash
+
+if ! mountpoint -q /mnt ; then
+ echo "I do not seem to see a Mageia install mounted on /mnt. You need to mount it first!" >&2
+ exit 1
+fi
+
+if [ ! -f /mnt/etc/machine-id ]; then
+ echo "Cannot find machine-id file (/mnt/etc/machine-id)" >&2
+ exit 1
+fi
+
+MID=$(cat /mnt/etc/machine-id)
+echo
+echo "Found machine-id: $MID"
+if [ ! -d /mnt/var/log/journal/$MID ]; then
+ echo "Cannot find journal log directory (/mnt/var/log/journal/<machine-id>)" >&2
+ exit 1
+fi
+
+TIMEFRAME=24
+if [ -n "$1" ]; then
+ NEWTIMEFRAME=$(( 0 + $1 ))
+ if [ $NEWTIMEFRAME -gt 0 ]; then
+ TIMEFRAME=$NEWTIMEFRAME
+ fi
+fi
+SINCE="$(LC_ALL=c date --date=$TIMEFRAME' hours ago' +'%F %T')"
+echo "Will collect logs from the last $TIMEFRAME hour(s)"
+echo " NB give numeric argument to override capture period"
+
+TEMPFILE=$(mktemp /tmp/grabjournallogs.XXXXXX)
+echo -n "Extracting logs... "
+journalctl -D /mnt/var/log/journal/$MID --since "$SINCE" -o short >$TEMPFILE
+echo "done"
+
+if [ $(cat $TEMPFILE | wc -l) -lt 2 ]; then
+ rm -f $TEMPFILE
+ echo >&2
+ echo "Cannot find any logs. Consider increasing the capture period by passing a" >&2
+ echo "numeric argument larger than $TIMEFRAME." >&2
+ exit 1
+fi
+
+echo -n "Compressing logs... "
+cat $TEMPFILE | xz >/journallogs.xz
+rm -f $TEMPFILE
+echo "done"
+
+echo
+echo "Your logs have been extracted to the file 'journallogs.xz'"
diff --git a/rescue/tree/usr/sbin/restore-image.sh b/rescue/tree/usr/sbin/restore-image.sh
new file mode 100755
index 000000000..f4f904f3f
--- /dev/null
+++ b/rescue/tree/usr/sbin/restore-image.sh
@@ -0,0 +1,412 @@
+#!/bin/bash
+
+setterm -powersave off
+setterm -blank 0
+
+if [ -r ./restore-image-lib.sh ]; then
+ . ./restore-image-lib.sh
+elif [ -r /usr/lib/restore-image-lib.sh ]; then
+ . /usr/lib/restore-image-lib.sh
+fi
+
+export PATH="/sbin:/bin:/usr/sbin:/usr/bin"
+
+mnt_dir="/tmp/mnt"
+restore_media="/tmp/media"
+images_dir="$restore_media/images"
+images="$images_dir/list"
+images_config="$images_dir/config"
+image=""
+win32_part_dev=
+win32_part_type=
+win32_part_new_size=
+
+function read_config()
+{
+ if [ -r "$images_config" ]; then
+ . $images_config
+ fi
+}
+
+function image_list()
+{
+ list=$(cat $images | awk -F',' \
+ '{ print $1 " " $2 " " $4 }')
+
+ echo $list
+}
+
+function image_file()
+{
+ country="$1"
+
+ file=$(grep ^$country $images | awk -F',' '{ print $3 }')
+
+ echo $file
+}
+
+function welcome()
+{
+ while true; do
+ clear
+ msg="\n Welcome to $TITLE\n\
+\nThe following images were found, select one:\n "
+ opcao=$(dialog --backtitle "$BACKTITLE" --title "$TITLE" \
+ --stdout --radiolist "$msg" 0 0 0 \
+ $(image_list))
+
+ if [ "$?" != "0" ]; then
+ _yesno "\nInterrupt installation?\n "
+ if [ "$?" = "0" ]; then
+ _shutdown
+ fi
+ else
+ if [ -z "$opcao" ]; then
+ continue
+ else
+ image=$(image_file $opcao)
+ break
+ fi
+ fi
+ done
+
+ # disable kernel messages in the console
+ echo "1 4 1 7" > /proc/sys/kernel/printk
+}
+
+function install_warning()
+{
+ if [ -n "${win32_part_dev}" ]; then
+ warn_msg="Windows installation detected.\nWe will set it up as dual boot. \
+You may lose some data.\nPlease backup before proceeding."
+ else
+ warn_msg="WARNING: This process will erase all data in this machine, \
+do you want to continue?"
+ fi
+
+ clear
+ _yesno "\n$warn_msg\n"
+ if [ "$?" != "0" ]; then
+ _shutdown
+ fi
+}
+
+function detect_root()
+{
+ inst_source_dev=$(awk "\$2 == \"$restore_media\" { print \$1 }" /proc/mounts | sed -e 's/[0-9]$//')
+ inst_source_dev=${inst_source_dev#/dev/}
+ devices=$(grep "^ .*[^0-9]$" < /proc/partitions | grep -v ${inst_source_dev} | awk '$3 > '$MIN_DISKSIZE' { print $4,$3 }')
+
+ if [ -z "${devices}" ]; then
+ exit 1
+ fi
+
+ devs_found=$(($(echo $devices | wc -w)/2))
+
+ root_data=$(detect_win32 ${inst_source_dev})
+
+ if [ -z "${root_data}" ]; then
+ if [ "$devs_found" -gt "1" ]; then
+ if [ -n "${inst_source_dev}" ]; then
+ opcao=$(dialog --backtitle "$BACKTITLE" --title "$TITLE" --stdout --menu 'Choose one of the detected devices to restore to (check the blocks size column first):' 8 50 0 $devices )
+ if [ "$?" != "0" ]; then
+ _yesno "\nInterrupt installation?\n "
+ if [ "$?" = "0" ]; then
+ _shutdown
+ fi
+ else
+ root_data=${opcao}
+ fi
+ fi
+ else
+ root_data=$(echo ${devices} | cut -d ' ' -f 1)
+ fi
+ fi
+
+ echo ${root_data}
+}
+
+function detect_win32()
+{
+ # from detect_root()
+ skip_dev=${1}
+
+ # win32 detection won't handle complex layouts
+ if [ $(fdisk -l | grep "^/dev/" | grep -v ${skip_dev} | wc -l) -gt 1 ]; then
+ exit
+ fi
+
+ # get the last created windows partition information
+ set -f
+ device=$(fdisk -l | grep "^/dev/" | grep -v ${skip_dev} | grep -e "FAT\|NTFS\|HPFS" | tail -1 | sed 's/ .*$//')
+ set +f
+
+ if [ -z "${device}" ]; then
+ exit
+ fi
+
+ # it might be needed, for safety
+ device_type=$(blkid -o value -s TYPE ${device})
+ modprobe ${device_type}
+
+ # df for that partition
+ mount ${device} /mnt
+ size=$(df ${device} | tail -1)
+ umount /mnt
+
+ # its diskspace
+ used=$(echo ${size} | awk '{ print $3 }')
+ left=$(echo ${size} | awk '{ print $4 }')
+ avail=$((${left}/2))
+
+ if [ ! ${avail} -lt ${MIN_DISKSIZE} ]; then
+ win32_part_dev=${device}
+ win32_part_type=${device_type}
+ # our install takes half of 'left'
+ win32_part_new_size=$((${used}+${avail}))
+
+ dev=${win32_part_dev#/dev/}
+ disk=${dev%[0-9]}
+ number=${dev#[a-w][a-w][a-w]}
+ let number++
+ echo ${disk}${number} ${win32_part_dev} ${win32_part_type} ${win32_part_new_size}
+ fi
+}
+
+function resize_win32()
+{
+ device=${1}
+ device_type=${2}
+ new_win32_size=${3}
+
+ dialog --backtitle "$BACKTITLE" --title "$TITLE" --infobox "\nResizing Windows partition...\n" 4 55
+
+ dev=${device#/dev/}
+ disk=${dev%[0-9]}
+ win32_number=${dev#[a-w][a-w][a-w]}
+
+ case ${device_type} in
+ vfat) device_id=b ;;
+ ntfs) device_id=7 ;;
+ hpfs) device_id=87 ;;
+ esac
+
+ # wrapper around libdrakx by blino
+ diskdrake-resize ${device} ${device_type} $((${new_win32_size}*2)) &>/dev/null
+
+ # we need some free sector here, rebuilding layout
+ fdisk /dev/${disk} &>/dev/null <<EOF
+d
+n
+p
+${win32_number}
+
++${new_win32_size}K
+t
+${device_id}
+a
+${win32_number}
+w
+EOF
+ # adds linux partition to the end of the working disk
+ fdisk /dev/${disk} &>/dev/null <<EOF
+n
+p
+$((${win32_number}+1))
+
++${MIN_DISKSIZE}K
+t
+$((${win32_number}+1))
+83
+w
+EOF
+}
+
+function detect_device()
+{
+ dialog --backtitle "$BACKTITLE" --title "$TITLE" --infobox "\nTrying to detect your root partition and disk...\n" 4 55
+
+ root_data=$(detect_root)
+ if [ -z "${root_data}" ]; then
+ _msgbox "\nError writing image: disk device not detected.\n"
+ # so that netbooks using USB sticks as disks can retry (like Gdium)
+ welcome
+ root_data=$(detect_root)
+ fi
+ set ${root_data}
+ root=$1
+ win32_part_dev=$2
+ win32_part_type=$3
+ win32_part_new_size=$4
+}
+
+function write_image()
+{
+ if [ -n "${win32_part_dev}" ]; then
+ resize_win32 ${win32_part_dev} ${win32_part_type} ${win32_part_new_size}
+ fi
+
+ image=$(cat $images_dir/list | cut -d ',' -f 3)
+ extension=${image/*./}
+ imagesize=$(ls -l $images_dir/$image | awk '{ print $5 }')
+ case $extension in
+ gz)
+ uncomp=zcat
+ total=$(gzip -l $images_dir/$image | tail -n 1 | awk '{ print $2 }')
+ ;;
+ bz2)
+ uncomp=bzcat
+ total=$((imagesize * 3))
+ ;;
+ *)
+ uncomp=cat
+ total=$imagesize
+ ;;
+ esac
+
+ skipstart=/bin/true
+ if [ -n "$win32_part_dev" ]; then
+ skipstart='dd of=/dev/null bs=1 count=32256'
+ fi
+
+ # the actual dumping command, from image to disk
+ ${uncomp} ${images_dir}/${image} | (${skipstart} &>/dev/null; dd bs=4M of=/dev/${root} >/tmp/backup.out 2>&1>>/tmp/log) &
+
+ sleep 3
+ pid=$(ps ax | grep 'dd bs=4M of' | grep -v grep | awk '{ print $1 }')
+
+ while [ true ]; do
+ ps | grep -q $pid
+ if [ $? -eq 0 ]; then
+ /bin/kill -SIGUSR1 $pid
+ complete=$(tail -n 1 /tmp/backup.out | awk '{ print $1 }')
+ echo $((complete*100/total))
+ sleep 1
+ else
+ break
+ fi
+ done | dialog --backtitle "$BACKTITLE" --title "$TITLE" --gauge "\nWriting image..." 8 45
+
+ in=$(tail -n 3 /tmp/backup.out | grep 'in$' | cut -d' ' -f1)
+ out=$(tail -n 3 /tmp/backup.out | grep 'out$' | cut -d' ' -f1)
+
+ if [ x"$in" != x"$out" ]; then
+ _msgbox "\nError writing image!\n"
+ sleep 24h
+ fi
+
+ # Now re-read the partition table because 'dd' might have changed it
+ sfdisk -R /dev/${root}
+}
+
+function grub_setup()
+{
+ root=${1}
+ grub_dir=${2}
+
+ # install the bootloader
+ grub <<EOF
+device (hd0) /dev/${root%[0-9]}
+root (hd0,1)
+setup (hd0)
+quit
+EOF
+ # change the partition order and boot timeout accordingly
+ sed -i 's/(hd0,0)/(hd0,1)/g;/^timeout/s/$/0/' ${grub_dir}/menu.lst
+
+ # dualboot configuration for grub
+ cat >> ${grub_dir}/menu.lst <<EOF
+title Microsoft Windows
+root (hd0,0)
+makeactive
+rootnoverify(hd0,0)
+chainloader +1
+EOF
+}
+
+function expand_fs()
+{
+ if [ -z "$win32_part_dev" ]; then
+ if [ -n "$MAIN_PART_NUMBER" ]; then
+ part_number=$MAIN_PART_NUMBER
+ else
+ part_number=1
+ fi
+ root=${root%[0-9]}$part_number
+ fi
+ filesystem_type=$(dumpe2fs -h /dev/${root} 2>/dev/null| grep "Filesystem OS type" | awk '{ print $4 }')
+ if [ "${filesystem_type}" = "Linux" ]; then
+ dialog --backtitle "$BACKTITLE" --title "$TITLE" --infobox "Finishing Install... Expanding ${root}" 3 40
+ disk=/dev/${root%[0-9]}
+ main_part=/dev/${root}
+
+ # FIXME: absurdly dirty hack
+ main_part_num=${root:3}
+ swap_part_num=$((main_part_num+1))
+ swap_part=${disk}${swap_part_num}
+
+ main_part_sectors=
+ if [ -n "$SWAP_BLOCKS" ]; then
+ if [ -n "$EXPAND_FS" ]; then
+ total_blocks=$(sfdisk -s $disk)
+ main_part_blocks=$((total_blocks-SWAP_BLOCKS))
+ main_part_sectors=$((main_part_blocks*2))
+ else
+ main_part_sectors=$(sfdisk -d $disk | perl -lne 'm|^'$main_part'\b.*,\s*size\s*=\s*(\d+)\b| and print($1), exit')
+ fi
+ fi
+ if [ -n "$SWAP_BLOCKS" ]; then
+ parted $disk -- mkpartfs primary linux-swap ${main_part_sectors}s -1s yes
+ mkswap -L swap $swap_part
+ fi
+ if [ -n "$EXPAND_FS" ]; then
+ e2fsck -fy $main_part
+ fdisk $disk << EOF
+d
+$main_part_num
+n
+p
+$main_part_num
+
+
+a
+$main_part_num
+w
+EOF
+ sfdisk -R $disk
+ e2fsck -fy $main_part
+ resize2fs $main_part
+ fi
+ mkdir -p $mnt_dir
+ mount $main_part $mnt_dir
+ grub_dir="$mnt_dir/boot/grub"
+ if [ -d "$grub_dir" ]; then
+ echo "(hd0) $disk" > "$grub_dir/device.map"
+ if [ -n "$win32_part_dev" ]; then
+ grub_setup ${root} ${grub_dir}
+ fi
+ fi
+ if [ -n "$MKINITRD" ]; then
+ mount -t sysfs none "$mnt_dir/sys"
+ mount -t proc none "$mnt_dir/proc"
+ chroot $mnt_dir bootloader-config --action rebuild-initrds
+ umount "$mnt_dir/sys"
+ umount "$mnt_dir/proc"
+ fi
+ umount $mnt_dir
+ fi
+}
+
+# installation steps
+welcome
+read_config
+detect_device
+install_warning
+write_image
+expand_fs
+
+# all done!
+_msgbox "\nInstallation process finished.\nPress ENTER to shutdown.\n "
+
+_shutdown
+
diff --git a/rescue/tree/usr/sbin/startssh b/rescue/tree/usr/sbin/startssh
new file mode 100755
index 000000000..e14bb10e8
--- /dev/null
+++ b/rescue/tree/usr/sbin/startssh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+# test for an up interface != lo
+if test "x"`ifconfig | cut -d ' ' -f 1 | grep -v '^$' | grep -v lo` = "x"; then
+ echo "There is no up interface, you can try to execute 'drvinst' to find drivers and 'dhcp-client' to configure your interface for DHCP." >&2
+ exit 5
+fi
+
+# generate host keys
+mkdir -p /etc/dropbear
+[[ -f /etc/dropbear/dropbear_dss_host_key ]] || dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key >/dev/null || { echo "Can't generate dsa host key" >&2 ; exit 4; }
+[[ -f /etc/dropbear/dropbear_rsa_host_key ]] || dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key >/dev/null || { echo "Can't generate rsa host key" >&2 ; exit 3; }
+
+# set a password
+passwd=`genpasswd`
+if (( $? != 0 )); then
+ reset
+ exit $?
+fi
+sed -E -i -e 's/^root:[^:]*:/root:'"${passwd//\//\\/}"':/' /etc/passwd || { echo "Can't set password" >&2 ; exit 2; }
+
+# test for /dev/pts
+grep '^devpts /dev/pts devpts ' /proc/mounts >/dev/null 2>/dev/null || mount -t devpts devpts /dev/pts
+
+echo ""
+echo -n "Starting ssh daemon... "
+dropbear -E 2>/var/log/dropbear.log && echo "OK" || { echo "Failed" ; exit 1; }