[pve-devel] [PATCH access-control] pveum: Allow listing of roles and their privileges

Thomas Lamprecht t.lamprecht at proxmox.com
Mon Sep 25 10:13:29 CEST 2017


On 09/25/2017 07:05 AM, Dietmar Maurer wrote:
> 
>> +	sub {
>> +	    my ($res) = @_;
>> +	    my $longest = 0;
>> +	    foreach my $role(map($_->{roleid}, @$res)) {
>> +		my $len = length $role;
>> +		$longest = $len if $len > $longest;
>> +	    }
>> +	    $longest += 2;
>> +	    my $width = 96;
>> +	    my $maxlength = $width - $longest;
>> +	    printf("%-${longest}s%s\n", "ROLE", "PRIVILEGES");
>> +	    for my $role(sort {lc($a->{roleid}) cmp lc($b->{roleid})} @$res) {
>> +		my @lines_privs = ("");
>> +		my $cur_line = 0;
>> +		for my $priv(split(',', $role->{privs})) {
>> +		    if (length($lines_privs[$cur_line]) == 0) {
>> +			$lines_privs[$cur_line] .= "$priv";
>> +		    } elsif (length($lines_privs[$cur_line]) + length($priv) <= $maxlength)
>> {
>> +			$lines_privs[$cur_line] .= ", $priv";
>> +		    } else {
>> +			$lines_privs[++$cur_line] .= "$priv";
>> +		    }
>> +		}
>> +		printf("%-${longest}s%s\n", "$role->{roleid}:", $lines_privs[0]);
>> +		for my $line(1..(scalar(@lines_privs) - 1)) {
>> +		    printf("%${longest}s%s\n", "", $lines_privs[$line]);
>> +		}
>> +	    }
> 
> I would like to have a generic utility function to print nicely formatted tables
> instead.
> 

Philip, do you have interest to take a look at that?
Would be nice if we could unify all this.

We have such or similar implementations in:

pvesm status
pct list
qm list

possible other places too, just mentioning those from top of my head.

We probably can go a long way if we can tell the formatter that a
column is left, right and maybe center aligned.
We currently just pad columns where we know that the may get long,
but padding all and call it a day would work too.

Your formatting (which looks nice, btw) would need an additional
"wrap column line" feature.

The signature of this all could be a small class or just a method,
what's nicer to use and reuse.
We could pass a Column headings to alignment mapping and , e.g.:

my $columns = {
     Name => { align => 'l', data => 'id' },
     Type => { align => 'c', data => 'type' },
     ...,
     'Used %' => { align => 'r', data => sub { my $d = shift; return ($d->{used}/$d->{total}) * 100 },
};
Where l,r,c are for left-, right- and center-padded, respectively.
And data is either a hash key if scalar or a coderef to allow making
transformation on the data or calculating columns which are not
directly available from the data.

PVE::FormatTable::print($columns, $data);

Just a rough draft what would be needed and idea how the interface
could look like..

Perl modules which could be looked at, e.g. for inspiration:
http://search.cpan.org/~shlomif/Text-Table-1.133/lib/Text/Table.pm
http://search.cpan.org/~cub/Text-SimpleTable-AutoWidth-0.09/lib/Text/SimpleTable/AutoWidth.pm
http://search.cpan.org/dist/Text-FormatTable/lib/Text/FormatTable.pm
(the last ones source doesn't looks to big)

Maybe, if their quite small, support our use cases and do not need
to much extra dependencies (at best none :) them self and look like
they will stay with us longer (i.e. active and have some
reverse-dependencies in Debian) we could also use this directly.




More information about the pve-devel mailing list