Linux Quest. G'oliblarni tabriklaymiz va topshiriqlarning yechimlari haqida gapirib bering

Linux Quest. G'oliblarni tabriklaymiz va topshiriqlarning yechimlari haqida gapirib bering

25 mart kuni biz ro'yxatdan o'tdik Linux Quest, bu Linux operatsion tizimini sevuvchilar va mutaxassislar uchun o'yin. Ba'zi statistik ma'lumotlar: o'yin uchun ro'yxatdan o'tgan 1117 kishi, ulardan 317 nafari kamida bitta kalit topdi, 241 nafari birinchi bosqich topshirig'ini muvaffaqiyatli bajardi, 123 nafari ikkinchi va 70 nafari uchinchi bosqichdan o'tdi. Bugun o'yinimiz o'z nihoyasiga yetdi va g'oliblarimizni tabriklaymiz!

  • Birinchi o‘rinni Aleksandr Teldekov egalladi.
    Aleksandr o'zini eng tipik tizim ma'muri deb aytdi. Volgogradda yashaydi, taxminan yigirma yil davomida Unix-ga o'xshash turli xil tizimlarni boshqaradi. Men internet provayderlarida, bankda va tizim integratorida ishlashga muvaffaq bo'ldim. Endi u yirik xorijiy mijoz uchun bulutli infratuzilmada ishlaydigan kichik kompaniyada masofadan turib ishlaydi. O'qishni va musiqa tinglashni yaxshi ko'radi. O'yin haqida Aleksandr o'yinni umuman yoqtirishini, bunday vazifalarni yaxshi ko'rishini aytdi. Kompaniyalardan birida intervyu paytida men Hackerrank-ga o'xshash narsani qildim, bu qiziq edi.
  • Ikkinchi o'rin - Roman Suslov.
    Moskvadan bir roman. U 37 yoshda. Jet Infosystems kompaniyasida Linux/Unix muhandisi sifatida ishlaydi. Ishda men Linux/Unix tizimlari + SAN ni boshqarishim va muammolarni bartaraf etishim kerak. Qiziqishlar turlicha: Linux tizimlari, dasturlash, teskari muhandislik, axborot xavfsizligi, Arduino. O'yin haqida Roman umuman o'yinni yoqtirishini ta'kidladi. “Men miyamni biroz cho'zdim va kundalik ishning kulrang kundalik hayotidan tanaffus oldim. 🙂 Menda ko'proq vazifalar bo'lishini xohlardim, aks holda men buni tatib ko'rishga ulgurmadim, o'yin allaqachon tugagan edi.
  • Uchinchi - alex3d.
    Aleks Moskvada yashaydi va dasturiy ta'minotni ishlab chiqishda ishlaydi. "Tanlov uchun rahmat, mening google-fu ko'nikmalarimni sinab ko'rish qiziqarli bo'ldi."

Shuningdek, 10 ta eng yaxshi futbolchi reytingida:

  • Yevgeniy Saldayev
  • Markel Moxnachevskiy
  • Konstantin Konosov
  • Pavel Sergeev
  • Vladimir Bovaev
  • Ivan Bubnov
  • Pavlo Klets

Biz barcha muammolarimizni hal qilishning ko'plab variantlari mavjudligini tushunamiz, ba'zi mumkin bo'lgan echimlar quyida tavsiflanadi.

1. Birinchi bosqich

Biz buni "Siz haqiqatan ham administratormisiz?" Deb chaqirdik, chunki vazifa juda oddiy edi - issiq chiroq xizmatini tuzatish.

1.1. Qiziq faktlar:

Ikki futbolchi o'yinning dastlabki 15 daqiqasida birinchi kalitni topdi va birinchi soatda bizda uchta etakchi vazifani bajardi.

1.2. Mashq qilish

Siz uzoq vaqt davomida axborot texnologiyalari bo'yicha malakali mutaxassis bo'lmagan kompaniyaga ishlashga borgansiz. Ishlarni tartibga solishni boshlashdan oldin, siz ofis ishiga to'sqinlik qiladigan yonish muammosini hal qilishingiz kerak.

