92 lines
3.1 KiB
Perl
92 lines
3.1 KiB
Perl
#!/usr/bin/env perl
|
|
|
|
use v5.36.0;
|
|
|
|
use strict;
|
|
use warnings;
|
|
use utf8;
|
|
|
|
use Path::Tiny;
|
|
use lib path(__FILE__)->parent->child('lib') . '';
|
|
|
|
use BaseUtils;
|
|
|
|
my $utils = BaseUtils->new;
|
|
|
|
main();
|
|
|
|
sub main() {
|
|
die 'Must be superuser.' if $< != 0;
|
|
my $target_dir = shift @ARGV or die 'No target dir passed.';
|
|
my $destination_dir = shift @ARGV or die 'No destination dir passed.';
|
|
$target_dir = path($target_dir);
|
|
$destination_dir = path($destination_dir);
|
|
$utils->createBasicMountsChroot($target_dir);
|
|
my $mnt_gentoo = $target_dir->child('mnt/gentoo');
|
|
populateDirectory($destination_dir);
|
|
populateDirectory($mnt_gentoo);
|
|
$utils->mountRbind($destination_dir, $mnt_gentoo);
|
|
$utils->createBasicMountsChroot($mnt_gentoo);
|
|
my $packages = $utils->readPackagesToInstall();
|
|
$utils->execChroot($target_dir, 'emerge', '--root', '/mnt/gentoo', '--noreplace', '-K', @$packages);
|
|
$utils->execChroot($mnt_gentoo, 'systemctl', 'enable', 'nginx');
|
|
$utils->execChroot($mnt_gentoo, 'systemctl', 'enable', 'docker');
|
|
$utils->execChroot($mnt_gentoo, 'systemctl', 'enable', 'sshd');
|
|
$utils->execChroot($mnt_gentoo, 'systemctl', 'enable', 'systemd-resolved');
|
|
my @boot_services = qw( systemd-tmpfiles-setup sysctl );
|
|
my @sysinit_services;
|
|
for my $service (@boot_services) {
|
|
$utils->execChroot($mnt_gentoo, 'systemctl', 'enable', $service);
|
|
}
|
|
for my $service (@sysinit_services) {
|
|
$utils->execChroot($mnt_gentoo, 'systemctl', 'enable', $service);
|
|
}
|
|
$utils->install('nginx.conf', $mnt_gentoo->child('etc/nginx/nginx.conf'));
|
|
_installEfiSyslinux($target_dir, $mnt_gentoo);
|
|
_installKernel($target_dir, $mnt_gentoo);
|
|
$utils->_installRootFiles( $mnt_gentoo->child('etc/portage'), $target_dir->child('etc/portage'));
|
|
$utils->_installRootFiles( $mnt_gentoo, path('root_final') );
|
|
_configureNetwork($mnt_gentoo);
|
|
}
|
|
|
|
|
|
sub _configureNetwork($mnt_gentoo) {
|
|
# $mnt_gentoo->child('etc/conf.d/net')->spew_utf8(<<'EOF');
|
|
#config_eth0="192.168.1.1/24"
|
|
#EOF
|
|
$utils->execChroot($mnt_gentoo, 'systemctl', 'enable', 'dhcpcd');
|
|
}
|
|
|
|
sub _installKernel($target_dir, $mnt_gentoo) {
|
|
my $vmlinuz = $utils->getVmlinuz($target_dir);
|
|
my $return_code = system 'cp', '-v', $target_dir->child("boot/$vmlinuz"), $mnt_gentoo->child('boot');
|
|
}
|
|
|
|
sub _installEfiSyslinux($target_dir, $mnt_gentoo) {
|
|
my @files = grep { -f $_ } $target_dir->child('usr/share/syslinux/efi64')->children;
|
|
my $syslinux_dir = $mnt_gentoo->child('boot/EFI/BOOT');
|
|
$syslinux_dir->mkpath;
|
|
for my $file (@files) {
|
|
if ($file =~ /\.efi$/i) {
|
|
my $return_code = system 'cp', '-v', $file, $syslinux_dir->child('BOOTx64.EFI');
|
|
_errIfSyslinuxFail($return_code);
|
|
next;
|
|
}
|
|
my $return_code = system 'cp', '-v', @files, $syslinux_dir;
|
|
_errIfSyslinuxFail($return_code);
|
|
}
|
|
}
|
|
|
|
sub _errIfSyslinuxFail($return_code) {
|
|
if ($return_code != 0) {
|
|
die 'Unable to install syslinux EFI files.';
|
|
}
|
|
}
|
|
|
|
sub populateDirectory($dir) {
|
|
my $return_code = system 'mkdir', '-pv', $dir;
|
|
if ($return_code != 0) {
|
|
die "Unable to create $dir.";
|
|
}
|
|
}
|