diff options
-rw-r--r-- | perl-install/patch/patch-oem-hp.pl | 323 |
1 files changed, 323 insertions, 0 deletions
diff --git a/perl-install/patch/patch-oem-hp.pl b/perl-install/patch/patch-oem-hp.pl new file mode 100644 index 000000000..0a5b0b51e --- /dev/null +++ b/perl-install/patch/patch-oem-hp.pl @@ -0,0 +1,323 @@ +use modules; +package modules; +my $old_load_raw = \&load_raw; +undef *load_raw; +*load_raw = sub { + &$old_load_raw; + + my @l = map { my ($i, @i) = @$_; [ $i, \@i ] } grep { $_->[0] !~ /ignore/ } @_; + foreach (@l) { + if ($_->[0] eq 'ehci-hcd') { + add_alias('usb-interface1', $_->[0]); + } + } + + if (get_alias("usb-interface") || get_alias("usb-interface1")) { + unless (-e "/proc/bus/usb/devices") { + require fs; fs::mount('/proc/bus/usb', '/proc/bus/usb', 'usbdevfs'); + #- ensure keyboard is working, the kernel must do the job the BIOS was doing + sleep 4; + load_multi("usbkbd", "keybdev") if detect_devices::usbKeyboards(); + } + } +}; + +my $old_load = \&load; +undef *load; +*load = sub { + &$old_load; + + #- hack to get back usb-interface (even if already loaded by stage1) + #- NOTE load_multi is not used for that so not overloaded to fix that too. + if ($_[0] =~ /usb-[uo]hci/ && !get_alias("usb-interface")) { + add_alias('usb-interface', $_[0]); + } elsif ($_[0] eq 'ehci-hcd' && !get_alias("usb-interface1")) { + add_alias('usb-interface1', $_[0]); + } + + if (get_alias("usb-interface") || get_alias("usb-interface1")) { + unless (-e "/proc/bus/usb/devices") { + require fs; fs::mount('/proc/bus/usb', '/proc/bus/usb', 'usbdevfs'); + #- ensure keyboard is working, the kernel must do the job the BIOS was doing + sleep 4; + load_multi("usbkbd", "keybdev") if detect_devices::usbKeyboards(); + } + } +}; + +#- ensure it is loaded using this patch. +$::noauto or modules::load_thiskind("usb"); +sleep 2; + +use install_steps; +package install_steps; + +my $old_beforeInstallPackages = \&beforeInstallPackages; +undef *beforeInstallPackages; +*beforeInstallPackages = sub { + &$old_beforeInstallPackages; + + my ($o) = @_; + mkdir "$o->{prefix}$_" foreach qw(/boot /usr /usr/share /usr/share/mdk); + install_any::getAndSaveFile("Mandrake/base/oem-message-graphic", "$o->{prefix}/boot/oem-message-graphic"); + install_any::getAndSaveFile("Mandrake/base/oem-background.png", "$o->{prefix}/usr/share/mdk/oem-background.png"); +}; + +my $old_afterInstallPackages = \&afterInstallPackages; +undef *afterInstallPackages; +*afterInstallPackages = sub { + &$old_afterInstallPackages; + + my ($o) = @_; + + #- lilo image. + rename "$o->{prefix}/boot/lilo-graphic/message", "$o->{prefix}/boot/lilo-graphic/message.orig"; + system "chroot", $o->{prefix}, "cp", "-f", "/boot/oem-message-graphic", "/boot/lilo-graphic/message"; + + #- KDE desktop background. + if (-e "$o->{prefix}/usr/share/config/kdesktoprc") { + update_gnomekderc("$o->{prefix}/usr/share/config/kdesktoprc", "Desktop0", + MultiWallpaperMode => "NoMulti", + Wallpaper => "/usr/share/mdk/oem-background.png", + WallpaperMode => "Scaled", + ); + } + #- GNOME desktop background. + if (-e "$o->{prefix}/etc/gnome/config/Background") { + update_gnomekderc("$o->{prefix}/etc/gnome/config/Background", "Default", + wallpaper => "/usr/share/mdk/oem-background.png", + wallpaperAlign => "3", + ); + } + + #- make sure no error can be forwarded, test staroffice installed and OpenOffice.org, + #- remove the first if the second is installed. + eval { + if (!$o->{isUpgrade} && -e "$o->{prefix}/usr/lib/openoffice/program/soffice.bin" && grep { -e "$o->{prefix}/usr/lib/office60_$_/program/soffice.bin" } qw(de en es fr it)) { + require run_program; + log::l("removing OpenOffice.org as staroffice is installed"); + run_program::rooted($o->{prefix}, "rpm", "-e", "OpenOffice.org"); + } + }; +}; + +use install_any; +package install_any; + +undef *copy_advertising; +*copy_advertising = sub { + my ($o) = @_; + + return if $::rootwidth < 800; + + my $f; + my $source_dir = "Mandrake/share/advertising"; + foreach ("." . $o->{lang}, "." . substr($o->{lang},0,2), '') { + $f = getFile("$source_dir$_/list") or next; + $source_dir = "$source_dir$_"; + } + if (my @files = <$f>) { + my $dir = "$o->{prefix}/tmp/drakx-images"; + mkdir $dir; + unlink glob_("$dir/*"); + foreach (@files) { + chomp; + getAndSaveFile("$source_dir/$_", "$dir/$_"); + s/\.png/\.pl/; + getAndSaveFile("$source_dir/$_", "$dir/$_"); + s/\.pl/_icon\.png/; + getAndSaveFile("$source_dir/$_", "$dir/$_"); + s/_icon\.png/\.png/; + } + @advertising_images = map { $_ && -e "$dir/$_" ? ("$dir/$_") : () } @files; + } +}; + +#undef *allowNVIDIA_rpms; +#*allowNVIDIA_rpms = sub { +# my ($packages) = @_; +# require pkgs; +# if (pkgs::packageByName($packages, "NVIDIA_GLX")) { +# #- at this point, we can allow using NVIDIA 3D acceleration packages. +# my @rpms; +# foreach (keys %{$packages->{names}}) { +# my ($ext, $version, $release) = /kernel[^-]*(-smp|-enterprise|-secure)?(?:-(\d.*?)\.(\d+\.\d+mdk))?$/ or next; +# my $p = pkgs::packageByName($packages, $_); +# pkgs::packageSelectedOrInstalled($p) or next; +# $version or ($version, $release) = (pkgs::packageVersion($p), pkgs::packageRelease($p)); +# my $name = "NVIDIA_kernel-$version-$release$ext"; +# pkgs::packageByName($packages, $name) or return; +# push @rpms, $name; +# } +# @rpms > 0 or return; +# return [ @rpms, "NVIDIA_GLX" ]; +# } +#}; + +use detect_devices; +package detect_devices; + +undef *usbMice; +*usbMice = sub { grep { ($_->{media_type} =~ /\|Mouse/ || $_->{driver} =~ /Mouse:USB/) && + $_->{driver} !~ /Tablet:wacom/} usb_probe() }; + +use Xconfigurator; +package Xconfigurator; + +undef *cardConfigurationAuto; +*cardConfigurationAuto = sub { + my @cards; + if (my @c = grep { $_->{driver} =~ /(Card|Server):/ } detect_devices::probeall()) { + @c >= 2 && $c[0]{description} eq $c[1]{description} && $c[0]{description} =~ /82830 CGC/ and shift @c; + foreach my $i (0..$#c) { + local $_ = $c[$i]->{driver}; + my $card = { identifier => ($c[$i]{description} . (@c > 1 && " $i")) }; + $card->{type} = $1 if /Card:(.*)/; + $card->{server} = $1 if /Server:(.*)/; + $card->{driver} = $1 if /Driver:(.*)/; + $card->{flags}{needVideoRam} = /86c368|S3 Inc|Tseng.*ET6\d00/; + $card->{busid} = "PCI:$c[$i]{pci_bus}:$c[$i]{pci_device}:$c[$i]{pci_function}"; + push @{$card->{lines}}, @{$lines{$card->{identifier}} || []}; + push @cards, $card; + } + } + #- take a default on sparc if nothing has been found. + if (arch() =~ /^sparc/ && !@cards) { + log::l("Using probe with /proc/fb as nothing has been found!"); + local $_ = cat_("/proc/fb"); + if (/Mach64/) { push @cards, { server => "Mach64" } } + elsif (/Permedia2/) { push @cards, { server => "3DLabs" } } + else { push @cards, { server => "Sun24" } } + } + #- special case for dual head card using only one busid. + @cards = map { my $dup = $_->{identifier} =~ /MGA G[45]50/ ? 2 : 1; + if ($dup > 1) { + my @result; + my $orig = $_; + foreach (1..$dup) { + my $card = {}; + add2hash($card, $orig); + push @result, $card; + } + @result; + } else { + ($_); + } + } @cards; + #- make sure no type are already used, duplicate both screen + #- and rename type (because used as id). + if (@cards > 1) { + my $card = 1; + foreach (@cards) { + updateCardAccordingName($_, $_->{type}) if $_->{type}; + $_->{type} = "$_->{type} $card"; + $card++; + } + } + #- in case of only one cards, remove all busid reference, this will avoid + #- need of change of it if the card is moved. + #- on many PPC machines, card is on-board, busid is important, leave? + @cards == 1 and delete $cards[0]{busid} if arch() !~ /ppc/; + @cards; +}; + +use mouse; +package mouse; +undef *detect; +*detect = sub { + if (arch() =~ /^sparc/) { + return fullname2mouse("sunmouse|Sun - Mouse"); + } + if (arch() eq "ppc") { + return fullname2mouse(detect_devices::hasMousePS2("usbmouse") ? + "USB|1 button" : + #- No need to search for an ADB mouse. If I did, the PPC kernel would + #- find one whether or not I had one installed! So.. default to it. + "busmouse|1 button"); + } + + my @wacom; + my $fast_mouse_probe = sub { + my $auxmouse = detect_devices::hasMousePS2("psaux") && fullname2mouse("PS/2|Standard", unsafe => 1); + + if (modules::get_alias("usb-interface")) { + if (my (@l) = detect_devices::usbMice()) { + log::l("found usb mouse $_->{driver} $_->{description} ($_->{type})") foreach @l; + eval { modules::load($_) foreach qw(hid mousedev usbmouse) }; + if (!$@ && detect_devices::tryOpen("usbmouse")) { + my $mouse = fullname2mouse($l[0]{driver} =~ /Mouse:(.*)/ ? $1 : "USB|Generic"); + $auxmouse and $mouse->{auxmouse} = $auxmouse; #- for laptop, we kept the PS/2 as secondary (symbolic). + return $mouse; + } + eval { modules::unload($_) foreach qw(usbmouse mousedev hid) }; + } + } + $auxmouse; + }; + + if (modules::get_alias("usb-interface")) { + my $keep_mouse; + if (my (@l) = detect_devices::usbWacom()) { + log::l("found usb wacom $_->{driver} $_->{description} ($_->{type})") foreach @l; + eval { modules::load("wacom"); modules::load("evdev"); }; + unless ($@) { + foreach (0..$#l) { + detect_devices::tryOpen("input/event$_") and $keep_mouse = 1, push @wacom, "input/event$_"; + } + } + $keep_mouse or eval { modules::unload("evdev"); modules::unload("wacom"); }; + } + } + + #- at this level, not all possible mice are detected so avoid invoking serial_probe + #- which takes a while for its probe. + if ($::isStandalone) { + my $mouse = $fast_mouse_probe->(); + $mouse and return ($mouse, @wacom); + } + + #- probe serial device to make sure a wacom has been detected. + eval { modules::load("serial") }; + my ($r, @serial_wacom) = mouseconfig(); push @wacom, @serial_wacom; + + if (!$::isStandalone) { + my $mouse = $fast_mouse_probe->(); + $r && $mouse and $r->{auxmouse} = $mouse; #- we kept the auxilliary mouse as PS/2. + $r and return ($r, @wacom); + $mouse and return ($mouse, @wacom); + } else { + $r and return ($r, @wacom); + } + + #- in case only a wacom has been found, assume an inexistant mouse (necessary). + @wacom and return { CLASS => 'MOUSE', + nbuttons => 2, + device => "nothing", + MOUSETYPE => "Microsoft", + XMOUSETYPE => "Microsoft"}, @wacom; + + if (!modules::get_alias("usb-interface") && detect_devices::is_a_recent_computer() && $::isInstall && !$::noauto) { + #- special case for non detected usb interface on a box with no mouse. + #- we *must* find out if there really is no usb, otherwise the box may + #- not be accessible via the keyboard (if the keyboard is USB) + #- the only way to know this is to make a full pci probe + modules::load_thiskind("usb", '', 'unsafe'); + if (my $mouse = $fast_mouse_probe->()) { + return $mouse; + } + } + + if (modules::get_alias("usb-interface")) { + eval { modules::load($_) foreach qw(hid mousedev usbmouse) }; + sleep 1; + if (!$@ && detect_devices::tryOpen("usbmouse")) { + #- defaults to generic USB mouse on usbmouse. + log::l("defaulting to usb generic mouse"); + return fullname2mouse("USB|Generic", unsafe => 1); + } + } + + #- defaults to generic serial mouse on ttyS0. + #- Oops? using return let return a hash ref, if not using it, it return a list directly :-) + return fullname2mouse("serial|Generic 2 Button Mouse", unsafe => 1); +}; |