diff --git a/Build.PL b/Build.PL new file mode 100644 index 0000000..08a469c --- /dev/null +++ b/Build.PL @@ -0,0 +1,19 @@ +use Module::Build; + +my $home = $ENV{HOME}; + +my $build = Module::Build->new( + module_name => 'QuotaUsers', + license => 'GPLv3', + dist_author => 'Sergio Iglesias ', + dist_abstract => 'Creates users limited in quota.', + requires => { + 'Getopt::Long::Descriptive' => '0', + 'Const::Fast' => '0', + 'Text::CSV' => 0, + 'Crypt::URandom' => 0, + }, + install_path => { + } +); +$build->create_build_script; diff --git a/bin/quotausers b/bin/quotausers new file mode 100644 index 0000000..420d38b --- /dev/null +++ b/bin/quotausers @@ -0,0 +1,69 @@ +#!/usr/bin/env perl + +use v5.30.0; + +use strict; +use warnings; + +use Getopt::Long::Descriptive; +use Const::Fast; + +use Text::CSV qw/csv/; +use Crypt::URandom; + +const my @CHARACTERS => ( 'a' .. 'z', 'A' .. 'Z' ); + +my ( $opt, $usage ) = describe_options( + 'quotausers %o', + [ 'csv|c=s', 'The csv with the emails and usernames', { required => 1 } ], + [ 'size|c=s', 'Assigned size for all users.', { required => 1 } ], + [ 'help|h=s', 'Show help', { shortcircuit => 1 } ], +); + +print( $usage->text ), exit if $opt->help; + +my $size = $opt->size; +my $users = csv( in => $opt->csv, headers => 'auto' ); + +for my $user (@$users) { + my $username = $user->{username}; + my $email = $user->{email}; + my $passwd = get_passwd(); + my $errorno = system qw/sudo useradd -m/, $username, qw{-s /bin/bash}; + my $full_size = 1024**2 * $size; + my $size_softlimit = 1024**2 * ( $size - 1 ); + if ($errorno) { + die 'Cannot create user. Are you admin?'; + } + execute_chpasswd( $username, $passwd ); + system qw/sudo setquota -u/, $username, $size_softlimit, $full_size, 0, 0, + '/'; + system qw/sudo gpasswd -a/, $username, 'video'; + system qw/sudo gpasswd -a/, $username, 'plugdev'; + system qw/sudo gpasswd -a/, $username, 'storage'; + system qw/sudo gpasswd -a/, $username, 'audio'; + system qw/sudo -u/, $username, + qw{flatpak --user remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo}; + say "$username <$email> -- $passwd"; +} + +sub execute_chpasswd { + my $username = shift; + my $passwd = shift; + open my $fh, '|-', qw/sudo chpasswd/ or die "Unable to change passwd."; + say $fh "$username:$passwd"; + close $fh; +} + +sub get_passwd { + my $passwd = ''; + for ( 0 .. 11 ) { + $passwd .= + $CHARACTERS[ get_safe_random_64_bits_number() % scalar @CHARACTERS ]; + } + return $passwd; +} + +sub get_safe_random_64_bits_number { + return unpack 'Q', Crypt::URandom::urandom(8); +}