Оригинал доступен по ссылке kermitproject.org

Компактний, швидкий, надійний, портативний протокол передачі файлів

Версія: 1.7
Дата: 6 червня 2011 року

Оголошення з відкритим вихідним кодом: з 30 березня 2011 року з версією 1.6, E-Kermit випускається «як є» згідно з переглянутою BSD ліцензією 3-Clause.

Зміст

  1. КОНТРОЛЬНА ПРОГРАМА
  2. ПЕРЕДАЧА ФАЙЛІВ
  3. ПОЧАТКОВИЙ КОД
  4. ВЕРСІЯ UNIX
  5. ПОРТІНГ НА НОВУ ПЛАТФОРМУ
  6. НАЛАГОДЖЕННЯ ПРОГРАМ
  7. ІСТОРІЯ РЕЛІЗІВ
  8. СКАЧАТИ

EK (Embedded Kermit, E-Kermit) — це реалізація протоколу передачі файлів Kermit, що написана на ANSI C і призначена для вбудовування в пристрої або прошивки, використання в додатках реального часу чи для побудови DLL і бібліотек. EKSW — це нова версія E-Kermit, яка передбачає відправку пакетів за допомогою ковзного вікна. EK і EKSW повинні бути зведені знов у єдину базу коду, але поки що цього не відбулося.

Що робить E-Kermit

EK виконує лише дві функції: відправлення файлів і отримання файлів. Він компактний, портативна і повністю повторовхідною. На SPARC (RISC) kermit.o становить близько 25K. На Intel (CISC) це близько 15K. За рахунок зменшення розмірів буфера і виключення додаткових або небажаних функцій можна досягти менших розмірів.

Що E-Kermit НЕ робить

EK не має функції клієнт/сервер, мови програмування команд або скриптів; конверсії символів; транспортного шифрування або будь-якої форми зв’язку чи введення/виводу файлів. Він не набирає модеми, не створює з’єднання, не має вбудованого стека TCP/IP або інтерфейсу до зовнішнього стека. Якщо вам потрібні ці функції, тоді вам слід скористатися повною програмою Kermit, такою як  C-Kermit чи  Kermit 95.

EK не є програмою як такою; він є підпрограмою, яку потрібно викликати з головної програми. Він корисний тільки для розробників, які повинні надати головний додаток або середовище, яке викликає, а також файли і обмін даними підпрограми для вводу/виводу. Середовище, яке викликає, повинно, у свою чергу, створювати та конфігурувати комунікаційне з’єднання, якщо те є необхідним і ще не відкрите. Для Unix передбачено семпл середовищ, що викликає, та підтримку вводу-виводу.

Клієнти адаптували ЕК до різних середовищ і платформ, включно з Palm Pilot, різними видами технічного обладнання (наприклад, для діагностики та обслуговування веж стільникових телефонів), а іноді вони сприяють їх адаптації або процедурам вводу / виводу, і ми можемо зробити їх доступними на основі “як є”. Ми не можемо підтримувати чи зберігати код, наданий клієнтом; таким чином (наприклад), якщо випущено нову версію EK, то модулі, надані клієнтом, не обов’язково оновлюються. Клієнтський код має:

  • послідовний порт Microsoft Windows 9x / ME / NT / 2000 / XP / Vista / 7 і файл вводу/виводу для EK 1.3 і пізніших версій.
  • Wind River VxWorks для EK 1.1.
  • EK 1.2 перекладений на Java.

EK має наступні функції протоколу Kermit:

  • Довгі пакети
  • Ковзні вікна з відновленням помилок Go-Back-to-N (істинний селективний повтор у EKSW).
  • Стиснення повторів
  • Додавання та забирання префіксу в керівних символах
  • 8-бітне додавання префіксу (для передачі 8-бітових даних по 7-бітовим посиланням) (= паритет)
  • Пакети атрибутів (тип, розмір і дата)
  • Надсилання та отримання одного або декількох файлів.
  • Автоматичне перемикання в режим тексту/двійкового коду.
  • Всі три типи перевірки блоків (6- і 12-бітна контрольна сума, 16-бітова CRC).
  • Звіти про стан (стан протоколу, ім’я файлу, розмір, відмітка часу, байти аж до поточного моменту).
  • Скасування передачі будь-якою із сторін.

