Complete-Unix

 view release on metacpan or  search on metacpan

lib/Complete/Unix.pm  view on Meta::CPAN

package Complete::Unix;

use 5.010001;
use strict;
use warnings;
use Log::ger;

use Complete::Common qw(:all);
use Exporter 'import';

our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
our $DATE = '2022-09-08'; # DATE
our $DIST = 'Complete-Unix'; # DIST
our $VERSION = '0.081'; # VERSION

our @EXPORT_OK = qw(
                       complete_uid
                       complete_user
                       complete_gid
                       complete_group

                       complete_pid
                       complete_proc_name

                       complete_service_name
                       complete_service_port
                );

our %SPEC;

$SPEC{':package'} = {
    v => 1.1,
    summary => 'Unix-related completion routines',
};

$SPEC{complete_uid} = {
    v => 1.1,
    summary => 'Complete from list of Unix UID\'s',
    args => {
        %arg_word,
        etc_dir => { schema=>['str*'] },
    },
    result_naked => 1,
    result => {
        schema => 'array',
    },
};
sub complete_uid {
    require Complete::Util;
    require Unix::Passwd::File;

    my %args  = @_;
    my $word  = $args{word} // "";

    my $res = Unix::Passwd::File::list_users(
        etc_dir=>$args{etc_dir}, detail=>1);
    return unless $res->[0] == 200;
    Complete::Util::complete_array_elem(
        array     => [map {$_->{uid}} @{ $res->[2] }],
        summaries => [map {$_->{user} . (length $_->{gecos} ? " ($_->{gecos})" : "") } @{ $res->[2] }],
        word=>$word);
}

$SPEC{complete_user} = {
    v => 1.1,
    summary => 'Complete from list of Unix users',
    args => {
        %arg_word,
        etc_dir => { schema=>['str*'] },
    },
    result_naked => 1,
    result => {
        schema => 'array',
    },
};
sub complete_user {
    require Complete::Util;
    require Unix::Passwd::File;

    my %args  = @_;
    my $word  = $args{word} // "";

    my $res = Unix::Passwd::File::list_users(
        etc_dir=>$args{etc_dir}, detail=>1);
    return unless $res->[0] == 200;
    Complete::Util::complete_array_elem(
        array     => [map {$_->{user}} @{ $res->[2] }],
        summaries => [map {(length $_->{gecos} ? "$_->{gecos} " : "") . "(UID $_->{uid})" } @{ $res->[2] }],
        word=>$word);
}

$SPEC{complete_gid} = {
    v => 1.1,
    summary => 'Complete from list of Unix GID\'s',
    args => {
        %arg_word,
        etc_dir => { schema=>['str*'] },
    },
    result_naked => 1,
    result => {
        schema => 'array',
    },
};
sub complete_gid {
    require Complete::Util;
    require Unix::Passwd::File;

    my %args  = @_;
    my $word  = $args{word} // "";

    my $res = Unix::Passwd::File::list_groups(
        etc_dir=>$args{etc_dir}, detail=>1);
    return unless $res->[0] == 200;
    Complete::Util::complete_array_elem(
        array     => [map {$_->{gid}} @{ $res->[2] }],
        summaries => [map {$_->{group}} @{ $res->[2] }],
        word=>$word);
}

$SPEC{complete_group} = {
    v => 1.1,
    summary => 'Complete from list of Unix groups',
    args => {
        %arg_word,
        etc_dir => { schema=>['str*'] },
    },
    result_naked => 1,
    result => {
        schema => 'array',
    },
};
sub complete_group {
    require Complete::Util;
    require Unix::Passwd::File;

    my %args  = @_;
    my $word  = $args{word} // "";

    my $res = Unix::Passwd::File::list_groups(
        etc_dir=>$args{etc_dir}, detail=>1);
    return unless $res->[0] == 200;
    Complete::Util::complete_array_elem(
        array     => [map {$_->{group}} @{ $res->[2] }],
        summaries => [map {"(GID $_->{gid})"} @{ $res->[2] }],
        word=>$word);
}

$SPEC{complete_pid} = {
    v => 1.1,
    summary => 'Complete from list of running PIDs',
    args => {
        %arg_word,
    },
    result_naked => 1,
    result => {
        schema => 'array',
    },
};
sub complete_pid {
    require Complete::Util;
    require Proc::Find;

    my %args  = @_;
    my $word  = $args{word} // "";

    my $procs = Proc::Find::find_proc(detail => 1);

    Complete::Util::complete_array_elem(
        array     => [map {$_->{pid}} @$procs],
        summaries => [map {$_->{cmndline}} @$procs],
        word=>$word);
}

$SPEC{complete_proc_name} = {
    v => 1.1,
    summary => 'Complete from list of process names',
    args => {
        %arg_word,
    },
    result_naked => 1,
    result => {
        schema => 'array',
    },
};
sub complete_proc_name {
    require Complete::Util;
    require List::MoreUtils;
    require Proc::Find;

    my %args  = @_;
    my $word  = $args{word} // "";

    Complete::Util::complete_array_elem(
        array=>[List::MoreUtils::uniq(
            grep {length}
                map { $_->{name} }
                    @{ Proc::Find::find_proc(detail=>1) })],
        word=>$word);
}

$SPEC{complete_service_name} = {
    v => 1.1,
    summary => 'Complete from list of service names from /etc/services',
    args => {

lib/Complete/Unix.pm  view on Meta::CPAN

}

$SPEC{complete_service_port} = {
    v => 1.1,
    summary => 'Complete from list of service ports from /etc/services',
    args => {
        %arg_word,
    },
    result_naked => 1,
    result => {
        schema => 'array',
    },
};
sub complete_service_port {
    require Parse::Services;

    my %args  = @_;
    my $word  = $args{word} // "";

    my %services;

    # from /etc/services
    {
        my $res = Parse::Services::parse_services();
        last if $res->[0] != 200;
        for my $row (@{ $res->[2] }) {
            $services{$row->{port}} = "$row->{name}".(@{$row->{aliases}} ? "/".join("/", @{$row->{aliases}}) : "")." ($row->{proto})";
        }
    }

    require Complete::Util;
    Complete::Util::complete_hash_key(
        word => $word,
        hash => \%services,
        summaries_from_hash_values => 1,
    );
}

1;
# ABSTRACT: Unix-related completion routines

__END__

=pod

=encoding UTF-8

=head1 NAME

Complete::Unix - Unix-related completion routines

=head1 VERSION

This document describes version 0.081 of Complete::Unix (from Perl distribution Complete-Unix), released on 2022-09-08.

=head1 DESCRIPTION

=head1 FUNCTIONS


=head2 complete_gid

Usage:

 complete_gid(%args) -> array

Complete from list of Unix GID's.

This function is not exported by default, but exportable.

Arguments ('*' denotes required arguments):

=over 4

=item * B<etc_dir> => I<str>

=item * B<word>* => I<str> (default: "")

Word to complete.


=back

Return value:  (array)



=head2 complete_group

Usage:

 complete_group(%args) -> array

Complete from list of Unix groups.

This function is not exported by default, but exportable.

Arguments ('*' denotes required arguments):

=over 4

=item * B<etc_dir> => I<str>

=item * B<word>* => I<str> (default: "")

Word to complete.


=back

Return value:  (array)



=head2 complete_pid

Usage:

 complete_pid(%args) -> array

Complete from list of running PIDs.

This function is not exported by default, but exportable.

Arguments ('*' denotes required arguments):



( run in 1.495 second using v1.01-cache-2.11-cpan-5735350b133 )