JFIF$        dd7 

Viewing File: /usr/local/cpanel/scripts/rdate

#!/usr/local/cpanel/3rdparty/bin/perl

# cpanel - scripts/rdate                           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

package rdate;

use cPstrict;

use Cpanel::Unix::PID::Tiny ();
use Cpanel::SafeRun::Simple ();
use Getopt::Long            ();
use Cpanel::OS              ();
use Cpanel::OSSys::Env      ();
use Cpanel::Binaries        ();

use Socket;

my $timeout = 10;

exit( _run_alarmed( $timeout, @ARGV ) // 0 ) unless caller;

sub run (@args) {

    my $print_time;    # used to map usage to rdate's -p option
    my $help;

    Getopt::Long::GetOptionsFromArray(
        \@args,
        '-p|print' => \$print_time,
        '-h|help'  => \$help,
    ) or return usage(1);

    return usage(0) if $help;

    my $envtype = Cpanel::OSSys::Env::get_envtype();

    # Case 48348 -- Virtual environments cannot set the system time so do nothing.
    if ( $envtype =~ qr{^(?:virtuozzo|cpanel-vserver|vzcontainer)$} ) {
        say "Container environment detected - rdate skipped";
        return;
    }

    my $pid = 0;

    my $check_ntpd_pid_method = Cpanel::OS::check_ntpd_pid_method();

    if ( $check_ntpd_pid_method eq 'systemd_ntpd' ) {
        $pid = _detect_systemd_managed_ntpd();
    }
    elsif ( $check_ntpd_pid_method eq 'pid_check_var_run_ntpd' ) {
        my $upid = Cpanel::Unix::PID::Tiny->new();
        $pid = $upid->is_pidfile_running('/var/run/ntpd.pid');
    }
    else {
        die qq[Unknown check_ntpd_pid_method method: $check_ntpd_pid_method];
    }

    if ($pid) {
        say "The 'ntpd' daemon is running on PID '$pid'. Exiting.";
    }
    else {
        my %rdate_opts = ( 'set_time' => 1 );
        $rdate_opts{'print_time'} = 1 if $print_time;
        $rdate_opts{'server'}     = 'rdate.g.geo.mycache.org';
        exec_rdate(%rdate_opts);
    }

    return;
}

sub exec_rdate (%opts) {

    my $server     = $opts{'server'} || 'rdate.g.geo.mycache.org';
    my $port       = $opts{'port'} // 37;
    my $rdate_mode = $opts{'mode'} // 1;    # act like the binary unless otherwise requested

    my $socket = _create_socket( $server, $port );

    my $time_data;
    recv( $socket, $time_data, 4, 0 );
    close($socket);

    # Make sure we actually got some data back
    if ( !$time_data ) {
        print "Server returned empty data, please try a different server.\n";
        return;
    }

    # Take the binary data we get from the time server, convert to hex, sprintf to decimal then
    # subtract the number of seconds from Jan 1st 1900 to 1970 ( 2208988800 ) to get our epoch, es defined in RFC868

    my $epoch = unpack( "N*", $time_data ) - 2208988800;

    if ( $opts{'print_time'} || ( !$opts{'set_time'} ) ) {
        print "rdate: [$server]\t" . scalar localtime($epoch) . "\n" if $rdate_mode == 1;
    }

    if ( $opts{'set_time'} ) {
        set_system_time( $epoch, $rdate_mode );
    }
    return $epoch;
}

# split out for mocking purposes
sub _create_socket ( $server, $port ) {
    my $socket;
    socket( $socket, PF_INET, SOCK_STREAM, ( getprotobyname('tcp') )[2] ) or die "Can't open socket $!\n";
    binmode($socket);
    connect( $socket, pack_sockaddr_in( $port, inet_aton($server) ) ) or die "Can't connect to $server:$port $! \n";

    return $socket;
}

sub set_system_time {
    my ( $epoch, $rdate_mode ) = @_;

    # We only want to allow for a 10 digit number, anything else is nonsensical here
    if ( $epoch !~ m/^\d{10}$/ ) {
        die "Invalid epoch given to set_system_time.\n";
    }

    # Find date binary on CentOS 6 and 7+
    my $date_bin_path = Cpanel::Binaries::path('date');
    my $output        = Cpanel::SafeRun::Simple::saferunnoerror( $date_bin_path, '-s', "\@$epoch" );
    chomp $output;

    # mimic binary rdate behavior
    print "Set system time to “$output”\n" if !$rdate_mode;
    return;
}

sub _detect_systemd_managed_ntpd() {

    my $output = Cpanel::SafeRun::Simple::saferunallerrors( '/usr/bin/systemctl', 'status', 'ntpd' );
    if ( $output =~ m/Active:\sactive\s+\(running\)/a && $output =~ m/Main\s+PID:\s+(\d+)\s+\(/a ) {
        return $1;
    }

    return;
}

sub _run_alarmed {

    my ( $timeout, @args ) = @_;
    {
        require Cpanel::Alarm;
        my $alrm = Cpanel::Alarm->new( $timeout, sub { die "Failed to run due to the $timeout second timeout being exceeded.\n" } );
        run(@args);
    }
    return;
}

sub usage ($status) {
    $status //= 0;

    print <<EOS;
scripts/rdate

On servers without ntp daemon, use 'rdate' to adjust the system clock.

Options:
    --help  [-h] display this help
    --print [-p] Print the time returned by the remote machine.

Usage:
    scripts/rdate
    scripts/rdate -p

EOS

    return $status;
}
Back to Directory  nL+D550H?Mx ,D"v]qv;6*Zqn)ZP0!1 A "#a$2Qr D8 a Ri[f\mIykIw0cuFcRı?lO7к_f˓[C$殷WF<_W ԣsKcëIzyQy/_LKℂ;C",pFA:/]=H  ~,ls/9ć:[=/#f;)x{ٛEQ )~ =𘙲r*2~ a _V=' kumFD}KYYC)({ *g&f`툪ry`=^cJ.I](*`wq1dđ#̩͑0;H]u搂@:~וKL Nsh}OIR*8:2 !lDJVo(3=M(zȰ+i*NAr6KnSl)!JJӁ* %݉?|D}d5:eP0R;{$X'xF@.ÊB {,WJuQɲRI;9QE琯62fT.DUJ;*cP A\ILNj!J۱+O\͔]ޒS߼Jȧc%ANolՎprULZԛerE2=XDXgVQeӓk yP7U*omQIs,K`)6\G3t?pgjrmۛجwluGtfh9uyP0D;Uڽ"OXlif$)&|ML0Zrm1[HXPlPR0'G=i2N+0e2]]9VTPO׮7h(F*癈'=QVZDF,d߬~TX G[`le69CR(!S2!P <0x<!1AQ "Raq02Br#SCTb ?Ζ"]mH5WR7k.ۛ!}Q~+yԏz|@T20S~Kek *zFf^2X*(@8r?CIuI|֓>^ExLgNUY+{.RѪ τV׸YTD I62'8Y27'\TP.6d&˦@Vqi|8-OΕ]ʔ U=TL8=;6c| !qfF3aů&~$l}'NWUs$Uk^SV:U# 6w++s&r+nڐ{@29 gL u"TÙM=6(^"7r}=6YݾlCuhquympǦ GjhsǜNlɻ}o7#S6aw4!OSrD57%|?x>L |/nD6?/8w#[)L7+6〼T ATg!%5MmZ/c-{1_Je"|^$'O&ޱմTrb$w)R$& N1EtdU3Uȉ1pM"N*(DNyd96.(jQ)X 5cQɎMyW?Q*!R>6=7)Xj5`J]e8%t!+'!1Q5 !1 AQaqё#2"0BRb?Gt^## .llQT $v,,m㵜5ubV =sY+@d{N! dnO<.-B;_wJt6;QJd.Qc%p{ 1,sNDdFHI0ГoXшe黅XۢF:)[FGXƹ/w_cMeD,ʡcc.WDtA$j@:) -# u c1<@ۗ9F)KJ-hpP]_x[qBlbpʖw q"LFGdƶ*s+ډ_Zc"?%t[IP 6J]#=ɺVvvCGsGh1 >)6|ey?Lӣm,4GWUi`]uJVoVDG< SB6ϏQ@ TiUlyOU0kfV~~}SZ@*WUUi##; s/[=!7}"WN]'(L! ~y5g9T̅JkbM' +s:S +B)v@Mj e Cf jE 0Y\QnzG1д~Wo{T9?`Rmyhsy3!HAD]mc1~2LSu7xT;j$`}4->L#vzŏILS ֭T{rjGKC;bpU=-`BsK.SFw4Mq]ZdHS0)tLg