Наступні функції протоколу Kermit не реалізовані:

  • Ковзні вікна з вибірковою ретрансмісією (за винятком EKSW)
  • Набори символів
  • Блокування змін
  • Клієнт/сервер

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

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

КОНТОРОЛЬНА ПРОГРАМА

EK розроблений для роботи в кооперативному багатозадачному середовищі, проте не вимагає такого середовища. Контрольна програма займається плануванням. Ось що повинна (і/бо може) робити контрольна програма:

  • Якщо це бажано, відкрити комунікаційний пристрій, якщо такий є.
  • Якщо це бажано, помістити комунікаційний пристрій, якщо такий є, в «пакетний режим».
  • Ініціалізувати структуру kermit з бажаними робочими параметрами.
  • Викликати kermit (K_INIT, …), щоб Kermit ініціалізувався сам.
  • При надсиланні файлів, викликати kermit (K_SEND), щоб розпочати трансфер.

(Коли E-Kermit займається прийомом файлів, він пасивно чекає на перший пакет від відправника файлів; таким чином, він просто входить у цикл пакета). У циклі пакетів E-Kermit:

  • Отримує буфер і зчитує в нього вхідний пакет.
  • Перевіряє переривання користувача.
  • Виклики kermit (K_RUN, …) для виконання наступного кроку в протоколі.
  • Здійснює будь-що інше (наприклад, виконує інші завдання).
  • Виходить або продовжує цикл на основі коду повернення kermit ().

Кожен раз, коли програма керування викликає функцію kermit (), вона надає їй дозвіл на обробку одного пакета; таким чином, один пакет = один часовий інтервал. Якщо програма управління не має що робити, вона просто безперервно обробляє пакети, як і звичайна програма Kermit. У циклі передачі даних кожен виклик kermit () повертає структуру, що містить:

  • Стан поточного протоколу;
  • Поточне ім’я файлу;
  • Розмір файлу, якщо він відомий, або -1;
  • Мітка часу файлу, якщо відома;
  • Кількість переданих байтів.

Після завершення програми керування:

  • Відновлює і (за бажанням) закриває пристрій зв’язку.

Коди функцій, які контрольна програма може викликати з kermit () це:

K_INIT — ініціалізація структури даних.
K_SEND — (лише надсилання) — ініціювання надсилання.
K_RUN — Запуск протоколу.
K_STATUS — повертає звіт про стан у структурі k_response.
K_QUIT — Вихід негайний і мовчки.
K_ERROR — Відправлення пакету помилок, а після — вихід.

Коди повернення функції kermit () це:

X_OK — ОК, активний протокол.
X_DONE — ОК, протокол завершено.
X_ERROR — Фатальна помилка.
X_STATUS — Повернення статусу у відповідь на K_STATUS.

(По факту, статус повертається при кожному виклику). Коди станів протоколу:

-1 — Фатальна помилка
0 — приймач (протокол не виконується)
1 — приймач очікує на пакет S
2 — приймач очікує на F або B пакет
3 — приймач очікує на A або D пакет
4 — приймач очікує на D або Z пакет
10 — Відправник (протокол не виконується)
11 — Відправник надіслав пакет S (початок)
12 — Відправник надіслав пакет F (ім’я файлу)
13 — Відправник надіслав пакет A (атрибути)
14 — Відправник надіслав пакет D (дані)
15 — Відправник надіслав пакет Z (EOF)
16 — Відправник надіслав пакет B (EOT)

ПЕРЕДАЧА ФАЙЛІВ

Оскільки ЕК призначений головним чином для вбудовування, він не використовує потокові або (крім EKSW) вірні ковзні вікна (хоча більша частина коду для ковзних вікон наявна). Так сталося з наступних причин:

  • Використання регулярного протоколу ACK / NAK дозволяє програмі керування відновити контроль за кожним пакетом. Це дозволяє йому виконувати багатозадачність, виставляти графічний дисплей для передачі файлів, тощо. Потокові або справжні ковзні вікна можуть вивести програму керування з ладу на тривалий час.
  • Потокові або справжні ковзні вікна набагато ускладнюють інтерфейс між програмою керування та модулем kermit (), і, насправді, підштовхнуть багато деталей протоколу до простору контрольної програми, куди вони не належать.
  • Потокове передача може використовуватися тільки на надійних з’єднаннях (наприклад, TCP/IP), але пристрої з вбудованими комунікаціями зазвичай використовують послідовні порти.

