#!/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."; } }