Як централізовано і дистанційно встановлювати на ПК і мобільні пристрої компанії



Ефективність роботи компанії, а також і її безпеку, безпосередньо залежать від програмного забезпечення, що використовується на робочих станціях, серверах і мобільних пристроях співробітників. З іншого боку, «зайве» може відволікати співробітників від виконання своїх обов'язків, а також створювати додаткові ризики безпеки. Як можна централізовано і дистанційно встановлювати необхідне з допомогою RMM-рішень?

Розглянемо на прикладі Panda Systems Management

Навіщо потрібна централізована установка
Мабуть, відповідь на це питання очевидна: щоб значно спростити і прискорити процес встановлення необхідного програмного забезпечення на корпоративні сервери і робочі станції, а також мобільні пристрої співробітників компанії. Щоб співробітники використовували саме те ПЗ, яке їм дійсно необхідно для виконання своїх службових обов'язків. А адже ще є питання управління оновленнями і виправленнями, щоб у першу чергу, закривати нові уразливості.

Природно, всі ці питання цілком актуальні для будь-якого підприємства, тому що в тій чи іншій мірі впливають на ефективність його роботи, а, отже, і його конкурентоспроможність. Таким чином, централізована і віддалена установка сприяє більш ефективній роботі не тільки безпосередньо ІТ-відділу, а і всієї компанії.

RMM-сервіс для централізованої установки
Для автоматизованого вирішення численних ІТ-задач існують спеціальні комплексні RMM-рішення, призначені для віддаленого та централізованого моніторингу, обслуговування та підтримки корпоративних мереж. До класу RMM-рішень відноситься хмарний сервіс Panda Systems Management.

Раніше ми вже розповідали в цілому про цьому хмарному сервісі, а також говорили про його використання для моніторингу корпоративних мереж і управління мобільними пристроями, але сьогодні ми вирішили розповісти про централізовану установку.

Сервер Panda Systems Management може автоматично і дистанційно встановлювати на керовані пристрої (робочі станції, сервери і деякі мобільні пристрої). Це дозволяє адміністратору бути впевненим в тому, що всі керовані пристрої мають те ПЗ, яке необхідно співробітникам для роботи, при цьому йому не потрібно віддалено підключатися до кожного пристрою окремо, щоб інсталювати програму.

Автоматичне розгортання також допомагає адміністратору підтримувати рівень захисту від вразливостей (Java, Adobe та ін.), що дозволяє значно знизити ризик інфекції і втрати конфіденційних корпоративних даних.

Отже, сьогодні ми розповімо:

1. Вимоги та процедура розгортання
2. Різні приклади впровадження
3. Оптимізація смуги пропускання каналу зв'язку
4. Установка на пристрої з iOS

Ви можете безкоштовно зареєструвати тріал-версію Panda Systems Management на сайт і протестувати сервіс у своєму IT-оточенні.
Як швидко впровадити рішення у Вашій ІТ-оточенні можна дізнатися в нашій попередній оглядовій статті.

Вимоги
Розгортання та інсталяція – це процес, який виконується за допомогою компонентів додатків для платформ Windows, Linux і Mac. Також є можливість установки додатків і на смартфони і планшети з iOS, про що ми розповімо в цій статті.

Подібно сценаріями і компонентів для моніторингу, компоненти додатків містять невеликий скрипт, який для вирішення даної задачі керує процесом установки, щоб інсталювати набір файлів і/або програм.

Щоб встановити на пристрої користувачів групи файлів або програм, необхідно для кожної такої групи створити окремий компонент.

Процедура розгортання та встановлення програмних пакетів
Загалом, звичайна процедура складається з чотирьох кроків:

Крок 1. Ідентифікація пристроїв, на які необхідно встановити ПО

Процедура пошуку пристроїв, на яких не встановлені необхідні програми або файли, буде відрізнятися в залежності від того, може чи Panda Systems Management виконати аудит програм, встановлених на пристрої, чи ні.

Якщо встановлюється ЗА з'являється в списку встановлених програм, яка зберігається в операційній системі, то це також буде відображатися у звітах Panda Systems Management аудиту. Таким чином, можна створити фільтр для фільтрації пристроїв, на яких вже встановлено це.