Відсутність справжніх ковзних вікон в ЕК компенсується тим, що ЕК прикидається, що підтримує їх, не роблячи цього. Це дозволяє своєму партнеру, що відправляє, «передавати» пакети, а не чекати ACK після кожного, якщо не існує помилки. Якщо є помилка, то стратегія відновлення «повертається до n» (або, можливо, в деяких випадках «помилка»), а не «вибіркове повторення». EKSW, окрема програма, яка не була інтегрована з EK (але повинна бути), підтримує справжні ковзні вікна з селективним повтором; тобто тільки ті пакети повторно передаються, що насправді необхідно.

У будь-якому випадку, оскільки ЕК призначена в першу чергу для вбудовування, передбачається, що затримки в обидва кінці не будуть великим фактором; з’єднання, як правило, будуть локальними, короткими, відносно швидкими, і якщо зв’язок ефективно управляється потоком, без помилок. Коли ефективного управління потоком бракує, швидкість і/або довжина пакета і / або розмір вікна можуть бути встановлені в комбінації значень, що максимізує пропускну здатність і мінімізує втрату даних.

ПОЧАТКОВИЙ КОД

Початковими файлами є:

platform.h

Файл заголовка для будь-якої необхідної специфічної для платформи #includes або definitions. Обов’язковий, навіть якщо він порожній, оскільки kermit.c включає його.

kermit.h

Файл заголовка для всіх модулів. Визначення структур k_data і k_response.

kermit.c

