�PNG  IHDR22?�� pHYs  �� OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*! J�!��Q�EEȠ�����Q, � ��!���������{�kּ������>���� �H3Q5� �B�������.@� $p�d!s�#�~<<+"��x� �M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH���� � 0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4���������x����6��_-��"bb���ϫp@�t~��,/��;�m��%�h^ �u��f�@����W�p�~<�5�j>{�-�]c�K'Xt����o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A��,���� �`6�B$��BB d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(�� A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=� �C��7�F� �dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8, �c˱"� ���V����cϱw�E� 6wB aAHXLXN�H� $4� 7 �Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[ �b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w ��Ljg(�gw��L�Ӌ�T071���oUX*�*|�� �J�&�*/T����ު U�U�T��^S}�FU3S� Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k ��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN �(���~���)�)�4L�1e\k����X�H�Q�G�6������E�Y��A�J'\'Gg����S�Sݧ �M=:��.�k���Dw�n��^��Lo��y���}/�T�m���G X� $� �<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��= ���Z~s�r:V:ޚΜ�?}����/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z���������ۯ�6�i�ܟ�4�)�Y3s���C�Q��? ��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�������!h�쐭!��Α�i�P~���a�a��~ '���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl������� �{�/�]py�����.,:�@L�N8��A*��%�w%� y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y- �B��TZ(�*�geWf�͉�9���+��̳�ې7�����ᒶ��KW-X潬j9�������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n �ڴ �V����E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa��n��{��4���[���>ɾ�UUM�f�e�I���?�������m]�Nmq����#�׹���=TR��+�G�����w- 6 U����#pDy��� �� :�v�{���vg/jB��F�S��[b[�O�>����z�G��499�?r����C�d�&����ˮ/~�����јѡ�򗓿m|������������x31^�V���w�w��O�| (�h���SЧ��������c3-� cHRMz%������u0�`:�o�_�F5IDATx��ytUս�?�;���fN$$��@B�!�k��� -*�gE���j�O�kQ�ʠ`U�B_ �AÐ0%�Ȕ�@r3ޛ;߳��$�@��v����^�s����������$��ߢ !�W��5�̱'-٘������4�>�Rƫ$�G��0U�H}�_ _� #��k�MJ/=�9Du *ڲ�k�PQ;0��j|�*�$�^컂脛y���>�z×� B��� ��(�:$�ʔ_�6��C!B����MVx��a��ζyY����j��ƋY2�9�F�{r��r�딟F��Q��hY6��� x��[l��RC��������nt@��;P��3��� F�w��7��:�P���ɋ'���mj���Bƪ�$�Q�L��y��߷g��\���z����v5�p�v$�v櫻�`6~K �Y�X����,�:��"�o�e0II"(��,������l_�C���/4�+f�E�!q��:����u����c��樼.UE�@� �]K�W���$-�h]�JG���Dz)�`��.�A/ ���mᏣc�3jK� �!�>���$�Q�!�_�? \�C2(E �M$Z I{�U���s�ǣ���=��@Բe ޻��W�����@ �w����}�9v,)��.}*|"�s��di���,���G�]W�AC�������|<����[��ߕ������K�*�G nߴ!��‹��J�!��6(L�a)��Am��������;adf��:�xm��nh�;֦I��(���o�C~ډa?�=��s����h��E������xp����)���_���t��W�����´;8���`dz=(��@@�+,�;�`�fhl��XȌ�3,uI�~z(J����� �ZX�A����H'�À�㜦�82|��a�n�z2��I���� ���EY�h�ε<�0�q�{��C��v�˅��?"@��χ�x�WS+��N�~�KQ�J�8ل�� _.W��� !TU{�����,��"�� �;�������HI S� ��))�o�1�H�D� ���� (� ;����"Ҕ��,���� �F=���O��&�Ph>�`���y��߲ &S��P�<��'��1s�1cĂ�N����2)����@�u��tv��<�+�-&�����h��[!FSG���' � z z0��<����8d&�����E0�,��<��"!P�b4��� �{S�����X����.�囤���T��hEF��X�q0"-<����h���]�Py*����F⩍��@v�˂�Y08�� .q��a��s����(!<̫1�3�L�H��7sYW�`��qtu�\7��?�@�Y�� %Ka�x�GZ�*W�P��y�����N0r9��Z�c�%���q,��k�����!!,��>���IB��� �x1�Xu�Y���v-���ֺ��N������JP��a�2`�e5��w��u;�6�i���̃��(K���ťa��(l51��JL��O'%���]���ٖ뿉!��{*�p+f ���i8��D�ȑ���ܩ�M��V��ӟz��x�7Z�1i}�^͜���6e����x��)u�d�ˏ�V�eG�\�X1�����=n�U'�~Y����L�\,�(d!x ,�:�TW8� M`r���@��r+v�Q0��>^;˴�VbF��('����� �*O��i��j�Ӆ����^�S3&� ���{������.ی�� N;��NU%d0�Ce\r"�C�b��&t7N�7��� �ȪD�[%l�۪�$��'m?�A9tI�9>��NVL ��� 6v~M�����ъ�B���0����9$&=ώm��W�0���L���&��E���f�f��'+�9��hv��7,���M��6�D�&�^� �����8 D֮�����o��k^z��O��hP�8q�5d*��YVq3�{��������#LX4�?��jP=3�~�؅c�ݰ�̱�ұ��8̲��2�G�����j��έ�9��w7���U�X�w�85C��?!I&���o&����L���I#�^�eV�,�^t5�k� �xs˛\��U�8��."���{���ǵ�l4��ݼ�;��r"���G�/~���gJV�N糦��ZZ^k+NN�D��I$�=OE�z����|*�*{��%k���G��>�`9��b;�s���8,�qs��c��.b��q�%�>r��n�R�Ƨ�%�,�A��le#�8���}; 21�0�b�&�QX�f���q�00����$>�h�N�'�a3��A���/�r ��L5�8�GԲ'�����w;��c#�q1���h$*��V^�k��QĽ�b:i������� ����H F#�_���,��]g����Ը����`RUU���� ��"�qD���>-��ϤI�~��3�̴�����NZ[[555�eeek7�m����YF#[��Đ��R��i��L�H�r ��@��J-�Pŝ��_|�-��6y��ks�V�U~��6���w.����(��0A� 4��f��� /���C�xŊ�ٳ����z=6�����rg���mKo��o�/����a�g���?'9%9��P��斓��~���L{�� �H��{AW��B��$����v�1b�&Mb�ر��ر#�0`�`xMBp! )Z�Nmo�mZ�g�}�eذaWTVV ���'99��C5��&�&+5�bT>|8��PUUETT����&���t��~TE%��'������b�tEGG;RSS�S�N�v��ѯ��t����u1@�ޚ"f��͈���r'L�Ph��m��ƌ�74o��`�x�q�P���NRSS�X,�����l&&&��MFFA!-��`��ҷ�n��Yuu�����x<I�LB%����KԒ50�!�3�bz�����ʸKL���;---�l6[��`��������Ȏ;�����egg4��!D�T��jWujyZ��������K����%����p�^���X,6��sV=�ܖ����6�3�X ���4ҿ��A2�&����_k�;d�� �VfOIEND�B`� 0x0x
PHP 8.1.31
Preview: pam-auth-update Size: 19.86 KB
//sbin/pam-auth-update
#!/usr/bin/perl -w

# pam-auth-update: update /etc/pam.d/common-* from /usr/share/pam-configs
#
# Update the /etc/pam.d/common-* files based on the per-package profiles
# provided in /usr/share/pam-configs/ taking into consideration user's
# preferences (as determined via debconf prompting).
#
# Written by Steve Langasek <steve.langasek@canonical.com>
#
# Copyright (C) 2008 Canonical Ltd.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of version 3 of the GNU General Public License as
# published by the Free Software Foundation.
#
# # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
# USA.

use strict;
use Debconf::Client::ConfModule ':all';
use IPC::Open2 'open2';

version('2.0');
my $capb=capb('backup escape');

my $inputdir = '/usr/share/pam-configs';
my $template = 'libpam-runtime/profiles';
my $errtemplate = 'libpam-runtime/conflicts';
my $overridetemplate = 'libpam-runtime/override';
my $blanktemplate = 'libpam-runtime/no_profiles_chosen';
my $titletemplate = 'libpam-runtime/title';
my $confdir = '/etc/pam.d';
my $savedir = '/var/lib/pam';
my (%profiles, @sorted, @enabled, @conflicts, @new, %removals, %to_enable);
my $force = 0;
my $package = 0;
my $priority = 'high';
my %md5sums = (
	'auth' => ['8d4fe17e66ba25de16a117035d1396aa'],
	'account' => ['3c0c362eaf3421848b679d63fd48c3fa'],
	'password' => [
		'50fce2113dfda83ac8bdd5a6e706caec',
		'4bd7610f2e85f8ddaef79c7db7cb49eb',
		'9ba753d0824276b44bcadfee1f87b6bc',
	],
	'session' => [
		'240fb92986c885b327cdb21dd641da8c',
		'4a25673e8b36f1805219027d3be02cd2',
		'73144a2f4e609a922a51e301cd66a57e',
	],
	'session-noninteractive' => [
		'ad2b78ce1498dd637ef36469430b6ac6',
		'a20e8df3469bfe25c13a3b39161b30f0',
	],
);

opendir(DIR, $inputdir) || die "could not open config directory: $!";
while (my $profile = readdir(DIR)) {
	next if ($profile eq '.' || $profile eq '..' || $profile =~ m/~$/ || $profile =~ m/^#.+#$/);
	%{$profiles{$profile}} = parse_pam_profile($inputdir . '/' . $profile);
}
closedir DIR;

# use a '--force' arg to specify that /etc/pam.d should be overwritten; 
# used only on upgrades where the postinst has already determined that the
# checksums match.  Module packages other than libpam-runtime itself must
# NEVER use this option!  Document with big skullses and crossboneses!  It
# needs to be exposed for libpam-runtime because that's the package that
# decides whether we have a pristine config to be converted, and knows
# whether the version being upgraded from is one for which the conversion
# should be done.

while ($#ARGV >= 0) {
	my $opt = shift;
	if ($opt eq '--force') {
		$force = 1;
	} elsif ($opt eq '--package') {
		$package = 1;
	} elsif ($opt eq '--remove') {
		while ($#ARGV >= 0) {
			last if ($ARGV[0] =~ /^--/);
			$removals{shift @ARGV} = 1;
		}
		# --remove implies --package
		$package = 1 if (keys(%removals));
	} elsif ($opt eq '--enable') {
		while ($#ARGV >= 0) {
			last if ($ARGV[0] =~ /^--/);
			$to_enable{shift @ARGV} = 1;
		}
		# --enable implies --package
		$package = 1 if (keys(%to_enable));
	}
}

$priority = 'medium' if ($package);

x_loadtemplatefile('/var/lib/dpkg/info/libpam-runtime.templates','libpam-runtime');

# always sort by priority, so we have consistency and don't have to
# shuffle later
@sorted = sort { $profiles{$b}->{'Priority'} <=> $profiles{$a}->{'Priority'}
                 || $b cmp $a }
               keys(%profiles);
# If we're being called for package removal, filter out those options here
@sorted = grep { !$removals{$_} } @sorted;

subst($template, 'profile_names', join(', ',@sorted));
subst($template, 'profiles',
	join(', ', map { $profiles{$_}->{'Name'} } @sorted));

my $diff = diff_profiles($confdir,$savedir);

if ($diff) {
	@enabled = grep { !$removals{$_} } @{$diff->{'mods'}};
} else {
	@enabled = split(/, /,get($template));
}

# find out what we've seen, so we can ignore those defaults
my %seen;
if (-e $savedir . '/seen') {
	open(SEEN,$savedir . '/seen')  or die("open(${savedir}/seen) failed: $!");
	while (<SEEN>) {
		chomp;
		$seen{$_} = 1;
	}
	close(SEEN);
}

# filter out any options that are no longer available for any reason
@enabled = grep { $profiles{$_} } @enabled;

# an empty module set is an error, so in that case grab all the defaults
if (!@enabled) {
	%seen = ();
	$priority = 'high' unless ($force);
}

# add configs to enable
push(@enabled,
     grep { $to_enable{$_} } @sorted);

# add any previously-unseen configs
push(@enabled,
     grep { $profiles{$_}->{'Default'} eq 'yes' && !$seen{$_} } @sorted);
@enabled = sort { $profiles{$b}->{'Priority'} <=> $profiles{$a}->{'Priority'}
                  || $b cmp $a }
                @enabled;
my $prev = '';
@enabled = grep { $_ ne $prev && (($prev) = $_) } @enabled;

# Do we have any new options to show?  If not, we shouldn't reprompt the
# user, at any priority level, unless explicitly called.
@new = grep { !$seen{$_} } @sorted;

settitle($titletemplate);

# if diff_profiles() fails, and we weren't passed a 'force' argument
# (because this isn't an upgrade from an old version, or the checksum
# didn't match, or we're being called by some other module package), prompt
# the user whether to override.  If the user declines (the default), we
# never again manage this config unless manually called with '--force'.
if (!$diff && !$force) {
	input('high',$overridetemplate);
	go();
	$force = 1 if (get($overridetemplate) eq 'true');
}

if (!$diff && !$force) {
	print STDERR <<EOF;

pam-auth-update: Local modifications to /etc/pam.d/common-*, not updating.
pam-auth-update: Run pam-auth-update --force to override.

EOF
	exit;
}

umask(0022);

do {
	@conflicts = ();

	if (@new || !$package) {
		fset($template,'seen','false');
	}
	set($template,join(', ', @enabled));

	input($priority,$template);
	go();

	@enabled = split(/, /, get($template));

	# in case of conflicts, automatically unset the lower priority
	# item of each pair
	foreach my $elem (@enabled)
	{
		for (my $i=$#enabled; $i >= 0; $i--)
		{
			my $conflict = $enabled[$i];
			if ($profiles{$elem}->{'Conflicts'}->{$conflict}) {
				splice(@enabled,$i,1);
				my $desc = $profiles{$elem}->{'Name'}
					. ', ' . $profiles{$conflict}->{'Name'};
				push(@conflicts,$desc);
			}
		}
	}
	if (@conflicts) {
		subst($errtemplate, 'conflicts', join("\\n", @conflicts));
		input('high',$errtemplate);
	}
	set($template, join(', ', @enabled));
	if (!@enabled) {
		input('high',$blanktemplate);
		# we can only end up here by user error, but give them another
		# shot at selecting a correct config anyway.
		fset($template,'seen','false');
	}
} while (@conflicts || !@enabled);

# the decision has been made about what configs to use, so even if
# something fails after this, we shouldn't go munging the default
# options again.  Save the list of known configs to /var/lib/pam.
open(SEEN,"> $savedir/seen") or die("open(${savedir}/seen) failed: $!");
for my $i (@sorted) {
	print SEEN "$i\n";
}
close(SEEN) or die("close(${savedir}/seen) failed: $!");

# @enabled now contains our list of profiles to use for piecing together
# a config
# we have:
# - templates into which we insert the specialness
# - magic comments denoting the beginning and end of our managed block;
#   looking at only the functional config lines would potentially let us
#   handle more cases, at the expense of much greater complexity, so
#   pass on this at least for the first round
# - a representation of the autogenerated config stored in /var/lib/pam,
#   that we can diff against in order to account for changed options or
#   manually dropped modules
# - a hash describing the local modifications the user has made to the
#   config; these are always preserved unless manually overridden with
#   the --force option

write_profiles(\%profiles, \@enabled, $confdir, $savedir, $diff, $force);


# take a single line from a stock config, and merge it with the
# information about local admin edits
sub merge_one_line
{
	my ($line,$diff,$count) = @_;
	my (@opts,$modline);

	my ($adds,$removes);

	$line =~ /^((\[[^]]+\]|\w+)\s+\S+)\s*(.*)/;

	@opts = split(/\s+/,$3);
	$modline = $1;
	$modline =~ s/end/$count/g;
	if ($diff) {
		my $mod = $modline;
		$mod =~ s/(\[[^0-9]*)[0-9]+(.*\])/$1$2/g;
		$adds = \%{$diff->{'add'}{$mod}};
		$removes = \%{$diff->{'remove'}{$mod}};
	} else {
		$adds = $removes = undef;
	}

	for (my $i = 0; $i <= $#opts; $i++) {
		if ($adds->{$opts[$i]}) {
			delete $adds->{$opts[$i]};
		}
		if ($removes->{$opts[$i]}) {
			splice(@opts,$i,1);
			$i--;
		}
	}
	return $modline . " " . join(' ',@opts,sort keys(%{$adds})) . "\n";
}

# return the lines for a given config name, type, and position in the stack
sub lines_for_module_and_type
{
	my ($profiles, $mod, $type, $modpos) = @_;
	if ($modpos == 0 && $profiles->{$mod}{$type . '-Initial'}) {
		return $profiles->{$mod}{$type . '-Initial'};
	}
	return $profiles->{$mod}{$type};
}

# create a single PAM config from the indicated template and selections,
# writing to a new file
sub create_from_template
{
	my($template,$dest,$profiles,$enabled,$diff,$type) = @_;
	my $state = 0;
	my $uctype = ucfirst($type);
	$type =~ s/-noninteractive//;

	open(INPUT,$template) || return 0;
	open(OUTPUT,">$dest") || return 0;

	while (<INPUT>) {
		if ($state == 1) {
			if (/^# here's the fallback if no module succeeds/) {
				print OUTPUT;
				$state++;
			}
			next;
		}
		if ($state == 3) {
			if (/^# end of pam-auth-update config/) {
				print OUTPUT;
				$state++;
			}
			next;
		}

		print OUTPUT;

		my ($pattern,$val);
		if ($state == 0) {
			$pattern = '^# here are the per-package modules \(the "Primary" block\)';
			$val = 'Primary';
		} elsif ($state == 2) {
			$pattern = '^# and here are more per-package modules \(the "Additional" block\)';
			$val = 'Additional';
		} else {
			next;
		}

		if (/$pattern/) {
			my $i = 0;
			my $count = 0;
			# first we need to get a count of lines that we're
			# going to output, so we can fix up the jumps correctly
			for my $mod (@{$enabled}) {
				my $output;
				next if (!$profiles->{$mod}{$uctype . '-Type'});
				next if $profiles->{$mod}{$uctype . '-Type'} ne $val;
				$output = lines_for_module_and_type($profiles, $mod, $uctype, $i++);
				# bypasses a perl warning about @_, sigh
				my @tmparr = split("\n+",$output);
				$count += @tmparr;
			}

			# in case anything tries to jump in the 'additional'
			# block, let's try not to jump off the stack...
			$count-- if ($val eq 'Additional');

			# no primary block, so output a stock pam_permit line
			# to keep the stack intact
			if ($val eq 'Primary' && $count == 0)
			{
				print OUTPUT "$type\t[default=1]\t\t\tpam_permit.so\n";
			}

			$i = 0;
			for my $mod (@{$enabled}) {
				my $output;
				my @output;
				next if (!$profiles->{$mod}{$uctype . '-Type'});
				next if $profiles->{$mod}{$uctype . '-Type'} ne $val;
				$output = lines_for_module_and_type($profiles, $mod, $uctype, $i++);
				for my $line (split("\n",$output)) {
					$line = merge_one_line($line,$diff,
					                       $count);
					print OUTPUT "$type\t$line";
					$count--;
				}
			}
			$state++;
		}
	}
	close(INPUT);
	close(OUTPUT) or die("close($dest) failed: $!");

	if ($state < 4) {
		unlink($dest);
		return 0;
	}
	return 1;
}

# take a template file, strip out everything between the markers, and
# return the md5sum of the remaining contents.  Used for testing for
# local modifications of the boilerplate.
sub get_template_md5sum
{
	my($template) = @_;
	my $state = 0;

	open(INPUT,$template) || return '';
	my($md5sum_fd,$output_fd);
	my $pid = open2($md5sum_fd, $output_fd, 'md5sum');
	return '' if (!$pid);

	while (<INPUT>) {
		if ($state == 1) {
			if (/^# here's the fallback if no module succeeds/) {
				print $output_fd $_;
				$state++;
			}
			next;
		}
		if ($state == 3) {
			if (/^# end of pam-auth-update config/) {
				print $output_fd $_;
				$state++;
			}
			next;
		}

		print $output_fd $_;

		my ($pattern,$val);
		if ($state == 0) {
			$pattern = '^# here are the per-package modules \(the "Primary" block\)';
		} elsif ($state == 2) {
			$pattern = '^# and here are more per-package modules \(the "Additional" block\)';
		} else {
			next;
		}

		if (/$pattern/) {
			$state++;
		}
	}
	close(INPUT);
	close($output_fd);
	my $md5sum = <$md5sum_fd>;
	close($md5sum_fd);
	waitpid $pid, 0;

	$md5sum = (split(/\s+/,$md5sum))[0];
	return $md5sum;
}

# merge a set of module declarations into a set of new config files,
# using the information returned from diff_profiles().
sub write_profiles
{
	my($profiles,$enabled,$confdir,$savedir,$diff,$force) = @_;

	if (! -d $savedir) {
		mkdir($savedir);
	}
		
	# because we can't atomically replace both /var/lib/pam/$foo and
	# /etc/pam.d/common-$foo at the same time, take steps to make this
	# somewhat robust
	for my $type ('auth','account','password','session',
	              'session-noninteractive')
	{
		my $target = $confdir . '/common-' . $type;
		my $template = $target;
		my $dest = $template . '.pam-new';

		my $diff = $diff;
		if ($diff) {
			$diff = \%{$diff->{$type}};
		}

		# Detect if the template is unmodified, and if so, use
		# the version from /usr/share.  Depends on knowing the
		# md5sums of the originals.
		my $md5sum = get_template_md5sum($template);
		for my $i (@{$md5sums{$type}}) {
			if ($md5sum eq $i) {
				$template = '/usr/share/pam/common-' . $type;
				last;
			}
		}

		# first, write out the new config
		if (!create_from_template($template,$dest,$profiles,$enabled,
		                          $diff,$type))
		{
			if (!$force) {
				return 0;
			}
			$template = '/usr/share/pam/common-' . $type;
			if (!create_from_template($template,$dest,$profiles,
			                          $enabled,$diff,$type))
			{
				return 0;
			}
		}

		# then write out the saved config
		if (!open(OUTPUT, "> $savedir/$type.new")) {
			unlink($dest);
			return 0;
		}
		my $i = 0;
		my $uctype = ucfirst($type);
		for my $mod (@{$enabled}) {
			my $output;
			next if (!$profiles->{$mod}{$uctype . '-Type'});
			next if ($profiles->{$mod}{$uctype . '-Type'} eq 'Additional');

			$output = lines_for_module_and_type($profiles, $mod, $uctype, $i++);
			if ($output) {
				print OUTPUT "Module: $mod\n";
				print OUTPUT $output . "\n";
			}
		}

		# no primary block, so output a stock pam_permit line
		if ($i == 0)
		{
			print OUTPUT "Module: null\n";
			print OUTPUT "[default=1]\t\t\tpam_permit.so\n";
		}

		$i = 0;
		for my $mod (@{$enabled}) {
			my $output;
			next if (!$profiles->{$mod}{$uctype . '-Type'});
			next if ($profiles->{$mod}{$uctype . '-Type'} eq 'Primary');

			$output = lines_for_module_and_type($profiles, $mod, $uctype, $i++);
			if ($output) {
				print OUTPUT "Module: $mod\n";
				print OUTPUT $output . "\n";
			}
		}

		close(OUTPUT) or die("close($dest) failed: $!");

		# then do the renames, back-to-back
		# we have to use system because File::Copy is in
		# perl-modules, not perl-base
		if (-e $target && $force) {
			system('cp','-f',$target,$target . '.pam-old') == 0
                            or die("cp -f ${target} ${target}.pam.old failed");
		}
		rename($dest,$target)
                    or die("rename($dest, $target) failed: $!");
		rename("$savedir/${type}.new","$savedir/$type")
                    or die("rename(${savedir}/${type}.new, ${savedir}/${type}) failed: $!");
	}

	# at the end of a successful write, reset the 'seen' flag and the
	# value of the debconf override question.
	fset($overridetemplate,'seen','false');
	set($overridetemplate,'false');
}

# reconcile the current config in /etc/pam.d with the saved ones in
# /var/lib/pam; returns a hash of profile names and the corresponding
# options that should be added/removed relative to the stock config.
# returns false if any of the markers are missing that permit a merge,
# or on any other failure.
sub diff_profiles
{
	my ($sourcedir,$savedir) = @_;
	my (%diff);

	@{$diff{'mods'}} = ();
	# Load the saved config from /var/lib/pam, then iterate through all
	# lines in the current config that are in the managed block.
	# If anything fails here, just return immediately since we then
	# have nothing to merge; instead, the caller will decide later
	# whether to force an overwrite.
	for my $type ('auth','account','password','session',
	              'session-noninteractive')
	{
		my (@saved,$modname);

		open(SAVED,$savedir . '/' . $type) || return 0;
		while (<SAVED>) {
			if (/^Module: (.*)/) {
				$modname = $1;
				next;
			}
			chomp;
			# trim out the destination of any jumps; this saves
			# us from having to re-parse everything just to fix
			# up the jump lengths, when changes to these will
			# already show up as inconsistencies elsewhere
			s/(\[[^0-9]*)[0-9]+(.*\])/$1$2/g;
			s/(\[.*)end(.*\])/$1$2/g;
			my (@temp) = ($modname,$_);
			push(@saved,\@temp);
		}
		close(SAVED);

		my $state = 0;
		my (@prev_opts,$curmod);
		my $realtype = $type;
		$realtype =~ s/-noninteractive//;

		open(CURRENT,$sourcedir . '/common-' . $type) || return 0;
		while (<CURRENT>) {
			if ($state == 0) {
				$state = 1
				   if (/^# here are the per-package modules \(the "Primary" block\)/);
				next;
			}
			if ($state == 1) {
				s/^$realtype\s+//;
				if (/^# here's the fallback if no module succeeds/) {
					$state = 2;
					next;
				}
			}
			if ($state == 2) {
				$state = 3
				   if (/^# and here are more per-package modules \(the "Additional" block\)/);
				next;
			}
			if ($state == 3) {
				last if (/^# end of pam-auth-update config/);
				s/^$realtype\s+//;
			}

			my $found = 0;
			my $curopts;
			while (!$found && $#saved >= 0) {
				my $line;
				($modname,$line) = @{$saved[0]};
				shift(@saved);
				$line =~ /^((\[[^]]+\]|\w+)\s+\S+)\s*(.*)/;
				@prev_opts = split(/\s+/,$3);
				$curmod = $1;
				# FIXME: the key isn't derived from the config
				# name, so collisions are possible if more
				# than one config references the same module

				$_ =~ s/(\[[^0-9]*)[0-9]+(.*\])/$1$2/g;
				# check if this is a match for the current line
				if ($_ =~ /^\Q$curmod\E\s*(.*)$/) {
					$found = 1;
					$curopts = $1;
					push(@{$diff{'mods'}},$modname);
				}
			}

			# there's a line in the live config that doesn't
			# correspond to anything from the saved config.
			# treat this as a failure; it's very error-prone
			# to decide what to do with an added line that
			# didn't come from a package.
			return 0 if (!$found);

			for my $opt (split(/\s+/,$curopts)) {
				my $found = 0;
				for (my $i = 0; $i <= $#prev_opts; $i++) {
					if ($prev_opts[$i] eq $opt) {
						$found = 1;
						splice(@prev_opts,$i,1);
					}
				}
				$diff{$type}{'add'}{$curmod}{$opt} = 1 if (!$found);
			}
			for my $opt (@prev_opts) {
				$diff{$type}{'remove'}{$curmod}{$opt} = 1;
			}
		}
		close(CURRENT);

		# we couldn't parse the config, so the merge fails
		return 0 if ($state < 3);
	}
	return \%diff;
}

# simple function to parse a provided config file, in pseudo-RFC822
# format,
sub parse_pam_profile
{
	my ($profile) = $_[0];
	my $fieldname;
	my %profile;
	open(PROFILE, $profile) || die "could not read profile $profile: $!";
	while (<PROFILE>) {
		if (/^(\S+):\s+(.*)\s*$/) {
			$fieldname = $1;
			# compatibility with the first implementation round;
			# "Auth-Final" is now just called "Auth"
			$fieldname =~ s/-Final$//;
			if ($fieldname eq 'Conflicts') {
				foreach my $elem (split(/, /, $2)) {
					$profile{'Conflicts'}->{$elem} = 1;
				}
			} else {
				$profile{$fieldname} = $2;
			}
		} else {
			chomp;
			s/^\s+//;
			s/\s+$//;
			$profile{$fieldname} .= "\n$_" if ($_);
			$profile{$fieldname} =~ s/^[\n\s]+//;
		}
	}
	close(PROFILE);
	if (!defined($profile{'Session-Interactive-Only'})) {
			$profile{'Session-noninteractive-Type'} = $profile{'Session-Type'};
			$profile{'Session-noninteractive'} = $profile{'Session'};
			$profile{'Session-noninteractive-Initial'} = $profile{'Session-Initial'};
	}
	return %profile;
}

Directory Contents

Dirs: 0 × Files: 473
Name Size Perms Modified Actions
15.89 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
15.89 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
15.89 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
15.89 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
15.89 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
15.89 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
9.64 KB lrwxr-xr-x 2025-04-02 18:34:29
Edit Download
3.00 KB lrwxr-xr-x 2024-03-06 18:40:00
Edit Download
8.63 KB lrwxr-xr-x 2024-03-06 18:40:00
Edit Download
139 B lrwxr-xr-x 2019-06-17 23:55:38
Edit Download
14.38 KB lrwxr-xr-x 2020-02-25 17:13:45
Edit Download
860 B lrwxr-xr-x 2019-12-07 02:13:44
Edit Download
3.00 KB lrwxr-xr-x 2025-06-26 16:57:26
Edit Download
36.90 KB lrwxr-xr-x 2020-04-16 14:12:53
Edit Download
36.90 KB lrwxr-xr-x 2020-04-16 14:12:53
Edit Download
67.38 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
692.07 KB lrwxr-xr-x 2025-04-02 18:34:29
Edit Download
7.06 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
7.06 KB lrwxr-xr-x 2024-03-18 13:42:39
Edit Download
1.46 MB lrwxr-xr-x 2024-03-06 18:40:00
Edit Download
8.63 KB lrwxr-xr-x 2024-03-06 18:40:00
Edit Download
2.17 KB lrwxr-xr-x 2025-06-26 16:57:26
Edit Download
78.27 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
13.22 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
30.01 KB lrwxr-xr-x 2018-11-12 17:11:53
Edit Download
38.38 KB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
34.32 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
14.15 KB lrwxr-xr-x 2020-07-23 00:33:50
Edit Download
27.20 KB lrwxr-xr-x 2019-12-23 17:56:41
Edit Download
14.49 KB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
34.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
118.26 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
70.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
66.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
102.30 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
30.30 KB lrwxr-xr-x 2025-02-20 16:01:08
Edit Download
102.59 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
206.48 KB lrwxr-xr-x 2020-02-20 09:44:58
Edit Download
46.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
952 B lrwxr-xr-x 2011-04-26 15:10:00
Edit Download
66.20 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
62.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
58.20 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
42.34 KB lrwxr-xr-x 2019-09-05 10:38:40
Edit Download
60.34 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
60.34 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
54.63 KB lrwxr-xr-x 2020-02-13 20:44:42
Edit Download
1.51 KB lrwxr-xr-x 2020-02-04 13:11:12
Edit Download
844 B lrwxr-xr-x 2020-02-04 13:11:12
Edit Download
135.54 KB lrwxr-xr-x 2022-01-18 17:36:47
Edit Download
105.32 KB lrwxr-xr-x 2022-01-18 17:36:47
Edit Download
38.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
225.80 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
16.11 KB lrwxr-xr-x 2020-04-16 14:12:53
Edit Download
16.11 KB lrwxr-xr-x 2020-04-16 14:12:53
Edit Download
170.34 KB lrwxr-xr-x 2022-01-28 14:49:50
Edit Download
150.47 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
508.98 KB lrwxr-xr-x 2023-01-31 22:10:35
Edit Download
15.92 KB lrwxr-xr-x 2023-01-31 22:10:35
Edit Download
50.23 KB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
119.00 KB lrwxr-xr-x 2019-12-23 17:56:41
Edit Download
171.02 KB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
171.02 KB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
58.08 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
54.08 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
98.40 KB lrwxr-xr-x 2024-09-11 12:08:49
Edit Download
3.58 KB lrwxr-xr-x 2019-08-03 10:51:13
Edit Download
4.34 KB lrwxr-xr-x 2019-08-03 10:51:13
Edit Download
30.38 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
18.38 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
327.21 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
42.38 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
106.55 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
30.38 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
7.13 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
5.27 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
22.38 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
30.38 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
34.30 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
375.05 KB lrwxr-xr-x 2020-01-30 16:25:08
Edit Download
11.03 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
10.28 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
1.41 MB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
1.41 MB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
148.03 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
4.74 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
72.76 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
18.31 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
26.33 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
34.33 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
18.30 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
26.33 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
8.08 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
59.25 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
5.19 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
5.04 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
4.34 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
14.15 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
54.08 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
34.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
150.27 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
18.33 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
14.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
74.48 KB lrwxr-xr-x 2020-02-20 09:44:58
Edit Download
23.54 KB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
54.27 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
1.16 KB lrwxr-xr-x 2020-02-15 15:52:17
Edit Download
38.26 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
327.21 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
327.21 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
327.21 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
58.08 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
122.25 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
58.08 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
58.08 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
1.92 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
14.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
14.30 KB lrwxr-xr-x 2020-02-13 18:38:21
Edit Download
70.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
34.67 KB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
32.20 KB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
23.45 KB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
14.15 KB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
12.15 KB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
210.48 KB lrwxr-xr-x 2020-02-20 09:44:58
Edit Download
82.29 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
14.30 KB lrwxr-xr-x 2025-02-20 16:01:08
Edit Download
14.30 KB lrwxr-xr-x 2025-02-20 16:01:08
Edit Download
67.38 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
90.95 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
86.77 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
62.24 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
94.86 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
62.18 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
58.05 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
58.05 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
909.34 KB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
1.11 MB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
897.03 KB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
8.54 KB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
215.70 KB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
905.28 KB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
4.73 KB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
3.47 KB lrwxr-xr-x 2022-12-18 21:29:03
Edit Download
973.23 KB lrwxr-xr-x 2023-11-21 21:10:21
Edit Download
140.34 KB lrwxr-xr-x 2019-08-21 12:36:14
Edit Download
14.15 KB lrwxr-xr-x 2025-04-02 18:34:29
Edit Download
102.35 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
30.40 KB lrwxr-xr-x 2025-05-26 08:09:37
Edit Download
1.02 MB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
1.55 MB lrwxr-xr-x 2023-11-21 21:10:21
Edit Download
170.34 KB lrwxr-xr-x 2022-01-28 14:49:50
Edit Download
2.58 KB lrwxr-xr-x 2019-12-07 02:13:44
Edit Download
60.23 KB lrwxr-xr-x 2022-01-18 17:36:47
Edit Download
16.64 KB lrwxr-xr-x 2019-06-21 18:56:55
Edit Download
597.62 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
6.89 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
6.89 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
62.92 KB lrwxr-xr-x 2020-02-13 19:39:57
Edit Download
34.38 KB lrwxr-xr-x 2020-02-13 19:39:57
Edit Download
18.15 KB lrwxr-xr-x 2023-07-25 14:33:19
Edit Download
394.10 KB lrwxr-xr-x 2023-07-25 14:33:19
Edit Download
410.30 KB lrwxr-xr-x 2023-07-25 14:33:19
Edit Download
366.29 KB lrwxr-xr-x 2023-07-25 14:33:19
Edit Download
5.16 KB lrwxr-xr-x 2016-09-29 18:33:24
Edit Download
30.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
15.39 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
13.99 KB lrwxr-xr-x 2019-05-09 15:22:51
Edit Download
26.38 KB lrwxr-xr-x 2020-02-13 18:38:21
Edit Download
46.16 KB lrwxr-xr-x 2023-11-07 21:20:27
Edit Download
34.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
387 B lrwxr-xr-x 2025-05-26 08:09:37
Edit Download
1.00 MB lrwxr-xr-x 2025-05-26 08:09:37
Edit Download
4.30 KB lrwxr-xr-x 2023-07-26 07:44:39
Edit Download
82.09 KB lrwxr-xr-x 2019-01-21 10:11:39
Edit Download
14.16 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
110.34 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
170.34 KB lrwxr-xr-x 2022-01-28 14:49:50
Edit Download
3.32 KB lrwxr-xr-x 2020-02-04 13:11:12
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
10.07 KB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
232.05 KB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
78.19 KB lrwxr-xr-x 2020-03-20 14:12:10
Edit Download
22.23 KB lrwxr-xr-x 2020-07-23 00:33:50
Edit Download
3.78 KB lrwxr-xr-x 2017-04-28 19:58:22
Edit Download
589.65 KB lrwxr-xr-x 2020-09-28 16:29:11
Edit Download
325.49 KB lrwxr-xr-x 2020-09-28 16:29:11
Edit Download
34.50 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
134.62 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
14.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
34.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
451.53 KB lrwxr-xr-x 2020-02-15 15:52:17
Edit Download
42.16 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
134.62 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
134.62 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
134.62 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
34.50 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
106.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
34.50 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
86.27 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
34.50 KB lrwxr-xr-x 2018-05-12 22:59:39
Edit Download
366.24 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
22.17 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
11.55 KB lrwxr-xr-x 2022-01-26 17:11:24
Edit Download
14.30 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
86.27 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
106.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
1.83 MB lrwxr-xr-x 2022-04-08 09:37:10
Edit Download
170.34 KB lrwxr-xr-x 2022-01-28 14:49:50
Edit Download
170.34 KB lrwxr-xr-x 2022-01-28 14:49:50
Edit Download
14.15 KB lrwxr-xr-x 2020-03-07 11:09:49
Edit Download
118.86 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
158.89 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
158.89 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
46.48 KB lrwxr-xr-x 2025-05-06 13:36:15
Edit Download
31.05 KB lrwxr-xr-x 2023-11-07 21:20:27
Edit Download
34.15 KB lrwxr-xr-x 2023-11-07 21:20:27
Edit Download
126.20 KB lrwxr-xr-x 2023-11-07 21:20:27
Edit Download
69.27 MB lrwxr-xr-x 2024-03-27 20:24:33
Edit Download
1.04 KB lrwxr-xr-x 2021-12-10 12:55:20
Edit Download
798 B lrwxr-xr-x 2024-06-28 16:59:34
Edit Download
98.80 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
18.30 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
1.50 MB lrwxr-xr-x 2024-04-23 15:42:29
Edit Download
1.67 MB lrwxr-xr-x 2024-04-23 15:42:29
Edit Download
14.30 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
58.27 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
42.26 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
34.26 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
78.27 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
54.26 KB lrwxr-xr-x 2022-11-01 11:56:50
Edit Download
2.18 KB lrwxr-xr-x 2019-07-20 15:43:51
Edit Download
2.45 KB lrwxr-xr-x 2021-11-02 14:33:46
Edit Download
14.45 KB lrwxr-xr-x 2019-12-23 17:56:41
Edit Download
19.86 KB lrwxr-xr-x 2021-09-17 06:05:34
Edit Download
42.16 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
42.16 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
2.82 KB lrwxr-xr-x 2020-08-12 00:15:04
Edit Download
14.16 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
18.16 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
14.15 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
4.07 KB lrwxr-xr-x 2019-06-25 22:04:32
Edit Download
86.25 KB lrwxr-xr-x 2020-12-01 15:18:05
Edit Download
14.23 KB lrwxr-xr-x 2020-12-01 15:18:05
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
4.55 MB lrwxr-xr-x 2025-03-25 18:57:03
Edit Download
5.41 MB lrwxr-xr-x 2025-03-13 18:12:52
Edit Download
7.11 KB lrwxr-xr-x 2020-03-27 07:44:39
Edit Download
7.11 KB lrwxr-xr-x 2020-03-27 07:44:39
Edit Download
6.24 KB lrwxr-xr-x 2020-03-27 07:44:39
Edit Download
14.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
146.41 KB lrwxr-xr-x 2020-11-02 10:02:17
Edit Download
543 B lrwxr-xr-x 2020-02-13 23:04:46
Edit Download
5.23 KB lrwxr-xr-x 2020-02-13 23:04:46
Edit Download
973.23 KB lrwxr-xr-x 2023-11-21 21:10:21
Edit Download
1.02 MB lrwxr-xr-x 2025-02-05 10:43:43
Edit Download
1.64 KB lrwxr-xr-x 2020-02-27 19:30:14
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
58.17 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
54.05 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
54.05 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
14.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
22.26 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
973.23 KB lrwxr-xr-x 2023-11-21 21:10:21
Edit Download
2.86 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
2.86 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
904 B lrwxr-xr-x 2019-12-07 02:13:44
Edit Download
66.38 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
1.41 MB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
170.34 KB lrwxr-xr-x 2022-01-28 14:49:50
Edit Download
58.55 KB lrwxr-xr-x 2023-12-05 05:16:50
Edit Download
58.55 KB lrwxr-xr-x 2023-12-05 05:16:50
Edit Download
1.41 MB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
710.20 KB lrwxr-xr-x 2022-05-03 08:48:35
Edit Download
48.29 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
46.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
78.24 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
973.23 KB lrwxr-xr-x 2023-11-21 21:10:21
Edit Download
1.41 MB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
66.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
3.23 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
3.21 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
1.41 MB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
9.04 KB lrwxr-xr-x 2019-06-21 18:56:55
Edit Download
14.30 KB lrwxr-xr-x 2025-02-20 16:01:08
Edit Download
14.07 KB lrwxr-xr-x 2019-05-09 15:22:51
Edit Download
14.13 KB lrwxr-xr-x 2019-05-09 15:22:51
Edit Download
138.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
190.48 KB lrwxr-xr-x 2020-02-20 09:44:58
Edit Download
885 B lrwxr-xr-x 2021-07-14 22:08:18
Edit Download
973.23 KB lrwxr-xr-x 2023-11-21 21:10:21
Edit Download
2.36 KB lrwxr-xr-x 2025-04-02 18:34:29
Edit Download
863.79 KB lrwxr-xr-x 2025-04-11 12:16:08
Edit Download
47.32 KB lrwxr-xr-x 2022-05-25 11:14:20
Edit Download
50.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
18.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
22.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
50.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
14.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
30.23 KB lrwxr-xr-x 2023-10-31 11:35:56
Edit Download
1.41 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
936 B lrwxr-xr-x 2023-12-05 05:16:50
Edit Download
529.45 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
1,019.76 KB lrwxr-xr-x 2024-02-08 13:08:41
Edit Download
973.23 KB lrwxr-xr-x 2023-11-21 21:10:21
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
1.29 MB lrwxr-xr-x 2020-02-08 11:20:35
Edit Download
126.23 KB lrwxr-xr-x 2020-02-13 17:21:59
Edit Download
106.55 KB lrwxr-xr-x 2022-06-02 00:59:32
Edit Download
106 B lrwxr-xr-x 2025-04-22 10:15:47
Edit Download
4.82 KB lrwxr-xr-x 2023-07-17 14:14:04
Edit Download
14.30 KB lrwxr-xr-x 2021-09-06 03:01:13
Edit Download
42.15 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
42.15 KB lrwxr-xr-x 2024-01-10 13:55:08
Edit Download
5.29 KB lrwxr-xr-x 2024-09-24 17:46:09
Edit Download
1.00 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
9.68 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
7.50 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
1.00 KB lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
782 B lrwxr-xr-x 2018-11-15 15:24:46
Edit Download
14.72 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
3.33 KB lrwxr-xr-x 2020-03-27 23:00:03
Edit Download
8.20 KB lrwxr-xr-x 2024-07-30 19:25:41
Edit Download
5.71 KB lrwxr-xr-x 2016-08-21 16:54:00
Edit Download
3.98 KB lrwxr-xr-x 2016-08-21 16:54:11
Edit Download
6.10 KB lrwxr-xr-x 2016-08-21 16:54:20
Edit Download
64 B lrwxr-xr-x 2022-12-02 15:20:54
Edit Download
301 B lrwxr-xr-x 2015-03-27 17:50:35
Edit Download
64 B lrwxr-xr-x 2022-12-02 15:20:54
Edit Download
470 B lrwxr-xr-x 2025-03-25 19:38:31
Edit Download
1.66 KB lrwxr-xr-x 2019-10-10 22:32:01
Edit Download
7.25 KB lrwxr-xr-x 2021-03-18 18:48:17
Edit Download
2.99 KB lrwxr-xr-x 2023-06-16 10:22:06
Edit Download
9.18 KB lrwxr-xr-x 2019-10-18 23:05:50
Edit Download
34.56 KB lrwxr-xr-x 2019-12-16 23:51:51
Edit Download
1.71 KB lrwxr-xr-x 2021-03-31 22:55:11
Edit Download
16.76 KB lrwxr-xr-x 2019-06-21 18:56:55
Edit Download
7.43 KB lrwxr-xr-x 2024-01-24 09:14:48
Edit Download
1.49 KB lrwxr-xr-x 2022-12-02 15:20:54
Edit Download
59.66 KB lrwxr-xr-x 2020-02-10 07:23:53
Edit Download
54.32 KB lrwxr-xr-x 2020-02-10 07:23:53
Edit Download
143.71 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
98.89 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
139.49 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
42.30 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
1.73 KB lrwxr-xr-x 2022-08-02 15:34:43
Edit Download
13.99 KB lrwxr-xr-x 2019-05-09 15:22:51
Edit Download
51.82 KB lrwxr-xr-x 2022-01-18 17:36:47
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
2.73 MB lrwxr-xr-x 2020-02-13 21:21:51
Edit Download
68.55 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
68.55 KB lrwxr-xr-x 2024-02-06 12:49:54
Edit Download
218.20 KB lrwxr-xr-x 2023-04-04 11:56:28
Edit Download
18.58 KB lrwxr-xr-x 2019-12-23 17:56:41
Edit Download
46.23 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
1.38 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
695 B lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
90.28 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
620.09 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
14.01 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
800 B lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
42.02 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
34.14 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
1.26 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
187.34 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
74.15 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
30.02 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
782 B lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
1.02 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
685 B lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
86.01 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
563.15 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
17.99 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
102.11 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
5.86 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
42.15 KB lrwxr-xr-x 2020-03-03 20:42:53
Edit Download
96.97 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
215.32 KB lrwxr-xr-x 2023-05-09 18:39:57
Edit Download
9.99 KB lrwxr-xr-x 2018-03-15 11:50:56
Edit Download
62.29 KB lrwxr-xr-x 2025-05-26 08:09:37
Edit Download
114.34 KB lrwxr-xr-x 2024-04-09 15:34:13
Edit Download
If ZipArchive is unavailable, a .tar will be created (no compression).
© 2026 0xNothings — Secure File Manager. All rights reserved. Built with ❤️ & Tailwind x Dark UI
Upload
React Archives - Weelorum https://weelorum.com/technology/react/ Full Cycle Mobile App Development Services For Startups Sun, 01 Mar 2026 20:04:38 +0000 en-US hourly 1 https://wordpress.org/?v=7.0 LearnPath https://weelorum.com/portfolio-projects/learnpath/ Sun, 01 Mar 2026 20:04:38 +0000 https://weelorum.com/success-stories/learnpath/ LearnPath uses machine learning to create personalized learning paths for professionals. The platform analyzes user performance, adjusts difficulty levels in real-time, and recommends relevant courses. Features include video lessons, interactive quizzes, and certification tracking.

Сообщение LearnPath появились сначала на Weelorum.

]]>
LearnPath uses machine learning to create personalized learning paths for professionals. The platform analyzes user performance, adjusts difficulty levels in real-time, and recommends relevant courses. Features include video lessons, interactive quizzes, and certification tracking.

Сообщение LearnPath появились сначала на Weelorum.

]]>
FleetTrack https://weelorum.com/portfolio-projects/fleettrack/ Sun, 01 Mar 2026 20:04:38 +0000 https://weelorum.com/success-stories/fleettrack/ FleetTrack provides comprehensive fleet management for logistics companies. Features include GPS tracking, route optimization, driver behavior monitoring, fuel consumption analytics, and maintenance scheduling. The dashboard offers real-time visibility across the entire fleet.

Сообщение FleetTrack появились сначала на Weelorum.

]]>
FleetTrack provides comprehensive fleet management for logistics companies. Features include GPS tracking, route optimization, driver behavior monitoring, fuel consumption analytics, and maintenance scheduling. The dashboard offers real-time visibility across the entire fleet.

Сообщение FleetTrack появились сначала на Weelorum.

]]>