рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ Udpxy

рдЕрджреНрднреБрдд udpxy рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореЗрдВ рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдСрдкрд░реЗрдЯрд░ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдерд┐рддрд┐ рдФрд░ рд░реАрд╕реЗрдЯ рдЖрджреЗрд╢ рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рджреВрд╕рд░реЗ, рд▓рдЧрднрдЧ 40 рдПрдХ рд╕рд╛рде рдереНрд░реЗрдбреНрд╕ рдкрд░, udpxy рдзреАрдорд╛ рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рдЧрднрдЧ рд╡реНрдпрд╕реНрдд рдирд╣реАрдВ рд╣реИрдВред


рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░


рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, udpxy рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдЗрдирд░реА рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЕрд╕реЗрдВрдмрд▓реА (рдХрдВрдкрд╛рдЗрд▓рд░, рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬ) рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд░реЛрдХрдирд╛ рдмреБрд░рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ - рдЕрдкрдбреЗрдЯ рдХрд╛ рдЖрдХрд╛рд░ рдмрдврд╝рддрд╛ рд╣реИ, рдирд┐рд░реНрднрд░рддрд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЖрджрд┐ред

рджреВрд╕рд░реА рдУрд░, рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдлрд╛рд░реНрдо рдХрд╛ рд╕рдВрдЧрдарди рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрдХрд┐рдВрдЧ рдФрд░ рдЕрд╕реЗрдВрдмрд▓реА рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ, рдЗрдХрдЯреНрдареЗ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрддред

рдПрдХ рдмрд╛рд░ рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рд╕рдордЭреМрддрд╛ рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХрд╛рд░реНрдп рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╡рд╛рддрд╛рд╡рд░рдг (рдЙрд░реНрдл рд╕реИрдВрдбрдмреЙрдХреНрд╕) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

рдбреЗрдмрд┐рдпрди рд╕реНрдХреНрд╡реАрдЬрд╝ рдореЗрдВ, рдирд┐рдореНрди рдЖрджреЗрд╢ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ:
apt-get install debootstrap mkdir /home/builder debootstrap squeeze /home/builder http://mirror.yandex.ru/debian chroot /home/builder apt-get update chroot /home/builder apt-get -y dist-upgrade chroot /home/builder apt-get -y install gcc make 

Udpxy рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ gcc рдФрд░ рдореЗрдХ рдХреА рдЬрд░реВрд░рдд рд╣реИ; рдмрдбрд╝реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХ рдкреИрдХреЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдФрд░ рд╕реНрдерд╛рдкрдирд╛


рд╕реНрд░реЛрдд рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдкрд░ рддреИрдирд╛рдд рдХрд░реЗрдВ:
 ver="1.0.23-0" wget http://downloads.sourceforge.net/project/udpxy/udpxy/Chipmunk-1.0/udpxy.${ver}-prod.tar.gz' tar xzf ~/udpxy.${ver}-prod.tar.gz -C /home/builder/home/ 

рдирд┐рдпрдВрддреНрд░рдг рдЯреАрдореЛрдВ рдХреЗ рдирд╛рдо рдХреЛ рдмрд╣реБрдд рдЧреБрдкреНрдд рд▓реЛрдЧреЛрдВ рдореЗрдВ рдмрджрд▓реЗрдВ:
 cd /home/builder/home/udpxy-${ver} sed -i.orig -e 's!/restart!/SECRET_restart!' -e 's!/status!/SECRET_status!' statpg.h sed -i.orig -e 's!"status"!"SECRET_status"!' -e 's!"restart"!"SECRET_restart"!' -e 's!"rtp"!"SECRET_rtp"!' extrn.c 

рд╣рдо рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ:
 chroot /home/builder make -C /home/udpxy-${ver} 

рд╣рдо udpxy рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫрджреНрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЗрд╕рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
 useradd --system --shell /bin/true --create-home udpxy install -o udpxy -g udpxy -m 700 -p /home/builder/home/udpxy-${ver}/udpxy /home/udpxy/ 


рд▓рд╛рдВрдЪ