Якщо не має установки, а тому не показується в списку встановлених програм, або мова йде про окремий документ, конфігураційні файли та ін., то Panda Systems Management не зможе відфільтрувати пристрої, на яких вже є дані файли, а тому інсталяційний скрипт повинен буде здійснити відповідні перевірки.

Крок 2. Генерація компонента для установки

Для цього в цілому необхідно виконати наступні дії.
1. Запустити задачу по розповсюдженню компонента для установки на локальні агенти Panda Systems Management, встановлені на необхідних пристроях.

Ви можете запустити цю задачу за розкладом, налаштувавши її на певну дату і час, коли користувач не буде працювати на своєму пристрої, щоб звести до мінімуму вплив на продуктивність.

2. Зібрати дані з результатами установки, щоб перевірити наявність можливих помилок.

Після завершення процесу, система буде збирати можливі коди помилок та/або повідомлень, які будуть показувати в консолі керування результат установки.

У даній задачі може бути чотири фінальних статусу:
Success: Виконання завдання по установці було завершено без помилок. Скрипт повертає код Errorlevel 0.

Success — Warning: Виконання завдання по установці було завершено з деякими незначними помилками. Скрипт повертає код Errorlevel 0 і відповідне повідомлення, яке буде відображатися в консолі управління.

Error: Виконання завдання по установці не було завершено. Скрипт повертає код Errorlevel 1.

Error-Warning: Виконання завдання по установці не було завершено. Скрипт повертає код Errorlevel 1 і відповідне повідомлення, яке буде відображатися в консолі управління.

Приклади установки
Щоб продемонструвати можливості централізованої установки, нижче ми наведемо чотири приклади:

• Впровадження самоустанавливающегося
• Впровадження без інсталятора
• Впровадження документів і файлів з використанням мови скриптів
• Впровадження документів і файлів без використання мови скриптів

Процедури, описані в цій главі, а також використовуються сторонні утиліти і мови скриптів є лише прикладами, і вони можуть бути різні. Panda Systems Management є досить гнучким рішенням, і він може бути адаптований до тих інструментів, за допомогою яких адміністратор може почувати себе найбільш комфортно.

Приклад 1. Впровадження самоустанавливающегося

У даному прикладі ми спробуємо централізовано і дистанційно встановити пакет dotNetFx40_Full_x86_x64.exe для Microsoft Framework .NET 4.0 на пристрої, на яких він ще не встановлений.

В силу того, що Microsoft Framework .NET 4.0 – це програма, яка відображається у списку встановлених програм, яка зберігається в операційній системі пристрою, ми будемо використовувати фільтр для вибірки тих пристроїв, на яких цей пакет ще не встановлено.

Інсталяційний пакет являє собою саморозпаковується .EXE-файл, який допускає використання параметрів /q /norestart для установки в прихованому режимі і запобігання перезавантаження пристрою, а тому ніякої додаткової спеціальної підготовки нам не знадобиться.

Крок 1. Виберіть пристрій, на які необхідно встановити пакет

Щоб вибрати пристрій, на які потрібно встановити цей пакет, необхідно скористатися фільтром пристроїв. Для цього в консолі управління Panda Systems Management відкрийте потрібний сайт (проект) у розділі ", після чого в лівій колонці в блоці Sites Devices Filters натисніть на значок з плюсиком, щоб додати потрібний фільтр:



В результаті цього відкриється вікно для додавання фільтру пристроїв, в якому необхідно вказати назву фільтра, критерії відбору (Software package, Does not contain, Microsoft .NET Framework 4) і натиснути кнопку Save:



Тепер у блоці Sites Devices Filters додався налаштований фільтр, при натисканні на який, Ви зможете отримати список пристроїв, які задовольняють критеріям відбору.

До речі, іноді при вказівці назви пакета в критеріях фільтра, необхідно точно знати, яка ідентифікаційна рядок відповідає цьому пакету (особливо у випадку з яким-небудь специфічним ПО). В цьому випадку необхідно буде в списку пристроїв знайти пристрій (можна також використовуючи різні фільтри), на якому цей пакет вже встановлено, відкрити цей пристрій зі списку, вибрати закладку Audit і включити опцію Software.



Крок 2. Створіть компонент для установки

Це можна зробити досить легко: в консолі управління в основному меню виберіть розділ Components, натисніть кнопку New component. В результаті цього відкриється вікно для додавання компонента. У списку Category необхідно вибрати Applications. Вкажіть ім'я компонента і його короткий опис (при необхідності) і натисніть кнопку Save.



