1 ! ˆl–äY>”TÔD¨ ÅõÆEp/©‹Fÿ 0ÁÀÄ# ˆl–ß=¿JJj"Tâ�rã-Üd*bѿà ƒh¹ÂÁÅ $ ˆl–Ãa¾”*eJm@?q¶n41hßÄ „ Ï2×ÃÂÆ?÷ #!/usr/local/cpanel/3rdparty/bin/perl # cpanel - scripts/fixquotas Copyright 2022 cPanel, L.L.C. # All rights reserved. # copyright@cpanel.net http://cpanel.net # This code is subject to the cPanel license. Unauthorized copying is prohibited package Scripts::FixQuotas; use cPstrict; use Cwd (); use IO::File (); use Scalar::Util (); use Cpanel::Binaries (); use Cpanel::FindBin (); use Cpanel::Filesys::FindParse (); use Cpanel::Filesys::Info (); use Cpanel::SafeRun::Errors (); use Cpanel::OS (); use Cpanel::Filesys::Root (); use Cpanel::LoadFile (); use Cpanel::Fcntl::Constants (); use Cpanel::SafeRun::Object (); use Cpanel::SetEnvLocale (); use Cpanel::ServerTasks (); use Cpanel::Transaction::File::Raw (); use Cpanel::SafeDir::MK (); use Cpanel::Notify (); use Cpanel::FileUtils::Touch (); use Cpanel::Kernel::Status (); use Cpanel::Pkgr (); use Cpanel::SysPkgs (); # For testing purposes our $PROC_MOUNTS = Cwd::realpath('/proc/mounts'); our $UDEV_RULES_DIR = "/etc/udev/rules.d"; our $UDEV_LINK_RULES_FILE = "$UDEV_RULES_DIR/99-root-link.rules"; our $REBOOT_TOUCH_FILE = "/var/cpanel/reboot_required_for_quota"; our $BROKEN_TOUCH_FILE = "/var/cpanel/quota_broken"; our $DEFAULT_GRUB_CONFIG = '/etc/default/grub'; our %cmd = ( 'quotaon' => undef, 'quotaoff' => undef, ); use constant { CONTINUED_SUCCESS => 1, NEW_SUCCESS => 2 }; exit run(@ARGV) unless caller(); sub run (@args) { my $onboot = grep { $_ eq '--onboot' } @args; return 0 if !verify_quota_binaries(); if ($onboot) { if ( enable_quotas() == NEW_SUCCESS ) { # dies on failures Cpanel::Notify::notification_class( 'class' => 'Quota::SetupComplete', 'application' => 'Quota::SetupComplete', 'constructor_args' => [] ); } return 0; } Cpanel::SafeRun::Errors::saferunnoerror( $cmd{'quotaoff'}, '-a' ); fix_broken_dev_root_links(); initialize_quotas(); enable_quotas(); return 0; } sub get_xfs_mount_points_without_quota { my @lines = grep { /\bxfs\b.*\bnoquota\b/ } Cpanel::SafeRun::Errors::saferunnoerror('/bin/mount'); my @partitions; foreach my $line (@lines) { push @partitions, $1 if $line =~ /^\S+\s+on\s+(\S+)/; } return @partitions; } # Find the XFS partitions with uquota (but not noquota) set in fstab. sub get_xfs_mount_points_fstab_quota { my @xfs = grep { $_->{'fstype'} eq 'xfs' } Cpanel::Filesys::FindParse::parse_fstab(); return map { $_->{mountpoint} } grep { my $obj = $_; my $opts = { map { $_ => 1 } @{ $obj->{'options'} } }; $opts->{'uquota'} && !$opts->{'noquota'}; } @xfs; } sub fix_broken_dev_root_links { if ( !-e $PROC_MOUNTS || !-r $PROC_MOUNTS ) { return 0; } my @lines = split qq{\n}, Cpanel::LoadFile::load($PROC_MOUNTS) or die "Unable to open $PROC_MOUNTS: $!"; # # Danger: This code is targeted to fix systems that have # /dev/root (AKA Cpanel::Filesys::Root::DEV_ROOT) in /proc/mounts # # If it is refactored to fix other system additional coverage will # be needed esp for handling roots like /dev/mapper/Vol.... # foreach my $line (@lines) { my ( $device, $mount, $type, undef ) = split( /\s+/, $line, 4 ); if ( defined $device && $device eq $Cpanel::Filesys::Root::DEV_ROOT && !-e $Cpanel::Filesys::Root::DEV_ROOT ) { my $actual_root_device_path = Cpanel::Filesys::Root::get_root_device_path(); #If $DEV_ROOT is a symlink that doesn’t resolve, #whether it’s a dangling symlink, #a symlink to a dangling symlink, or part of a sym