Це двигун протоколу Kermit. Він керується виключно її даними викликів. Вся інформація про стан зберігається в структурі даних kermit, яка передається за допомогою посилання з основного модуля і серед усіх функцій модуля kermit і назад до основного модуля; таким чином має бути можливим для одного і того ж модуля одночасно передати декілька файлів на різні з’єднання. Крім того, у модулі kermit немає посилань на бібліотеку, взагалі жодних, навіть stdio (за винятком випадків, коли активовано налагодження), а файли заголовків /usr/include/* не включені. Правила для kermit.c:

  • Немає глобальних змінних (за винятком налагодження) або буферів.
  • Немає ініціалізації масивів компілятором.
  • Тільки для безпеки, жодної ініціалізації автоматичних скалярів теж.
  • Немає бібліотечних або системних викликів, немає #include <…>.
  • Всі комунікації вводу/виводу здійснюються за допомогою функцій, визначених в окремих модулях.

Однією точкою входу для модуля kermit.c є функція kermit ():

int kermit(struct k_data * k, struct k_response * r)

K-структура має  всі робочі параметри, змінні, інформацію про стан і буфери; r struct інформує абонента про поточний стан протоколу, ім’я файлу та інформацію про файл, а також про перенесення (байти досі).

main.c

Контрольна програма зразка. У тест-середовищі Unix це лише традиційний main (), який читає аргументи командного рядка, ініціалізує протокол, потім викликає модуль протоколу у цикл, що керується станом, доки його робота не буде виконана, а потім очищається. У вбудованому середовищі ці функції будуть інтегровані в програму керування.

unixio.c

Функції введення / виводу для Unix. Замініть власний модуль, який реалізує ці функції в цільовому середовищі, і змініть процедуру збирання, щоб зв’язатись з ним. Точки входу і конвенції викликів описані нижче.

ВЕРСІЯ UNIX

Розробка EK відбувається на звичайній платформі Unix, такий як Solaris, HP-UX або Linux, в якій EK побудований як програма Kermit для передачі файлів з віддаленим режимом, подібна до G-Kermit, і протестована на настільному Kermit як K95 або C-Kermit. ПРИМІТКА: Версія Unix працює над stdin / stdout; «лінія» обумовлена ​​найпотужнішим способом (система («stty …»)). Це дає змінні результати; напр. завантаження з EK на Solaris може працювати на рівні 17Kcps, тоді як завантаження з Linux на тій же самій мережі може працювати на рівні 1700Kcps. Це не варто турбувати, оскільки ЕК не призначений для виробництва продукції на Unix, яка вже має G-Kermit і C-Kermit для виробництва.

Файл make-файлу Unix має такі цілі (можна легко додати більше):

gcc: збірка з gcc (за замовчуванням).
cc: збірка за допомогою cc.
hp: збірка для HP-UX.
gccnd: збірка з gcc, без налагодження.
gprof: збірка з gcc, включаючи профілювання.
clean: видалення файлів об’єктів і ядра.

Файл make-файлу створює виконуваний файл Unix з назвою «ek» (вбудований kermit). Підпрограма main () надає простий інтерфейс командного рядка:

$ ./ek -h
Usage: ./ek options
Options:

-r           Receive files
-s files     Send files
-p [neoms]   Parity: none, even, odd, mark, space
-b [123]     Block check type: 1, 2, or 3 (default = 3)
-k           Keep incompletely received files
-B           Force binary mode
-T           Force text mode
-R           Remote mode (vs local)
-L           Local mode (vs remote)
-E number    Simulated error rate (0-100)
-d           Create debug.log
-h           Help (this message)
$

Якщо при відправці файлів ви не вкажете текст або двійковий файл, то EK просканує кожен файл і обере текст або бінарний режим на основі його вмісту.

Режим Remote vs Local використовується лише для включення тесту на переривання передачі файлів з клавіатури.

ПОРТІНГ НА НОВУ ПЛАТФОРМУ

Версія 1.0 ЕК була перенесена в VxWorks компанією Airvana, Inc, Chelmsford MA. Повноцінний пакет VxWorks EK 1.1 наявний як приклад виробничої системи з дозволу Airvana (зауважте, що з того часу API EK трохи змінився, тому, перш ніж використовувати код VxWorks, він повинен бути оновлений). Щоб перейти до нової платформи:

  • Додайте новий запис Makefile для вашої цілі або напишіть власну процедуру налагодження.
  • Створіть файл platform.h для вашої платформи. Він може містити будь-які бажані #включення або визначення, а також може використовуватися для перевизначення певних визначень у kermit.h:

#define NODEBUG для створення без коду налагодження.
#define HAVE_UCHAR, якщо UCHAR вже визначено або задіяно typedef до unsigned char.
#define HAVE_ULONG, якщо ULONG вже визначено або задіяно typedef до unsigned long.
#define IBUFLEN — щоб мати бажаний розмір для буфера введення файлу.
#define OBUFLEN — щоб мати бажаний розмір для буфера виведення файлів.
#define FN_MAX для максимальної довжини імені файлу.
#define P_PKTLEN для перевизначення максимальної довжини пакета за замовчуванням.
#define P_WSLOTS для перевизначення максимальних слотів вікна за умовчанням.

  • Замініть зразок main.c власною програмою керування. Використовуйте ті ж самі файли заголовків і конвенції викликів, що й у зразку.
  • Скопіюйте файл unixio.c до xxxio.c (ім’я на ваш вибір), відредагуйте його, щоб працювати на своїй платформі, використовуючи ті самі умови, і налаштуйте процедуру збирання, щоб прив’язати новий модуль xxxio замість unixio. Зауважте, що в буфері xxxio повинні бути визначені вхідні та вихідні буфери (i_buf [] і o_buf []).

Нижче наведено кілька порад щодо створення модуля вводу/виводу:

Процедури вводу-виводу пристроїв повинні обробляти самі параметри зв’язку, включаючи швидкість лінії зв’язку, парність і керування потоком. Зокрема, Kermit не перевіряє паритет, але все ж треба розповісти про це. Це робиться в налаштуваннях за допомогою main (). Підпрограми readpkt () і tx_data () повинні при необхідності скинути і додати паритет відповідно На послідовних з’єднаннях на це, вірогідно, може бути запрограмований UART.

Зміна API між EK 1.1 і 1.2: Умови викликів (списки аргументів функцій і повернені значення) були змінені між версіями 1.1 на 1.2, головним чином, щоб дати всім підпрограмам доступ до структури k послідовним чином, а також забезпечити кращу зворотний зв’язок з абонентом . У кожному випадку, коли було внесено зміни, відображаються як старий, так і новий формат.

Функції вводу/виводу пристрою:

int
devopen(char * device)

Відкриває даний пристрій зв’язку. Також може бути мережевий хост, як би там не було. Повертає 0 при помилці, 1 при успіху.

int
devsettings(char * settings)

Цей параметр виконує будь-які необхідні налаштування пристрою, такі як керування швидкістю і потоком для послідовного пристрою. Оскільки не існує способу дізнатися, що таке відповідні параметри, ця процедура просто приймає рядок, який може бути в будь-якому форматі, наприклад, «9600; 8N1» або «швидкість = 57600; потік = rts / cts»; Підпрограма devsettings буде розбирати рядок. Повертає 0 при помилці, 1 при успіху.

int
devrestore(void)

Якщо потрібно, поверніть пристрій назад, як це було знайдено devsettings(), наприклад, перед закриттям.

int
devclose(void)

Закриває пристрій зв’язку.

int
readpkt(UCHAR * buffer, struct k_data * k) (1.1)
readpkt(struct k_data * k, UCHAR * buffer, int length) (1.2)

Ця процедура повинна робити саме те, що робить зразок: шукати початок пакета, потім копіювати всі символи до (але не включаючи) кінець пакета в буфер пакетів, адреса якого вказана. Ви захочете кодувати це якомога ефективніше, використовуючи будь-які доступні вам трюки: неблокуючие буферизоване читання, і т.д. Якщо ви хочете, щоб ваша програма Kermit закінчилася, то саме тут ви б поклали код. ПРИМІТКА: Тайм-аути не потрібні, оскільки шанси, що партнер Kermit не може закінчитися, дорівнює 0. Формат EK 1.2 ставить k як перший аргумент для узгодженості з іншими процедурами, і додає аргумент довжини буфера.

Зверніть увагу на функцію F_CTRLC. Цей параметр увімкнено за умовчанням. Це дозволяє вимикати EK з пакетного режиму, посилаючи йому три послідовні Ctrl-C в потік даних. Як правило, вам не потрібно буде вимикати цю функцію, оскільки, навіть якщо відправник «не фіксує» Ctrl-C, три з них зазвичай будуть згорнуті в послідовність повторного підрахунку.

int
tx_data(UCHAR * data, int length, short parity) (1.1)
tx_data(struct k_data * k, UCHAR * data, int length) (1.2)

Знову ж таки, ви повинні зачекати на паритет (якщо це не робиться автоматично пристроєм зв’язку або драйвером). Ця процедура повинна бути ефективною та надійною. Передбачається, що він передає весь рядок даних, або ж провалиться. Див. Зразок unixio.c для того, що я маю на увазі під «надійним». У EK 1.2 і пізніших значеннях параметр парності підбирається з k-структури.

Файлові функції вводу/виводу виконуються наступним чином; звичайно, вони можуть бути використані для читання чи запису будь-яких — не тільки файлів: пам’яті, касети, карт, лазерних променів, контролерів приладів, що завгодно. Не має значення, що ви називаєте цими процедурами, але список аргументів і тип повернення повинні бути, як показано; також якщо ви даєте їм різні назви, вам доведеться змінити прототипи в kermit.h:

int
openfile(UCHAR * filename, int mode, struct k_date * k) (1.1)
openfile(struct k_date * k, UCHAR * filename, int mode) (1.2)

Відкриває ім’я файлу в даному режимі (1 = читання, 2 = запис, 3 = додавання). Повертає X_OK на успіх, X_ERROR на помилку.

ULONG
fileinfo(UCHAR * filename, UCHAR * buf, int buflen, short * type, short mode)(1.1)
fileinfo(struct k_data * k,UCHAR * filename,UCHAR * buf,int buflen,short * type,short mode) (1.2)

Отримує інформацію про вказаний існуючий локальний файл: розмір, дата і, якщо режим == 0, тип файлу (текстовий або двійковий). buf і buflen застосовуються до строки дати / часу файлу. Повертає X_OK або X_ERROR.

int
readfile(struct k_data *)

Зчитує буфер з вхідного файлу, і якщо передача знаходиться в текстовому режимі, перетворює формат запису на стандартний Kermit Stream CRLF. Повертає X_OK або X_ERROR.

int
writefile(struct k_data *, CHAR * buffer, int length)

Записує буфер у вихідний файл, і якщо передача відбувається в текстовому режимі, також перетворює стандартний формат запису CRLF Kermit Stream до того, що потрібно локально. Повертає X_OK або X_ERROR.

int
closefile(struct k_data *, UCHAR code, int mode)

Закриває файл. Для вихідних файлів, звичайно, це змиває всі очікувані буфери до файлу перед його закриттям; Потім він перевіряє, чи відправляє Kermit скасував передачу файлу до його закінчення (код == ‘D’), у цьому випадку він відкидає частковий файл, а не зберігає його. Режим вказує, чи є він вхідним або вихідним файлом, тому отримані файли, що не потрібні, можуть бути видалені за бажанням. Повертає X_OK або X_ERROR.

Точні конвенції викликів відображаються у файлі unixio.c.

НАЛАГОДЖЕННЯ ПРОГРАМ

Якщо EK було побудовано без NODEBUG, то, коли ви задієте параметр -d у командному рядку, пробна версія на основі Unix створює файл debug.log у своєму поточному каталозі. У повній версії вам слід додати -DNODEBUG до компілятора C CFLAGS, щоб усунути код налагодження. Розміри, вказані вище, задіюють налагодження. Ви можете реалізувати функцію налагодження у будь-який спосіб який бажаєте у вашому модулі вводу/виводу, який пасує платформі.

ІСТОРІЯ РЕЛІЗІВ

Версія Дата  Опис
1.1 2002/10/07 Перший реліз. Версія VxWorks, яка все ще на цьому рівні.
1.2  2003/01/28 Покращений API, порт Java (який все ще на цьому рівні).
1.3 2004/03/04 Виправлення передачі файлів за допомогою HyperTerminal.
1.4 2004/03/20 Виправлення прийому порожніх файлів.
1.5 2004/04/10 Виправлення проблеми з A-пакетами, дозволяє супер-малі налаштування та/або налаштування виключно на приймання.
1.51 2004/09/23 Адаптація до Philips XAG30 (Джон Данлап)
EKSW 0.94 2010/06/24 Справжні ковзні вікна з вибірковою ретрансмісією (Джон Данлап)
1.6 2011/03/30  Опублікована і випущена з переглянутою BSD ліцензією 3-Clause.
1.7 2011/06/06 Протокол FORCE-3 працює спільно з  C-Kermit 9.0 (розповідається тут)

СКАЧАТИ

Для завантаження доступні декілька різних релізів E-Kermit. Сама E-Kermit, версія 1.7, є основною. Інші — це адаптації до різних платформ або мов, які були зроблені під час попередніх релізів E-Kermit, як зазначено в попередньому розділі; іншими словами, виправлення, знайдені в E-Kermit 1.3, 1.4 і 1.5, не входять у версії VxWorks або Java, а версія VxWorks використовує API E-Kermit 1.1 замість покращеної версії 1.2. EKSW має деякі модифікації API та інші невідповідності, які повинні бути скасовані до того, як вони будуть інтегровані з EK 1.6, але цілком придатні самі по собі. Фактично ця версія працює в новому поколінні Apex-EM ocean floats, і була протестована більш ретельно при більш несприятливих умовах, ніж будь-яка інша реалізація протоколу Kermit. Стала поштовхом для розвитку версії 1.7, яка реалізує новий протокол Force-3 для перевірки пакетів на помилки (колись EKSW теж отримає його).

HTTP FTP
Name Description Tar* Zip Source Files
E-Kermit 1.7 Портативний на всіх платформах, з Unix демо. Download Download Download
EKSW 0.94  E-Kermit з справжніми ковзними вікнами, адаптованими до Linux. Download Download Download
EKVX 1.1 E-Kermit 1.1, адаптований для VxWorks. Download Download Download
Java E-Kermit 1.2, який конверовано в Java Download Download Download
Simirid  Тестер стресу для протоколу [опис] Download Download Download

* Не стиснуті — немає потреби, вони дуже маленькі.

Натисніть тут щоб отримати FTP-доступ до всіх файлів E-Kermit.

Проект Kermit розміщено на Panix.com / [email protected] / 28 лютого 2019 року