Tozalashchi xonim server kabinetining elektr kabelini shvav bilan ushladi. Quvvat tiklandi, lekin juda muhim veb-sayt hali ham ishlamayapti. Veb-sayt muhim ahamiyatga ega, chunki kompaniya axborot xavfsizligi haqida juda tashvishlanmaydi va uning asosiy sahifasida siz aniq matnda bosh direktor kompyuteri uchun administrator parolini topishingiz mumkin.

Boshqa kuni parol o'zgartirildi, lekin hamma yangisini unutdi, direktor ishlay olmaydi. Ushbu mashinada buxgalteriya hujjatlarining zaxira nusxasini ochishga yordam beradigan ko'proq kalitlar borligi haqida mish-mishlar mavjud.

Hamma muammoning tezkor hal etilishini kutmoqda!

1.3. Yechim

1. Avvalo, virtual mashinaga kirish uchun root parolini o'zgartirishingiz kerak. Ishga tushganda, bu Ubuntu 16.04 Server ekanligini ko'ramiz.

Ildiz parolini tiklash uchun biz mashinani qayta ishga tushiramiz, yuklashda grub menyusi ko'rsatilganda "e" tugmasi bilan Ubuntu elementini tahrirlashga o'ting. Linux qatorini tahrirlang, uni oxiriga qo'shing init=/bin/bash. Biz Ctrl+x orqali yuklaymiz, bash olamiz. Ildizni rw bilan qayta o'rnating, parolni o'zgartiring:

$ mount -o remount,rw /dev/mapper/ubuntu--vg-root
$ passwd

Sinxronizatsiya, qayta ishga tushirish haqida unutmang.

2. Shartda bizning veb-serverimiz ishlamayapti, qarang:

$ curl localhost
Not Found
The requested URL / was not found on this server.
Apache/2.4.18 

Ya'ni, aslida Apache ishlayapti, lekin 404 kodi bilan javob beradi. Keling, konfiguratsiyani ko'rib chiqaylik:

$ vim /etc/apache2/sites-enabled/000-default.conf

Bu erda kalit ham bor - StevenPaulSteveJobs.

Yo'lni tekshirish /usr/share/WordPress - bunday narsa yo'q, lekin bor /usr/share/wordpress. Konfiguratsiyani tahrirlang va Apache-ni qayta ishga tushiring.

$ systemctl restart apache2

3. Qayta urinib ko'ring, xatoga duch kelamiz:

Warning: mysqli_real_connect(): (HY000/2002): Connection refused in /usr/share/wordpress/wp-includes/wp-db.php on line 1488

Ma'lumotlar bazasi ishlamayaptimi?

$ systemctl status mysql
Active: active (running)

Nima bo'ldi? Biz buni aniqlab olishimiz kerak. Buni amalga oshirish uchun siz maqolada tasvirlanganidek MySQL-ga kirishingiz kerak hujjatlar. Hujjatlar nuqtalaridan biri variantni ro'yxatdan o'tkazishni tavsiya qiladi skip-grant-tables в /etc/mysql/mysql.conf.d/mysqld.cnf. Bu erda kalit ham bor - AugustaAdaKingByron.

Foydalanuvchi huquqlarini tuzatish 'wp'@'localhost'. Biz MySQL-ni ishga tushiramiz, uni tarmoq orqali foydalanish imkoniyatini yaratamiz, konfiguratsiyadagi variantni sharhlaymiz skip-networking.

4. Ushbu bosqichlardan so'ng veb-server ishga tushadi, lekin sayt hali ham ishlamayapti, chunki

Warning: require_once(/usr/share/wordpress/wp-content/themes/twentysixteen/footer.php): failed to open stream: Permission denied in /usr/share/wordpress/wp-includes/template.php on line 562

Biz faylga bo'lgan huquqlarni tahrirlaymiz.

$ chmod 644 /usr/share/wordpress/wp-content/themes/twentysixteen/footer.php

Biz sahifani yangilaymiz, saytga o'tamiz va kalitni topamiz - BjarneStroustrup! Biz uchta kalitni topdik, direktorimiz ishlashi mumkin, biz buxgalteriya fayllarini parolini hal qildik. Hamma xursand, sizning oldingizda kompaniyada infratuzilma, zaxira va xavfsizlikni o‘rnatish bo‘yicha ko‘p ishlar turibdi.

2. Ikkinchi bosqich