Після цього Ви відразу побачите вікно з редагуванням параметрів даного компонента. У цьому вікні необхідно виконати наступні зміни:

• У лівому верхньому куті можна натиснути на зірочку, щоб додати цей компонент в обране. У цьому випадку іконка зірочки стане жовтою, а сам компонент з'явиться в списку компонентів.
• Вкажіть використовуваний мова скриптів, вибравши відповідне значення у списку Install command. У даному випадку варто значення Batch.
• Вставте код скрипта.
• Додайте файл з пакетом, який потрібно встановити.



В даному скрипті по суті справи один рядок, в якій запускається інсталяційний пакет з відповідними параметрами для прихованої установки.

Крок 3. Запустіть завдання для розгортання пакета агентів необхідних пристроїв

У цьому випадку Вам необхідно буде знову відкрити свій сайт (проект), в лівій колонці в блоці Sites Devices Filters натиснути на створений раніше фільтр, щоб отримати список необхідних пристроїв, куди необхідно встановити пакет. Потім у цьому списку виберіть необхідні пристрої (а швидше за все, всі пристрої) і панелі дій натисніть на кнопку для швидкого запуску завдання (при необхідності можна запланувати виконання даної задачі на певний час, натиснувши на кнопку, розташовану ліворуч від даної кнопки).



В результаті цього відкриється вікно, в якому Вам необхідно вибрати потрібний компонент і натиснути кнопку OK.



Крок 4. Перевірте результати для виявлення можливих проблем

Перевірити результат можна в розділі Scheduled Jobs -> Completed Jobs.
Також хороший спосіб перевірити результати установки – це знову запустити попередньо налаштований фільтр пристроїв, щоб переконатися в тому, що більше не залишилося ні одного пристрою з невстановленим. У тому ж випадку, якщо якісь пристрої виявляться в даному списку пристроїв, то за них можна буде перевірити наявність помилки.

Дані аудиту, встановленого на пристроях, синхронізуються з консоллю керування кожні 24 години, тому, якщо з моменту встановлення ПО ще не пройшли добу, то список встановленого на закладці Audit не буде оновлено. Однак можна вручну оновити список встановленого ПЗ, використовуючи кнопку Request device audit в панелі дій.



Приклад 2. Впровадження без інсталятора

Багато програми містять простий виконуваний файл без відповідного інсталятора, який генерує необхідну структуру в меню Пуск, іконки на робочому столі або відповідні записи у списку інстальованих на комп'ютері програм (наприклад, в Панелі управління Програми та компоненти). Такі типи програм можуть бути встановлені, наприклад, просто запуском цього виконуваного файлу. Однак, в такому випадку Panda Systems Management не зможе надавати коректний аудит встановленого на ПК програм, т. к. такі програми не будуть з'являтися в списку встановлених програм, яка зберігається в операційній системі пристрою.

З цієї причини часто використовуються сторонні утиліти, які дозволяють генерувати MSI пакет з усіма додаються програмами, створюючи всі необхідні групи в меню Пуск, а також іконки на робочому столі користувача для спрощення доступу до програми.

У нашому прикладі ми будемо використовувати утиліту Advanced Installer, безкоштовна версія дозволяє нам легко генерувати MSI-інсталяторів.

Щоб завантажити безкоштовну версію Advanced Installer, відвідайте сторінку

Щоб створити інсталятор, виконайте наступні дії:

1. Встановіть цю утиліту на свій ПК, запустіть її і виберіть безкоштовний шаблон Simple



2. У розділі Product Details введіть основні дані інсталятора: Product Name (назва продукту), Product Version (версія продукту) і Company Name (назва компанії)



3. Додайте програми та файли, які необхідно встановити, а також іконки, які необхідно створити. Це можна зробити на закладці Files and Folders.





4. На завершення цього процесу, натисніть Build, після чого в обрану папку буде згенерований MS-пакет:



Після того як інсталяційний пакет буде згенеровано, необхідно виконати ті ж самі кроки по створенню компонента для установки і розгортання, як це було описано в прикладі вище (Впровадження самоустанавливающегося ПО), за винятком скрипта Batch, оскільки в даному випадку команда для установки буде трохи відрізнятися.



