рд╢реБрд░реБрдЖрддреА рдмрдЪрдкрди рдореЗрдВ, рдореБрдЭреЗ рдбреЗрдЯрд╛ рдХрд╛ рдмреИрдХрдЕрдк рд▓реЗрдиреЗ рдХрд╛ рдорд╣рддреНрд╡ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рд╕рдордЭ рдЕрдиреБрднрд╡ рдХреЗ рд╕рд╛рде рдЖрддреА рд╣реИред рдЕрдХреНрд╕рд░ рдЕрдиреБрднрд╡ рдмрд╣реБрдд рдХрдбрд╝рд╡рд╛ рд╣реЛрддрд╛ рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдиреЗ рджреЛ рдмрд╛рд░
MathInfinity рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдХреЛ рдорд╛рд░ рдбрд╛рд▓рд╛, рдореЗрд░реЗ рдЫрд╛рддреНрд░ рджрд┐рдиреЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕ рдмрдирд╛рдпрд╛ред
рдмрдбрд╝реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмреИрдХрдЕрдк рдХреЗ рд▓рд┐рдП рдкреВрд░реЗ рд╕рд░реНрд╡рд░ рдХреЛ рдЕрд▓рдЧ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдЙрддреНрд╕рд╛рд╣ рдкрд░ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред рдЗрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдмреИрдХрдЕрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдбреНрд░реЙрдкрдмреЙрдХреНрд╕, рдЙрдмрдВрдЯреВ рд╡рди, рдпреИрдВрдбреЗрдХреНрд╕ рдбрд┐рд╕реНрдХ, рдЧреВрдЧрд▓ рдбреНрд░рд╛рдЗрд╡, рдЖрджрд┐ рдЬреИрд╕реА рд╕реЗрд╡рд╛рдУрдВ рдкрд░ рдЕрднрд┐рд▓реЗрдЦ рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореЗрд░рд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рджрд░реНрдЬрдиреЛрдВ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдореБрдХреНрдд рд╕реНрдерд╛рди, рдЬреЛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдм рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдЕрд╡рддрд╛рд░ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред рдпрд╛рдВрдбреЗрдХреНрд╕ рдбрд┐рд╕реНрдХ рдХреЛ рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред
рдореИрдВ рд╡рд┐рдЪрд╛рд░ рдХреА рдкреНрд░рддрд┐рднрд╛ рдХрд╛ рдвреЛрдВрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ред рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЯрд░реНрдирдХреА рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖред рд╕рднреА рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдпрд╛ рддреЛ рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрдардиреАрдп рд╣реИред рдореИрдВ рдпрд╣ рд╕рдордЭрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рдЖрд╡реЗрджрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ Yandex рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдПрдкреАрдЖрдИ рдореЗрдВ рдЙрддреНрдХреГрд╖реНрдЯ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдирдХреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╕рдВрджрд░реНрдн рд╣реИрдВред рдЗрддрдирд╛ рд╣реА рдХрд╛рдлреА рдерд╛ред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдбреЗрдЯрд╛ рдмреИрдХрдЕрдк рдХрд╛рд░реНрдп рдирд┐рдореНрди рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рдЧрд┐рд░ рдЧрдпрд╛:
- рдЖрд╡реЗрджрди рдкрдВрдЬреАрдХрд░рдг
- OAuth рдХреЗ рд╕рд╛рде рдпрд╛рдВрдбреЗрдХреНрд╕ рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг
- Yandex.Disk рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди
- Yandex рдбрд┐рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдмреИрдХрдЕрдк рдмрдирд╛рдирд╛ рдФрд░ рднреЗрдЬрдирд╛
- рдХреНрд░рд╛рдЙрди рдХреЙрдкреА рдХрд░реЗрдВ
рдЕрдВрддрд┐рдо рджреЛ рдмрд┐рдВрджреБ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХрд╛ рд╡рд┐рд╖рдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд▓рд┐рдореНрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдФрд░ рдЖрдкрдХреА рдмрд╛рдЗрдХ рдХреЗ рдкрд╣рд┐рдпреЛрдВ рдХреЛ рд╕реБрджреГрдврд╝ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╡рд░реНрдЧ рдХреЛрдб рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗ
рдЗрд╕ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ред Lmb рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╕рднреА рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдорд╛рдирдХ Limb рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВред
рдЖрд╡реЗрджрди рдкрдВрдЬреАрдХрд░рдг
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрд╡реЗрджрди рдкрдВрдЬреАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛
рдпрд╛рдВрдбреЗрдХреНрд╕ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред
рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлреЙрд░реНрдо рднрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдпреИрдВрдбреЗрдХреНрд╕ рдбреНрд░рд╛рдЗрд╡ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рд╣реЛрдЧреАред рдлреЙрд░реНрдо рдлрд╝реАрд▓реНрдб рднрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдИрдбреА рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд╛рд╕рд╡рд░реНрдб рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдореБрдЭреЗ 3 рдорд┐рдирдЯ рд▓рдЧреЗред
OAuth рдХреЗ рд╕рд╛рде рдпрд╛рдВрдбреЗрдХреНрд╕ рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг
рдбрд┐рд╕реНрдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ OAuth рдЯреЛрдХрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред OAuth рдорд╛рдирдХ рдПрдХ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рддреВ рдиреЗ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд░рд╛рд╕реНрддрд╛ рддрдп рдХрд┐рдпрд╛ред OAuth рдорд╛рдирдХ рдкреАред 4.3.2 рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпреИрдВрдбреЗрдХреНрд╕ рдЦрд╛рддреЗ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд╡рд╛ рдХреЛ рд╕реАрдзреЗ рдЕрдиреБрд░реЛрдз рдХрд░рдХреЗ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЦреЛрдЬ рдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд░реНрдЧ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА:
рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рд╡рд░реНрдЧ рдХреЛрдбclass YaAuth { protected $token; protected $error; protected $create_time; protected $ttl; protected $app_id; protected $conf; protected $logger; function __construct($conf,$logger) { $this->logger = $logger; $this->app_id = $conf->get('oauth_app_id'); $this->clear(); $this->conf = $conf; } function getToken() { if($this->checkToken()) return $this->token; $url = $this->conf->get('oauth_token_url'); $curl = lmbToolkit::instance()->getCurlRequest(); $curl->setOpt(CURLOPT_HEADER,0); $curl->setOpt(CURLOPT_REFERER,$this->conf->get('oauth_referer_url')); $curl->setOpt(CURLOPT_URL,$url); $curl->setOpt(CURLOPT_CONNECTTIMEOUT,1); $curl->setOpt(CURLOPT_FRESH_CONNECT,1); $curl->setOpt(CURLOPT_RETURNTRANSFER,1); $curl->setOpt(CURLOPT_FORBID_REUSE,1); $curl->setOpt(CURLOPT_TIMEOUT,4); $curl->setOpt(CURLOPT_SSL_VERIFYPEER,false); $post = 'grant_type=password&client_id='.$this->conf->get('oauth_app_id'). '&client_secret='.$this->conf->get('oauth_app_secret'). '&username='.$this->conf->get('oauth_login'). '&password='.$this->conf->get('oauth_password'); $header = array( 'Content-type: application/x-www-form-urlencoded', 'Content-Length: '.strlen($post) ); $curl->setOpt(CURLOPT_HTTPHEADER,$header); $json = $curl->open($post); if(!$json) { $this->error = $curl->getError(); $this->logger->log('','ERROR', $this->error); return false; } $http_code = $curl->getRequestStatus(); if(($http_code!='200') && ($http_code!='400')) { $this->error = "Request Status is ".$http_code; $this->logger->log('','ERROR', $this->error); return false; } $result = json_decode($json, true); if (isset($result['error']) && ($result['error'] != '')) { $this->error = $result['error']; $this->logger->log('','ERROR', $this->error); return false; } $this->token = $result['access_token']; $this->ttl = (int)$result['expires_in']; $this->create_time = (int)time(); return $this->token; } function clear() { $this->token = ''; $this->error = ''; $this->counter_id = ''; $this->create_time = 0; $this->ttl = -1; } function checkToken() { if ($this->ttl <= 0) return false; if (time()>($this->ttl+$this->create_time)) { $this->error = 'token_outdated'; $this->logger->log('','ERROR', $this->error); return false; } return true; } function getError() { return $this->error; } }
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдирд┐рдХрд╛рд▓ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХрд╛ рд╕рдорд░реНрдерди рдФрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓реЙрдЧ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдп рд▓реЙрдЧ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХреЛрдб рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд░реНрдЧ рдореЗрдВ рд╣реА рджреЛ рдореБрдЦреНрдп рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ, рд╡реИрдЯрдХреЗрди рдФрд░ рдЪреЗрдХрдЯреЛрдХрдиред рдкрд╣рд▓рд╛ рдПрдХ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдПрдХ CUrl рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдпрджрд┐ рдХреЛрдИ рдЯреЛрдХрди рдЖрдЙрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИред
Yandex.Disk рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди
рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдпреИрдВрдбреЗрдХреНрд╕ рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рдСрдкрд░реЗрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпреИрдВрдбреЗрдХреНрд╕ рдбрд┐рд╕реНрдХ рдЖрдкрдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореЗрд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ:
- рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ
- рдлрд╝рд╛рдЗрд▓ рдХреЛ рдпреИрдВрдбреЗрдХреНрд╕ рдбрд┐рд╕реНрдХ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛
- рдпреИрдВрдбреЗрдХреНрд╕ рдбреНрд░рд╛рдЗрд╡ рд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛рдПрдВ
- рдпреИрдВрдбреЗрдХреНрд╕ рдбрд┐рд╕реНрдХ рд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛
- рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
- рдбрд┐рд╕реНрдХ рдФрд░ рдЙрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг
рд╕рднреА рдСрдкрд░реЗрд╢рди cUrl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдпрд╣ рд╕рдм рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреА рд╕рд╛рджрдЧреА рдореЗрд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред Yandex рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рд╕рднреА рдСрдкрд░реЗрд╢рди WebDav рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред рдпрд╛рдВрдбреЗрдХреНрд╕ рдбрд┐рд╕реНрдХ рдПрдкреАрдЖрдИ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдХреНрд╡реЗрд░реА рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ рдЗрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╡рд┐рд╕реНрддреГрдд рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд░реНрдЧ рдХреЛрдб рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдбреНрд░рд╛рдЗрд╡ рдХреЛрдб class YaDisk { protected $auth; protected $config; protected $error; protected $token; protected $logger; protected $url; function __construct($token,$config,$logger) { $this->auth = $auth; $this->config = $config; $this->token = $token; $this->logger = $logger; } function getCurl($server_dst) { $curl = lmbToolkit::instance()->getCurlRequest(); $curl->setOpt(CURLOPT_SSL_VERIFYPEER,false); $curl->setOpt(CURLOPT_PORT,$this->config->get('disk_port')); $curl->setOpt(CURLOPT_CONNECTTIMEOUT,2); $curl->setOpt(CURLOPT_RETURNTRANSFER,1); $curl->setOpt(CURLOPT_HEADER, 0); $curl->setOpt(CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1); $uri = new lmbUri($this->config->get('disk_server_url')); $uri = $uri->setPath($server_dst)->toString(); $curl->setOpt(CURLOPT_URL,$uri); $header = array('Accept: */*', "Authorization: OAuth {$this->token}" ); $curl->setOpt(CURLOPT_HTTPHEADER,$header); return $curl; } function getResult($curl, $codes = array()) { if($curl->getError()) { $this->error = $curl->getError(); echo $this->error; $this->logger->log('','ERROR', $this->error); return false; } else { if (!in_array($curl->getRequestStatus(),$codes)) { $this->error = 'Response http error:'.$curl->getRequestStatus(); $this->logger->log('','ERROR', $this->error); return false; } else { return true; } } } function mkdir($server_dst) { $curl = $this->getCurl($server_dst); $curl->setOpt(CURLOPT_CUSTOMREQUEST,"MKCOL"); $response = $curl->open(); return $this->getResult($curl, array(201,405));
рд╕рднреА рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рдирд╛рдо mkdir, рдЕрдкрд▓реЛрдб, рдбрд╛рдЙрдирд▓реЛрдб, ls, rm рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрди рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗред рдпрд╣ рд╕рдм cUrl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд╡реЗрд░реА рдмрдирд╛рдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдКрдкрд░ рдкреНрд░рд╛рдкреНрдд рдЯреЛрдХрди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
рдЙрддреНрддрд░ рдХрд╛ рд╕рдВрдкреВрд░реНрдг рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдирд╛, рдРрд╕рд╛ рдХрд░рдирд╛ рдЖрд▓рд╕реНрдп рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗрд╡рд▓ рдЕрдиреБрд░реЛрдз рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреА рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рдСрдкрд░реЗрд╢рди рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рд▓реЙрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд▓рд┐рдЦреЗрдВред
рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди is_dir, is_file рд╣реИ, рдореМрдЬреВрдж рд╣реИ, рднрдпрд╛рдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ 10 рд╕реЗ рдЕрдзрд┐рдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╡рд╛рд▓реЗ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдПрд▓рдПрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рдПрдХ рдбрд┐рд╕реНрдХ рдкреНрд░рдмрдВрдзрди рдЙрдкрдХрд░рдг рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рд╣реИ, рдлрд┐рд░ рднреА рдпрд╣ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИред
Yandex рдбрд┐рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдмреИрдХрдЕрдк рдмрдирд╛рдирд╛ рдФрд░ рднреЗрдЬрдирд╛
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмреИрдХрдЕрдк рдмрдирд╛рдПрдВрдЧреЗ:
- рд╣рдо рдпрд╛рдВрдбреЗрдХреНрд╕ рдбреНрд░рд╛рдЗрд╡ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдмреИрдХрдЕрдк рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред рдпрджрд┐ рдбрд┐рд╕реНрдХ рдкрд░ n рд╕реЗ рдЕрдзрд┐рдХ рдмреИрдХрдЕрдк рдЬрдорд╛ рд╣реЛ рдЧрдП рд╣реИрдВ, рддреЛ рдкреБрд░рд╛рдиреЗ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред, рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рдирдВрдмрд░ n рд▓реЗрдВред
- рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдореИрд╕рдХрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдПрдХ рдбрдВрдк рдмрдирд╛рдПрдВред рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ, рдпрд╣ mysqldump рдХрдорд╛рдВрдб рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдЙрд╕реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
- рд╣рдо рдмрдирд╛рдП рдЧрдП рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред
- рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдпреИрдВрдбреЗрдХреНрд╕ рдбрд┐рд╕реНрдХ рдкрд░ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣рдЯрд╛рдПрдВ
рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЕрдВрддрд┐рдо рд╕реЗрдЯ рдХреА рд╡рд┐рд╡рд┐рдзрддрд╛рдПрдБ рд╕рдВрднрд╡ рд╣реИрдВред рдпрд╣рд╛рдБ рдХрд▓реНрдкрдирд╛ рдХреА рдЙрдбрд╝рд╛рди рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реЗрдЯ рдореЗрд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдореНрди рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдбрд┐рд╕реНрдХ рдкрд░ рднреЗрдЬреЗрдВ class YaBackup { protected $disk; protected $db; protected $logger; protected $backup_number; function __construct($backupconfig) { $config = lmbToolkit::instance()->getConf('yandex'); $this->logger = YaLogger::instance(); $auth = new YaAuth($config,$this->logger); $token = $auth->getToken(); if($token == '') throw Exception(' '); $this->disk = new YaDisk($token,$config,$this->logger); $this->db = $backupconfig->get('db'); $this->folders = $backupconfig->get('folders'); $this->tmp_dir = $backupconfig->get('tmp_dir'); $this->project = $backupconfig->get('project'); $this->backup_number = $backupconfig->get('stored_backups_number'); $this->server_dir = $backupconfig->get('dir'); $time = time(); $this->archive = date("Ymd",$time).'-'.$time; } function execute() { $this->logger->log(" ".$this->project,"START_PROJECT"); $this->_clean(); $this->logger->log(" "); $this->_deleteOld(); $this->logger->log(" "); $this->_makeDump(); $this->logger->log(" "); $this->_copyFolders(); $this->logger->log(" "); $this->_createArchive(); $this->logger->log(" ."); $this->_upload(); $this->logger->log(" "); $this->_clean(); $this->logger->log(" ".$this->project." ", "END_PROJECT"); } protected function _clean() { lmbFs::rm($this->getProjectDir()); } protected function _deleteOld() { $list = $this->disk->ls($this->server_dir.'/'.$this->project); $paths=array(); $n=0; foreach($list as $item) {
рдореИрдВрдиреЗ рдЕрдВрддрд┐рдо рд╡рд░реНрдЧ рдХреЗ рдХреЛрдб рдХреЛ рдХрдВрдШреА рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЗрдЪреНрдЫреБрдХ рдкрд╛рдардХ рдЕрдкрдиреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ, рд╣рдЯрд╛рдиреЗ рдпрд╛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд░реНрдЧ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреЛрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рдХреНрд░рд╛рдЙрди рдХреЙрдкреА рдХрд░реЗрдВ
рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдореИрдВ рдореБрдХреБрдЯ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд░реНрдЧ рдХреЗ рд╡рд╛рд░рд┐рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВ:
cronjob abstract class CronJob { abstract function run(); }
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдпрд╣рд╛рдБ рдмреЗрдорд╛рдиреА рд╣реИрдВред
рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реВрдВ:
рд╢реЗрдбреНрдпреВрд▓ рдЯрд╛рд╕реНрдХ рд▓реЙрдиреНрдЪ рдХреНрд▓рд╛рд╕ class YaBackupJob extends CronJob { protected $conf; protected $conf_name = 'adevelop'; function __construct() { $this->conf = lmbToolkit::instance()->getConf($this->conf_name); } function run() { $backup = new YaBackup($this->conf); $backup->execute(); } }
рдпрд╣рд╛рдВ, рдХрд╣реАрдВ рдФрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд▓рд┐рдВрдм рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдорд╛рдирдХ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдЕрдореВрд░реНрдд рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдПрдХ рдкреНрд░рдХреНрд╖реЗрдкрдг рдореБрджреНрджрд╛ рдерд╛ред рдХрд╛рд░реНрдп рд╕реНрд╡рдпрдВ cron_runner.php рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЯрд╛рд╕реНрдХ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд╣реА рдХрд╛рд░реНрдп рдХреЛ рджреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рдлрд╝рд╛рдЗрд▓ рд▓реЙрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
cron_runner.php set_time_limit(0); require_once(dirname(__FILE__) . '/../setup.php'); lmb_require('limb/core/src/lmbBacktrace.class.php'); lmb_require('limb/fs/src/lmbFs.class.php'); lmb_require('ya/src/YaLogger.class.php'); new lmbBacktrace; function write_error_in_log($errno, $errstr, $errfile, $errline) { global $logger; $back_trace = new lmbBacktrace(10, 10); $error_str = " error: $errstr\nfile: $errfile\nline: $errline\nbacktrace:".$back_trace->toString(); $logger->log($error_str,"ERROR",$errno); } set_error_handler('write_error_in_log'); error_reporting(E_ALL); ini_set('display_errors', true); if($argc < 2) die('Usage: php cron_runner.php cron_job_file_path(starting from include_file_path)' . PHP_EOL); $cron_job_file_path = $argv[1]; $logger = YaLogger::instance(); $lock_dir = LIMB_VAR_DIR . '/cron_job_lock/'; if(!file_exists($lock_dir)) lmbFs :: mkdir($lock_dir, 0777); $name = array_shift(explode('.', basename($cron_job_file_path))); $lock_file = $lock_dir . $name; if(!file_exists($lock_file)) { file_put_contents($lock_file, ''); chmod($lock_file, 0777); } $fp = fopen($lock_file, 'w'); if(!flock($fp, LOCK_EX + LOCK_NB)) { $logger->logConflict(); return; } flock($fp, LOCK_EX + LOCK_NB); try { lmb_require($cron_job_file_path); $job = new $name; if(!in_array('-ld', $argv)) $logger->log('',"START"); ob_start(); echo $name . ' started' . PHP_EOL; $result = $job->run(); $output = ob_get_contents(); ob_end_clean(); if(!in_array('-ld', $argv)) $logger->log($output,"END",$result); } catch (lmbException $e) { $logger->logException($e->getNiceTraceAsString()); throw $e; } flock($fp, LOCK_UN); fclose($fp); if(in_array('-v', $argv)) { echo $output; var_dump($logger->getRecords()); }
рдХрдорд╛рдВрдб рдХреЛ рдХреНрд░реЙрд╕реНрдЯреИрдм рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ:
php /path/to/cron_runner.php ya/src/YaBackupJob.class.php
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓_рдкрд╛рде рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрд╡рдпрдВ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╕реЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдпрд╣ рдХреЛрдб рдХрд╛рдо рдЖрддрд╛ рд╣реИред рдПрдХ рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдВрдХ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╣реИрдВред
рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИред
рд╕рдиреНрджрд░реНрдн рдФрд░ рд╕реВрддреНрд░