Tahlillarni yig'ish muammosini hal qilish kerak edi. Har bir inson tahlilni yaxshi ko'radi - kim, qaerda va qanday miqdorda foydalanadi. Biz barcha muhandislar hayotda u yoki bu shaklda duch kelishi mumkin bo'lgan ishni o'ylab topdik.

2.1. Qiziq faktlar

O'yinchilarimizdan biri o'yinning dastlabki 10 daqiqasida to'g'ri kalitni kiritdi va birinchi soat ichida bizda vazifani bajargan etakchi bor edi.

2.2. Mashq qilish

Siz kompaniyaga ishlash uchun borgan edingiz, menejerlar sizning oldingizga kelib, Afrikadan kimga xatlar yuborilganligini bilib olishingizni so'rashdi. Biz ular asosida 21 ta eng yaxshi qabul qiluvchi manzillarini yaratishimiz kerak. Qabul qiluvchilarning manzillarining birinchi harflari kalit hisoblanadi. Bir narsa: xatlar yuborilgan pochta serveri yuklanmaydi. Hamma muammoning tezkor hal etilishini kutmoqda!

2.3. Yechim

1. Server fstab-da mavjud bo'lmagan almashtirish bo'limi tufayli ishga tushmaydi, yuklash paytida tizim uni o'rnatishga harakat qiladi va ishlamay qoladi. Qanday yuklash kerak?

Rasmni yuklab oling, biz CentOS 7-ni yuklab oldik, Live CD/DVD-dan yuklaymiz (Muammolarni bartaraf etish -> Qutqarish), tizimni o'rnatamiz, tahrirlaymiz /etc/fstab. Biz darhol birinchi kalitni topamiz - GottfriedWilhelm11646Leibniz!

Swap yaratish:

$ lvcreate -n swap centos -L 256M
$ sync && reboot

2. Har doimgidek, parol yo'q, virtual mashinada ildiz parolini o'zgartirishingiz kerak. Biz buni birinchi vazifada allaqachon qildik. Biz serverni o'zgartiramiz va muvaffaqiyatli tizimga kiramiz, lekin u darhol qayta ishga tushadi. Server shu qadar yuklanganki, siz barcha jurnallarni diqqat bilan ko'rib chiqishga vaqtingiz ham yo'q. Nima bo'layotganini qanday tushunish mumkin?

Biz yana livecd-dan yuklaymiz, tizim jurnallarini sinchkovlik bilan o'rganamiz va har qanday holatda, cronga qaraymiz, chunki bunday davriylik. U erda biz muammoni va ikkinchi kalitni topamiz - Alan1912MathisonTuring!

Kirish kerak /etc/crontab o'chirish yoki sharhlash qatorini o'chirish echo b > /proc/sysrq-trigger.

3. Shundan so'ng server yuklandi va siz menejerlarning topshirig'ini bajarishingiz mumkin: "Afrikadagi manzillar qanday?" Ushbu ma'lumotlar odatda jamoatchilikka ochiqdir. Ushbu ma'lumotni Internetda "ip address africa", "geoip ma'lumotlar bazasi" iboralari yordamida topishingiz mumkin. Muammoni hal qilish uchun siz erkin foydalanish mumkin bo'lgan manzillarni tarqatish ma'lumotlar bazalaridan (geoip) foydalanishingiz mumkin. Biz ma'lumotlar bazasidan standart sifatida foydalandik MaxMind GeoLite2, Creative Commons Attribution-ShareAlike 4.0 litsenziyasi ostida mavjud.

Keling, muammoni faqat Linux tizim yordam dasturlari yordamida hal qilishga harakat qilaylik, lekin umuman olganda, uni juda ko'p usullar bilan hal qilish mumkin: matnni filtrlash yordam dasturlari va turli dasturlash tillarida skriptlardan foydalanish.