Утиліта MSIEXEC дозволяє використовувати параметр /qn для запуску прихованої установки.
При створенні компонента (дивіться порядок створення в попередньому прикладі) у списку Category необхідно вибратиApplications. У вікні редагування компонента виконайте наступні дії:

• У лівому верхньому куті натисніть на зірочку, щоб додати цей компонент в обране. У цьому випадку іконка зірочки стане жовтою, а сам компонент з'явиться в списку компонентів.
• Вкажіть використовуваний мова скриптів, вибравши відповідне значення у списку Install command. У даному випадку варто значення Batch.
• Вставте код скрипта із зазначенням на утиліту MSIEXEC, запускає згенерований MSI пакет (у нашому прикладі – це файл My Software.msi)
• Додайте файл з пакетом My Software.msi, який потрібно встановити.

Приклад 3. Впровадження документів і файлів з використанням мови скриптів

У цьому прикладі нам необхідно впровадити три документа Word в папки, розташованої в кореневій директорії пристрої користувача. Повний код скрипта можна подивитися в файл. Отже, для вирішення поставленого завдання необхідно виконати наступні дії:

Крок 1. Виберіть пристрій, на які необхідно встановити пакет

Оскільки в цьому прикладі Panda Systems Management не може відслідковувати стан жорсткого диска на пристрої користувача на рівні системних файлів, то інсталяційний скрипт буде розгортатися на всіх пристроях сайту, при цьому скрипт (рядки 19-24) буде перевіряти, чи існує папка, що містять документи, чи ні.


Якщо папка не існує, то вона буде створена (рядок 28), після чого документи будуть переміщені в неї (рядки 30-32), а повідомлення буде відправлено через стандартний «вихід» (рядок 37).



Крок 2. Створіть компонент для установки

Як завжди, на цьому кроці необхідно створити компонент додатків, для якого необхідно вказати скрипт і прив'язати ці три документа Word.



У блоці Post-Conditions Ви можете вказати текстові рядки, які консоль управління буде інтерпретувати як попередження:



Приклад показує, що якщо стандартний вихід (Resource: stdout) містить (Qualifier: is found in), то результат виконання скрипта Deploy unsuccessful буде відображатися як попередження.

Крок 3. Запустіть завдання для розгортання пакета агентів необхідних пристроїв

В консолі керування необхідного сайту (проекту) виберіть у списку пристроїв ті пристрої, на які необхідно впровадити ці три документа Word, після чого на панелі дій натисніть на іконку Quick job або Job, щоб створити відповідну задачу.



Якщо необхідно впровадити документи на всіх комп'ютерах у різних сайтах (проектах), то Ви можете вибрати ці сайти на рівні Вашого аккаунта в консолі управління Panda Systems Management.

Крок 4. Перевірте результати для виявлення можливих проблем

У нашому прикладі у скрипта визначено три вихідних умови:

Success: Файли копіюються у потрібну папку без будь-яких помилок (рядки 30-32). Закінчується з ErrorLevel0 (рядок 38).



Error: При копіюванні файлів виникає помилка. Закінчується з ErrorLevel1 (рядок 35).

Success — Warning: Папка вже існує, тому файли скопійовані. Закінчується з ErrorLevel0 (рядок 23) і генерується рядокDeploy unsuccessful, яку консоль управління інтерпретує як попередження, що було налагоджене в блоці Post-Conditions на кроці 3.



Після того як завдання запущена, вона з'явиться в розділі Scheduled Jobs -> Active Jobs.


На закладці Completed Jobs Ви зможете побачити результат виконання завдання, який буде позначено червоним кольором, якщо результат містить помилку, помаранчевий – якщо є попередження, або зелений – якщо завдання успішно виконано.



Іконки Stdout та Stderror показують копію стандартного виходу і стандартної помилки, що генеруються скриптом.

Крім цього, дана закладка містить панель іконок, яка дозволяє запускати різні дії:

• Набір іконок Actions групує іконки, які дозволяють Вам повторно запустити задачу, перезавантажте сторінку, щоб оновити статус завдань, або завантажити стандартний вихід або помилку в файл

• Фільтр Views дозволяє фільтрувати завдання за статусом

Приклад 4. Впровадження документів і файлів без використання мови скриптів

