แแก แขแ แแแแแแฃแ แ แแแแชแแแ แแแฉแแแ แแ แ แแแ แแกแแแแก แจแฃแแแฆแแกแแก แแ 2-3 แฌแฃแแ แฃแแแ แแแกแญแแ แแแก. แแแแแแแ, แ แแแแ แช แงแแแแแแแแก.
แแแแแแแ แแแฎแแแ แกแแ แแแขแแก แแแคแแฅแกแแ แแแ แแแก แกแแ แแแ แแ. แแ แแก แแแแแแแแ, แแแแแฌแแแ แแ แฃแแแแฃแ แแ แฉแแแแแ แแ: โแแ แ 5 แฌแฃแแแก แกแฌแ แแคแแโ. แแแแ แแแแชแแ แกแแ แแแ แก แแแแแ แแแฃแแแแแแแแก แกแแแฅแ แแแแแแชแแแก. แแแแแแ แแแฎแแแแ แ แกแแแแ, แแ แแ แกแแแแ แแ แแก แแแแแช แแคแแแฅแ แแ แฉแฃแแแ แแแแแแแแ.
โแกแฃแแแแ! - แแแแแคแแฅแ แ, แแแแแแแแ แกแแ แแแ แแก แแแแกแแแแ - แแแ แแ, แแแแแ แ แแแแแแแแ แฌแฃแแแ แแแแแกแแแแแ.
แฒแแแ แแแแฎแแ ntp, rdate, sdwdate แแ แแ แแก แแแแแกแขแแแแ แแแฃแแ แฏแแ แกแแแฅแ แแแแแแแฃแแ แแแแแ แแฃแแแ แแ แแ แแฃแจแแแแก.
# timedatectl
Local time: Sun 2019-08-25 20:44:39 +03
Universal time: Sun 2019-08-25 17:44:39 UTC
RTC time: Sun 2019-08-25 17:39:52
Time zone: Europe/Minsk (+03, +0300)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
แแฅแแ แแแฃแงแแแแแแแแ แแฆแแแแจแแแ, แ แแ แแแแ แแขแฃแ แแก แแ แ แกแฌแแ แแ: แฃแคแ แ แแแแแแ แแฅแแแแ แจแแแแแแแ แแแแแแแชแแ.
แกแฌแแ แแ แแฅแแแแ แแแแฌแงแ แจแแชแแแแแแแก แกแแ แแ.
แแแ แแแแ แจแแชแแแแ. แฒแแแแแฏแแ แแแฃแแแแ
แแแแฌแแแแฃแแแ-แแแแฌแแแแฃแแแ...
# systemctl enable systemd-timesyncd.service && systemctl start systemd-timesyncd.service && ntpdate 0.ru.pool.ntp.org && timedatectl set-ntp on && timedatectl
25 Aug 21:00:10 ntpdate[28114]: adjust time server 195.210.189.106 offset -249.015251 sec
Local time: Sun 2019-08-25 21:00:10 +03
Universal time: Sun 2019-08-25 18:00:10 UTC
RTC time: Sun 2019-08-25 18:00:10
Time zone: Europe/Minsk (+03, +0300)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
แงแแแแแคแแ แ แแแ แแแแแ, แแ แ แกแแแฅแ แแแแแแแฃแแแ, แกแแกแขแแแแก แแ แ แแแแฎแแแแ แแแแ แแขแฃแ แฃแแก. - แแแฆแ, - แแฃแแฎแแ แ แแ แฉแแแก แกแแฅแแแก แแแแฃแแ แฃแแแ.
โแ แ แฌแแแฆแ? - แแฆแจแคแแแแ แแแแแแ. "แแแแแ แแ แแ!"
แ แแช แฃแคแ แ แแแขแแ แแแแแ แแแ แขแแแฃแ แแ แแแแแแแแก, แแแ แฃแคแ แ แแแขแแ แแแแแแ แแฅแแแแ แแแ แแแแแแ แแ แแฆแแ แคแแฅแ แแแ, แ แแ แแแแกแ แแ แแแแแแกแ แกแแขแฃแแชแแ แแแแกแฎแแแแแแฃแแ แแฅแแแแ, แแแแ แแ แแ แ แแแฏแแ แแ.
# timedatectl
Local time: Sun 2019-08-25 21:09:15 +03
Universal time: Sun 2019-08-25 18:09:15 UTC
RTC time: Sun 2019-08-25 18:05:04
Time zone: Europe/Minsk (+03, +0300)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
แกแแกแขแแแแก แแ แ แแกแแ แแ แแกแฌแแ แแ.
แฒแแแแ แแชแแแแ:
# ntpdate 0.ru.pool.ntp.org && timedatectl && sleep 1 && timedatectl
25 Aug 21:07:37 ntpdate[30350]: step time server 89.175.20.7 offset -249.220828 sec
Local time: Sun 2019-08-25 21:07:37 +03
Universal time: Sun 2019-08-25 18:07:37 UTC
RTC time: Sun 2019-08-25 18:07:37
Time zone: Europe/Minsk (+03, +0300)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
Local time: Sun 2019-08-25 21:11:46 +03
Universal time: Sun 2019-08-25 18:11:46 UTC
RTC time: Sun 2019-08-25 18:07:37
Time zone: Europe/Minsk (+03, +0300)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
แแแแ แกแฎแแแแแแ แแ แแแแแแแแแ:
# date -s "2019-08-25 21:10:30" && date && sleep 1 && timedatectl
Sun Aug 25 21:10:30 +03 2019
Sun Aug 25 21:10:30 +03 2019
Local time: Sun 2019-08-25 21:14:36 +03
Universal time: Sun 2019-08-25 18:14:36 UTC
RTC time: Sun 2019-08-25 18:10:30
Time zone: Europe/Minsk (+03, +0300)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
แแ แแกแ:
# hwclock --hctosys && timedatectl && sleep 1 && timedatectl
Local time: Sun 2019-08-25 21:11:31 +03
Universal time: Sun 2019-08-25 18:11:31 UTC
RTC time: Sun 2019-08-25 18:11:31
Time zone: Europe/Minsk (+03, +0300)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
Local time: Sun 2019-08-25 21:15:36 +03
Universal time: Sun 2019-08-25 18:15:36 UTC
RTC time: Sun 2019-08-25 18:11:32
Time zone: Europe/Minsk (+03, +0300)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
แแ แ แแแฌแแกแแแฃแแแ แฌแแแแก แแแแกแแแแ แแ แแแจแแแแ แแฌแงแแแก แฎแแแแฎแแ โแกแฌแ แแคแแแกโ.
แแแแแแ แแฃแแแ, แแฃแ แแแแแแจแ, แแกแแแ แฎแแแแ แจแแชแแแแก แแ แแก, แฉแแแ แแฎแแแแแ แแฎแแแแ แกแแกแขแแแแก แแแแแ แแจแแแก, แ แแ แแ แ แจแแแชแแแแ, แจแแกแแแแแแกแแ, แกแฌแแ แ/แแ แแกแฌแแ แ แแแแแ แแฃแแแแแ แแ แแแแฏแแ . แฎแแแแฎแแแ แกแแแฅแ แแแแแแชแแ systemd-timesyncd-แแแ.
Aug 25 21:18:51 wisi systemd[1]: Time has been changed
Aug 25 21:18:51 wisi systemd-timesyncd[29258]: System time changed. Resyncing.
Aug 25 21:18:51 wisi systemd[1187]: Time has been changed
Aug 25 21:18:51 wisi systemd[1]: Time has been changed
Aug 25 21:18:51 wisi systemd[1187]: Time has been changed
แแฅ
# ps afx | grep "[1]187"
1187 ? Ss 0:02 /lib/systemd/systemd --user
แแ แแขแแแแ แแแแแแ แฃแแแ แกแแญแแ แ แแงแ, แแแแ แแ แแแแแแแกแขแ แแชแแแก 18 แฌแแแก แแแแแแแแแแแจแ แขแแแแแ แแแแแ แแแ แกแขแแขแแกแขแแแ โแแ แแแกโ แจแแชแแแแแแแ แแ แฉแแแแแก แแแแ แแกแแ แกแแแฅแ แแแแแแชแแแก แแแแแแจแแฃแแแแก.
แแแแ แแแแแแแแ แแแแแแ แแแ.
# timedatectl set-ntp off && systemctl stop systemd-timesyncd.service
# hwclock --hctosys && timedatectl && sleep 1 && timedatectl
Local time: Sun 2019-08-25 21:25:40 +03
Universal time: Sun 2019-08-25 18:25:40 UTC
RTC time: Sun 2019-08-25 18:25:40
Time zone: Europe/Minsk (+03, +0300)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
Local time: Sun 2019-08-25 21:29:31 +03
Universal time: Sun 2019-08-25 18:29:31 UTC
RTC time: Sun 2019-08-25 18:25:41
Time zone: Europe/Minsk (+03, +0300)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
แแ แแฃแ แแแแแแจแ
Aug 25 21:25:40 wisi systemd[1]: Time has been changed
Aug 25 21:25:40 wisi systemd[1187]: Time has been changed
Aug 25 21:29:30 wisi systemd[1]: Time has been changed
Aug 25 21:29:30 wisi systemd[1187]: Time has been changed
แฎแแแแฎแแแ แกแแแฅแ แแแแแแชแแ แแแฅแ แ แแ แแแ แแ แแแ แแแ แฎแแแฃแฎแแแแแแแ.
แแแกแแแแแแแก แจแแแแฌแแแแ tcpdump แแแ แขแแ 123 แงแแแแ แแแขแแ แคแแแกแแ. แแแแฎแแแแ แแ แแ แแก, แแแแ แแ แแ แ แแแแแช แแแแแก.
แจแแชแแแแ แแ แ. แแฉแฅแแ แแ
แกแแแฃแจแแ แแแแ แแก แแแกแ แฃแแแแแแแ แแแ แฉแ แแ แแ แกแแแแ แแ แแ แแแแแ แจแแแแ-แแแแ แแก แฌแแ แแแแแแ แแแแแฃแญแ แแแ แแ แแแแแแ (แแแแจแ แแแแแแแแฃแ แแ แแก แแ แแแแฅแชแแแ แงแฃแ แแแฆแแแ, แกแขแแขแแ แแแแฌแแ แ แแแแแแแแ แแฆแแแแจแ ).
แแ แแฅ แแกแแ แแแแแแแก แซแแแแแก แแแชแแแแ แแแแแฌแงแ แจแแแแแแก แแฎแกแแแก แแชแแแแแแ. แแ แแแแแแ "แแแแแแแแแแแก", แ แแแแแ แ แแช แแ แฃแแแ แแแแแแฃแ แ แแงแแก แจแแแแแแก แแฎแกแแ, แแก แแ แแก แแ แแแแแแแก แแแแแญแ แแก แแชแแแ แ แแแแแแแ.
แแก แกแแ แแแ แ แแ แแก แกแขแ แแแแแแแก แกแแ แแแ แ แแ แแแ แแแฅแแแแก DVB-S2 แแแแแแก IP-แแ. DVB-S แแแแแแ แจแแแชแแแก แแ แแแก แแแจแแแก, แแแแขแแ แแแแฆแแแแแ, แแฃแแขแแแแแฅแกแแขแแ แแแ, แกแแ แแแแแแ แแแ แแ แขแแแแแแแแ แแแ แฎแจแแ แแ แแงแแแแแแ แแแ แกแแกแขแแแแก แกแแแแแก แกแแแฅแ แแแแแแชแแแกแแแแก. DVB-S แแแคแแก แแ แแแแแ แแแ แฉแแจแแแแแฃแแแ แแแ แแแจแ, แแแแขแแ แงแแแแแแ แกแฌแ แแคแ แแแ DVB-S2 แแแแแแแก แแแแฆแแแแก แฃแแ แฃแแแแแกแแงแแคแแ แแ แแก "แคแแ แคแแขแแแแแแ" แแแแแแแแ แแแแแแแแแก แแแแแจแแ. แกแแแแแแแแ แแ, แกแแ แแแ แ แแแแแแก แแแฆแแแ, แแกแแช แแงแแก.
แ แ แแฅแแ แฃแแแ, แแฃแ แแแแแแ แ แแ แจแแแชแแแแแก แแแแก, แ แแช แแฅ แฃแแแ แงแแคแแแแงแ, แแก แแ แแแฎแแแแแแ, แแแแ แแ แฃแคแ แ แแแแก แจแแกแแฎแแ, แแแแแ แแ แแฎแแ, แกแขแแขแแแก แแแแแก.
แแกแ, แ แแแแแ แฉแแแ แฃแแแ แฌแแแจแแแแ แงแแแแ แกแแขแแแแขแฃแ แ แกแแแแแแ, แฉแแแ แแกแแแ แแแแฎแกแแแ แฎแแแแแแแก แกแแแแแแแแก - แแแแแแ แแฃแแแ แแแฆแแแ แฅแกแแแแก แงแแแแ แแแแแแก. แกแแ แแแ แ แแแฌแงแแแขแแแแ แแแ แ แกแแแงแแ แแกแแแ แแ แแฃแจแแแแก แกแ แฃแแแแ แแแขแแแแแแฃแ แแ, แแแแ แแ แกแแกแขแแแแก แกแแแแ แแแแแช แฉแฅแแ แแแก.
แกแแแฃแจแแ แแแแ แ แแแกแ แฃแแแ แแ แแแ แแฆแแก/แแ แแแก แกแแแแแฎแ แแแแแกแแแแแ แแ แแ แแก แแ แแขแแแฃแแ, แแกแ แ แแ แแฅแแแ แจแแแแซแแแแ แกแแฎแแจแ แฌแแกแแแ, แแแแ แแ แแฅ แแ แแฃแจแแแ แแฎแแ แจแแชแแแแแก.
แจแแชแแแแ แกแแแ. แแ แฉแแแแแแ
แแ แแกแแแแก! แแ แแกแแแแก แแแฃแกแแแ แจแแแแแฎแแแแ แคแแ แฃแแแแแ แแ แแแแแ แกแแแชแแแแแแแแฃแ (a la stackoverflow) แกแแแขแแแแ, แแฃ แแแกแแ แแแกแฃแฎแ แแแแแฎแแแก แฃแคแ แ แแแขแก, แแแแ แ Google-แแก แแแ แแแแ แแแแ แแแก แจแแกแฌแแแแ แแ แแ แแ แแแชแแก แแแแ แแแก แแแแฎแแ.
แแแแแแ แฃแแแแแ แแฃแแแจแ, แฌแแแแแแฎแแแแ แแแแแ แแแชแก แแ แแแแฃแแแ แฃแแแ แแแแฎแกแแแแ แคแแ แฃแแแก/แกแแแขแแก แฌแแกแแแก, แแแแ แแ แแแกแฃแฎแก แแ แแแแชแแแแ.
แแฅ แแ แแก แ แแแแแแแแ แแแแแฅแขแฃแ แ แคแแฅแขแแ แ:
- แแฅแแแ แแแ แแ แแแ แแแแ แจแแซแแแแก แแ แแแแแแแก แชแแแแแก;
- แแแ แแแแ แจแแซแแแแก แขแแกแขแแแแก แฉแแขแแ แแแแก แแฅแแแแก แแแ แแแแแจแ
แแ แกแฃแแแแฅแขแฃแ แ:
- แจแแกแแซแแแ, แแ แแแแแแแก แแแแแกแแญแ แแแแ แแแแแ แฌแแแแแแก แจแแขแแแ แแ แแแแชแแ, แ แแแแแ แฃแแแ แแแแคแแฅแ แแ โแกแฌแแ แโ แแแแแ แแฃแแแแ แแ แแแกแแ แคแแแฃแกแแ แแแฃแแ แฌแแ แแแแแแแแ แกแแแแแฎแแก แแ แกแก;
- แแกแขแแขแ (แแแแแ แแขแแ แ, แซแแแแ แขแแแแแ แ, แแแแแแ) แงแแแแแแแแก แแแ แแแแแ, แแฃ แแกแขแแขแ แชแแแแ... แแแ, แแฅแแแ แแชแแ...
แแฃ แแแแแแขแแ แแแแ แแแกแฃแฎแแก แแแชแแแแกแแก แชแแแแฃแ แแ แแแฃแแ แแแฅแกแแแแก แคแแ แแแแแจแ แแแ แฉแแ, แแแจแแ แซแแแแ แ แแแ แแแแ แแแฅแแ.
แแแแแฌแงแแแขแแแแแ
แแ แแ แแก แกแแญแแ แ แแแแแแแแแแแก แแแงแแคแ แแแ แขแแ แแ แ แแฃแแแ.
แฉแแแ แแฌแงแแแขแ แฉแแแแก แแแแแชแแแแแแแก, แกแขแแขแแกแขแแแแก, แแ แฉแแแแแก แแ แแแฌแงแแแ แแ แ แกแแแแแแ แจแแแแแแก โแแฎแกแแแกโ, แแ แแแแ แแแแแแแก แแแแแแแแแแ แฃแแแ แซแแแแแก.
แแแแแแแแ แแแแแ แแแแแแก แแ แแก, แจแแกแแแแแแกแ แกแแกแขแแแฃแ แ แแแ แ แฃแแแ แแแฎแแแก.
แ แแแแ แช แแ แแแ แแแฃแ แแแแฃแแแแขแแชแแแจแ แกแแฃแแแแแกแ แแแแฃแแแแขแแแแ แฌแงแแ แแแแ, แแกแแแ แกแแกแขแแแแก แแแแแแแกแขแ แแ แแแแจแ แกแแฃแแแแแกแ แแกแแกแขแแแขแ แแ แแก แแฃแแแขแ, แฉแแแแก แจแแแแฎแแแแแจแ. แแฃแแแขแ.
แแญแแแก แแแแแแขแแแ แแแแแแ แ แแแแ, แแแแ แแ แแแแแแแ แแแ แฌแแฃแแแแฃแแ แแ แแแงแแแ, แ แแ Linux-แจแ แแ แแแก แแแงแแแแแ แแฎแแแแ แจแแกแแซแแแแแแแ แกแแแแแก_แแแงแแแแแแก แแ แ ะธ แแฆแแก แแแแแจแแแแแกแ แ แแ, แแแ แแแแ แขแแกแขแแกแแแแก แแ แแแแ แฉแแ แงแแแแ "แจแแกแแคแแ แแกแ" แแแ แ:
# man syscalls | col | grep -F '(2)' | grep -vE '(:|;)' | grep -E '(time|date|clock)' | sed "s/(2).*//" | xargs -I SYSCALL echo "-S SYSCALL " | xargs echo
-S adjtimex -S clock_adjtime -S clock_getres -S clock_gettime -S clock_nanosleep -S clock_settime -S futimesat -S getitimer -S gettimeofday -S mq_timedreceive -S mq_timedsend -S rt_sigtimedwait -S s390_runtime_instr -S setitimer -S settimeofday -S stime -S time -S timer_create -S timer_delete -S timer_getoverrun -S timer_gettime -S timer_settime -S timerfd_create -S timerfd_gettime -S timerfd_settime -S times -S utime -S utimensat -S utimes
แแ แแแแแแแแแ s390_runtime_instr, stime, timerfd_create, แ แแแแแแช แแฃแแแขแแกแขแ แแ แแฆแแแ แ, แแแแแแแแ แแแแแ แแแแฌแงแ แแฃแแแขแ แกแแฎแแ:
auditctl -a exit,always -S adjtimex -S clock_adjtime -S clock_getres -S clock_nanosleep -S clock_settime -S futimesat -S getitimer -S gettimeofday -S mq_timedreceive -S mq_timedsend -S rt_sigtimedwait -S semtimedop -S setitimer -S settimeofday -S time -S timer_create -S timer_delete -S timer_getoverrun -S timer_gettime -S timer_settime -S timerfd_gettime -S timerfd_settime -S times -S utime -S utimensat -S utimes
แแแก แจแแแแแ แ แแช แแแแ แฌแแฃแแแ, แ แแ แแ แแ แแก แกแฎแแ แแฃแ แแแแแแ แแฃแ แแแแแแแก แแแแแแแแแ, แ แแแแแแแช แแ แแแแแขแแ แแกแแแก syscals แแ แแ แแก แแแ แแ, แจแแแแแแแจแ แแฎแแแแ แแกแแแ แแแแแแแงแแแ.
แกแแกแขแแแฃแ แ แแแ แแก แแฃแแแขแแก แแแจแแแแ แกแแแแแก_แแแงแแแแแแก แแ แ ะธ แแฆแแก แแแแแจแแแ แแ แจแแแชแแแแ แจแแชแแแแแ แแแ แแฆแ:
# auditctl -a exit,always -S clock_settime -S settimeofday && date -s "2019-08-22 12:10:00" && sleep 5 && auditctl -D
แฎแฃแ แฌแแแแแแ แจแแคแแ แฎแแแ แแแแขแแแ, แ แแ แฉแแแแ โแแแ แแแแขแโ แแแ แแแขแแ แแแฃแแ แแงแแก แแ แแแก แแแแแกแฌแแ แแแแจแ.
แแแแฎแแ แแแฎแกแแแแแ:
# aureport -s -i
Syscall Report
=======================================
# date time syscall pid comm auid event
=======================================
Warning - freq is non-zero and incremental flushing not selected.
1. 08/22/2019 12:10:00 settimeofday 3088 chkcache_proces root 479630
2. 08/26/2019 09:37:06 clock_settime 1538 date root 479629
แแฅ แฉแแแ แแฎแแแแแ แฉแแแแก แแแ แแฆแ แแ แฉแแแแแแแก แฃแชแแแแ chkcache_processes. แแแ แแแกแ แฃแแแ แแแแแ แแแฎแกแแแแแแจแ, แ แแแแแ aureport-แแ แแแแแแแ แแแแแแแแแแ แแแ แแฆแแก แแแฎแแแแแ, แ แแแแกแแช แแแแแแ แขแแชแแ แแ แแแแแ แแงแ, แแ แแแแแแแ แแแฎแแ แแ แแ แแก, แ แแแแกแแช แฉแแแ แแแงแแแแแแแ แแแ แแฆแ -s "2019-08-22 12:10:00".
แแแ แแแแฉแแแ แแแ?
# ausearch -sc settimeofday --comm "chkcache_proces"
----
time->Thu Aug 22 12:10:00 2019
type=PROCTITLE msg=audit(1566465000.000:479630): proctitle="/usr/local/bin/oscam"
type=SYSCALL msg=audit(1566465000.000:479630): arch=c000003e syscall=164 success=yes exit=0 a0=7fde0dfc6e60 a1=0 a2=136cf a3=713ba56 items=0 ppid=3081 pid=3088 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts20 ses=68149 comm="chkcache_proces" exe="/usr/local/bin/oscam" key=(null)
/usr/local/bin/oscam - แฉแแแแ แแแ แแแแขแ แแฆแแแแฉแแแแก. แแแฃแฎแแแแแแ แแแกแ โแแแแแโ แฅแชแแแแกแ, แจแแฃแซแแแแแแแ แแแ แแแแแ แฌแแแแแแก แกแแกแขแแแแแ แฃแแ แแก แแฅแแ, แแแแ แแ แแแแแช แแแแแ แแแชแแแ แแกแแแแ, WTF?
แแแกแฃแฎแ แกแฌแ แแคแแ แแแแแแแ
#if defined(CLOCKFIX)
if (tv.tv_sec > lasttime.tv_sec || (tv.tv_sec == lasttime.tv_sec && tv.tv_usec >= lasttime.tv_usec)) // check for time issues!
{
lasttime = tv; // register this valid time
}
else
{
tv = lasttime;
settimeofday(&tv, NULL); // set time back to last known valid time
//fprintf(stderr, "*** WARNING: BAD TIME AFFECTING WHOLE OSCAM ECM HANDLING, SYSTEMTIME SET TO LAST KNOWN VALID TIME **** n");
}
แ แ แกแแงแแแ แแแ แแแแแแงแฃแ แแแ แแฅ แแแแแแฎแแแฃแ แ แฎแแแ แแแคแ แแฎแแแแแ...
แฌแงแแ แ: www.habr.com