Boshlash uchun biz shunchaki pochta jurnalidan "yuboruvchi-oluvchi IP" juftligini olamiz. /var/log/maillog (elektron pochtani qabul qiluvchilar jadvalini tuzamiz - jo'natuvchi IP). Buni quyidagi buyruq yordamida amalga oshirish mumkin:

$ cat /var/log/maillog | fgrep -e ' connect from' -e 'status=sent' | sed 's/[]<>[]/ /g' | awk '/connect from/ {ip=$11} /status=sent/ {print $10" "ip}' > log1.txt

Afrika manzillari ma'lumotlar bazasini tuzishni davom ettirishdan oldin, keling, jo'natuvchilarning eng yaxshi IP manzillarini ko'rib chiqaylik.

$ cat log1.txt | cut -d' ' -f1 | sort | uniq -c | sort -r | head -n 40
5206 [email protected]
4165 [email protected]
3739 [email protected]
3405 [email protected]
3346 [email protected]

Ularning barchasi orasida yuqoridan kelgan dastlabki uchta oluvchilar harflar soni bo'yicha aniq ajralib turadi. Agar siz ushbu uchta yuqoridagi manzillarga yuborilgan jo'natuvchilarning IP-manzillarini o'rgansangiz, ba'zi tarmoqlarning aniq ustunligini ko'rasiz:

$ cat log1.txt | fgrep '[email protected]' | cut -d' ' -f2 | sort | cut -d'.' -f1 | uniq -c | sort -r | head
831 105
806 41
782 197
664 196
542 154
503 102
266 156
165 45
150 160
108 165

105/8, 41/8, 196/8,197/8 tarmoqlarining aksariyati AFRINIC-ga ajratilgan - Internet-resurslarni tarqatuvchi beshta mintaqaviy Internet registratorlaridan biri. AFRINIC butun Afrika bo'ylab manzil maydonini tarqatadi. Va 41/8 to'liq AFRINICga tegishli.

https://www.nic.ru/whois/?searchWord=105.0.0.0 
https://www.nic.ru/whois/?searchWord=41.0.0.0

Shunday qilib, muammoning javobi, aslida, jurnalning o'zida.

$ cat log1.txt | fgrep -e '105.' -e '41.' -e '196.' -e '197.' -e '154.' -e '102.' | awk '{print $1}' | sort | uniq -c | sort -r | head -n 21
4209 [email protected]
3313 [email protected]
2704 [email protected]
2215 [email protected]
1774 [email protected]
1448 [email protected]
1233 [email protected]
958 [email protected]
862 [email protected]
762 [email protected]
632 [email protected]
539 [email protected]
531 [email protected]
431 [email protected]
380 [email protected]
357 [email protected]
348 [email protected]
312 [email protected]
289 [email protected]
282 [email protected]
274 [email protected]

Ushbu bosqichda biz "LinuxBenedictTorvadst" qatorini olamiz.

To'g'ri kalit: "LinusBenedictTorvalds".

Olingan satr oxirgi 3 ta belgidagi to'g'ri kalitga nisbatan xatoni o'z ichiga oladi. Buning sababi, biz tanlagan tarmoqlar Afrika mamlakatlariga to'liq bag'ishlanmaganligi va elektron pochta xabarlari jurnalimizdagi IP manzillar bo'yicha tarqatilishi bilan bog'liq.

Afrika mamlakatlariga ajratilgan eng yirik tarmoqlarning etarli spetsifikatsiyasi bilan aniq javobni olish mumkin:

$ cat log1.txt | fgrep -e' '105.{30..255}. -e' '41. -e' '196.{64..47}. -e' '196.{248..132}. -e' '197.{160..31}. -e' '154.{127..255}. -e' '102.{70..255}. -e' '156.{155..255}. | awk '{print $1}' | sort | uniq -c | sort -r | head -n 21
3350 [email protected]
2662 [email protected]
2105 [email protected]
1724 [email protected]
1376 [email protected]
1092 [email protected]
849 [email protected]
712 [email protected]
584 [email protected]
463 [email protected]
365 [email protected]
269 [email protected]
225 [email protected]
168 [email protected]
142 [email protected]
111 [email protected]
 96 [email protected]
 78 [email protected]
 56 [email protected]
 56 [email protected]
 40 [email protected]

Muammoni boshqa yo'l bilan ham hal qilish mumkin.
MaxMind-ni yuklab oling, uni oching va keyingi uchta buyruq ham bizning muammomizni hal qiladi.

$ cat GeoLite2-Country-Locations-ru.csv | grep "Африка" | cut -d',' -f1 > africaIds.txt
$ grep -Ff africaIds.txt GeoLite2-Country-Blocks-IPv4.csv | cut -d',' -f1 > africaNetworks.txt
$ grepcidr -f africaNetworks.txt log1.txt | cut -d' ' -f1 | sort | uniq -c | sort -r | head -n21

Qanday bo'lmasin, biz oxir-oqibat statistikani hisoblab chiqdik va menejerlar ishlashlari uchun kerakli ma'lumotlarni olishdi!

3. Uchinchi bosqich

Uchinchi bosqich birinchisiga biroz o'xshaydi - siz ham issiq chiroq xizmatini tuzatishingiz kerak, ammo hamma narsa birinchi vazifaga qaraganda ancha murakkab.

3.1. Qiziq faktlar

Dastlabki 15 daqiqada uchta o'yinchi birinchi kalitni topdi, bosqich boshlanganidan 2 soat 20 daqiqa o'tgach, g'olibimiz vazifani bajardi.

3.2. Mashq qilish

Siz kompaniyaning barcha hujjatlari ichki Wiki serverida saqlanadigan kompaniyaga ishga borgansiz. O'tgan yili muhandis tizim nosozliklarga chidamli bo'lishi uchun disklarni qandaydir massivlarga joylashtirish kerakligini ta'kidlab, mavjud bo'lganiga qo'shimcha ravishda server uchun 3 ta yangi diskni buyurtma qildi. Afsuski, ular o'rnatilganidan bir necha hafta o'tgach, muhandis Hindistonga ta'tilga chiqdi va qaytib kelmadi.

Server bir necha yil davomida nosozliklarsiz ishladi, biroq bir necha kun oldin kompaniya tarmog'i buzilgan. Ko'rsatmalarga ko'ra, xavfsizlik xodimlari disklarni serverdan olib tashlashdi va ularni sizga jo'natishdi. Tashish paytida bitta disk qaytarib bo'lmaydigan darajada yo'qolgan.

Biz Wiki funksiyasini tiklashimiz kerak, birinchi navbatda, bizni wiki-sahifalarning mazmuni qiziqtiradi. Ushbu wiki sahifalaridan birida joylashgan matnning ma'lum bir qismi 1C serveri uchun parol bo'lib, uni ochish uchun zudlik bilan kerak bo'ladi.

Bundan tashqari, wiki-sahifalarning biron bir joyida yoki boshqa joyda jurnal serveri va video kuzatuv serveri uchun parollar mavjud bo'lib, ularni tiklash ham maqsadga muvofiqdir, ularsiz hodisani tekshirish mumkin emas. Har doimgidek, muammoning tezkor hal etilishini kutamiz!

3.3. Yechim

1. Bizda mavjud bo'lgan disklardan birma-bir yuklashga harakat qilamiz va hamma joyda bir xil xabarni olamiz:

No bootable medium found! System halted 

Siz biror narsadan yuklashingiz kerak. Jonli CD/DVD dan yuklash (Muammolarni bartaraf etish -> Qutqarish) yana yordam beradi. Yuklashda biz yuklash bo'limini topishga harakat qilamiz, uni topa olmayapmiz, biz qobiqqa tushamiz. Biz disklar bilan nima va qanday qilishni o'rganishga harakat qilmoqdamiz. Ma'lumki, ularning uchtasi bor. Buning uchun CentOS-ning 7-versiyasida buyruqlar mavjud bo'lgan ko'proq vositalar mavjud blkid yoki lsblk, bu bizga disklar haqidagi barcha ma'lumotlarni ko'rsatadi.

Biz qanday va nima qilamiz:

$ ls /dev/sd*

Bu darhol ayon bo'ladi

/dev/sdb1 - ext4
/dev/sdb2 - часть lvm
/dev/sda1 и /dev/sdc1 - части рейда
/dev/sda2 и /dev/sdc2 - про них ничего не известно на текущий момент

Biz sdb1 ni o'rnatamiz, bu CentOS 6 ning yuklash qismi ekanligi aniq.

$ mkdir /mnt/sdb1 && mount /dev/sdb1 /mnt/sdb1

Shubhasiz, biz grub bo'limiga o'tamiz va u erda birinchi kalitni topamiz - James191955Gosling noodatiy faylda.

2. Biz pvs va lvsni o'rganamiz, chunki biz LVM bilan ishlaymiz. Biz 2 ta jismoniy jild bo'lishi kerakligini ko'ramiz, biri joylashmagan va yo'qolgan uid haqida shikoyat qilmoqda. Biz 2 mantiqiy jild bo'lishi kerakligini ko'ramiz: ildiz va almashtirish, ildiz qisman yo'qolgan (hajmning P atributi). O'rnatish mumkin emas, bu juda achinarli! Biz unga haqiqatan ham muhtojmiz.

Yana ikkita disk bor, biz ularni ko'rib chiqamiz, yig'amiz va o'rnatamiz:

$ mdadm --examine --verbose --scan
$ mdadm --assemble --verbose --scan
$ mkdir /mnt/md127 && mount /dev/md127  /mnt/md127 

Biz qaraymiz, bu CentOS 6-ning yuklash bo'limi va allaqachon yoqilgan narsaning dublikati. /dev/sdb1, va bu erda yana bir xil kalit - DennisBMacAlistairCRitchie!
Keling, qanday yig'ilganini ko'rib chiqaylik /dev/md127.

$ mdadm --detail /dev/md127

Biz uni 4 ta diskdan yig'ish kerakligini ko'ramiz, lekin ikkitadan yig'ilgan /dev/sda1 и /dev/sdc1, ular tizimda 2 va 4 raqamlari bo'lishi kerak edi. dan deb taxmin qilamiz /dev/sda2 и /dev/sdc2 Shuningdek, siz massivni to'plashingiz mumkin. Nima uchun ularda metama'lumotlar yo'qligi aniq emas, lekin bu Goa shahrida bo'lgan administratorning vijdoniga bog'liq. Variantlar mavjud bo'lsa-da, biz RAID10 bo'lishi kerak deb o'ylaymiz. Biz yig'amiz:

$ mdadm --create --verbose /dev/md0 --assume-clean --level=10 --raid-devices=4 missing /dev/sda2 missing /dev/sdc2

Biz blkid, pvs, lvs ga qaraymiz. Biz ilgari etishmayotgan jismoniy hajmni to'plaganimizni aniqladik.

lvroot darhol ta'mirlandi, biz uni o'rnatamiz, lekin avval VGni faollashtiramiz:

$ vgchange -a y
$ mkdir /mnt/lvroot && mount /dev/mapper/vg_c6m1-lv_root /mnt/lvroot 

Va hamma narsa mavjud, shu jumladan asosiy asosiy katalogdagi kalit - /root/sweet.

3. Biz hali ham serverimizni normal ishga tushirish uchun qayta tiklashga harakat qilmoqdamiz. Bizdan barcha mantiqiy jildlar /dev/md0 (biz hamma narsani qaerdan topdik) uni sudrab olib boring /dev/sdb2, bu erda butun server dastlab ishlagan.

$ pvmove /dev/md0 /dev/sdb2
$ vgreduce vg_c6m1 /dev/md0

Biz serverni o'chiramiz, 1 va 3-disklarni olib tashlaymiz, ikkinchisini qoldiramiz, Live CD/DVD-dan Rescue-ga yuklaymiz. Yuklash bo'limini toping va bootloaderni grubda tiklang:

root (hd0,0)
setup (hd0)

Biz yuklash diskini yirtib tashlaymiz va muvaffaqiyatli yuklaymiz, lekin sayt ishlamayapti.

4. Veb-saytni ishga tushirishning ikkita varianti mavjud: Apache-ni noldan sozlang yoki nginx-ni oldindan sozlangan php-fpm bilan ishlating:

$ /etc/init.d/nginx start
$ /etc/init.d/php-fpm start

Nihoyat, MySQL-ni ishga tushirishingiz kerak:

$ /etc/init.d/mysqld start

U boshlamaydi va javob ichida /var/log/mysql. MySQL bilan muammoni hal qilganingizdan so'ng, sayt ishlaydi, asosiy sahifada kalit bo'ladi - RichardGCCMatthewGNUStallman! Endi bizda 1C ga kirish imkoni bor va xodimlar o'z maoshlarini olishlari mumkin. Va har doimgidek, sizning oldingizda kompaniyada infratuzilma va xavfsizlikni o'rnatish uchun juda ko'p ish bor.

Shuningdek, biz va ishtirokchilarimizga o'yinga tayyorgarlik ko'rishda yordam bergan kitoblar ro'yxatini yana bir bor baham ko'rishimiz mumkin: linux.mail.ru/books.

Biz bilan bo'lganingiz uchun tashakkur! Keyingi o'yinlar haqidagi anonslarni kuzatib boring!

Manba: www.habr.com

a Izoh qo'shish