Інсталяційний скрипт можна значно спростити, якщо не потрібні попередні перевірки або якщо не потрібно генерувати попередження в консолі управління.

У даному прикладі потрібно впровадити 3 документи, які використовувалися у попередньому прикладі, але в цьому прикладі, замість створення структури папки з самого скрипта, створений саморозпаковується EXE-пакет, який містить архівні документи та необхідну структуру папок. Даний EXE-пакет може бути створений з використанням різних утиліт, наприклад, WinRar.

Щоб завантажити безкоштовну версію WinRar, перейдіть до сайт

У цьому прикладі було створено саморозпаковується EXE-файл з наступними характеристиками:

• Працює в прихованому режимі (Silent).
• Необхідна папка з контентом автоматично створюється в C:\.
• Якщо папка вже існує, її вміст буде перезаписаний без попередження.

Важливо створити саморозпаковується файл, який працює в прихованому режимі, тобто він не буде показувати діалогових вікон і не потребує втручання з боку користувача.

На всякий випадок давайте розглянемо кроки щодо створення саморозпаковується інсталяційного файлу з допомогою WinRar.

Крок 1: Підготуйте папку з документами, які необхідно впровадити.

Створіть кореневу папку ACME Documents, в яку покладіть всі файли, папки і підпапки, які необхідно впровадити.

Крок 2: Згенеруйте виконуваний файл.

У програмі WinRar при створенні архіву ACME Documents на закладці Загальне увімкніть опції Створити SFX-архів та Створити безперервний архів.


Тепер необхідно налаштувати архів в прихованому режимі. Для цього перейдіть на закладку Додатково і натисніть кнопку Параметри SFX



У вікніДодаткові параметри SFX виберіть закладку Режими і в блоціРежим виводу інформації виберіть опцію Приховати всі.



В цьому ж вікні виберіть закладку Загальне і вкажіть шлях для розпакування, де повинна бути створена папка.



І ще виберіть закладку Оновлення, в якій необхідно вказати, що всі файли, якщо вони вже існують на ПК, буде замінено без додаткових запитів до користувача.



Після цього натисніть кнопку OK. В результаті цього буде створено EXE-пакет (ACME Documents.exe) з необхідними параметрами.

Після генерації пакета необхідно виконати вже всі стандартні кроки щодо вибору пристроїв, створення компонента, запуску завдання та перевірки результатів її виконання.

Зверніть увагу на параметри, які необхідно використовувати при створенні компонента:



При створенні компонента (дивіться порядок створення в попередніх прикладах) у списку Category необхідно вибратиApplications. У вікні редагування компонента виконайте наступні дії:

• У лівому верхньому куті натисніть на зірочку, щоб додати цей компонент в обране. У цьому випадку іконка зірочки стане жовтою, а сам компонент з'явиться в списку компонентів.

• Вкажіть використовуваний мова скриптів, вибравши відповідне значення у списку Install command. У даному випадку варто значення Batch.

• Вставте код скрипта

• Додайте файл з пакетом ACME Documents.exe, який потрібно впровадити.

В результаті цього скрипт буде запускати саморозпаковується архів, який буде створювати папку в корені диска C з усією внутрішньою структурою, перезаписуючи будь-який існуючий контент, якщо така папка уже є.

Оптимізація смуги пропускання каналу зв'язку
Локальний агент, встановлений на кожному пристрої, перевіряє сервер Panda Systems Management на доступні завантаження і оновлення кожні 60 секунд. У тому випадку, якщо для локального агента є, що скачати або завантажити, то Panda Systems Management запускає цю завантаження індивідуально для кожного агента. В такому випадку, якщо інсталяційний пакет має розмір 50 МБ, а мережа складається з 50 пристроїв, то сумарний трафік при скачуванні складе 2,5 ГБ.



Щоб знизити сумарний розмір трафіку, одне з мережевих пристроїв може виконувати роль сховища/кеша. У цьому випадку тільки даний пристрій буде завантажувати пакет з Сервера, а потім вже поширювати його на всі необхідні мережеві пристрої.



Щоб вибраного пристрою призначити роль репозиторію/кеша, Вам необхідно знайти цей пристрій в консолі управління Panda Systems Management і на сторінці з детальною інформацією з даного пристрою в панелі дій натиснути на іконку Add/Remove as local cache.