рдПрдХ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХреА рдХрд╛рд░реНрдп рд╕реАрдорд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреЛрд░реНрдЯ рдкрд░ рдХрдИ udpxy рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдЪрд▓рд╛рдПрдВрдЧреЗ рдФрд░ рдЙрди рдкрд░ рд╕реНрдЯреИрдВрдбрд░реНрдб рдкреЛрд░реНрдЯ 4022 рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдХреИрдЯрд░ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ iptables => nat => PREROUTING = REDIRECT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреНрд▓рд╛рдЗрдВрдЯ рдЖрдИрдкреА рдПрдбреНрд░реЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛:
 #!/bin/bash # /home/udpxy/start MAINPORT="4022" SUBPORTS="16" SUBMASK="40%02d" LOGDIR="/var/log/udpxy" UDPXY="/home/udpxy/udpxy" USER="udpxy" mkdir -p $LOGDIR || { echo "ERROR: cannot create $LOGDIR, aborted."; exit 1; } id "$USER" > /dev/null 2>&1 || { echo "ERROR: user $USER does not exists, aborted."; exit 1; } # Run instances and create redirects... for ((a = 0; a < "$SUBPORTS"; a++)); do p=`printf "$SUBMASK" "$a"` iptables -t nat -I PREROUTING -s 0.0.0.0/0.0.0.$a -p tcp -m tcp --dport "$MAINPORT" \ -j REDIRECT --to-ports "$p" while : ; do date +"%Y.%m.%d %H:%M:%S -- Started $p" sudo -u "$USER" "$UDPXY" -T -p $p -c32 date +"%Y.%m.%d %H:%M:%S -- Finished $p" sleep 30 done >> "$LOGDIR/$p.log" 2>&1 & done 

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмреИрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ sh рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рд▓реВрдк рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рд╣реИред рджреВрд╕рд░реЗ, рдЖрдк "-I" рдХреЗ рдмрдЬрд╛рдп "iptables-a" рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ "-s 0.0.0.0/0.0.0.0" рд╡рд╛рд▓рд╛ рдирд┐рдпрдо рдкрд╣рд▓рд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЕрдкрдиреЗ рд▓рд┐рдП рд╕рднреА рдХрдиреЗрдХреНрд╢рди рд▓реЗрдЧрд╛ред рддреАрд╕рд░рд╛, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рдЪрд▓рддреА рд░рд╣рддреА рд╣реИ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ (рдЧрд┐рд░ рдЧрдпрд╛?) Udpxy рдЗрдВрд╕реНрдЯреЗрдВрд╕ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, udpxy, /var/log/udpxy/*.log рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдиреНрдпреВрдирддрдо рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ "sudo -u ..." рд▓реЙрдиреНрдЪ рд▓рд╛рдЗрди рдореЗрдВ "-v" рдФрд░ "-S" рдХреБрдВрдЬрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВред

рдЕрддрд┐рд░рд┐рдХреНрдд рдкреЗрди рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдореЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ: "-B 1Mb" рдЗрдирдкреБрдЯ рдмрдлрд░ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ), "-R 10" - рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕рд╛рде рд╕рдВрдЦреНрдпрд╛ (рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ) рдФрд░ "-H 5" - рдЕрдзрд┐рдХрддрдо рдбреЗрдЯрд╛ рдмрдлрд╝рд░ рд╕рдордп (рд╕реЗрдХрдВрдб рдореЗрдВ) )ред

/ Home / udpxy рдХреЛ рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВ / /etc/rc.local рдкрд░ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ (рд╣рдо рджреВрд╕рд░реА рдмрд╛рд░ /etc/init.d рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдирд╛ рд╕реНрдердЧрд┐рдд рдХрд░ рджреЗрдВрдЧреЗ)ред

рдкреВрд░реНрдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП:
 #!/bin/bash # /home/udpxy/stop # Remove firewall rules... iptables-save \ | grep -- "-p tcp -m tcp --dport 4022 -j REDIRECT --to-ports" \ | sed 's/^-A/iptables -t nat -D/' \ | sh - # Kill program instances... pkill -f "/home/udpxy/udpxy" sleep 5 # Kill wrapper scripts... pkill -f "/home/udpxy/start" 


рд╕реНрдерд┐рддрд┐ рджреЗрдЦреЗрдВ


рд╕рднреА udpxy рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪреА рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджреЗрдЦреЗрдВ:
 #!/usr/bin/perl # /var/www/html/SECRET-udpxy-status.cgi use strict; use warnings; my $port0 = 4000; my $ports = 16; my $status_cmd = 'SECRET_status'; my $title = "Udpxy summary status"; my $hostname; ($hostname = $ENV{HTTP_HOST}) =~ s/:\d+$//; print "Content-type: text/html\n\n" if $ENV{REMOTE_ADDR}; # ..cgi-bin mode? print << "__HEAD__"; <html> <head> <title>$title</title> </head> <body> <div id='bodyCon'> <h1>$title</h1> <div id='pgCont'> <table border='1'> <tr><th>Port</th><th>Process ID</th><th>Source</th><th>Destination</th><th>Throughput</th></tr> __HEAD__ my %cnt; my $total = 0; my $style_copied; my $style_passed; for (my $p = $port0; $p < $port0 + $ports; $p++) { open F, "wget -q -O - http://localhost:$p/$status_cmd |"; while(<F>) { if ($style_copied and /<\/style>/) { $style_copied = 0; # ..style finished $style_passed = 1; print; } elsif (/<style/ and not $style_passed) { $style_copied = 1; # ..style started print; } elsif ($style_copied) { # ..style copy in progress print; } elsif (/<td>\d+<\/td><td>\d+\.\d+\.\d+\.\d+:\d+<\/td>/) { s/<tr([^>]*)>/<tr$1><td>$p<\/td>/; # ..insert first column with port number ($cnt{$p} ||= 0)++; $total++; print; } } close F; } print "</table><h3>Clients count</h3><table border='1'><tr><th>Port</th>\n"; print "<td><a href='http://$hostname:$_/$status_cmd'>$_</a></td>\n" foreach $port0 .. ($port0 + $ports - 1); print "<th>Total</th></tr><tr><th>Count</th>\n"; printf "<td>%s</td>\n", $cnt{$_} || '' foreach $port0 .. ($port0 + $ports - 1); print "<th>$total</th></tr></table></div></div></body></html>\n"; 

рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдирд┐рдХрд▓рд╛ред

рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╕реЗ CGI-BIN рд╕рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдбреЗрдмрд┐рдпрди рдореЗрдВ, рдорд┐рдиреА-httpd рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рд╣реИ:
 apt-get install mini-httpd echo 'START=1' >> /etc/default/mini-httpd echo ' port=4020 user=nobody nochroot dir=/var/www data_dir=/var/www/html cgipat=**.cgi logfile=/var/log/mini-httpd.log pidfile=/var/run/mini-httpd.pid charset=utf-8 ' > /etc/mini-httpd.conf /etc/init.d/mini-httpd restart 


SNMP


SNMP рдХреЛ Cacti / Zabbix / MRTG рдореЗрдВ рдЬреБрдбрд╝реЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕рдВрдЦреНрдпрд╛ (рдЕрдзрд┐рдХрддрдо рдкреНрд░рддрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ + рдХреБрд▓) рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, /etc/snmp/snmpd.conf рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
 exec udpxy_connections /etc/snmp/udpxy_connections.sh 

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ /etc/snmp/udpxy_connections.sh:
 #!/bin/sh A() { netstat -nt |grep ESTABLISHED |grep -v 127.0.0.1: |awk '{print $4;}' |egrep ':40[01][0-9]$'; } A | wc -l A | awk -F : '{print $2;}' | sort | uniq -c | sort -nr | head -1 | awk '{print $1;}' 

рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
 snmpwalk -On -c SecretCommunity -v2c 10.20.30.40 NET-SNMP-EXTEND-MIB::nsExtendObjects 


рдирд┐рд╖реНрдХрд░реНрд╖



рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ рдореЗрдВ рдЖрдИрдкреА-рдЯреЗрд▓реАрд╡рд┐рдЬрди рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣рд░ рдкреБрд░рд╛рдиреЗ рдиреЗрдЯрд╡рд░реНрдХ (рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд╕рд╛рде рдбрдВрдмреЗрд╕ рдХреА рдЬрдЧрд╣, рд╕реАрдзреЗ рдлрд╛рдЗрдмрд░ рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдбреЗрдЬрд╝реА рдХреА рдЬрдЧрд╣) рдХрд╛ рдЖрдзреБрдирд┐рдХреАрдХрд░рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред Udpxy рдХреЗ рд╕рд╛рде рдЕрд╕реНрдерд╛рдпреА рд╡рд┐рдХрд▓реНрдк рдЖрдкрдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрдИрдкреАрдЯреАрд╡реА рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In152397/


All Articles