package any; # $Id$
use diagnostics;
use strict;
#-######################################################################################
#- misc imports
#-######################################################################################
use common;
use detect_devices;
use partition_table;
use fs::type;
use lang;
use run_program;
use devices;
use modules;
use log;
use fs;
use c;
sub facesdir() {
"$::prefix/usr/share/mga/faces/";
}
sub face2png {
my ($face) = @_;
facesdir() . $face . ".png";
}
sub facesnames() {
my $dir = facesdir();
my @l = grep { /^[A-Z]/ } all($dir);
map { if_(/(.*)\.png/, $1) } (@l ? @l : all($dir));
}
sub addKdmIcon {
my ($user, $icon) = @_;
my $dest = "$::prefix/usr/share/faces/$user.png";
eval { cp_af(facesdir() . $icon . ".png", $dest) } if $icon;
}
sub alloc_user_faces {
my ($users) = @_;
my @m = my @l = facesnames();
foreach (grep { !$_->{icon} || $_->{icon} eq "automagic" } @$users) {
$_->{auto_icon} = splice(@m, rand(@m), 1); #- known biased (see cookbook for better)
log::l("auto_icon is $_->{auto_icon}");
@m = @l unless @m;
}
}
sub create_user {
my ($u, $authentication) = @_;
my @existing = stat("$::prefix/home/$u->{name}");
if (!getpwnam($u->{name})) {
my $uid = $u->{uid} || $existing[4];
if ($uid && getpwuid($uid)) {
undef $uid; #- suggested uid already in use
}
my $gid = $u->{gid} || $existing[5] || int getgrnam($u->{name});
if ($gid) {
if (getgrgid($gid)) {
undef $gid if getgrgid($gid) ne $u->{name};
} else {
run_program::rooted($::prefix, 'groupadd', '-g', $gid, $u->{name});
}
} elsif ($u->{rename_from}) {
run_program::rooted($::prefix, 'groupmod', '-n', $u->{name}, $u->{rename_from});
}
require authentication;
my $symlink_home_from = $u->{rename_from} && (getpwnam($u->{rename_from}))[7];
run_program::raw({ root => $::prefix, sensitive_arguments => 1 },
($u->{rename_from} ? 'usermod' : 'adduser'),
'-p', authentication::user_crypted_passwd($u, $authentication),
if_($uid, '-u', $uid), if_($gid, '-g', $gid),
if_($u->{realname}, '-c', $u->{realname}),
if_($u->{home}, '-d', $u->{home}, if_($u->{rename_from}, '-m')),
if_($u->{shell}, '-s', $u->{shell}),
($u->{rename_from}
? ('-l', $u->{name}, $u->{rename_from})
: $u->{name}));
symlink($u->{home}, $symlink_home_from) if $symlink_home_from;
}
my (undef, undef, $uid, $gid, undef, undef, undef, $home) = getpwnam($u->{name});
if (@existing && $::isInstall && ($uid != $existing[4] || $gid != $existing[5])) {
log::l("chown'ing $home from $existing[4].$existing[5] to $uid.$gid");
eval { common::chown_('recursive', $uid, $gid, "$::prefix$home") };
}
}
sub add_users {
my ($users, $authentication) = @_;
alloc_user_faces($users);
foreach (@$users) {
create_user($_, $authentication);
run_program::rooted($::prefix, "usermod", "-G", join(",", @{$_->{groups}}), $_->{name}) if !is_empty_array_ref($_->{groups});
addKdmIcon($_->{name}, delete $_->{auto_icon} || $_->{icon});
}
}
sub install_bootloader_pkgs {
my ($do_pkgs, $b) = @_;
bootloader::ensure_pkg_is_installed($do_pkgs, $b);
install_acpi_pkgs($do_pkgs, $b);
}
sub install_acpi_pkgs {
my ($do_pkgs, $b) = @_;
my $acpi = bootloader::get_append_with_key($b, 'acpi');
my $use_acpi = !member($acpi, 'off', 'ht');
if ($use_acpi) {
$do_pkgs->ensure_files_are_installed([ [ 'acpi', '/usr/bin/acpi' ], [ 'acpid', '/usr/sbin/acpid' ] ], $::isInstall);
}
require services;
services::set_status($_, $use_acpi, $::isInstall) foreach qw(acpi acpid);
}
sub setupBootloaderBeforeStandalone {
my ($do_pkgs, $b, $all_hds, $fstab) = @_;
require keyboard;
my $keyboard = keyboard::read_or_default();
my $allow_fb = listlength(cat_("/proc/fb"));
my $cmdline = cat_('/proc/cmdline');
|