В результаті, вибраний пристрій буде завантажувати і поширювати компоненти і настановні пакети на пристрої в локальній мережі, що дозволить значно прискорити процес віддаленої установки і істотно знизити навантаження на смугу пропускання каналу зв'язку.

Віддалена установка на пристрої iOS
Хмарний RMM-сервіс Panda Systems Management дозволяє віддалено і централізовано встановлювати необхідне на мобільні пристрої (планшети і смартфони під управлінням iOS. В цьому випадку процедура установки відрізняється від вищеописаної процедури, т. к. дані пристрої мають певні обмеження, пов'язані з джерелом завантаження встановлюється З (Apple Store).

Віддалена установка на пристроях з Android поки не підтримується.

Вимоги для установки додатків на пристрої з iOS

Щоб мати можливість завантажувати додатки на пристрої з iOS, Вам спочатку необхідно завантажити з ComStore компонент Mobile Device Management.



При цьому не забудьте, що Вам необхідно буде завантажити Ваш сертифікат Apple Push Notification. Як це зробити – ми писали в попередній статті з управління мобільними пристроями.

Після цього Ви зможете додати необхідні для впровадження програми в списку додатків Application List. Для цього в основному меню консолі керування виберіть розділ ComStore і в лівій колонці вікна в блоці App Store натисніть на іконку з плюсом для доступу до вікна вибору додатків.



У вікні, Вам необхідно вказати країну користувача та ввести назву програми в текстовому полі. Натисніть кнопку Search для пошуку додатків із зазначенням його назви, загального опису і вартості.



У необхідних додатків натисніть кнопку Add, щоб додати їх у список додатків Application List.



Після цього вибрані компоненти з'являться в списку компонентів мобільних додатків в розділі основного меню Components:



Установка додатків iOS зі списку додатків
Після того як Ви додали необхідні додатки до списку додатків, Вам необхідно буде створити політику управління для впровадження їх на пристрої з iOS. Для цього в консолі керування, відкрийте сайт (проект), профіль або весь обліковий запис повністю, натисніть на закладку Manage, виберіть опцію Software Management і натисніть кнопку New site policy… (або відповідну кнопку, якщо обраний цілком аккаунт або профіль).



У вікні вкажіть назву політики і натисніть кнопку Next.



Потім у вікні редагування політики виберіть пристрої, до яких необхідно застосувати дану політику, натиснувши на кнопку Add a target..., а також виберіть програми, які необхідно встановити, натиснувши на кнопку Add an app



Після того як Ви додали програми, і в тому випадку, якщо які-небудь з них є платними, натисніть на іконку з жовтим олівцем у даного додатка, щоб ввести відповіднийRedemption code.



Після закінчення редагування політики натисніть кнопкуSave. Після цього ця політика буде відображатися в списку політик. Натисніть у неї кнопку Push changes, щоб відправити налаштовані програми на вибрані в політиці пристрою.



У тому випадку, якщо пристрій з iOS вимкнено у той момент, коли Ви натиснули кнопку Push changes, то такий пристрій з'явиться в блоці Non-Compliant Devices. Щоб ці зміни автоматично застосувались після того, як такий пристрій знову стане доступним, натисніть зелену кнопку зі стрілкою.

Висновок
У даній статті ми розглянули 4 стандартні ситуації віддаленої і централізованої установки (пакетів, файлів) на необхідних пристроях Windows, Linux, Mac, а також розповіли про те, як можна віддалено і централізовано встановлювати програми на мобільні пристрої з iOS. Для вирішення даних завдань ми використовували хмарний RMM-сервіс Panda Systems Management.

Причому ми розглянули досить прості випадки. Очевидно, що сценарії можуть бути значно складніше. Наприклад, установка необхідного образу на нові пристрої, планова перевстановлення ПЗ при зміні операційної системи, або якісь інші умови, які можуть як тригери запускати відповідні завдання на віддалену і централізовану установку.

Як бачите, чим більше в ІТ-мережі комп'ютерів і пристроїв, тим більше буде незамінним інструментом такої віддаленої і централізованої установки. Він дозволяє автоматизувати дану задачу і значно заощадити час ІТ-спеціаліста на впровадження.

Сучасні RMM-рішення є ефективними інструментами для вирішення подібних завдань. І, до речі, ще дуже багатьох інших :)

Досягайте більшого, роблячи менше!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.