Русский
Русский
English
Статистика
Реклама

*nix

Одновременный speedtest на нескольких LTE-модемах

08.07.2020 12:13:32 | Автор: admin
На карантине мне предложили поучаствовать в разработке устройства измерения скорости LTE-модемов для нескольких операторов сотовой связи.



Заказчик хотел оценить скорость всевозможных операторов связи в различных географических точках, для того чтобы можно было понять, какой оператор сотовой связи ему наиболее оптимален при установке оборудования, использующее LTE-соединение, например, для видеотрансляций. При этом задачу нужно было решить максимально просто и дешево, без дорогостоящего оборудования.

Сразу скажу, что задача не самая простая и наукоемкая, расскажу, какие проблемы мне встретились и как я их решал. Итак, поехали.

Примечание


Измерение скорости LTE-соединение дело весьма сложное: необходимо правильно выбрать оборудования и методику измерения, также хорошо представлять топологию и работу сотовой сети. Плюс на скорость может влиять несколько факторов: количество абонентов на соте, погодные условия, даже от соты к соте скорость может разительно отличаться из-за топологии сети. В общем, эта задача с огромным количеством неизвестных, и ее правильно решить может только оператор связи.

Изначально заказчик хотел просто гонять курьера с телефонами операторов, проводить измерения прямо на телефоне и далее в тетрадку записывать результаты измерения скорости. Мое решение измерения скорости сетей lte, хоть не идеально, но решает поставленную задачу.

Из-за нехватки времени, я принимал решения не в пользу удобства или практичности, а в пользу скорости разработки. Например, для удаленного доступа поднимался обратный ssh, вместо более практичного vpn, ради экономии времени на настройку сервера и каждого отдельного клиента.

Техническое задание


Как сказано в статье Без ТЗ: почему клиент не хочет его: Не работайте без ТЗ! Никогда, нигде!

Техническое задание было достаточно простое, я немного его расширю для понимания конечного пользователя. Выбор технических решений и оборудования был продиктован заказчиком. Итак, само ТЗ, после всех согласований:

На базе одноплатного компьютера vim2 сделать тестер скорости lte-соединения через модемы Huawei e3372h 153 нескольких операторов связи (от одного до n). Так же необходимо получать координаты с GPS-приемника, подключенного по UART. Замеры скорости производить с помощью сервиса www.speedtest.net и сводить их в таблицу вида:



Таблица в формате csv. После чего отсылать на е-майл каждые 6 часов данную табличку. В случае возникновения ошибок мигать светодиодом, который подключен к GPIO.

ТЗ я описал в вольной форме, после множества согласований. Но смысл задачи уже виден. Срок на все про все был дан неделя. Но в реальности он растянулся на три недели. Это с учетом того, что я делал это только после основной работы и по выходным.

Здесь я хочу еще раз обратить внимание, что заказчиком было заранее оговорено использование сервиса измерения скорости и аппаратное обеспечение, что сильно ограничило мои возможности. Был так же ограничен бюджет, поэтому особо ничего не докупалось. Так что пришлось играть по данным правилам.

Архитектура и разработка


Схема проста и очевидна. Поэтому оставлю ее без особых комментариев.



Весь проект решил реализовать на python, несмотря на то, что опыта разработки на этом языке у меня не было совсем. Выбрал его, так как была куча готовых примеров и решений, которые могли ускорить разработку. Поэтому, прошу всех профессиональных программистов не ругать мой первый опыт разработки на python, и всегда с удовольствием готов услышать конструктивную критику, для повышения своего скилла.

Также в процессе открыл, что python имеет две ходовые версии 2 и 3, в результате остановился на третьей.

Аппаратные узлы


Одноплатник vim2


В качестве основной машины мне был дан одноплатник vim2



Отличный, мощный медиакомбайн для умного дома и SMART-TV, но на редкость неподходящий для данной задачи, или скажем так, слабо подходящий. Например, его главная ОС это Android, а Linux это попутная ОС, и соответственно никто не гарантирует качественной работы всех узлов и драйверов под Linux. И я предполагаю, что часть проблем была связана с драйверами USB данной платформы, поэтому модемы работали на данной плате не так как ожидал. Так же у него очень плохая и разрозненная документация, поэтому каждая операция занимала много времени копания в доках. Даже рядовая работа с GPIO попила много крови. Например, чтобы настроить работу со светодиодом, мне понадобилось несколько часов. Но, если быть объективным, то принципиально не было важно, что за одноплатник, главное, чтобы работал и были USB-порты.

Для начала мне нужно установить Linux на данную плату. Чтобы не рыскать всем по дебрям документации, а также для тех, кто будет разбираться с этим одноплатником, пишу данную главу.

Есть два варианта установить линукс: на внешнюю SD-карту, либо на внутреннюю MMC. С картой я побился вечерок, так и не вкурил как же заставить работать, поэтому решил устанавливать на MMC, хотя без сомнения с внешней картой много проще было бы работать.

О прошивке криво рассказано тут. Перевожу со странного на русский. Для того, чтобы прошить плату, мне необходимо подключить аппаратный UART. Подключал его следующим образом.

  • Tool Pin GND: <> Pin17 of VIMss GPIO
  • Tool Pin TXD: <> Pin18 of VIMss GPIO (Linux_Rx)
  • Tool Pin RXD: <> Pin19 of VIMss GPIO (Linux_Tx)
  • Tool Pin VCC: <> Pin20 of VIMss GPIO



После чего, я скачал прошивку отсюда. Конкретная версия прошивки VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.
Для того, чтобы залить данную прошивку, мне необходимы нужны утилиты. Более подробно об этом рассказано тут. Под Windows не пробовал прошивать, а вот о прошивке под Linux надо пару слов рассказать. Для начала установлю утилиты, согласно инструкции.

git clone https://github.com/khadas/utilscd /path/to/utilssudo ./INSTALL

Иии Ничего не работает. Потратил пару часов занимаясь правками установочных скриптов, чтобы все корректно установилось у меня. Что там делал не помню, но тоже еще тот цирк с конями. Так что будьте осторожны. Но без этих утилит дальше мучить vim2 смысла нет. Лучше с ним вообще не связываться!

После семи кругов ада, конфигурации скриптов и установки получил пакет работающих утилит. Подключил плата по USB к моему компьютеру линукс, и так же подключен UART по схеме выше.
Настраиваю мой любимый терминал minicom на скорость 115200, без аппаратного и программного контроля ошибок. И приступаем.



При загрузке VIM2 в терминале UART нажимаю какую-либо клавишу, например пробел, чтобы остановить загрузку. После того, как появится строка

kvim2# 

Ввожу команду:

kvim2# run update

На хосте, откуда загружаем, выполняю:

burn-tool -v aml -b VIM2 -i  VIM2_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.img

Все, фух. Прошил, на плате есть Linux. Логин/пароль khadas:khadas.

После этого небольшие первичные настройки. Для дальнейшей работы отключаю пароль у sudo (да, не безопасно, но удобно).

sudo visudo

Редактирую строку до вида и сохраняем

# Allow members of group sudo to execute any command%sudo ALL=(ALL:ALL) NOPASSWD: ALL

После чего меняю текущую локаль, чтобы время было по Москве, иначе будет по Гринвичу.

sudo timedatectl set-timezone Europe/Moscow

либо

ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Если вам показалось сложно, то не пользуйтесь данной платой, лучше Raspberry Pi. Честно.

Модем Huawei e3372h 153


Данный модем у меня попил крови знатно, и, по сути, он и стал самым узким местом всего проекта. Вообще, название модем для данных устройств совершенно не отражает суть работы: это мощнейший комбайн, эта железяка имеет составное устройство, которое прикидывается CD-ROM для того, чтобы установить драйвера, а потом переходит в режим сетевой карты.

Архитектурно, с точки зрения пользователя Linux после всех настроек, выглядит так: после подключения модема, у меня появляется сетевой интерфейс eth*, который по dhcp получает ip адрес 192.168.8.100, и шлюз по умолчанию 192.168.8.1.

И самый главный момент! Данная модель модема, не умеет работать в режиме именно модема, который управляется АТ-командами. Все было бы сильно проще, создать ppp-соединения на каждый модем и дальше уже оперировать с ними. Но в моем случае сам (точнее дайвера Linux согласно правилам udev), создает eth-интерфейс и по dhcp назначают ему ip-адрес.

Чтобы дальше не путаться, предлагаю забыть слово модем и говорить сетевая карта и шлюз, ибо по сути, это как подключение новой сетевой карты со шлюзом.
Когда один модем, это не вызывает особых проблем, но когда их больше одного, а именно n-штук, то возникает следующая картина сети.



То есть n сетевых карт, с одним IP-адресом, у каждого один и тот же шлюз по умолчанию. Но по факту, каждый из них подключен к своему оператору.

Изначально у меня было простое решение: с помощью команды ifconfig или ip гасить все интерфейсы и просто включать по очереди один и тестировать его. Решение было всем хорошо, кроме того, что в моменты коммутации я не имел возможности подключиться к устройству. А поскольку коммутации частые и быстрые, то фактически у меня не было возможности подключиться вообще.

Поэтому я выбрал путь менять вручную ip-адреса модемов и дальше гонять трафик с помощью настроек маршрутизации.



На этом у меня проблемы с модемами не закончились: в случае проблем с питанием, они отваливались, требовалось хорошее стабильное питание USB-хаба. Эту проблему решил жестко припаяв питание прямо к хабу. Другая проблема, с которой я столкнулся и которая погубила весь проект: после перезагрузки или холодного старта устройства определялись не все модемы и не всегда, и почему это происходило и по какому алгоритму мне установить не удалось. Но обо всем по порядку.

Для корректной работы модема, я установил пакет usb-modeswitch.

sudo apt updatesudo apt install -y usb-modeswitch

После чего, модем после подключения будет корректно определяться и конфигурироваться подсистемой udev. Проверяю, просто подключив модем и убедившись, что сеть появилась.
Еще одна проблема, которую я не смог решить: это как из этого модема получить имя оператора, с которым мы работаем? Имя оператора содержится в веб-интерфейсе модема по адресу 192.168.8.1. Это динамическая веб-страница, которая получает данные посредством ajax-запросов, поэтому просто wget-тнуть страницу и спарсить имя не получится. Поэтому начал смотреть, как отработать web-страницу и т.п., и понял, что занимаюсь какой-то ерундой. В результате плюнул, и оператора начал получать с помощью API самого Speedtest.

Многое было бы проще, если бы у модема был бы доступ через AT-команды. Можно было бы его переконфигурировать, создавать ppp-соединение, назначать IP, получать оператора связи и т.д. Но увы, работаю с тем что дали.

GPS


GPS-приемник, который мне выдали, имел интерфейс UART и питание. Это было не самое лучшее решение, но тем не менее рабочее и простое. Приемник был примерно такого вида.



Честно говоря, впервые работал с GPS-приемником, но как предполагал, все давно придумано за нас. Так что просто пользуемся готовыми решениями.

Для начала включаю uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) для подключения GPS.

khadas@Khadas:~$ sudo fdtput -t s /dtb.img /serial@c81004e0 status okay

После проверяю успешность операции.

khadas@Khadas:~$ fdtget /dtb.img /serial@c81004e0 statusokay

Данная команда, судя по всему, на лету редактирует devtree, что весьма удобно.

После успеха этой операции перезагружаемся и устанавливаем gps-демон.

khadas@Khadas:~$ sudo reboot

Установка gps-демона. Устанавливаю все и отрубаю его сразу для дальнейшей конфигурации.

sudo apt install gpsd gpsd-clients -ysudo killall gpsd /* GPS daemon stop/disable */sudo systemctl stop gpsd.socketsudo systemctl disable gpsd.socket

Редактирую файл настроек.

sudo vim /etc/default/gpsd

Устанавливаю UART, на котором будет висеть GPS.

DEVICES="/dev/ttyS4"

И после все включаем и стартуем.

/* GPS daemon enable/start */sudo systemctl enable gpsd.socketsudo systemctl start gpsd.socket

После чего, подключаю GPS.



В руках провод GPS, под пальцами видны провода UART отладчика.

Перезагружаюсь, и проверяю работу GPS с помощью программы gpsmon.



На этом скриншоте спутников не видать, но видно общение с GPS-приемником, и это говорит, что все хорошо.

На python опробовал много вариантов работы с данным демоном, но я остановился на том, который корректно работал с python 3.

Устанавливаю необходимую библиотеку.

sudo -H pip3 install gps3 

И ваяю код работы.

from gps3.agps3threaded import AGPS3mechanism...def getPositionData(agps_thread):counter = 0;while True:longitude = agps_thread.data_stream.lonlatitude = agps_thread.data_stream.latif latitude != 'n/a' and longitude != 'n/a':return '{}' .format(longitude), '{}' .format(latitude)counter = counter + 1print ("Wait gps counter = %d" % counter)if counter == 10:ErrorMessage("Ошибка GPS приемника!!!")return "NA", "NA"time.sleep(1.0)...f __name__ == '__main__':...#gpsagps_thread = AGPS3mechanism()  # Instantiate AGPS3 Mechanismsagps_thread.stream_data()  # From localhost (), or other hosts, by example, (host='gps.ddns.net')agps_thread.run_thread()  # Throttle time to sleep after an empty lookup, default '()' 0.2 two tenths of a second

Если мне нужно получить координаты, то делается это следующим вызовом:

longitude, latitude = getPositionData(agps_thread)

И в течении 1-10 секунд я либо получу координату, либо нет. Да, у меня попыток получить координаты было десять. Не оптимально, криво и косо, но работает. Я решил так сделать, потому что GPS может ловить плохо и не всегда получать данные. Если ждать получения данных, то в случае работы в глухом помещении, программа зависнет в это месте. Поэтому реализовал такой не элегантный вариант.

В принципе, было бы больше времени, можно было бы напрямую по UART получать данные с GSP, парсить их в отдельном потоке и работать с ними. Но времени не было совсем, отсюда лютый некрасивый код. И да, мне не стыдно.

Светодиод


С подключением светодиода было все просто и сложно одновременно. Главная сложность в том, что номер пина в системе не соответствует номеру пина на плате и потому что документация написана левой пяткой. Чтобы сопоставить номер аппаратного пина и номер пина в ОС, надо выполнить команду:

gpio readall

Будет выведена таблица соответствия пина в системе, и на плате. После чего я уже могу оперировать пином в самой ОС. В моем случае светодиод подключен к GPIOH_5.



Перевожу пин GPIO в режим вывода.

gpio -g mode 421 out

Записываю нуль.

gpio -g write 421 0

Записываю единицу.

gpio -g write 421 1


Все горит, после записи 1

#gpio subsistemdef gpio_init():os.system("gpio -g mode 421 out")os.system("gpio -g write 421 1")def gpio_set(val):os.system("gpio -g write 421 %d" % val)def error_blink():gpio_set(0)time.sleep(0.1)gpio_set(1)time.sleep(0.1)gpio_set(0)time.sleep(0.1)gpio_set(1)time.sleep(0.1)gpio_set(0)time.sleep(1.0)gpio_set(1)def good_blink():gpio_set(1)

Теперь, в случае ошибок я вызываю error_blink() и светодиод нам красиво помигает.

Программные узлы


Speedtest API


Большая радость, что у сервиса speedtest.net есть свой собственный python-API, посмотреть можно на Github.

Чем хорошо, что есть исходные коды, которые тоже можно посмотреть. Как работать с данным API (простейшие примеры) можно посмотреть в соответствующем разделе.

Устанавливаю python-библиотеку следующей командой.

sudo -H pip3 install speedtest-cli

Для примера вы можете вообще поставить спидтестер в Ubuntu прямо из реп. Это тоже самое python-приложение, которое потом можно запустить прямо из консоли.

sudo apt install speedtest-cli -y

И произвести замеры скорости вашего интернета.

speedtest-cli
Retrieving speedtest.net configuration...
Testing from B***** (*.*.*.*)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by MTS (Moscow) [0.12 km]: 11.8 ms
Testing download speed................................................................................
Download: 7.10 Mbit/s
Testing upload speed......................................................................................................
Upload: 3.86 Mbit/s


В результате, как сделал это я. Мне пришлось влезть в исходные коды этого спидтеста, чтобы более полно внедрить их в мой проект. Одна из важнейших задач это получать еще имя оператора связи, для подстановки его в табличку.

import speedtestfrom datetime import datetime...#Указываем конкретный сервер для теста#6053) MaximaTelecom (Moscow, Russian Federation)servers = ["6053"]# If you want to use a single threaded testthreads = Nones = speedtest.Speedtest()#получаем имя оператора сотовой связиopos = '%(isp)s' % s.config['client']s.get_servers(servers)#получаем текстовую строку с параметрами сервераtestserver = '%(sponsor)s (%(name)s) [%(d)0.2f km]: %(latency)s ms' % s.results.server#тест загрузкиs.download(threads=threads)#тест выгрузкиs.upload(threads=threads)#получаем результатыs.results.share()#После чего формируется строка для записи в csv-файл.#получаем позицию GPSlongitude, latitude = getPositionData(agps_thread)#время и датаcurdata = datetime.now().strftime('%d.%m.%Y')curtime = datetime.now().strftime('%H:%M:%S')delimiter = ';'result_string = opos + delimiter + str(curpos) + delimiter + \curdata + delimiter + curtime + delimiter + longitude + ', ' + latitude + delimiter + \str(s.results.download/1000.0/1000.0) + delimiter + str(s.results.upload / 1000.0 / 1000.0) + \delimiter + str(s.results.ping) + delimiter + testserver + "\n"#тут идет запись в файл логов

Здесь тоже оказалось не так все просто, хотя, казалось бы, куда проще. Изначально параметр servers у меня был равен [], мол выбери лучший сервер. В результате у меня были случайные сервера, и как нетрудно догадаться, плавающая скорость. Это достаточно сложная тема, использовать фиксированный сервер, если да, то какой или динамический, требует исследования. Но вот пример графиков замеров скорости оператора Билайна при динамическом выборе тестового сервера и статически зафиксированного.


Результат измерения скорости при выборе динамического сервера.


Результат тестирования скорости, при одном строго выбранном одном сервере.

Шерсть при тестировании есть и там и там, и ее нужно убирать математическими методами. Но при фиксированном сервере ее немного меньше и амплитуда стабильнее.
Вообще это место больших исследований. И я бы проводил замеры скорости к своему серверу, по средством утилиты iperf. Но мы не отходим от ТЗ.

Отправка почты и ошибок


Для отправки почты попробовал несколько десятков различных вариантов, но в результате остановился на следующем. Зарегистрировал почтовый ящик на yandex и далее взял данный пример отправки почты. Проверил его и внедрил в программу. В этом примере разбираются различные варианты, в том числе отправка с gmail и т.п. Возится с поднятием своего почтового сервера мне не хотелось и не было времени на это, но как потом оказалось тоже напрасно.

Отправка логов производил по планировщику, при наличии связи, каждые 6 часов: в 00 часов, 06 утра, 12 дня и 18 вечера. Отправлял следующим образом.

from send_email import *...message_log = "Логи тестирования платы 1"EmailForSend = ["dlinyj@trololo.ru", "pupkin@trololo.ru"]files = ["/home/khadas/modems_speedtest/csv"]...def sendLogs():global EmailForSendcurdata = datetime.now().strftime('%d.%m.%Y')сurtime = datetime.now().strftime('%H:%M:%S')try:for addr_to in EmailForSend:send_email(addr_to, message_log, "Логи за " + curdata + " " + сurtime, files)except:print("Network problem for send mail")return Falsereturn True

Ошибки тоже изначально отправлялись. Для начала они накапливались в списке, и потом отправлял также с помощью планировщика, при наличии связи. Однако потом возникли проблемы с тем, что yandex имеет ограничение на количество отправляемых сообщений в сутки (это боль, печаль и унижение). Поскольку ошибок даже в минуту могло быть огромное количество, соответственно от отправки ошибок по почте пришлось отказаться. Так что имейте в виду, при автоматической отправки через сервисы яндекса о такой проблеме.

Сервер обратной связи


Для того, чтобы иметь доступ к удаленной железке и иметь возможность ее донастроить и переконфигурировать мне понадобился внешний сервер. Вообще, справедливости говоря, правильно было бы все данные отправлять на сервер и в веб-интерфейсе строить все красивые графики. Но не все сразу.

В качестве VPS я выбрал ruvds.com. Можно было бы взять самый простой сервер. И в целом для моих бы целей этого хватило бы за глаза. Но поскольку платил за сервер не из своего кармана, решил взять с небольшим запасом, чтобы хватило, если будем разворачивать web-интерфейс, свой SMTP-сервер, vpn и т.д. Плюс иметь возможность настроить Telegram-бота и не иметь проблем с его блокировками. Поэтому выбрал Amsterdam и следующие параметры.



В качестве способа связи с железкой vim2 выбрал обратное ssh соединение и как показала практика не самое лучшее. При разрыве соединения, сервер удерживает порт и по нему невозможно подключиться некоторое время. Поэтому, все же лучше использовать другие способы связи, например vpn. В будущем хотел перейти на vpn, но не успел.

Не буду вдаваться в подробности настройки файрвола, ограничения прав, отключения ssh соединения root и прочие прописные истины настройки VPS. Хочется верить, что вы и так все знаете. Для удаленного соединения, создаю нового пользователя на сервере.

adduser vimssh

На нашей железке генерирую ключи ssh соединения.

ssh-keygen

И копирую их на наш сервер.

ssh-copy-id vimssh@host.com

На нашей железке создаю автоматическое подключение обратного ssh при каждой загрузке.

[Unit]
Description=Auto Reverse SSH
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service]
User=khadas
ExecStart=/usr/bin/ssh -NT -o ExitOnForwardFailure=yes -o ServerAliveInterval=60 -CD 8080 -R 8083:localhost:22 vimssh@host.com
RestartSec=5
Restart=always
[Install]
WantedBy=multi-user.target


Обратите внимание на порт 8083: он и определяет по какому порту у меня будет осуществляется подключение через обратный ssh. Добавляем в автозагрузку и стартуем.

sudo systemctl enable autossh.servicesudo systemctl start autossh.service

Можно даже посмотреть статус:

sudo systemctl status autossh.service

Теперь, на нашем VPS-сервере, если выполнить:

ssh -p 8083 khadas@localhost

То я попадаю на мою тестовую железку. И с железки могу так же отправлять логи и любые данные по ssh на мой сервер, что весьма удобно.

Собираем все воедино



Включение, приступаем к разработке и отладке

Фух, ну вроде все, описал все узлы. Теперь пришло время собрать все это в единую кучу. Код можно посмотреть вот тут.

Важный момент с кодом: Данный проект вот так вот влоб может не запуститься, так как затачивался на определенную задачу, определенной архитектуры. Хоть я и даю исходники, но все же самое ценное разберу вот тут, прямо в тексте, иначе совершенно непонятно.

В начале у меня идет инициализация gps, gpio и запуск отдельного потока планировщика.

#запуск потока планировщикаpShedulerThread = threading.Thread(target=ShedulerThread, args=(1,))pShedulerThread.start()

Планировщик достаточно прост: он смотрит не пришло ли время отправки сообщений и какой сейчас стоит статус ошибок. Если есть флаг ошибки, то мигаем светодиодом.

#shedulerdef ShedulerThread(name):global ready_to_sendwhile True:d = datetime.today()time_x = d.strftime('%H:%M')if time_x in time_send_csv:ready_to_send = Trueif error_status:error_blink()else:good_blink()time.sleep(1)

Самый сложный момент в данном проекте это сохранять обратное ssh-соединение при каждом тесте. В каждом тесте идет заново настройка шлюза по умолчанию и dns-сервера. Поскольку все равно никто не читает, то знайте, что поезд не катается по деревянным рельсам. Кто найдет пасхалку, тому конфетка.

Для этого я создаю отдельную таблица маршрутизации --set-mark 0x2 и правило для перенаправления трафика.

def InitRouteForSSH():cmd_run("sudo iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22 -j MARK --set-mark 0x2")cmd_run("sudo ip rule add fwmark 0x2/0x2 lookup 102")

Подробнее о том, как это работает можно прочитать в этой статье.

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

network_list = getNetworklist()

Получение списка сетевых интерфейсов достаточно простое.

def getNetworklist():full_networklist = os.listdir('/sys/class/net/')network_list = [x for x in full_networklist if "eth" in x and x != "eth0"]return network_list

После получения списка, задаю IP-адреса всем интерфейсам, как я приводил на картинке в главе про модем.

SetIpAllNetwork(network_list)def SetIpAllNetwork(network_list):for iface in network_list:lastip = "%d" % (3 + network_list.index(iface))cmd_run ("sudo ifconfig " + iface + " 192.168.8." + lastip +" up")

Далее просто в цикле иду по каждому интерфейсу. И конфигурирую каждый интерфейс.

for iface in network_list:ConfigNetwork(iface)

def ConfigNetwork(iface):#сбрасываем все настройкиcmd_run("sudo ip route flush all")#Назначаем шлюз по умолчаниюcmd_run("sudo route add default gw 192.168.8.1 " + iface)#задаем dns-сервер (это нужно для работы speedtest)cmd_run ("sudo bash -c 'echo nameserver 8.8.8.8 > /etc/resolv.conf'")

Проверяю интерфейс на работоспособность, если сети нет, то формирую ошибки. Если сеть есть, то время действовать!

Здесь я настраиваю ssh маршрутизацию на данный интерфейс (если не было сделано), отправляю ошибки на сервер, если время пришло, отправляю логи и в конце концов провожу speedtest и сохраняем логи в csv-файл.

if not NetworkAvalible():....#Здесь мы формируем ошибки....else: #Есть сеть, ура, работаем!#Если у нас проблемный интерфейс, на котором ssh, то меняем его  if (sshint == lastbanint or sshint =="free"):    print("********** Setup SSH ********************")    if sshint !="free":      сmd_run("sudo ip route del default via 192.168.8.1 dev " + sshint +" table 102")    SetupReverseSSH(iface)    sshint = iface#раз сетка работает, то давай срочно все отправим!!!    if ready_to_send:      print ("**** Ready to send!!!")        if sendLogs():          ready_to_send = False        if error_status:          SendErrors()        if (error_status):          SendErrors()#и далее тестируем скорость и сохраняем логи. 

Разве что стоит сказать о функции настройки обратного ssh.

def SetupReverseSSH(iface):cmd_run("sudo systemctl stop autossh.service")cmd_run("sudo ip route add default via 192.168.8.1 dev " + iface +" table 102")cmd_run("sudo systemctl start autossh.service")

Ну и конечно же, необходимо всю эту красоту добавить в автозагрузку. Для этого создаю файл:

sudo vim /etc/systemd/system/modems_speedtest.service

И записываю в него:

[Unit]
Description=Modem Speed Test
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service]
User=khadas
ExecStart=/usr/bin/python3.6 /home/khadas/modems_speedtest/networks.py
RestartSec=5
Restart=always
[Install]
WantedBy=multi-user.target


Включаю автозагрузку и стартую!

sudo systemctl enable modems_speedtest.servicesudo systemctl start modems_speedtest.service

Теперь я могу смотреть логи того, что происходит с помощью команды:

journalctl -u modems_speedtest.service --no-pager -f

Результаты


Ну теперь самое главное, что же получилось в результате? Приведу несколько графиков, которые мне удалось заснять в процессе разработки и отладки. Графики строились с помощью gnuplot следующим скриптом.

#! /usr/bin/gnuplot -persistset terminal postscript eps enhanced color solidset output "Rostelecom.ps" #set terminal png size 1024, 768#set output "Rostelecom.png" set datafile separator ';'set grid xtics yticsset xdata timeset ylabel "Speed Mb/s"set xlabel 'Time'set timefmt '%d.%m.%Y;%H:%M:%S'set title "Rostelecom Speed"plot "Rostelecom.csv" using 3:6 with lines title "Download", '' using 3:7 with lines title "Upload" set title "Rostelecom 2 Ping"set ylabel "Ping ms"plot "Rostelecom.csv" using 3:8 with lines title "Ping"

Первый опыт был оператора Tele2, который я проводил в течении нескольких дней.



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

Позднее я построил еще ряд графиков, для других операторов связи. Сервер тестирования в этом случае уже был один, и результаты тоже очень интересные.









Как видно тема очень обширная для исследований и обработки этих данных, и явно не тянет на пару недель работы. Но

Итог работы


Работа была резко завершена по независящим от меня обстоятельствам. Одной из слабых сторон данного проекта, на мой субъективный взгляд, был модем, который не очень хотел работать одновременно с другими модемами, и при каждой загрузке выделывал такие фортеля. Для данных целей существует громадное количество других моделей модемов, обычно они уже имеют формат Mini PCI-e и ставятся внутрь устройства и их сильно проще конфигурировать. Но это уже совсем другая история. Проект был интересный и был очень рад, что удалось в нем поучаствовать.

Подробнее..

Чесночно-луковый хостинг как поднять веб-ресурс, чтобы не отобрали домен

24.07.2020 12:09:40 | Автор: admin


Дисклеймер: инструменты, описанные здесь абсолютно легальны. Это как нож: кто-то режет капусту в салат, кто-то использует для нападений. Поэтому пост посвящен исключительно инструментам, которые могут использоваться как в хороших, так и не очень целях.

Глобальный DNS прекрасная вещь, пережившая не одно десятилетие. Но у него есть фундаментальная проблема ваш домен могут просто разделегировать, если вдруг решат, что вы что-то нарушили. Ну или у кого-то с деньгами и связями будет на вас зуб. Историю того же torrents.ru все помнят. Если по каким-то причинам вы хотите убрать подобные риски можно посмотреть в сторону оверлейных сетей, у которых просто нет регулятора, способного разделегировать доменное имя. Поэтому будем поднимать onion- и i2p-веб-ресурсы.

Луковые кольца


Начнем с классики. Я думаю, что Хабре почти все использовали Tor в виде бандла Tor-browser. Меня это сильно выручало, когда в процессе охоты за Telegram вдруг начали резко рвать связность с крупнейшими хостерами в самых неожиданных местах. В этом режиме Tor использует классическое луковое шифрование, послойно заворачивая данные таким образом, чтобы было невозможно установить источник и конечную цель пакета. Тем не менее конечной точкой маршрута все равно является обычный интернет, куда мы в итоге попадаем через Exit-ноды.

У этого решения есть несколько проблем:

  1. К владельцу Exit-ноды могут прийти недоброжелательно настроенные люди и начать утверждать, что владелец закоренелый преступник, ругающийся нехорошими словами на представителей власти. Есть ненулевой риск, что ваши объяснения про то, что вы только выходной узел, мало кто будет слушать.
  2. Использование сети tor как прокси к обычным ресурсам анонимизирует клиента, но никак не поможет от разделегирования домена и претензий к владельцу сервиса.

Готовим контент и обычный веб-сервер


Поэтому будем поднимать onion-ресурс непосредственно внутри сети, без выхода в обычный интернет. Например, как дополнительную резервную точку входа на свой ресурс. Предположим, что у вас уже есть веб-сервер с некоторым контентом, который отдает nginx. Для начала, если вы не хотите светиться в общедоступном интернете, не поленитесь зайти в iptables и настроить firewall. У вас должен быть заблокирован доступ в вашему веб-серверу отовсюду, кроме localhost. В результате вы получили сайт, доступный локально по адресу localhost:8080/. Дополнительное прикручивание https тут будет избыточным, так как транспорт tor возьмет на себя эту задачу.

Разворачиваем TOR


Я буду рассматривать установку на примере Ubuntu, но с другими дистрибутивами принципиальных отличий не будет. Для начала определимся с репозиторием. Официальная документация не рекомендует использовать пакеты, которые мейнтейнятся самим дистрибутивом, так как они могут содержать критические уязвимости, уже исправленные разработчиками в апстриме. Более того, разработчики рекомендуют использовать механизм автоматических обновлений unattended-upgrades, для того чтобы гарантировать их своевременную доставку.

Создаем файл для дополнительного репозитория:

# nano /etc/apt/sources.list.d/tor.list

И добавляем в него нужные адреса:

deb https://deb.torproject.org/torproject.org bionic maindeb-src https://deb.torproject.org/torproject.org bionic main

Теперь надо позаботиться о gpg ключе, без которого сервер совершенно разумно не будет доверять новым пакетам.

# curl https://deb.torproject.org/torproject.org A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --import# gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | apt-key add -

Теперь можно установить основной пакет из апстрима и связку ключей для автоматического обновления подписи.

# apt update# apt install tor deb.torproject.org-keyring

Настраиваем проксирование


В /etc/tor/torrc вы найдете конфигурационный файл демона. После его обновления не забудьте выполнить его рестарт.
Сразу хочу предупредить особо любопытных пользователей. Не включайте relay-режим на домашней машине! Особенно в режиме exit-ноды. Могут постучаться. На VPS я бы тоже не стал конфигурировать ноду как relay, так как это создаст довольно ощутимую нагрузку как на процессор, так и на траффик. На широком канале вы легко выйдете за 2-3 терабайта в месяц.

Найдите в torrc секцию следующего вида:

############### This section is just for location-hidden services ###

Сюда необходимо прописать ваш локалхостный веб-ресурс. Примерно так:

HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:8080


Или вы можете использовать unix-сокеты:

HiddenServiceDir /Library/Tor/var/lib/tor/hidden_service/
HiddenServicePort 80 unix:/path/to/socket


Получаем адрес


Все, теперь рестартуем демон tor через systemctl и смотрим в HiddenServiceDir. Там будет лежать несколько файлов приватный ключ и ваш луковый hostname. Он представляет собой случайный идентификатор из 16 символов. Например, gjobqjj7wyczbqie.onion адрес поискового ресурса Candle. Адрес полностью случаен, но при достаточно длительном переборе можно сгенерировать человекочитаемую пару из адреса и приватного ключа. Конечно, не на все 16 символов на это ушло бы миллиарды лет. Например, у всем известного каталога книг Флибусты есть зеркало flibustahezeous3.onion, а Facebook потратил кучу ресурсов на то, чтобы выбрать из сгенерированных вариантов наиболее благозвучный: facebookcorewwwi.onion.

Все, через какое-то время ваш ресурс будет проанонсирован и станет глобально доступен. Обратите внимание, что проксировать можно не только http-протокол, но и любой другой.

Чеснок


image
Второй вариант задумывался как еще более параноидальный по своей сути. Проект i2p изначально не задумывался как средство для проксирования трафика в обычный интернет и по архитектуре является полностью закрытой оверлейной сетью. Отдельные гейты в обе стороны существуют, но это скорее исключение. Причем потенциально небезопасное.

image
Красный логотип эталонного i2p и пурпурный i2pd-реализации

У i2p есть несколько вариантов реализации программных узлов-роутеров. Официальная имплементация написана на Java. И она просто чудовищно пожирает все доступные ресурсы как в плане RAM, так и CPU. Тем не менее именно она считается эталонной и проходит регулярный аудит. Я бы порекомендовал вам использовать куда более легковесный вариант i2pd, написанный на C++. У него есть свои нюансы, из-за которых могут не работать некоторые i2p-приложения, но в целом это отличная альтернативная реализация. Проект активно пилится в настоящее время.

Устанавливаем демона


Самое удобное, что авторы предусмотрели множество вариантов развертывания, включая docker и snap. Можно пойти путем классического репозитория.

sudo add-apt-repository ppa:purplei2p/i2pdsudo apt-get updatesudo apt-get install i2pd

Но я бы советовал использовать snap. Он не только быстро и удобно развернет демона, но и обеспечит автоматическое обновление прямо из апстрима, в зависимости от выбранного канала распространения.

no_face@i2pd:~$ snap info i2pdname:      i2pdsummary:   Distributed anonymous networking frameworkpublisher: Darknet Villain (supervillain)store-url: https://snapcraft.io/i2pdlicense:   BSD-3-Clausedescription: |  i2pd (I2P Daemon) is a full-featured C++ implementation of I2P client.  I2P (Invisible Internet Protocol) is a universal anonymous network layer.  All communications over I2P are anonymous and end-to-end encrypted,  participants don't reveal their real IP addresses.snap-id: clap1qoxuw4OdjJHVqEeHEqBBgIvwOTvchannels:  latest/stable:    2.32.1 2020-06-02 (62) 16MB -  latest/candidate:   latest/beta:        latest/edge:      2.32.1 2020-06-02 (62) 16MB -


Установите snap, если вы этого еще не сделали и установите stable вариант по умолчанию:
apt install snapdsnap install i2pd

Конфигурируем


У i2pd в отличие от web-gui Java версии нет такого количества настроек, крутилочек и вкладок. Только самое необходимое до аскетичности. Тем не менее проще всего будет настроить его напрямую в конфигурационном файле.
Для того чтобы ваш веб-ресурс стал доступен в i2p, его необходимо его проксировать аналогично варианту с onion. Для этого зайдите в файл ~/.i2pd/tunnels.conf и добавьте ваш бэкенд.

[anon-website]
type = http
host = 127.0.0.1
port = 8080
keys = anon-website.dat

После рестарта демона вы получите случайный 32-битный адрес. Его можно посмотреть в веб-консоли, которая по умолчанию доступна в 127.0.0.1:7070/?page=i2p_tunnels. Не забудьте разрешить к ней доступ со своего IP-адреса, если необходимо. По умолчанию она доступна только на локальном интерфейсе. Там будет что-то страшноватое вида ukeu3k5oycgaauneqgtnvselmt4yemvoilkln7jpvamvfx7dnkdq.b32.i2p.

В i2p-сети есть подобие DNS, но он скорее похож на разрозненный список /etc/hosts. Вы подписываетесь в консоли на конкретные источники, которые говорят вам, как добраться до условной flibusta.i2p. Поэтому имеет смысл добавиться с более или менее красивым именем на крупные ресурсы вроде inr.i2p.

Можно ли развернуть i2p и onion у нас?


Сразу хочу предупредить RuVDS не абузоустойчивый хостинг. В случае мотивированной жалобы на нашего клиента мы можем расторгнуть договор и потушить виртуальную машину. Таким же образом поступят большинство хостеров. Врочем, из-за особенностей архитектуры tor и особенно i2p очень сложно, а часто просто невозможно определить где именно хостится веб-сайт.

Тем не менее ничего противозаконного в самом использовании подобных инструментов нет. Поэтому мы не будем возражать, если вы откроете зеркало своего легального веб-ресурса в оверлейных сетях. В любом случае я еще раз настойчиво рекомендую не экспериментировать вслепую с tor на домашней машине. Или IP может попасть в черные списки, или пативен приедет. Лучше арендуйте VPS, это недорого.

Подробнее..

Как скачать файл порциями?

08.07.2020 00:21:16 | Автор: admin

Иногда требуется скачивать файл порциями. Причины бывают разные, например слишком большой объем файла, ширина канала не достаточна или сервер ограничивает объем данных для скачивания.

В этой статье опишу каким образом реализовать скачивание файла небольшими порциями на языке Java по протоколу HTTP.

Об HTTP


Для таких целей HTTP предоставляет заголовок Range для запроса. В котором указывается диапазон байтов для скачивания. Заголовок Range относится только к телу запроса, заголовки сюда не входят.

Спецификация определяет следующие форматы указания значений заголовка:

Range: bytes=first-byte-pos "-" [last-byte-pos]


first-byte-pos начальное смещение байта с которого необходимо начать (продолжить) скачивание, оно должно быть больше либо равно 0, и меньше либо равно last-byte-pos;

last-byte-pos конечное смещение байта до которого необходимо скачать файл, оно должно быть больше либо равно first-byte-pos и при этом меньше либо равно скачиваемому размеру файла минус один (потому что это смещение, то есть индекс в массиве байтов).

Примеры


Исключительно по указанному диапазону

bytes=0-255

bytes=256-512

Скачать начиная с позиции first-byte-pos до конца

Range: bytes=first-byte-pos "-"

bytes=512-

Скачать last-byte-pos с конца

Range: bytes="-"last-byte-pos

bytes=-32

На подобный запрос сервер в ответ пришлёт два возможных статуса


  • 206 Partial Content файл успешно скачан частично;
  • 416 Range Not Satisfiable неудовлетворительный диапазон для скачивания.

Конечно же ответов может быть больше. В контексте статьи они нас не интересуют.

И заголовок Content-Range в котором указан запрошенный диапазон и общий размер.

Content-Range: bytes 256-512/1024

Этот заголовок сообщает что пришёл ответ на запрос с 256-512 позиции в массиве байтов из 1024 байтов.

Реализация на Java 14


В качестве HTTP клиента возьмем стандартный из JDK, доступный с Java 11 java.net.http.HttpClient.

Для реализации логики выполнения запроса по порциям, напишем класс обёртку art.aukhatov.http.WebClient.

Опишем интерфейс этого класса

  • byte[] download(String uri, int chunkSize) скачивает файл по указанным порциям байтов;
  • Response download(String uri, int firstBytePos, int lastBytePos) скачивает файл по указанному диапазону.

В случае если переданный URI не валидный, то метод бросает исключение java.net.URISyntaxException. Исключение java.io.IOException бросается если какая-либо неожиданная ошибка с вводом/выводом.

Классы WebClient и Response


package art.aukhatov.http;import java.io.BufferedInputStream;import java.net.http.HttpClient;import java.net.http.HttpHeaders;import java.time.Duration;public class WebClient {     private final HttpClient httpClient;     public WebClient() {         this.httpClient = HttpClient.newBuilder()              .connectTimeout(Duration.ofSeconds(10))              .build();     }     public static class Response {          final BufferedInputStream inputStream;          final int status;          final HttpHeaders headers;          public Response(BufferedInputStream inputStream, int status, HttpHeaders headers) {               this.inputStream = inputStream;               this.status = status;               this.headers = headers;          }     }}

В качестве представления ответа опишем nested class WebClient.Response с полями BufferedInputStream, HTTP Status, HTTP Header. Эти данные необходимы для формирования результирующего массива байтов и понимания продолжать скачивать или нет.

Метод Response download(final String uri, int firstBytePos, int lastBytePos)


import java.io.BufferedInputStream;import java.io.IOException;import java.io.InputStream;import java.net.URI;import java.net.URISyntaxException;import java.net.http.HttpClient;import java.net.http.HttpHeaders;import java.net.http.HttpRequest;import java.net.http.HttpResponse;private static final String HEADER_RANGE = "Range";private static final String RANGE_FORMAT = "bytes=%d-%d";public Response download(final String uri, int firstBytePos, int lastBytePos)    throws URISyntaxException, IOException, InterruptedException {    HttpRequest request = HttpRequest            .newBuilder(new URI(uri))            .header(HEADER_RANGE, format(RANGE_FORMAT, firstBytePos, lastBytePos))            .GET()            .version(HttpClient.Version.HTTP_2)            .build();    HttpResponse<InputStream> response = httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());    return new Response(new BufferedInputStream(response.body()), response.statusCode(), response.headers());}

Этот метод скачивает указанный диапазон данных. Но прежде чем начать нам нужно знать сколько всего данных нам надо ожидать. Для этого необходимо сделать запрос без получения контента. Воспользуемся методом HEAD.

Метод long contentLength(final String uri)


import java.util.OptionalLong;private static final String HTTP_HEAD = "HEAD";private static final String HEADER_CONTENT_LENGTH = "content-length";private long contentLength(final String uri)throws URISyntaxException, IOException, InterruptedException {    HttpRequest headRequest = HttpRequest            .newBuilder(new URI(uri))            .method(HTTP_HEAD, HttpRequest.BodyPublishers.noBody())            .version(HttpClient.Version.HTTP_2)            .build();    HttpResponse<String> httpResponse = httpClient.send(headRequest, HttpResponse.BodyHandlers.ofString());    OptionalLong contentLength = httpResponse            .headers().firstValueAsLong(HEADER_CONTENT_LENGTH);    return contentLength.orElse(0L);}

Теперь у нас есть ожидаемая длина файла в байтах.

Метод byte[] download(final String uri, int chunkSize)


Можем приступить к написанию метода контролирующего скачивание файла по порциям. Для удобства, договоримся что размер порций будет передаваться вторым аргументом в этот метод. Хотя можно было бы придумать умный способ определения размера порций.

Определим размер файла

final int expectedLength = (int) contentLength(uri);

Начальное смещение

int firstBytePos = 0;

Конечное смещение

int lastBytePos = chunkSize - 1;

Данные

Скачанные данные за каждую итерацию необходимо накапливать, создадим для этого массив, размер массива нам уже известен.

byte[] downloadedBytes = new byte[expectedLength];

Размер скачанных данных

Дополнительно к самому массиву необходимо определять суммарно сколько данных скачано.

Поэтому эту длину будем считать отдельно.

int downloadedLength = 0;

Цикл скачивания


Условие цикла простое: продолжаем скачивать пока не достигнем ожидаемого размера. После того как успешно скачали очередную порцию данных, необходимо его прочитать и сохранить в результирующий массив, воспользуемся системным методом копирования массива System.arraycopy(). Затем нужно увеличить количество прочитанных данных и следующий диапазон скачиваемых данных. При увеличении диапазона нужно быть осторожнее, нельзя выходить за пределы. Поэтому будем брать минимальное значение из Math.min(lastBytePos + chunkSize, expectedLength - 1).

private static final int HTTP_PARTIAL_CONTENT = 206;while (downloadedLength < expectedLength) {        Response response;        try {            response = download(uri, firstBytePos, lastBytePos);        }        try (response.inputStream) {            byte[] chunkedBytes = response.inputStream.readAllBytes();            downloadedLength += chunkedBytes.length;            if (isPartial(response)) {                System.arraycopy(chunkedBytes, 0, downloadedBytes, firstBytePos, chunkedBytes.length);                firstBytePos = lastBytePos + 1;                lastBytePos = Math.min(lastBytePos + chunkSize, expectedLength - 1);            }        }    }    return downloadedBytes;}private boolean isPartial(Response response) {    return response.status == HTTP_PARTIAL_CONTENT;}

На вид всё хорошо. Что не так?

Когда при скачивании или чтении что-то пойдет не так, броситься I/O исключение и скачивание прекратиться. Отсутствуют fallback. Давайте напишем простой fallback ввиде количества совершенных попыток.

Определим поле для веб-клиента содержащий максимальное количество допустимых попыток скачивания файла.

private int maxAttempts;public int maxAttempts() {    return maxAttempts;}public void setMaxAttempts(int maxAttempts) {    this.maxAttempts = maxAttempts;}

Будем ловить отдельно каждое исключение и инкрементировать локальный счетчик попыток. Цикл скачивания должен остановиться если количество совершенных попыток превышает допустимое. Поэтому дополним условие цикла.

private static final int DEFAULT_MAX_ATTEMPTS = 3;int attempts = 1;while (downloadedLength < expectedLength && attempts < maxAttempts) {    Response response;    try {        response = download(uri, firstBytePos, lastBytePos);    } catch (IOException e) {        attempts++;        continue;    }    try (response.inputStream) {        byte[] chunkedBytes = response.inputStream.readAllBytes();        downloadedLength += chunkedBytes.length;        if (isPartial(response)) {            System.arraycopy(chunkedBytes, 0, downloadedBytes, firstBytePos, chunkedBytes.length);            firstBytePos = lastBytePos + 1;            lastBytePos = Math.min(lastBytePos + chunkSize, expectedLength - 1);        }    } catch (IOException e) {        attempts++;        continue;    }    attempts = 1;}

Дополним метод еще логами. Окончательный вариант выглядит так:

package art.aukhatov.http;import java.io.BufferedInputStream;import java.io.IOException;import java.io.InputStream;import java.net.URI;import java.net.URISyntaxException;import java.net.http.HttpClient;import java.net.http.HttpHeaders;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.time.Duration;import java.util.OptionalLong;import static java.lang.String.format;import static java.lang.System.err;import static java.lang.System.out;public class WebClient {private static final String HEADER_RANGE = "Range";private static final String RANGE_FORMAT = "bytes=%d-%d";private static final String HEADER_CONTENT_LENGTH = "content-length";private static final String HTTP_HEAD = "HEAD";private static final int DEFAULT_MAX_ATTEMPTS = 3;private static final int HTTP_PARTIAL_CONTENT = 206;private final HttpClient httpClient;private int maxAttempts;public WebClient() {this.httpClient = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build();this.maxAttempts = DEFAULT_MAX_ATTEMPTS;}public WebClient(HttpClient httpClient) {this.httpClient = httpClient;}private long contentLength(final String uri)throws URISyntaxException, IOException, InterruptedException {HttpRequest headRequest = HttpRequest.newBuilder(new URI(uri)).method(HTTP_HEAD, HttpRequest.BodyPublishers.noBody()).version(HttpClient.Version.HTTP_2).build();HttpResponse<String> httpResponse = httpClient.send(headRequest, HttpResponse.BodyHandlers.ofString());OptionalLong contentLength = httpResponse.headers().firstValueAsLong(HEADER_CONTENT_LENGTH);return contentLength.orElse(0L);}public Response download(final String uri, int firstBytePos, int lastBytePos)throws URISyntaxException, IOException, InterruptedException {HttpRequest request = HttpRequest.newBuilder(new URI(uri)).header(HEADER_RANGE, format(RANGE_FORMAT, firstBytePos, lastBytePos)).GET().version(HttpClient.Version.HTTP_2).build();HttpResponse<InputStream> response = httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());return new Response(new BufferedInputStream(response.body()), response.statusCode(), response.headers());}public byte[] download(final String uri, int chunkSize)throws URISyntaxException, IOException, InterruptedException {final int expectedLength = (int) contentLength(uri);int firstBytePos = 0;int lastBytePos = chunkSize - 1;byte[] downloadedBytes = new byte[expectedLength];int downloadedLength = 0;int attempts = 1;while (downloadedLength < expectedLength && attempts < maxAttempts) {Response response;try {response = download(uri, firstBytePos, lastBytePos);} catch (IOException e) {attempts++;err.println(format("I/O error has occurred. %s", e));out.println(format("Going to do %d attempt", attempts));continue;}try (response.inputStream) {byte[] chunkedBytes = response.inputStream.readAllBytes();downloadedLength += chunkedBytes.length;if (isPartial(response)) {System.arraycopy(chunkedBytes, 0, downloadedBytes, firstBytePos, chunkedBytes.length);firstBytePos = lastBytePos + 1;lastBytePos = Math.min(lastBytePos + chunkSize, expectedLength - 1);}} catch (IOException e) {attempts++;err.println(format("I/O error has occurred. %s", e));out.println(format("Going to do %d attempt", attempts));continue;}attempts = 1; // reset attempts counter}if (attempts >= maxAttempts) {err.println("A file could not be downloaded. Number of attempts are exceeded.");}return downloadedBytes;}private boolean isPartial(Response response) {return response.status == HTTP_PARTIAL_CONTENT;}public int maxAttempts() {return maxAttempts;}public void setMaxAttempts(int maxAttempts) {this.maxAttempts = maxAttempts;}public static class Response {final BufferedInputStream inputStream;final int status;final HttpHeaders headers;public Response(BufferedInputStream inputStream, int status, HttpHeaders headers) {this.inputStream = inputStream;this.status = status;this.headers = headers;}}}

Тестирование


Теперь можем написать тест на Junit 5 для проверки скачивания файла. Для примера возьмем рандомный файл в Интернете из доступных без аутентификации: file-examples.com/wp-content/uploads/2017/10/file-example_PDF_1MB.pdf

Сохраним файл во временную директорию. И проверим размер файла.

class WebClientTest {@Testvoid downloadByChunk() throws IOException, URISyntaxException, InterruptedException {WebClient fd = new WebClient();byte[] data = fd.download("https://file-examples.com/wp-content/uploads/2017/10/file-example_PDF_1MB.pdf", 262_144);final String downloadedFilePath = System.getProperty("java.io.tmpdir") + "sample.pdf";System.out.println("File has downloaded to " + downloadedFilePath);Path path = Paths.get(downloadedFilePath);try (OutputStream outputStream = Files.newOutputStream(path)) {outputStream.write(data);outputStream.flush();assertEquals(1_042_157, Files.readAllBytes(Paths.get(downloadedFilePath)).length);Files.delete(path);}}}

Заключение


В этой статье было рассмотрено каким образом реализовать скачивание файла заранее заданными порциями. Для большей гибкости можно подумать о динамическом размере порций, который расширяется и сужается в зависимости от поведения сервера. Также до конца не покрыты возможные исключения, которые можно обработать иначе. Например ошибка 401 Unauthorized или 500 Internal Server Error.

В качестве домашнего задания код можно доработать так, чтобы не выполнять первый запрос на получение размера файла. Также можно реализовать приостановку и возобновление.
Подробнее..

Цикл статей Изучаем VoIP-движок Mediastreamer2 одним pdf-файлом

18.07.2020 14:05:59 | Автор: admin


Здравствуйте, по материалам опубликованного мной ранее цикла статей, я подготовил pdf-файл, который представляет собой книгу с перекрестными ссылками, предметными указателями и т.д. В общей сложности 113 страниц.


Файл можно свободно скачать по ссылке: pdf-файл

Подробнее..

FOSS News 24 обзор новостей свободного и открытого ПО за 612 июля 2020 года

12.07.2020 22:04:29 | Автор: admin


Всем привет!

Продолжаем обзоры новостей свободного и открытого ПО и немного железа. Всё самое главное про пингвинов и не только, в России и мире. Google учредил организацию для поддержки открытых проектов в управлении торговыми марками, сравнительный обзор современных GNU/Linux дистрибутивов, мнение специалиста из Яндекса о прошедшем электронном голосовании (спойлер всё очень плохо), Open Source альтернативы Slack, частичная коммерциализация LibreOffice, Общество интернета выступило против бэкдоров в шифровании и многое другое. Также в этом выпуске добавлен опрос об участии читателей в своих или сторонних Open Source проектах. Просьба поучаствовать если читаете обзоры.

Оглавление


  1. Главные новости
    1. Линус Торвальдс о будущем разработки ядра Linux
    2. Baidu присоединился к инициативе по защите Linux от патентных претензий
    3. Утерянная диссертация Денниса Ритчи
    4. США запретили продавать Windows и iPhone российским военным и полиции
    5. Альтернативная конституция
  2. Короткой строкой
    1. Новости FOSS организаций
    2. Юридические вопросы
    3. Ядро и дистрибутивы
    4. Системное
    5. Специальное
    6. Безопасность
    7. Для разработчиков
    8. Пользовательское
    9. Разное
  3. Релизы
    1. Ядро и дистрибутивы
    2. Системный софт
    3. Для разработчиков
    4. Специальный софт
    5. Игры
    6. Пользовательский софт


Главные новости


Google учредил организацию для управления торговыми марками открытых проектов





OpenNET пишет: Компания Google учредила новую некоммерческую организацию Open Usage Commons, призванную защищать идентичность открытых проектов и оказывать помощь по управлению торговыми марками (название проекта и логотип), формированию правил по использованию торговых марок и проверке их выполнения. Целью организации является расширение философии и определения Open Source на торговые марки.

Подробности

Насколько современные Линуксы отличаются друг от друга





На Хабре вышла статья от автора с почти 15-летним опытом работы с GNU/Linux, в которой он на основе своего опыта сравнивает (поверхностно достаточно, но тем не менее) современные дистрибутивы. В материале показана эволюция ядра Линукс, выраженная в количестве строк, количество коммитов в ядро в разрезе компаний, дистрибутивы с точки зрения системного администратора, пользователя и прикладного программиста.

Подробности

Григорий Бакунов об электронном голосовании на голосовании по конституции





В продолжение темы, упомянутой в выпуске 22 habr.com/ru/post/508632, продолжается разбор опыта электронного голосования на выборах в городскую думу в 2019 году и на голосовании по вопросу изменения конституции в 2020. Стенограмма интервью с директором по распространению технологий Яндекса Григорием Бакуновым в эфире Точки на Эхе Москвы опубликована на Хабре. Ну и раз уж система была выложена в открытый доступ, это по теме обзора, хотя был бы рад не касаться. Кратко всё было очень плохо.

Подробности

5 опенсорсных альтернатив Slack для группового чата





На Хабре вышел обзор возможных открытых замен популярному корпоративному мессенджеру Slack. Рассмотрены Mattermost, Zulip, Rocker.Chat, Riot.im, IRC (внезапно). Почему-то правда забыли про Jabber.

Подробности

Разработчики LibreOffice рассматривает варианты коммерциализации разработки, сохраняя свободу распространения





OpenNET пишет: Организация The Document Foundation, курирующая разработку свободного пакета LibreOffice, объявила о грядущих изменениях, касающихся брендинга и позиционирования проекта на рынке. Ожидаемый в начале августа выпуск LibreOffice 7.0, в настоящее время доступный для тестирования в форме кандидата в релизы, планируют распространять как LibreOffice Personal Edition. При этом код и условия распространения останутся прежними, офисный пакет, как и раньше, без ограничений будет доступен бесплатно и всем без исключения, в том числе корпоративным пользователям. Добавление метки Personal Edition призвано упростить продвижение дополнительных коммерческих редакций, которые могут предлагаться сторонними поставщиками. Далее было объявлено про смену Personal Edition на Community Edition.

Подробности (1, 2, 3 (en))

Общество интернета выступило против бэкдоров в шифровании





Новость не относится напрямую к мир FOSS, но затрагивает многий софт и базовые принципы сообществ. SecurityLab пишет: Около ста организаций и экспертов подписали открытое письмо, в котором выступили против принятия в США закона LAEDA. Внесенный на рассмотрение Конгресса США проект закона О правомерном доступе к зашифрованным данным (Lawful Access to Encrypted Data Act, LAEDA) может стать сильнейшим в серии ударов по шифрованию мощнейшему инструменту безопасности online. Об этом сообщается в открытом письме, опубликованном в Сети международной организацией Общество интернета (Internet Society, ISOC), занимающейся развитием и обеспечением доступности интернета и насчитывающая более 20 тысяч участников и более 100 организаций-членов в 180 странах мира. Под письмом, адресованном авторам законопроекта, уже подписалось порядка ста общественных организаций, технологических компаний, торговых ассоциаций и специалистов в области информационной безопасности.

Подробности

Короткой строкой



Новости FOSS организаций


  1. Google и Canonical реализовали во Flutter возможность создания десктоп-приложений для Linux []
  2. Компания SUSE объявила о покупке Rancher Labs []
  3. Мастер-курсы по Istio и Kafka, книга про Python и немного про навыки веб-разработки. Полезные ссылки на живые мероприятия, видео, митапы и техтолки от RedHat []
  4. Дистанционный курс: Администрирование ОС Альт. Часть 2. С 15 по 17 июля 2020 []
  5. Разработчики ядра Linux рассматривают переход к использованию инклюзивных терминов [ 1, 2 (en)]


Юридические вопросы


  1. Всё о CLA и DCO: подробный материал о документах, формализующих процесс участия разработчиков в сторонних программных продуктах [ (en)]


Ядро и дистрибутивы


  1. Предложение по обсуждению вопроса добавления в ядро Linux средств для разработки на языке Rust []
  2. Проект Gentoo опубликовал сборку для мобильных устройств, поставляемых с Android []
  3. CentOS запустил репозиторий с RealTime-пакетами, развиваемыми для RHEL 8.3 []
  4. OpenBSD начал формирование сборок для архитектуры powerpc64 []
  5. Прекращена LTS-поддержка Debian 8.0 jessie []
  6. Btrfs станет файловой системой по умолчанию в Fedora? Fedora 33 начинает тестирование переключения на Btrfs [ (en)]


Системное


  1. В Reiser5 анонсирована поддержка выборочной миграции файлов []


Специальное


  1. Microsoft запустил сервис выявления руткитов для Linux [ 1, 2]
  2. Создан форк VKD3D для улучшения поддержки Direct3D 12 в Proton []
  3. Новая система оптического распознавания текста EasyOCR []
  4. Сверхточный Raspberry PI Stratum 1 NTP сервер []
  5. Настраиваем DRBD для репликации хранилища на два CentOS 7 сервера []


Безопасность


  1. Mozilla приостановила работу сервиса Firefox Send из-за вредоносной активности []
  2. Уязвимость в SSH-клиентах OpenSSH и PuTTY []
  3. Уязвимости в libc и IPv6-стеке FreeBSD []
  4. Digicert отзывает 50 тысяч TLS-сертификатов с расширенной верификацией []


Для разработчиков


  1. Блокируем заливку приватных ключей, архивов, больших файлов и не только в Gitlab CE []
  2. Портирование приложений с QWidget на QML под Desktop []
  3. В чём сила дашбордов, как тестировать JS-библиотеки и чего стоит выпустить собственный фреймворк в open source []
  4. Разработка критически важных алгоритмов: проектирование [] и реализация []
  5. Автоматизация сетевых сервисов или как собрать виртуальную лабораторию при помощи OpenDaylight, Postman и Vrnetlab []
  6. Руководство для начинающих: создаем DevOps-пайплайн []
  7. Гайд по DevOps для начинающих []
  8. Простое создание Kubernetes-операторов с shell-operator: прогресс проекта за год []
  9. readable еще один линтер для PHP []
  10. Serverless приложения быстрее и проще вместе с OpenShift []
  11. Microsoft не станет заниматься поддержкой PHP 8.0 для Windows []
  12. Как я простые циклы искал []


Пользовательское


  1. Установка Deepin DE в Ubuntu []
  2. Как исправить read-only file system? []
  3. Медиаплеер MPV прекращает поддержку GNOME []
  4. В Firefox 80 реализована настройка для перенаправления с HTTP на HTTPS []
  5. Как использовать eopkg для управления пакетами в Solus Linux [ (en)]
  6. Как включить поддержку Snap приложений в Linux Mint 20 (если вам действительно нужен Snap) [ (en)]
  7. Встречайте RecApp, новое приложение для записи экрана для GNU/Linux [ (en)]


Разное


  1. Загружаем последнее ядро Linux с дискеты на 486-м компьютере []
  2. Какой компьютер у Линуса Торвальдса []
  3. Встраиваемый компьютер AntexGate. От прототипа к серийному производству []
  4. Связанное с информационной безопасностью сообщество отказалось менять термины white hat и black hat []


Релизы



Ядро и дистрибутивы


  1. Выпуск дистрибутива NomadBSD 1.3.2 []
  2. Выпуск дистрибутива Clonezilla Live 2.6.7 []
  3. Выпуск дистрибутива Slackel 7.3 []
  4. Релизы ALT Server и Workstation [ 1, 2, 3, 4]


Системный софт


  1. Выпуск рабочего стола MaXX 2.1, адаптации IRIX Interactive Desktop для Linux [ 1, 2]
  2. Выпуск nginx 1.19.1 и njs 0.4.2 []
  3. Выпуск проприетарного драйвера NVIDIA 450.57 для Linux, FreeBSD и Solaris []
  4. Выпуск SMTP-сервера Sendmail 8.16.1 []
  5. Выпуск SFTP-сервера SFTPGo 1.0 []
  6. Выпуск системы инициализации sysvinit 2.97 []


Для разработчиков


  1. Вышел GitLab 13.1 с управлением оповещениями, качеством кода и улучшениями для безопасности и соответствия требованиям []


Специальный софт


  1. Опубликован F3D 1.0, компактный просмотрщик 3D-моделей []
  2. Значительный релиз HestiaCP 1.2.0 []
  3. Выпуск P2P-платформы GNUnet 0.13. Продвижение GNS в качестве интернет-стандарта []
  4. Обновление Tor 0.3.5.11, 0.4.2.8 и 0.4.3.6 с устранением DoS-уязвимости []


Игры


  1. Выпуск Minetest 5.3.0, открытого клона игры MineCraft [ 1, 2]


Пользовательский софт


  1. Обновление Firefox 78.0.2 []
  2. Июльское обновление приложений KDE 20.04.3 []
  3. Выпуск интегрированного набора интернет-приложений SeaMonkey 2.53.3 []





На этом всё, до следующего воскресенья!

Высказываю большое спасибо OpenNET, много новостных материалов и сообщений о новых релизах взято с их сайта.

Если кто интересуется составлением обзоров и имеет время и возможность помочь буду рад, пишите по контактам, указанным в моём профиле, или в личные сообщения.

Подписывайтесь на наш Telegram канал или RSS чтобы не пропустить новые выпуски FOSS News.

Предыдущий выпуск

P.S.: Для повышения актуальности опросов и поиска новых источников решил спросить аудиторию об участии в своих или сторонних FOSS проектах. Просьба поучаствовать, см. ниже.
Подробнее..

FOSS News 25 обзор новостей свободного и открытого ПО за 1319 июля 2020 года

19.07.2020 18:07:47 | Автор: admin


Всем привет!

Продолжаем обзоры новостей свободного и открытого ПО и немного железа. Всё самое главное про пингвинов и не только, в России и мире. GitHub сделал арктическую резервную копию всего значимого открытого кода, OpenCV анонсировал специализированный одноплатник, необычная история разработки синтезатора речи, недорогой ноутбук с широкой поддержкой дистрибутивов GNU/Linux, расследование кражи софта для продажи в рамках импортозамещения, дискуссионный пост о дивном новом цифровом мире и многое другое.

Оглавление


  1. Главные новости
    1. GitHub сохранил архив открытого кода в арктическом хранилище
    2. Проект OpenCV анонсировал похожие на Raspberry Pi наборы для реализации встраиваемых ИИ решений
    3. Как слепой разработчик в одиночку создала синтезатор речи
    4. Для недорогого ноутбука Star Lite Mk III доступны на выбор шесть дистрибутивов Linux
    5. Расследование: создатель AlterOffice украл код у Microsoft и рвётся назад в реестр
    6. Больше не user friendly: как интернет-монополии убивают конкуренцию и превращают пользователей в товар
  2. Короткой строкой

    1. Новости FOSS организаций
    2. DIY
    3. Юридические вопросы
    4. Ядро и дистрибутивы
    5. Системное
    6. Специальное
    7. Безопасность
    8. Для разработчиков
    9. Пользовательское
    10. Разное
  3. Релизы
    1. Ядро и дистрибутивы
    2. Системный софт
    3. Для разработчиков
    4. Специальный софт
    5. Пользовательский софт

Главные новости


GitHub сохранил архив открытого кода в арктическом хранилище




OpenNET пишет GitHub объявил о воплощении проекта по созданию архива открытых исходных текстов, размещённого в арктическом хранилище Arctic World Archive, способного уцелеть в случае наступления глобальной катастрофы. 186 плёночных накопителей piqlFilm, которые содержат фотоснимки информации и позволяют сохранять информацию более 1000 лет (по другим данным срок службы составляет 500 лет), успешно размещены в подземном хранилище на острове Шпицберген. Хранилище создано из заброшенной угольной шахты глубиной 150 метров, достаточной чтобы обеспечить сохранность информации даже в случае применения ядерного или электромагнитного оружия. В архиве сохранено около 21 ТБ информации, представляющей код многих открытых проектов, размещённых на GitHub.

Подробности

Проект OpenCV анонсировал похожие на Raspberry Pi наборы для реализации встраиваемых ИИ решений




Its FOSS пишет: Проект OpenCV анонсировал проект OAK (OpenCV AI Kit) подобный Raspberry Pi одноплатник, нацеленный на задачи компьютерного зрения. Кампания в поддержку ведётся на Kickstarter. Софт лицензирован под MIT, железо основано на чипе Myriad X Начальная цель в 20 000 долларов была выполнена за 20 минут OAK-1 включает 4K ИИ модуль камеры, а OAK-D модуль из трёх камер. OAK-1 и OAK-D продаются за 99$ и 149$ соответственно, после завершения кампании стоимость будет 199$ и 299$.

Подробности (en)

Страница на Kickstarter (en)

Как слепой разработчик в одиночку создала синтезатор речи




История разработки уникального софта всегда интересна, особенно если сложный софт был сделан в одиночку, ещё и человеком, для которого эта разработка существенно сложнее чем многим. Новая статья на Хабре как раз о такой истории: Мы все, так или иначе, сталкивались с пользователями, имеющими проблемы зрения. Отвечающие за UI, не важно сайта, мобильного приложения или любого другого софта, скорее всего, знают про необходимость учитывать потребности таких людей и поэтому делали режимы повышенной контрастности, увеличенные шрифты и так далее. А что, если пользователь совсем слепой и все эти режимы никак не упрощают его жизнь? Здесь на арену выходят программы для чтения экрана и синтезаторы звука, без которых им не обойтись. И вот про один из них я бы хотел вам сегодня рассказать. Называется от RhVoice и упоминался в нескольких публикациях на Хабре. Но знаете ли вы, что многие считают его лучшим бесплатным синтезатором русской (и не только) речи, а написан он в одиночку полностью слепым разработчиком Ольгой Яковлевой? Сегодня восстанавливаем историческую справедливость и немного узнаем про сам синтезатор вообще, и Ольгу в частности.

Подробности

Для недорогого ноутбука Star Lite Mk III доступны на выбор шесть дистрибутивов Linux




3Dnews пишет: Компания Star Labs, базирующаяся в Европе, анонсировала относительно недорогой портативный компьютер Star Lite Mk III, использующий аппаратную платформу Intel и операционную систему с ядром Linux. Ноутбук оборудован 11,6-дюймовым дисплеем на матрице IPS с разрешением 1920 1080 пикселей (формат Full HD). Задействован процессор Pentium Silver N5000 поколения Gemini Lake с четырьмя вычислительными ядрами (1,12,7 ГГц) без поддержки многопоточности и встроенным ускорителем Intel UHD Graphics 605. На выбор доступны шесть Linux-дистрибутивов: Ubuntu 20.04 LTS, Linux Mint 20 Ulyana, Manjaro 20.0 Lysia, elementary OS 5.1.5 Hera, Zorin OS 15.2 Core/Ultimate и MX Linux 19.2 Patito Feo.

Подробности

Расследование: создатель AlterOffice украл код у Microsoft и рвётся назад в реестр




Неприглядная сторона импортозамещения. На Хабре опубликовано расследование одного из продуктов, пытающегося выглядеть российским, но на деле, по мнению автора, являющегося практически полным заимствованием известных LibreOffice, Thunderbird и Microsoft Windows File Manager. Подводя итог, автор пишет: Анализ нового дистрибутива AlterOffice компании ООО Алми Партнер показал, что как и в прошлый раз, их софт лишь клон существующих решений, а не хоть сколько либо значимая российская разработка. Вероятно, парни из Нижнего Новгорода считают Реестр отечественного ПО пристанищем сирых и убогих, куда можно сгрузить всякий шлак в надежде на недальновидность экспертов. Причем, членов экспертного совета они явно держат за дурачков иначе не просто объяснить, почему юрлица, по их мнению, обязаны платить Алми Партнер за чужой и бесплатный софт.

Подробности

Больше не user friendly: как интернет-монополии убивают конкуренцию и превращают пользователей в товар




На дворе 21-й век, капитализм завоевал мир, закусив IT-революцей. Всё становится товаром. Следующая статья не столько про FOSS, сколько вообще про наш дивный новый цифровой мир. Но FOSS стал важной его частью и может продолжать быть либо его подчинённой составной частью, либо осознать себя ростком альтернативного мира. Автор пишет: На смену интернету романтического предпринимательства приходит интернет крупного капитала. Вместо старого-доброго единства ты и я одной крови, гик и юзер, стартапер и пользователь, произошло расслоение на антагонистичные сущности: корпорации против пользователей. Само слово пользователи отражает парадигму ещё старого интернета, когда сервисы ждали людей, которые ими воспользуются. Теперь критерием эффективности интернет-бизнеса становится умение удерживать человека, чтобы пользовать уже его. Современный интернет всё больше опирается не на возможность быть полезным людям, а пользоваться ими. Польза для юзера уже не основная их задача, а инструмент, помогающий приманивать людей побольше и удерживать их подольше, чтобы пользоваться ими.

Подробности

Короткой строкой


Новости FOSS организаций


  1. Openshift 4.5, мастер-курс OpenShift administrators & operations и роботы, наблюдающие за далекими галактиками. Полезные ссылки на живые мероприятия, видео, митапы и техтолки от RedHat []
  2. С 10 по 13 августа состоится онлайн-конференция Open Source Tech Conference []


DIY


  1. babooshka tv, как самодельный видео-показатор сместил точку сборки моих пожилых родителей []
  2. Реализация ARP-спуфинга на Python []
  3. Разработка zond-а для замера скорости интернета []

Юридические вопросы


  1. Open Source сообщества и торговые марки [ (en)]
  2. Обеспечение совместимости с кодом и спецификациями используя программы соответствия товарным знакам [ (en)]
  3. Понимание экспортного контроля США в отношении открытых проектов [ (en)]

Ядро и дистрибутивы


  1. Линус Торвальдс подключился к обсуждению начальной реализации поддержки Rust в ядре Linux []
  2. Установка Deepin DE в Ubuntu []
  3. Как установить один из популярнейших дистрибутивов Linux Mint 20 (простейший способ из возможных) [ (en)]
  4. Как обновить Linux Mint до 20? []
  5. 17-го июля закончилась поддержка Ubuntu 19.10, обновляйтесь до 20.04 как можно скорее [ (en)]
  6. В состав ядра Linux 5.8 приняты рекомендации по инклюзивной терминологии []
  7. Проект GloDroid развивает редакцию Android 10 для PinePhone, Orange Pi и Raspberry Pi []
  8. Редакция смартфона PinePhone с postmarketOS доступна для заказа []
  9. Утверждён переход Fedora Desktop на Btrfs и замена редактора vi на nano []
  10. Из базовой поставки Ubuntu будет удалён компонент для отправки сведений о пакетах []

Системное


  1. Основан Xfce Classic, форк Xfce без декорирования окон на стороне клиента []
  2. Прописываем процедуру экстренного доступа к хостам SSH с аппаратными ключами []
  3. Сравниваем лучшее программное обеспечение для виртуализации в 2020 году: Hyper-V, KVM, vSphere и XenServer []
  4. VPS на Linux с графическим интерфейсом: запускаем сервер VNC на Ubuntu 18.04 []
  5. Используем nftables в Red Hat Enterprise Linux 8 []
  6. Основы Ansible, без которых ваши плейбуки комок слипшихся макарон, часть 2 []
  7. xtables-addons: фильтруем пакеты по странам []

Специальное


  1. LINKa смотри. Система выбора карточек при помощи айтрекера и не только []
  2. Профилирование. Отслеживаем состояние боевого окружения с помощью Redis, ClickHouse и Grafana []
  3. Totum open source конструктор CRM/ERP и произвольных учетных систем (PHP + PgSQL) []
  4. Генератор трафика Cisco TRex: запускаем нагрузочное тестирование сетевых устройств []
  5. Для PostgreSQL подготовлено дополнение AGE для хранения данных в форме графа []
  6. Microsoft опубликовал открытую Linux-версию утилиты мониторинга ProcMon []
  7. Доступна библиотека декодирования изображений SAIL []
  8. В libtorrent добавлена поддержка протокола WebTorrent []
  9. Цикл статей Изучаем VoIP-движок Mediastreamer2 одним pdf-файлом []
  10. Как пользоваться видеотранскодером Handbrake? []

Безопасность


  1. В состав Glibc включено исправление уязвимости в memcpy, подготовленное разработчиками ОС Аврора []

Для разработчиков


  1. Релиз JPype 1.0, библиотеки для доступа к Java-классам из Python []
  2. Объектно-ориентированная альтернатива jquery []
  3. Делаем маршрутизацию (роутинг) на OpenStreetMap. Введение []
  4. Время в логах (о замерах длительных операций по имеющимся логам) []
  5. Как мы автоматизировали весь жизненный цикл серверов []
  6. Код игры Command & Conquer: баги из 90-х. Том второй []

Пользовательское


  1. Аналоги OneNote в Linux []
  2. 10 open source альтернатив Google Photos []
  3. 7 open source альтернатив Skype []
  4. Top 5 лучших Open Source средств для проведения видео конференций [ (en)]
  5. espanso: кроссплатформенный Open Source заменитель текста, который позволит вам печатать быстрее и более продуктивно [ (en)]
  6. Matrix-клиент Riot сменил название на Element [ 1, 2 (en), 3]
  7. Официально запущен сервис Mozilla VPN []
  8. В Chrome 86 будет по умолчанию включено контекстное меню для возвращения полного URL []
  9. В каталоге приложений KDE появилась информация об истории выпусков со ссылками для загрузки сборок []
  10. Подборка улучшений в KDE за прошлую неделю []
  11. Дополнение Firefox Multi-Account Containers получило поддержку изоляции сайтов []


Разное


  1. Энтузиасты из Pine64 анонсировали Linux-смартфон со сменными образами ОС на картах памяти []
  2. Вышел Linux-смартфон за $200, который можно использовать как десктоп []

Релизы


Ядро и дистрибутивы


  1. Nokia представила сетевую операционную систему SR Linux для маршрутизаторов []
  2. Выпуск дистрибутива EndeavourOS 2020.07.15, продолжившего развитие проекта Antergos []

Системный софт


  1. Доступен GNU Autoconf 2.69b для тестирования изменений, потенциально нарушающих совместимость []
  2. Релиз оконного менеджера IceWM 1.7 []
  3. Релиз сетевого конфигуратора NetworkManager 1.26.0 []
  4. Выпуск пользовательского окружения Sway 1.5, использующего Wayland [ 1, 2]
  5. Доступен выпуск KDE Frameworks 5.72 []

Для разработчиков


  1. Релиз тикет-системы OTOBO, форка OTRS []

Специальный софт


  1. Обновление Java SE, MySQL, VirtualBox и других продуктов Oracle с устранением уязвимостей []
  2. Выпущены аудиоэффекты LSP Plugins 1.1.24 []
  3. Выпущены VST3 версии плагинов программного гитарного процессора KPP 1.2.1 []
  4. Выпуск VirtualBox 6.1.12 []
  5. Выпуск Wine 5.13 []

Пользовательский софт


  1. Релиз Chrome 84 []
  2. Обновление свободного антивирусного пакета ClamAV 0.102.4 []
  3. Новая версия почтового клиента Claws Mail 3.17.6 []
  4. Выпуск браузера Pale Moon 28.11 []
  5. Выпуск музыкального проигрывателя Tauon Music Box 6.0 []
  6. Выпуск почтового клиента Thunderbird 78 []
  7. Доступны платформы обмена сообщениями Zulip 3.0 и Mattermost 5.25 []



На этом всё, до следующего воскресенья!

Высказываю большое спасибо OpenNET, много новостных материалов и сообщений о новых релизах взято с их сайта.

Если кто интересуется составлением обзоров и имеет время и возможность помочь буду рад, пишите по контактам, указанным в моём профиле, или в личные сообщения.

Подписывайтесь на наш Telegram канал или RSS чтобы не пропустить новые выпуски FOSS News.

Предыдущий выпуск
Подробнее..

FOSS News 26 обзор новостей свободного и открытого ПО за 2026 июля 2020 года

26.07.2020 22:11:54 | Автор: admin


Всем привет!

Продолжаем обзоры новостей свободного и открытого ПО и немного железа. Всё самое главное про пингвинов и не только, в России и мире. Два анонса ноутбуков специально созданных под GNU/Linux, о децентрализованном решении для мессенджера на базе Matrix как альтернативе Telegram, Пингвиний корпус в США ставит GNU/Linux на старые компьютеры и раздаёт желающим для дистанционного обучения во время пандемии, об альтернативном луковом вебе для владельцев ресурсов, ещё раз про игры с пингвинами и многое другое.

Оглавление


  1. Главные новости
    1. Проект KDE представил третье поколение ноутбуков KDE Slimbook
    2. В ноутбуке Tuxedo Pulse 15 соседствуют чип AMD Ryzen и ОС Linux
    3. Почему я использую Matrix вместо Telegram
    4. Студенческий Linux клуб восстанавливает старые компьютеры чтобы помочь нуждающимся обучаться дистанционно
    5. Чесночно-луковый хостинг: как поднять веб-ресурс, чтобы не отобрали домен
    6. Linux Gaming: Кровь, пот и командная строка. Часть 1
  2. Короткой строкой
    1. Новости FOSS организаций
    2. DIY
    3. Юридические вопросы
    4. Ядро и дистрибутивы
    5. Специальное
    6. Безопасность
    7. DevOps
    8. Для разработчиков
    9. Пользовательское
    10. Разное
  3. Релизы
    1. Ядро и дистрибутивы
    2. Системный софт
    3. Безопасность
    4. Для разработчиков
    5. Специальный софт
    6. Пользовательский софт


Главные новости



Проект KDE представил третье поколение ноутбуков KDE Slimbook





OpenNET пишет: Проект KDE представил третье поколение ультрабуков, поставляемых под брендом KDE Slimbook. Продукт разработан при участии сообщества KDE совместно с испанским поставщиком оборудования Slimbook. Программная начинка основана на рабочем столе KDE Plasma, системном окружении KDE Neon на базе Ubuntu и подборкой свободных приложений, таких как графический редактор Krita, система 3D-проектирования Blender, САПР FreeCAD и редактор видео Kdenlive. Все поставляемые в KDE Slimbook приложения и обновления досконально тестируются разработчиками KDE для обеспечения высокого уровня стабильности окружения и совместимости с оборудованием. В отличие от прошлых серий новый KDE Slimbook вместо процессоров Intel оснащён CPU AMD Ryzen 7 4800H с 8 ядрами CPU (16 потоками) и 7 ядрами GPU. Ноутбук предложен в вариантах с экранами 14 и 15.6 дюймов (1920x1080, IPS, 16:9, sRGB 100%). Вес устройств соответственно составляет 1.07 и 1.49 кг, а цена 899 $1039) и 929.90 ($1074). Устройства укомплектованы 250 ГБ M.2 SSD NVME (до 2 ТБ), 8 ГБ ОЗУ (до 64 ГБ), 3 USB-портами, 1 USB-C, HDMI, Ethernet (RJ45) и Wifi 6 (Intel AX200).

Подробности

В ноутбуке Tuxedo Pulse 15 соседствуют чип AMD Ryzen и ОС Linux





И ещё одна новость о специально предназначенных для Linux ноутбуках, 3Dnews пишет: Компания Tuxedo Computers анонсировала ноутбук Pulse 15, построенный на аппаратной платформе AMD. В качестве операционной системы используется Linux-дистрибутив Ubuntu, OpenSUSE или Tuxedo_OS. Портативный компьютер может нести на борту процессор Ryzen 5 4600H (шесть ядер; 3,04,0 ГГц) или Ryzen 7 4800H (восемь ядер; 2,94,2 ГГц). Допускается установка до 64 Гбайт оперативной памяти DDR4-3200. Дисплей с диагональю 15,6 дюйма обладает разрешением 1920 1080 точек. Обработкой графики занят интегрированный контроллер Radeon RX Vega. Доступны интерфейсы: SATA, HDMI 2.0, Wi-Fi 6, Bluetooth 5.1, USB 3.2 Gen1 Type-C, USB 3.2 Gen1 Type-A (2), USB 2.0 Type-A, Gigabit Ethernet, 3,5-мм гнездо для наушников и слот microSD. Размеры 356 234 17 мм, вес приблизительно 1,5 кг. Цена ориентировочно от 900 евро.

Подробности

Почему я использую Matrix вместо Telegram





На Хабре появилась статья от Михаила Подивилова. Он специализируется на сетевых технологиях и преподаёт в Сетевой академии Cisco. По его словам: Matrix замечательный, но недооценённый децентрализованный протокол обмена сообщениями с прилагающимся к нему клиентом Element, который я считаю достойной и жизнеспособной альтернативой Telegram. В статье он рассказывает, почему использует Matrix вместо Telegram, как присоединиться к сети Matrix и настроить свой сервер.

Подробности

Студенческий Linux клуб восстанавливает старые компьютеры чтобы помочь нуждающимся обучаться дистанционно





Очень интересный опыт Пингвиньего корпуса (англ. Penguin Corps) в Миннесоте, США. Цитирую введение от автора: Это было 17 марта 2020 года, и я был в своем классе в Академии Аспена. Часы тикали. Это должен был быть последний день в школе, прежде чем мы, как и все другие государственные школы в Миннесоте, закроемся из-за вспышки нового коронавируса. У меня были ученики в моей комнате во время ланча, консультативных периодов и моих факультативных занятий, которые делали одно и то же устанавливали Linux на старые компьютеры, чтобы мы могли отдавать их ученикам, которые будут использовать их дома Я только собирался помочь детям до завершения работы, но в итоге у нас было 17 готовых компьютеров. Это было начало.

Продолжение (en)

Чесночно-луковый хостинг: как поднять веб-ресурс, чтобы не отобрали домен





На Хабре вышла статья об альтернативном способе размещения своего веб-ресурса: Глобальный DNS прекрасная вещь, пережившая не одно десятилетие. Но у него есть фундаментальная проблема ваш домен могут просто разделегировать, если вдруг решат, что вы что-то нарушили. Ну или у кого-то с деньгами и связями будет на вас зуб. Историю того же torrents.ru все помнят. Если по каким-то причинам вы хотите убрать подобные риски можно посмотреть в сторону оверлейных сетей, у которых просто нет регулятора, способного разделегировать доменное имя. Поэтому будем поднимать onion- и i2p-веб-ресурсы.

Подробности

Linux Gaming: Кровь, пот и командная строка. Часть 1





Игры в Linux тема неутихающих дискуссий вот уже долгое время. И хотя ситуация за последние годы существенно улучшилась (во многом благодаря Steam от Valve), тем не менее вопросов остаётся много. Первая часть статьи о текущем положении дел вышла на DTF, она посвящена истории и теории (ну и немного личным мнением и опытом), а вот вторая часть ожидается более практическая, с различными приемами и выводом.

Подробности

Короткой строкой



Новости FOSS организаций


  1. Учим Tekton Pipelines и смотрим глазами NASA на космос, пока Ansible сам разбирается с нашими container images. Полезные ссылки на живые мероприятия, видео, митапы и техтолки от RedHat []
  2. Linux Foundation анонсировала Cloud Engineer Bootcamp по повышению квалификации системных администраторов до уровня администраторов облачных платформ [ (en)]
  3. В LibreOffice 7.0 решено не использовать метку Personal Edition []
  4. Mozilla воспользовалась push-уведомлениями для распространения политической рекламы в Firefox []
  5. В GNOME предложили учитывать влияние разработки на окружающую среду []


DIY


  1. Теплое ламповое интернет-радио []


Юридические вопросы


  1. Чем для вас опасна MongoDB SSPL лицензия? []


Ядро и дистрибутивы


  1. Почему люди сходят с ума по Arch Linux? Что в нём такого особенного? [ (en)]
  2. 7 новых возможностей в релизе Fedora 33 [ (en)]
  3. Инициатива по созданию сборок GNOME OS для реального оборудования []


Специальное


  1. Выпущен первый релиз Issuer, бота для автоматической модерации issues на GitHub []
  2. NoiseTorch, приложение для подавления шумов микрофона []
  3. Video Trimmer: простое приложение для видеомонтажа на Linux [ (en)]
  4. Как пользоваться программой для видеомонтажа Shotcut []
  5. Создано ПО для работы с геоданными на Эльбрусах c ОС Astra Linux []


Безопасность


  1. OpenSSL и Network Security Services (NSS) две стороны одной медали []
  2. BadPower атака на адаптеры быстрой зарядки, способная вызвать возгорание устройства []
  3. Техника незаметного искажения фотографий для нарушения работы систем распознавания лиц []
  4. В Chrome экспериментируют с прекращением автозаполнения форм, отправляемых без шифрования []
  5. Не по теме FOSS, но может быть интересно инцидент в Twitter, ставший причиной компрометации 130 популярных Twitter-аккаунтов []


DevOps


  1. OpenVPN с двухуровневой иерархией ЦС []
  2. Современные приложения на OpenShift, часть 1: веб-приложения всего за две команды []
  3. OKD4 общедоступный релиз уже здесь []
  4. Интеграция гиперконвергентной Росплатформы на HPE Synergy с СХД 3PAR []
  5. Устанавливаем балансировщик нагрузки HAProxy на CentOS []
  6. Управляем сетевыми подключениями в Linux с помощью консольной утилиты nmcli []
  7. Docker Compose: от разработки до продакшена []
  8. Разрабатываем самый удобный в мире* интерфейс для просмотра логов []


Для разработчиков


  1. Как Open Source разработка обеспечивает план по достижению цифрового доверия, безопасности и успешной удалённой работы [ (en)]
  2. Альтернативы Dreamweaver: 5 Open Source HTML и CSS редакторов для веб разработчиков и дизайнеров [ (en)]
  3. Избавляемся от технического долга с помощью Open Source [ (en)]
  4. Массивы bash, краткое руководство []
  5. Разработчики из The Qt Company опубликовали сборки Qt Creator, подготовленные с использованием CMake []


Пользовательское


  1. Как сделать загрузочную флешку Ubuntu? []
  2. Команда less в Linux []
  3. Установка Linux Mint 20 []
  4. В KWin Wayland добавлены запись экрана и поддержка менеджеров буфера обмена []
  5. Konsole в 2020 []


Разное


  1. В звуковой подсистеме ALSA проведена работа по избавлению от термина slave []
  2. Геймдев и кризис []
  3. Сравниваем подсистемы WSL 1 и WSL 2. Стоит ли переходить? []
  4. Энтузиасты установили Steam на Raspberry Pi 4 и смогли запустить там некоторые игры []


Релизы



Ядро и дистрибутивы


  1. Финальное обновление Debian 9.13 []
  2. Выпуск Chrome OS 84 []
  3. Доступен дистрибутив SUSE Linux Enterprise 15 SP2 []
  4. Выпуск дистрибутива GeckoLinux 152 []
  5. Выпуск дистрибутивов KaOS 2020.07 и Laxer OS 1.0 []


Системный софт


  1. Выпуск дисплейного сервера Mir 2.0 []
  2. Выпуск графического тулкита wxWidgets 3.1.4 []


Безопасность


  1. Представлена новая утилита очень быстрого сканирования портов RustScan []
  2. Выпуск REMnux 7.0, дистрибутива для анализа вредоносного ПО []


Для разработчиков


  1. Выпуск GNU Binutils 2.35 []
  2. Обновление набора компиляторов GCC 10.2 []
  3. Выпуск генератора лексических анализаторов re2c 2.0 []
  4. Обновление Python 3.8.5 с устранением уязвимостей []
  5. Выпуск языка программирования Rust 1.45 []
  6. Релиз системы сборки CMake 3.18 []


Специальный софт


  1. booty утилита для создания загрузочных образов и накопителей []
  2. Выпуск free5GC 3.0.3, открытой реализации компонентов опорной сети 5G []
  3. Доступны PeerTube 2.3 и WebTorrent Desktop 0.23 []
  4. Вышла новая версия медиасервера Jellyfin v10.6.0 []
  5. digiKam 7.0.0 []


Пользовательский софт


  1. Выпуск файлового менеджера Midnight Commander 4.8.25 []





На этом всё, до следующего воскресенья!

Высказываю большое спасибо OpenNET, много новостных материалов и сообщений о новых релизах взято с их сайта.

Если кто-то интересуется составлением обзоров и имеет время и возможность помочь буду рад, пишите по контактам, указанным в моём профиле, или в личные сообщения.

Подписывайтесь на наш Telegram канал или RSS чтобы не пропустить новые выпуски FOSS News.

Также вам может быть интересен июльский выпуск Linux Foundation Newsletter (en). Кроме того, вышел новый номер близкого нам обзора от единомышленников Новости из мира Linux #18. openSuse 15.2, проект Freta от Microsoft, MX Linux выбрал KDE Plasma....

Предыдущий выпуск
Подробнее..

FOSS News 27 обзор новостей свободного и открытого ПО за 27 июля 2 августа 2020 года

03.08.2020 22:10:54 | Автор: admin


Всем привет!

Прошу извинить за задержку с выпуском, возникли неотложные дела. Итак, продолжаем обзоры новостей свободного и открытого ПО и немного железа. Всё самое главное про пингвинов и не только, в России и мире. Перевод интервью с разработчиком GNOME о будущем проекта, отчёт фонда Apache, советы по продвинутому использованию Git, открытие регистрации на конференцию Linux Vacation / Eastern Europe, небольшая подборка о переходе европейских организаций на FOSS и многое другое.

Оглавление


  1. Главные новости
    1. От первого лица: разработчик GNOME рассказал о новой идеологии и будущих улучшениях юзабилити
    2. Фонд Apache опубликовал отчёт за 2020 финансовый год
    3. В одной лодке с ублюдком: 11 продвинутых советов по использованию Git
    4. Открыта регистрация на конференцию LVEE 2020 Online Edition
    5. Как Европа переходит на открытое ПО для госучреждений
  2. Короткой строкой
    1. Новости FOSS организаций
    2. Ядро и дистрибутивы
    3. Системное
    4. Специальное
    5. Безопасность
    6. DevOps
    7. Для разработчиков
    8. Пользовательское
    9. Игры
    10. Железо
    11. Разное
  3. Релизы
    1. Ядро и дистрибутивы
    2. Системный софт
    3. Безопасность
    4. Для разработчиков
    5. Специальный софт
    6. Игры
    7. Пользовательский софт


Главные новости



От первого лица: разработчик GNOME рассказал о новой идеологии и будущих улучшениях юзабилити





Разработчик Эммануэле Басси уверен, что с новыми обновлениями юзабилити рабочего стола GNOME станет более гибким и удобным, пишут в переводе интервью с OpenSource.com на Хабре.
Вот примеры вопросов, на которые там даны ответы:

  1. GNOME 3.36 вышел в марте 2020 года. О каких его особенностях обязательно нужно знать?
  2. Какие фичи GNOME недооценены или пока остаются незамеченными?
  3. Какие функции GNOME наиболее полезны в повседневной работе?
  4. Что интересного ждать от GNOME 3.37 и от GNOME 3.38, который запланирован на сентябрь 2020 года?


Подробности

Фонд Apache опубликовал отчёт за 2020 финансовый год





OpenNET пишет: Фонд Apache представил отчёт за 2020 финансовый год (c 1 мая 2019 по 30 апреля 2020 года). Объём активов за отчётный период составил 3.5 млн долларов, что на 300 тысяч меньше, чем за 2019 финансовый год. Размер собственного капитала за год уменьшился на 281 тысячу долларов и составил 2.16 млн долларов. Большая часть средств получена от спонсоров в настоящее время насчитывается 10 платиновых спонсоров, 9 золотых, 11 серебряных и 25 бронзовых, а также 24 спонсора целевых проектов и 500 индивидуальных спонсора. Также в статье по ссылке приведено больше интересной статистики про этот один из крупнейших FOSS фондов.

Подробности

В одной лодке с ублюдком: 11 продвинутых советов по использованию Git





На Хабре появилась статья о использовании популярнейшей и при этом свободной системе контроля версий Git. В материале подняты темы продвинутого использования консольного и графического интерфейса, конфигурационных файлов, временных коммитов, возможностей по скрытию лишних файлов, отслеживания локальных файлов без репозитория и многие другие.

Подробности

Открыта регистрация на конференцию LVEE 2020 Online Edition





OpenNET пишет: Открыта регистрация на международную конференцию разработчиков и пользователей свободного ПО Linux Vacation / Eastern Europe, которая пройдёт 2730 августа. В этом году конференция пройдет в режиме онлайн и займет четыре неполных дня. Участие в онлайн-версии LVEE 2020 бесплатное. Формат конференции включает главным образом доклады и краткие выступления; возможны также круглые столы, workshopы и код-спринты. В тематику докладов входит разработка и сопровождение свободного ПО, внедрение и администрирование решений на основе свободных технологий, особенности использования свободных лицензий. Конференция охватывает широкий круг платформ от рабочих станций и серверов до встраиваемых систем и мобильных устройств.

Подробности (1, 2)

Как Европа переходит на открытое ПО для госучреждений





Мюнхен, Барселона и CERN показывают интересный опыт перехода на FOSS, пишут на Хабре.

В государственных учреждениях Мюнхена переход на Open source начался более 15 лет назад. Считается, что толчком к этому стало прекращение поддержки Windows NT 4.0. Мюнхен начал разработку собственного дистрибутива LiMux. Но хотя и были достигнуты неплохие результаты (15 000 рабочих станций переведены на открытый дистрибутив), переход на Open Source шёл не так гладко, как планировалось. Был даже период отката в связи со сменой власти. Но в 2020 с новой сменой власти и с развёртыванием кампании Общие деньги, общий код всё снова пошло вперёд и есть надежды что до новых выборов в 2026 успеют сделать многое.

Примечателен опыт и Барселоны: До 70% IT-бюджета Барселоны уходит на поддержку местных разработчиков и развитие открытых проектов. Многие из них внедряют не только по всей Испании, но и по всему миру например, платформу Sentilo Platform для анализа данных со счетчиков и датчиков погоды используют в городе Тарраса, а также Дубае и Японии.

В 2019 году на Open Source решили перейти и в CERN, а в Европарламенте вообще рекомендуют всем правительственным организациям переходить на свободное программное обеспечение.
Будем надеяться увидеть всё больше подобных позитивных примеров.

Подробности

Короткой строкой



Новости FOSS организаций


  1. Подборка полезных ссылок по OpenShift 4.5, книга Kubernetes Operators и вебинар про Container Storage. Полезные ссылки на живые мероприятия, видео, митапы и техтолки от RedHat []
  2. Примите участие в опросе для FOSS профессионалов и для HR-специалистов 2020 Open Source Jobs Report! [ (en)]
  3. OpenJDK переходит на использование Git и GitHub []
  4. Компания Micrоsoft стала участником Blender Development Fund []


Ядро и дистрибутивы


  1. Во FreeBSD существенно оптимизированы операции поиска в VFS []
  2. ArchLinux: производительность превыше всего []
  3. Manjaro vs Arch Linux: В чём разница? Что лучше? [ (en)]


Системное


  1. Компания System76 занялась портированием CoreBoot для платформ AMD Ryzen []
  2. Google начал открытие реализации модели потоков M:N []
  3. В обновлении GRUB2 выявлена проблема, приводящая к невозможности загрузки []
  4. Bitdefender открыла код технологии интроспекции гипервизора HVI []
  5. KDE Plasma 5.19.4. Корректирующий релиз []


Специальное


  1. Какие есть открытые ОС для сетевого оборудования []
  2. Pi-KVM проект открытого KVM-коммутатора на Raspberry Pi []
  3. IBM открыл тулкит гомоморфного шифрования для Linux [ 1, 2]
  4. BigBlueButton: ПО для онлайн обучения [ (en)]
  5. Как освободить умные часы Garmin от облачных сервисов, которые не работают из-за атаки []


Безопасность


  1. В ходе атаки Meow удалено около 4000 общедоступных БД Elasticsearch и MongoDB []
  2. Раскрыты данные о двух 0-day уязвимостях в Tor и Tor Browser []
  3. GitHub ограничит доступ к Git аутентификацией по токенам и SSH-ключам []
  4. В Perl-пакете Module-AutoLoad выявлен вредоносный код []
  5. Chrome-дополнение с миллионной аудиторией уличено в подстановке рекламы в результаты поиска Google []
  6. Критическая уязвимость в загрузчике GRUB2, позволяющая обойти UEFI Secure Boot [ 1, 2, 3]
  7. Уязвимость в KDE Ark, позволяющая перезаписать файлы при открытии архива []
  8. Уязвимости в X.Org Server и libX11 []
  9. Критическая уязвимость в WordPress-плагине wpDiscuz, насчитывающем 80 тысяч установок []


DevOps


  1. Основы Ansible, без которых ваши плейбуки комок слипшихся макарон, часть 3 []
  2. VPS на Linux с графическим интерфейсом: запускаем сервер RDP на Ubuntu 18.04 []
  3. Использование таймеров systemd вместо заданий cron []
  4. Последнее обновление CentOS ломает GRUB2-efi загрузчики []
  5. Побег из привилегированных Docker-контейнеров []
  6. Дружим Docker и dnscrypt-proxy []
  7. Eще один бэкап больше, чем скрипт, проще, чем система []


Для разработчиков


  1. Если ты видишь статью, что язык Х быстрее, чем язык Y можешь закрывать статью []
  2. Как изучить Android за 3 года, или История одного приложения []
  3. Как писать хорошие библиотеки под Angular []
  4. Делаем маршрутизацию (роутинг) на OpenStreetMap. Добавляем поддержку односторонних дорог []
  5. Контрибьютим в Swift []
  6. В Redox OS появилась возможность отладки программ при помощи GDB []
  7. Rust вошёл в 20 самых популярных языков по рейтингу Redmonk []
  8. Google и команда разработчиков Ubuntu анонсировали приложения на Flutter для десктопных Linux систем []
  9. CVE и квадратная вероятность []
  10. Создание образа Ubuntu для ARM from scratch []
  11. Как можно и как нельзя использовать нулевой указатель в С++ []
  12. Альфа-версия Flutter для Linux и разработка настольных приложений []


Пользовательское


  1. Поиск больших файлов Linux []
  2. Как сменить владельца папки Linux []
  3. Команда top в Linux []
  4. Мультизагрузочная флешка с несколькими ОС Linux []
  5. В Chrome добавлена поддержка отложенной загрузки iframe-блоков []
  6. Как установить последнюю версию видео-конвертера Handbrake на основанные на Ubuntu GNU/Linux дистрибутивы [ (en)]
  7. Как установить мессенджер Discord в Ubuntu и другие дистрибутивы (3 метода) [ (en)]
  8. Как установить Google Chrome в GNU/Linux дистрибутивы основанные на Arch Linux [ (en)]


Игры


  1. Тяжело ли в 2020 году играть на Linux? []


Железо


  1. Возобновлен предзаказ на ноутбуки Pinebook Pro Linux Laptop []


Разное


  1. Облачный TL;DR: что даёт open source, почему разработчики дороже денег и пара слов о личной ИБ []
  2. Скорость разработки: как высокое качество ПО обеспечивает успешность бизнеса [ (en)]
  3. История успеха: Linux System Administration тренинг и сертификация ведут к новому шагу в карьере (интервью) [ (en)]


Релизы



Ядро и дистрибутивы


  1. Доступна версия ядра Linux 5.8 Самый большой релиз всех времён [ 1, 2, 3 (en)]
  2. Выпуск дистрибутивов Альт Рабочая станция, Альт Сервер и Альт Образование 9.1 [ 1, 2]
  3. Доступен дистрибутив для создания межсетевых экранов OPNsense 20.7 []
  4. Обновление Debian 10.5 []
  5. 4MLinux миниатюрный дистрибутив []


Системный софт


  1. Обновление оконного менеджера xfwm4 4.14.3 []
  2. Выпуск гипервизора Xen 4.14 []
  3. Выпуск GTK 3.99.0 ознаменовал готовность функциональности, запланированной для GTK 4 []
  4. Выпуск системного менеджера systemd 246 [ 1, 2]
  5. Опубликован пакет wayland-utils 1.0.0 []
  6. Выпуск Wine 5.14 []
  7. Релиз рабочего окружения Enlightenment 0.24.2 []


Безопасность


  1. Релиз дистрибутива Tails 4.9 и Tor Browser 9.5.3 []


Для разработчиков


  1. Новая версия Git 2.28, позволяющая не использовать имя master для основных веток []
  2. Обновление JPype 1.0.2, библиотеки для доступа к Java-классам из Python []


Специальный софт


  1. Выпуск программы для профессиональной обработки фотографий Darktable 3.2 []
  2. Релиз платформы для распределённой обработки данных Apache Hadoop 3.3 []


Игры


  1. fheroes2 0.8 []
  2. FreeOrion 0.4.10 Python 3 [ 1, 2]


Пользовательский софт


  1. Выпуск программы для управления фотографиями digiKam 7.0 []
  2. Релиз Telegram Desktop 2.2 [ 1, 2]
  3. Релиз Firefox 79 [ 1, 2]
  4. Обновление почтового клиента Thunderbird 78.1 с включением поддержки OpenPGP [ 1, 2]
  5. Выпуск текстового редактора GNU nano 5.0 [ 1, 2, 3 (en)]
  6. Обновление виджета Event Calendar []





На этом всё, до следующего воскресенья!

Высказываю большое спасибо OpenNET, много новостных материалов и сообщений о новых релизах взято с их сайта.

Если кто интересуется составлением обзоров и имеет время и возможность помочь буду рад, пишите по контактам, указанным в моём профиле, или в личные сообщения.

Подписывайтесь на наш Telegram канал или RSS чтобы не пропустить новые выпуски FOSS News.

Предыдущий выпуск
Подробнее..

Разрабатываем самый удобный в мире интерфейс для просмотра логов

22.07.2020 18:16:54 | Автор: admin

Если Вам приходилось когда-нибудь пользоваться веб-интерфейсами для просмотра логов, то Вы наверняка замечали, насколько, как правило, эти интерфейсы громоздки и (зачастую) не слишком-то удобны и отзывчивы. К некоторым можно привыкнуть, некоторые совсем ужасны, но, как мне кажется, причина всех проблем заключается в том, что мы неправильно подходим к задаче просмотра логов: мы пытаемся создать веб-интерфейс там, где лучше работает CLI (интерфейс командной строки). Мне лично очень комфортно работать с tail, grep, awk и прочими, и поэтому для меня идеальным интерфейсом для работы с логами было бы что-то аналогичное tail и grep, но которое при этом можно было использовать для чтения логов, которые пришли с множества серверов. То есть, очевидно, читать их из ClickHouse :).


*по личному мнению хабрапользователя youROCK


Встречайте logscli


Я не придумал названия своему интерфейсу, и, сказать честно, он скорее существует в виде прототипа, но если Вы хотите сразу посмотреть исходники, то добро пожаловать: https://github.com/YuriyNasretdinov/logscli (350 строк отборного кода на Go).


Возможности


Я ставил перед собой цель сделать интерфейс, который будет казаться знакомым тем, кто привык к tail/grep, то есть поддерживать следующие вещи:


  1. Просмотр всех логов, без фильтрации.
  2. Оставить строки, в которых содержится фиксированная подстрока (флаг -F у grep).
  3. Оставить строки, подходящие под регулярное выражение (флаг -E у grep).
  4. По умолчанию просмотр в обратном хронологическом порядке, поскольку обычно в первую очередь интересны самые свежие логи.
  5. Показ контекста возле каждой строки (параметры -A, -B и -C у grep, печатающие N строк до, после, и вокруг каждой совпадающей строки соответственно).
  6. Просмотр поступающих логов в режиме реального времени, с фильтрацией и без (по сути tail -f | grep).
  7. Интерфейс должен быть совместим с less, head, tail и прочими по умолчанию должны возвращаться результаты без ограничений по их количеству; строки печатаются потоково до тех пор, пока пользователь заинтересован в их получении; сигнал SIGPIPE должен молча прерывать стриминг логов, также, как это делают tail, grep и остальные UNIX-утилиты.

Реализация


Я буду предполагать, что вы уже каким-то образом умеете доставлять логи до ClickHouse. Если нет, то рекомендую попробовать lsd и kittenhouse, а также эту статью про доставку логов.


Для начала нужно определиться со схемой базы. Поскольку логи обычно хочется получать отсортированными по времени, то представляется логичным так их и хранить. Если категорий логов много и они все однотипные, то можно в качестве первой колонки первичного ключа сделать категорию логов это позволит иметь одну таблицу вместо нескольких, что при вставке в ClickHouse будет большим плюсом (на серверах с жёсткими дисками рекомендуется вставлять данные не чаще ~1 раза в секунду на весь сервер).


То есть, нам нужна примерно следующая схема таблиц:


CREATE TABLE logs(    category LowCardinality(String), -- категория логов (опционально)    time DateTime, -- время события    millis UInt16, -- миллисекунды (могут быть и микросекунды, и т.д.): рекомендуется хранить, если событий много, чтобы было легче различать события между собой    ..., -- ваши собственные поля, например имя сервера, уровень логирования, и так далее    message String -- текст сообщения) ENGINE=MergeTree()ORDER BY (category, time, millis)

К сожалению, я не смог сразу найти каких-либо открытых источников с реалистичными логами, которые можно было бы взять и скачать, поэтому я взял вместо этого для примера отзывы от товарах из Amazon до 2015 года. Безусловно, их структура не совсем такая же, как у текстовых логов, но для иллюстрации это не принципиально.


инструкция по заливке отзывов Amazon в ClickHouse

Создадим таблицу:


CREATE TABLE amazon(   review_date Date,   time DateTime DEFAULT toDateTime(toUInt32(review_date) * 86400 + rand() % 86400),   millis UInt16 DEFAULT rand() % 1000,   marketplace LowCardinality(String),   customer_id Int64,   review_id String,   product_id LowCardinality(String),   product_parent Int64,   product_title String,   product_category LowCardinality(String),   star_rating UInt8,   helpful_votes UInt32,   total_votes UInt32,   vine FixedString(1),   verified_purchase FixedString(1),   review_headline String,   review_body String)ENGINE=MergeTree()ORDER BY (time, millis)SETTINGS index_granularity=8192

В датасете Амазона есть только дата для отзыва, но нет точного времени, поэтому заполним эти данные рандоном.


Можно не скачивать все tsv-файлы и ограничиться первыми ~10-20, чтобы уже получить достаточно большой набор данных, который не влезет в 16 Гб оперативной памяти. Для заливки TSV-файлов я использовал следующую команду:


for i in *.tsv; do    echo $i;    tail -n +2 $i | pv |    clickhouse-client --input_format_allow_errors_ratio 0.5 --query='INSERT INTO amazon(marketplace,customer_id,review_id,product_id,product_parent,product_title,product_category,star_rating,helpful_votes,total_votes,vine,verified_purchase,review_headline,review_body,review_date) FORMAT TabSeparated'done

На стандартном Persistent Disk (который HDD) в Google Cloud размером в 1000 Гб (такой размер я взял в основном для того, чтобы скорость была чуть выше, хотя, возможно SSD нужного объема вышел бы дешевле :)) скорость заливки составила примерно ~75 Мб/сек на 4 ядрах.


  • должен оговориться, что я работаю в Google, но я использовал личный аккаунт и эта статья к моей работе в компании отношения не имеет

Все иллюстрации я буду производить именно с этим датасетом, поскольку это всё, что у меня было под рукой :)).


Показ прогресса сканирования данных


Поскольку в ClickHouse мы будем использовать full scan по таблице с логами, а эта операция может занимать существенное время и долго не отдавать никаких результатов, если совпадений найдено мало, желательно уметь показывать прогресс выполнения запроса до получения первых строк с результатом. Для этого в HTTP-интерфейсе есть параметр, позволяющий отдавать прогресс в заголовках HTTP: send_progress_in_http_headers=1. К сожалению, стандартная библиотека Go не умеет читать заголовки по мере их получения, но интерфейс HTTP 1.0 (не путайте с 1.1!) поддерживается ClickHouse, поэтому можно открыть сырое TCP-соединение с ClickHouse, послать туда GET /?query=... HTTP/1.0\n\n и получить в ответ заголовки и тело ответа без какого-либо экранирования и шифрования, так что нам в этом случае стандартную библиотеку использовать даже не требуется.


Стриминг логов из ClickHouse


В ClickHouse уже относительно давно (с 2019 года?) есть оптимизация для запросов с ORDER BY, так что запрос вида


SELECT time, millis, messageFROM logsWHERE message LIKE '%something%'ORDER BY time DESC, millis DESC

Начнет сразу возвращать строки, у которых в message есть подстрока "something", не дожидаясь окончания сканирования.


Также, было бы очень удобно, если бы ClickHouse сам отменял запрос, когда с ним закрыли соединение, но это не является поведением по умолчанию. Автоматическую отмену запроса можно включить опцией cancel_http_readonly_queries_on_client_close=1.


Корректная обработка SIGPIPE в Go


Когда Вы выполняете, скажем, команду some_cmd | head -n 10, каким именно образом команда some_cmd прекращает свое исполнение, когда head вычитал 10 строк? Ответ прост: когда head завершается, pipe закрывается, и stdout команды some_cmd начинает указывать, условно, вникуда. Когда some_cmd пытается записать в закрытый pipe, [https://www.quora.com/What-are-SIGPIPEs](ей приходит сигнал SIGPIPE, который по умолчанию молча завершает программу).


В Go по умолчанию это тоже происходит, но обработчик сигнала SIGPIPE в конце также печатает "signal: SIGPIPE" или похожее сообщение, и чтобы это сообщение убрать, нужно просто самому обработать SIGPIPE так, как мы хотим, то есть просто молча выйти:


ch := make(chan os.Signal)signal.Notify(ch, syscall.SIGPIPE)go func() {    <-ch    os.Exit(0)}()

Показ контекста сообщения


Часто хочется увидеть контекст, в котором произошла какая-то ошибка (например, какой запрос вызвал панику, или какие сопутствующие проблемы были видны до падения), и в grep для этого служат опции -A, -B и -C, которые показывают указанное число строк после, до, и вокруг сообщения соответственно.


К сожалению, я не нашел простого способа сделать то же самое в ClickHouse, поэтому, для отображения контекста, на каждую строчку результата посылается дополнительный запрос примерно следующего вида (детали зависят от сортировки и от того, показывается контекст до или после):


SELECT time,millis,review_body FROM amazonWHERE (time = 'ВРЕМЯ_СОБТИЯ' AND millis < МИЛЛИСЕКУНД_СОБТИЯ) OR (time < 'ВРЕМЯ_СОБТИЯ')ORDER BY time DESC, millis DESCLIMIT КОЛИЧЕСТВО_СТРОК_КОНТЕКСТАSETTINGS max_threads=1

Поскольку запрос посылается почти сразу после того, как ClickHouse вернул соответствующую строку, она попадает в кеш и в целом запрос выполняется достаточно быстро и тратит немножко CPU (обычно запрос занимает около ~6 мс на моей виртуалке).


Показ новых сообщений в режиме реального времени


Для того, чтобы показывать приходящие сообщения в режиме (почти) реального времени, просто исполняем запрос раз в несколько секунд, запомнив последний timestamp, который мы встретили до этого.


Примеры команд


Как выглядят типичные команды logscli на практике?


Если Вы загрузили датасет Amazon, который я упоминал в начале статьи, то сможете выполнить следующие команды:


# Показать строки, где встречается слово walmart$ logscli -F 'walmart' | less# Показать самые свежие 10 строк, где встречается "terrible"$ logscli -F terrible -limit 10# То же самое без -limit:$ logscli -F terrible | head -n 10# Показать все строки, подходящие под /times [0-9]/, написанные для vine и у которых высокий рейтинг$ logscli -E 'times [0-9]' -where="vine='Y' AND star_rating>4" | less# Показать все строки со словом "panic" и 3 строки контекста вокруг$ logscli -F 'panic' -C 3 | less# Непрерывно показывать новые строки со словом "5-star"$ logscli -F '5-star' -tailf

Ссылки


Код утилиты (без документации) доступен на github по адресу https://github.com/YuriyNasretdinov/logscli. Буду рад услышать Ваши мысли по поводу моей идеи для консольного интерфейса для просмотра логов на основе ClickHouse.

Подробнее..

Из песочницы Разработка zond-а для замера скорости интернета

12.07.2020 00:14:47 | Автор: admin

Добрый день всем хабра-пользователям.

Постоянно читаю на хабре статьи о разработках того или иного функционала на малинке. Решил вот поделиться своей наработкой.

Предыстория


Тружусь я в компании, предоставляющей услуги кабельного телевидения и доступа в интернет. И, как это бывает в подобных компаниях, периодически слышу жалобы о несоответствии тарифного плана заявленному в договоре. То пользователь жалуется на низкую скорость по кабелю, то на высокие пинги определенных сервисов, иногда на полное отсутствие интернета в определенное время суток. Зачастую, такие жалобы попадают в пулл заявок, по которым происходит выезд на место одного из сотрудников с рабочим ноутбуком, на котором и производятся все замеры. И, зачастую, выясняется, что со скоростью все в порядке. А низкая скорость на самом деле на мобильном телефоне, через wi-fi, на балконе. Ну или нечто подобное.

К сожалению, выезжать к абоненту например в 21:37, когда у него наиболее низкие скорости не получается. Все-таки рабочий день сотрудников ограничен. Замена роутера эффекта не дает, т.к. диапазон частот для wi-fi в нашей стране плачевно захламлен.

Для справки государственный провайдер в РБ принудительно включает на всех предоставляемых в пользование устройствах wi-fi и вещает SSID ByFly с каждого устройства. Даже если у абонента нет услуги интернета, а только домашний телефон. Сделано это для дополнительных продаж. Можно в ларьке купить карту данного оператора, подключиться к любой точке с именем ByFly и, введя данные с карты, получать услуги интернета. С учетом почти 100% покрытия городов и значительным покрытием частного сектора и сельских населенных пунктов найти точку подключения не составляет проблем.

Наблюдение за нашим внешними каналами связи показывают, что имеется заданный запас полосы пропускания. И абоненты суммарно не потребляют имеющиеся каналы даже в час-пик. С этим у нас все очень серьезно. Использование разных сервисов и разных серверов замера скорости привел к интересным результатам. Оказывается не все сервисы одинаково полезны Особенно по-вечерам. И не стоит однозначно им доверять. Множество операторов той же сети Ookla не имеют широких каналов связи, либо работают впритык. А это значит, что в вечернее время получить честный результат часто практически невозможно. Да и магистралы оказывается грешат. Для примера попытки замера скорости в японию показывают крайне плачевные результаты

Первичное решение



Фото носит иллюстрационный характер

Были развернуты два сервера контроля скорости. Первый это LibreSpeed, второй Speedtest от OOKLA. Сравнивались показатели обоих сервисов. Остановиться решили все-таки на Ookla т.к. до 90% абонентов пользуются именно данным сервисом.

Далее были написаны инструкции для пользователей и сотрудников о том, как производить замеры скорости внутри сети и наружу. Т.е. при запуске теста по умолчанию происходит замер скорости внутри сети. Сервер-то расположен у нас на головной станции, а решение Ookla по умолчанию выбирает самый близкий сервер к абоненту. Таким образом мы проверяем работу собственной сети передачи данных.

Для замера скорости внутри страны (есть у нас отдельная сеть для операторов связи, которая объединяет всех операторов и основные дата-центры внутри страны) нужно выбрать провайдера внутри страны и сделать повторный замер. Мы опытным путем выделили несколько серверов дающих более-менее стабильный результат в любое время суток и прописали их рекомендованными в инструкции.

Ну и аналогичные действия для внешних каналов связи. Нашли больших операторов с большими каналами на speedtest серверах и написали их в рекомендациях (уж простите Moskva Rostelecom и Riga Baltcom, но буду именно данные узлы рекомендовать для получения адекватных цифр. Лично я получал до ~870 мегабит с данных серверов в часы-пик).

Зачем, спросите вы, такие сложности? Все очень просто. Мы получили достаточно удобный инструмент, который в умелых руках позволяет определить: нет ли проблем в наших сетях, нет ли проблем в республиканской сети, нет ли проблем у магистрала. Если человек жалуется на низкую скорость скачивания с какого-то сервиса мы можем сделать замер скорости канала абонента и затем сравнить с тем, что он получает от сервиса. И аргументировано показать, что мы честно выделяем канал, прописанный в договоре. А так же можем пояснить возможные причины такой разницы в скоростях.

Вторичное решение


Остается открытым вопрос падения скорости по-вечерам/в течении суток. Как сделать все то же самое не находясь у абонента дома? Взять дешевый одноплатник с гигабитной сетью и сделать из него так называемый зонд. Устройство должно с заданным интервалом времени делать замеры скорости по кабелю. Решение должно быть опенсорсное, максимально неприхотливое, с удобной админкой для просмотра результатов замеров. Устройство должно быть максимально дешевым, что бы можно было легко заменить и без опасений оставлять у абонента на n суток.

Реализация




За основу был взят BananaPI (модель M1). Причин выбора на самом деле две.

  1. Гигабитный порт.
  2. Он просто валялся в тумбочке.

Далее было принято решение использовать python клиента speedtest-cli для сервиса Speedtest by Ookla в качестве бэкэнда для замера скорости. Библиотеку Pythonping для замера скорости пинга. Ну и php для админки. Для приятности восприятия применил bootstrap.

Ввиду того, что ресурсы малинки не резиновые была использована связка nginx+php-fpm+sqlite3. От MySQL хотелось отказаться из-за ее тяжести и переизбыточности. Предугадываю вопрос относительно Iperf. От него пришлось отказаться ввиду невозможности его использования на направлениях отличных от локальных.

Изначально пошел по-пути многих на этом сайте. Модифицировал клиент speedtest-cli. Но затем, немного поразмыслив, отказался от данной затеи. Написал свой воркер, который использует возможности оригинального клиента.

Для анализа пингов просто написал отдельный обработчик. Берем среднее значение по замеру. Пинговалка умеет как ip адрес так и доменное имя.

Асинхронности работы не добивался. Она в данном случае не особо нужна.

Админка для оценки результатов получилась довольно минималистическая.

Рис. Основное окно админки с результатами тестирования

Рис. Настройки тестирования


Рис. Обновление списка серверов Speedtest

Вот собственно и все. Идея реализована на коленке, в свободное от работы время. К полевым испытаниям пока не приступили. Но планируем в ближайшее время запустить в работу опытные образцы. Использовать можно как провайдерам там и клиентам провайдеров. Никто не мешает поставить делать замеры дома круглосуточно. Единственное, следует помнить, что если вы активно серферите в сети или что-то качаете то и замер получится ниже реального. Так что в идеале нужно зонд оставлять в сети единственным потребителем трафика.

P.S.: за качество кода прошу не пинать. Я самоучка без опыта. Исходный код на GitHub. Критика принимается.
Подробнее..

Eще один бэкап больше, чем скрипт, проще, чем система

28.07.2020 10:08:24 | Автор: admin
Систем резервного копирования множество, но что делать, если обслуживаемые сервера разбросаны по разным регионам и клиентам и нужно обходиться средствами операционной системы?



Добрый день, Habr!
Меня зовут Наталья. Я тимлид группы администраторов приложений в НПО Криста. Мы Ops для группы проектов нашей компании. У нас довольно своеобразная ситуация: мы устанавливаем и сопровождаем наше ПО как на серверах нашей компании, так и на серверах, расположенных у клиентов. При этом бэкапить сервер целиком нет необходимости. Важны лишь существенные данные: СУБД и отдельные каталоги файловой системы. Конечно, клиенты имеют (или не имеют) свои регламенты резервного копирования и часто предоставляют некое внешнее хранилище для складывания туда резервных копий. В этом случае после создания бэкапа мы обеспечиваем отправку во внешнее хранилище.

Какое-то время для целей бэкапа мы обходились bash-скриптом, но по мере разрастания вариантов настроек пропорционально росла и запутанность этого скрипта, и в один прекрасный момент мы пришли к необходимости его разрушить до основанья, а затем.....

Готовые решения не подошли по разным причинам: из-за необходимости децентрализации бэкапов, обязательности хранения бэкапов локально у клиента, сложности настройки, импортозамещения, ограничения доступа.

Нам показалось, что проще написать что-то своё. При этом хотелось получить что-то такое, чего хватит для нашей ситуации на следующие N лет, но с возможностью потенциального расширения области применения.

Условия задачи были следующие:
1. базовый инстанс бэкапа автономен, работает локально
2. хранение резервных копий и логов всегда в пределах сети клиента
3. инстанс состоит из модулей такой своеобразный конструктор
4. необходима совместимость с используемыми дистрибутивами Linux, включая устаревшие, желательна потенциальная кроссплатформенность
5. для работы с инстансом достаточно доступа по ssh, открытие дополнительных портов необязательно
6. максимальная простота настройки и эксплуатации
7. возможно (но не обязательно) существование отдельного инстанса, позволяющего централизованно просмотреть состояние бэкапов с разных серверов

То, что у нас получилось, можно посмотреть здесь: github.com/javister/krista-backup
ПО написано на python3; работает на Debian, Ubuntu, CentOS, AstraLinux 1.6.
Документация выложена в каталоге docs репозитария.

Основные понятия, которыми оперирует система:
action действие, реализующее одну атомарную операцию (бэкап БД, бэкап каталога, перенос из каталога А в каталог Б и т. д.). Существующие actions лежат в каталоге core/actions
task задание, набор actions, описывающий одну логическую задачу бэкапа
schedule расписание, набор task с опциональным указанием времени выполнения задачи

Конфигурация бэкапа хранится в yaml-файле; общая структура конфига:
общие настройки
раздел actions: описание действий, используемых на этом сервере
раздел schedule: описание всех заданий (наборов действий) и расписание их запуска по крону, если такой запуск требуется
Пример конфига можно посмотреть здесь: github.com/javister/krista-backup/blob/master/KristaBackup/config.yaml.example

Что умеет приложение на текущий момент:
поддерживаются основные для нас операции: бэкап PostgreSQL, бэкап каталога файловой системы через tar; операции с внешним хранилищем; rsync между каталогами; ротация бэкапов (удаление старых копий)
вызов внешнего скрипта
выполнение вручную отдельного задания
/opt/KristaBackup/KristaBackup.py run make_full_dump

можно добавить (или убрать) в кронтабе отдельное задание или все расписание
/opt/KristaBackup/KristaBackup.py enable all

генерация триггер-файла по результатам бэкапа. Эта функция полезна в связке с Zabbix для мониторинга бэкапов
может работать в фоне в режиме webapi или web
/opt/KristaBackup/KristaBackup.py web start [--api]


Разница между режимами: в webapi нет собственно веб-интерфейса, но приложение отвечает на запросы другого инстанса. Для режима web нужно установить flask и несколько дополнительных пакетов, а это не везде приемлемо, например в сертифицированной AstraLinux SE.

Через веб-интерфейс можно посмотреть состояние и логи бэкапов подключенных серверов: веб-инстанс запрашивает данные с бэкап-инстансов через API. Доступ к web требует авторизации, доступ к webapi нет.



Логи некорректно прошедших бэкапов размечаются цветом: warning желтым, error красным.





Если администратору не нужна шпаргалка по параметрам и серверные ОС однородны, можно скомпилировать файл и распространять уже готовый пакет.

Распространяем мы эту утилиту в основном через Ansible, выкатывая сначала на часть наименее важных серверов, а после тестирования на все остальные.

В итоге мы получили компактную автономную утилиту копирования, поддающуюся автоматизации и пригодную для эксплуатации даже малоопытными администраторами. Нам удобно может, пригодится и вам?
Подробнее..

Насколько современные Линуксы отличаются друг от друга

06.07.2020 14:13:22 | Автор: admin
Более 15 лет я работаю в компании Fast Reports и по роду своей деятельности мне часто приходится иметь дело с Linux, ведя поддержку одного из продуктов. С Linux я знаком несколько дольше впервые установил Slackware в 1997 году. Соответственно, обладая некоторым опытом, хочу поделиться с вами мнением, чем, на мой взгляд, современные дистрибутивы Linux отличаются друг от друга. Всё описанное в статье является субъективным мнением и не претендует на абсолютную истину.

Операционная система Линукс ведёт свою историю с 1991 года, когда финский студент Линус Торвальдс, начал разработку новой операционной системы, вдохновлённый идеями Unix и Minix. Удачный выбор свободной лицензии предопределил успех его начинания к разработке подключились десятки и сотни энтузиастов, каждый из которых привнёс что-то новое. Впоследствии к разработке подключились крупные компании Intel, IBM и другие. Точные причины, побудившие лидеров отрасли к поддержке свободной ОС мне не известны, но злые языки поговаривают что многие компании решили подвинуть Microsoft, занимающую в то время абсолютную монополию в операционных системах для настольных компьютеров.

Эволюция ядра Линукс, выраженная в количестве строк
image

Смог бы Линукс без поддержки мэтров индустрии стать тем, чем он есть сейчас? Далеко не факт старожилы помнят патентые войны между Santa Cruz Operation и компаниями, поддерживающими Linux. Компания SCO проиграла эту войну и больше её не существует.

Количество коммитов в ядро в разрезе компаний
image

Таким образом за время своей жизни операционная система Линукс прошла длинный путь эволюции и в настоящее время стала популярной операционной системой, способной заменить Windows для решения многих насущных задач пользователей.
Прежде чем приступить к сравнению современных дистрибутивов Linux, мы должны определить два важных аспекта первый аспект это из чего состоит операционная система, второй с какой точки зрения будем сравнивать. Под дистрибутивом мы понимаем законченное решение, состоящее из ядра ОС, графического сервера (Икс-сервер), окружения (набора поставляемых программ), утилиты установки и начальной конфигурации. Сравнивать дистрибутивы можно с точки зрения конечного пользователя, системного администратора и прикладного программиста.

Линуксы с точки зрения системного администратора

На заре своего развития Линукс был уделом техногиков и техножрецов, обладающих специфическими знаниями программирования и администрирования. Предтечей Линукса была операционная система Unix и специалист, имевший опыт администрирования Unix, мог без труда установить и сконфигировать систему. Обычному среднестатистическому пользователю это было недоступно и процесс администрирования для него был чем-то сродни магии. Современные Линуксы стали дружественны пользователю процесс установки сводится к ответу на несколько вопросов, а зачастую достаточно просто согласиться с предлагаемым установщиком вариантом конфигурации, просто положительно ответив на все вопросы установщик сам проанализирует конфигурацию оборудования и подберёт необходимые драйвера и параметры конфигурации. Обычно дистрибутив содержит готовые к работе пакеты программ, поставляемые в виде DEB или RPM архивов, содержащих помимо самих программ скрипты конфигурации и информацию о зависимостях от сторонних библиотек. Однако, бывают и исключения, например, дистрибутив Gentoo поставляется в виде исходного когда всех программ и правил сборки, а сама операционная система буквально собирается на компьютере пользователя под его конфигурацию процессора. Вопрос эффективности такого метода спорный, мы не будем углубляться в него, замечу лишь что это лишь одна из степеней декларируемой сообществом свободы пользователь волен сам выбирать стоит ли овчинка выделки. В целом же форматы пакетов RPM и DEB похожи и при выборе дистрибутива можно не рассматривать этот момент. За редким исключением иногда бывает так, что автор программы по какой-то причине не предусмотрел второй вариант инсталлятора и она существует только в RPM (RedHat Linux и производные от него дистрибутивы) или DEB (Debian Linux и его производные) формате. В этом случае вам могут потребоваться усилия по установке такой программы даже вручную распаковав установочный пакет, можно наткнуться на неудовлетворённые зависимости. Установка такой программы потребует больших усилий, а в случае ошибки, пытаясь подменить требуемые библиотеки, можно привести к краху системы. К счастью, такая ситуация исключительно редка и 99,9% пользователей Линукс никогда не столкнуться с этой проблемой. Более того все известные производители дистрибутивов держат свои репозитории с богатым набором программ, где каждая программа собрана и протестирована под конкретную версию дистрибутива.

Итак, мы знаем что одно из отличий Линуксов это формат пакетов. Однако, с точки зрения администратора системы существует ещё одно различие формат стартовых скриптов. Из семейства операционных систем Unix в Linux пришли два конкурирующих формата System V style и BSD style. Чтобы понять о чём речь, посмотрим как это работает. Стартовый загрузчик загружает ядро ОС и передаёт ему управление, ядро стартует и запускает первый процесс init. Строго говоря, вместо init можно подсунуть любой процесс, например, bash. В этом случае мы получим нечто вроде однопользовательской однозадачной консольной системы без сети и графического интерфейса и с корневой файловой системой, доступной только для чтения. Более того, часть оборудования в этом случае может не работать, если драйвера для него не присутствуют в ядре, а загружаются в виде модулей. В классическом же режиме работы процесс init читает файл /etc/inittab и в соответствии с ним начинает процесс старта системы монтирует разделы, подгружает драйвера, инициализирует сетевые интерфейсы, стартует сервисные программы (которые ранее называли демонами), загружает графическую подсистему. Делает это init не напрямую, а используя понятие runlevel и специальные скрипты. Обычно существует до шести runlevel режимов исполнения, которые описывают режимы работы системы стартовый, однопользовательский, многопользовательский с сетевой подсистемой, многопользовательский с графическим интерфейсом. В зависимости от условий применения администратор может задать стандартный runlevel, в который перейдёт система после загрузки, обычно это многопользовательский режим с сетью и графическим интерфейсом для десктопа и многопользовательский режим с сетью для серверов. Именно в этих скриптах и заключено отличие между SystemV и BSD стилями. Однако, обладая знаниями о формате inittab, можно посмотреть содержимое скриптов и понять как работают процедуры старта, останова и перехода между runlevels системы.

В 2010 году инженеры из RedHat разработали замену init сервис systemd. Этот сервис привнёс новые возможности в систему:

  • сокет-активация служб (заменяет дополняет inetd);
  • запуск сервисов по расписанию (заменяет дополняет cron);
  • работа с аппаратным сторожевым таймером (заменяет watchdog);
  • смена корня (заменяет chroot);
  • автомонтирование томов и сетевых ресурсов (заменяет дополняет mount и fstab);
  • journlctl сервис логирования;
  • systemd-analyze анализ запуска сервисов(включает в себя скорость загрузки(как системы, так и отдельных сервисов), отрисовку старта сервисов и др.);
  • systemd-boot UEFI загрузчик (замена grub и lilo).

В настоящее время подавляющие большинство дистрибутивов Linux перешли на systemd, из некогда популярных дистрибутивов только Slackware сопротивляется переходу на новую подсистему.
Таким образом переход на systemd как бы стирает одно из различий Линукс систему стартовых скриптов и приводит к унификации. При этом сохраняется поддержка классических стартовых скриптов например, часть томов для монтирования может быть указана классически через /etc/fstab, а другие тома могут быть монтированы средствами systemd.
В прошлом системные администраторы любили спорить какая же система лучше SystemV или BSD, однако сейчас споры поутихли. Опытный сисадмин сможет сконфигурировать любую систему, для новичков же в Сети достаточно информации, раскрывающей любой аспект конфигурации Linux.

Линуксы c точки зрения пользователя

С точки зрения конечного пользователя линуксы различаются несколько сильнее. Заглянем вглубь вопроса. Изначально графическая подсистема в Unix была необязательна. Зачастую Unix работал на мощных компьютерах, а пользователи подключались к нему посредством Икс-терминалов. Взаимодействие происходило по сети программа выполнялась на хост-компьютере, принимала информацию о нажатии на клавиатуру и событиях мыши, а в ответ посылал терминалу команды для отрисовки графических примитивов и текста. Графические терминалы были дорогими и редкими устройствами, поэтому в качестве терминалов стали популярны персональные компьютеры. Здесь, кстати, интересный момент, который зачастую вызывает недопонимание Икс-сервер выполняется на терминале, а не на хосте. На хосте выполняется сама программа, которая использует библиотеку xlib, предоставляющую базовый низкоуровневый интерфейс для работы с графическим сервером. Этот интерфейс достаточно низкоуровневый, он вводит понятие окна, т.е. прямоугольной области экрана, умеет выводить векторный текст различными шрифтами, а так же обеспечивает отрисовку различных графических примитивов точки, линии, прямоугольники, окружности и картинки.
Поскольку базовые графические примитивы довольно просты, это привело к появлению библиотек виджетов эти библиотеки предоставляют более высокий уровень абстракции и значительно упрощают написание программ с графическим интерфейсом. Например, библиотека X Athena Widgets стала частью графической системы X Window System. Эта библиотека вводит понятие кнопок, радиокнопок, меню, полей ввода и подобных примитивов. Однако по современным меркам выглядит это довольно вырвиглазно.

И вот собственно тут начинаются отличия для пользователей. Внешний вид того, что пользователь видит на экране, зависит от нескольких подсистем это среда рабочего стола (Desktop Environment) обеспечивающая пространство, называемое рабочим столом, это оконный менеджер, определяющий внешний вид окон программы (декорации окна) и зачастую, но не обязательно, интегрированный в среду рабочего стола, и наконец, это библиотека элементов интерфейса. Что и как видит пользователь на экране определяется сочетаниями вышеназванных компонентов.

На практике это приводит к тому, что одна и та же программа запущенная в различных оконных менеджерах может иметь разные декорации окон разные заголовки, размеры границ окон, разные кнопки сворачивания, раскрытия в полный экран и закрытия. Всё это определяет оконный менеджер. Вместе тем, в пределах одного оконного менеджера, различные программы могут иметь различный вид элементов интерфейса, в зависимости от используемой библиотеки. Справедливости ради нужно заметить, что подобное разнообразие вы могли наблюдать и в Windows, но значительно значительно реже, поскольку подавляющее большинство Windows программ используют стандартный GDI+ или обвзяку вокруг него.

С чем же столкнётся пользователь Linux на рабочем столе? Прежде всего это GNOME или KDE, большая часть дистрибутивов основана именно на этих средах рабочего стола. Однако ими не ограничиваются и различные вендоры Linux предлагают около десятка различных сред. Что касается библиотек элементов интерфейса, то здесь лидируют две библиотеки GTK и Qt. Обе библиотеки кроссплатформенные и если какая-либо программа существует и под Linux, и под Windows, то с большой вероятностью она написана с использование GTK или Qt. Однако есть и исключения, например, компания Xamarin создала версию библиотеки Windows Forms для Linux и macOS. Так же иногда разработчики оконных менеджеров распространяют свои библиотеки виджетов. Таким образом становится понятно откуда такое разнообразие графических пользовательских интерфейсов под Linux.

Линуксы с точки зрения прикладных программистов

Всё вышесказанное относится так же и к программированию. Если вы пишите сервер или консольную утилиту, то в подавляющем большинстве случаев вам не придётся использовать директивы условной компиляции современный Линукс достаточно хорошо стандартизирован и полностью совместим со стандартом POSIX. Более того, использование autoconf позволяет писать программы не только для Linux, но и для любой POSIX совместимой системы, начиная от BSD и заканчивая всяческой экзотикой.

Вам, скорее всего, не придётся выбирать формат пакетов используйте оба DEB и RPM, и вы покроете практически все случаи использования. Для сервисных программ наверняка придётся обратить внимание на формат стартовых скриптов, чтобы инсталлятор правильно прописал автозапуск вашего сервиса. В моём случае пришлось обратить внимание на расположение шрифтов, поскольку различные вендоры используют различные пути для хранения шрифтов, однако, тут вам поможет рекурсивный поиск начиная с /usr/share/fonts все шрифты, за исключением пользовательских, будут находиться по этому пути. Что касается пользовательских шрифтов, которые устанавливаются в /home/user, то здесь замечен некоторый разброд и шатание и разные вендоры предлагают как минимум две иерархии ~/.fonts и ~/.local/share/fonts.

Для графических программ сложностей несколько больше. В виду зоопарка различных сред рабочего стола, необходимо учитывать их особенности. Например, так называемые desktop notifications будут поддерживаться большинством сред рабочего стола, но могут не работать с какими-то экзотическими оконными менеджерами.

Наконец, ещё несколько важных моментов, которые вносят существенные различия между дистрибутивами. Несмотря на похожесть всех современных линуксов вы можете столкнуться с проблемами на дистрибутивах с повышенной защитой, т.е. теми, где используется мандатная система доступа. Например, какой-либо ресурс по умолчанию доступен во всех классических дистрибутивах, но вызовет ошибку доступа в защищённой версии Линукс. Заранее предугадать, где и как откажет программа в данном случае невозможно, поэтому единственным решением является тестирование на защищённых дистрибутивах. Или оперативное исправление проблемы после обращения пользователя в техподдержку.

Второй момент это популярность дистрибутива. Если в составе продукта вы используете какую-то не очень распространённую библиотеку или фреймворк, то возможна ситуация что в таком дистрибутиве будет старая или неполная версия этой библиотеки. В моей практике такая ситуация случалась в одном из дистрибутивов с поддержкой кодовой страницы 1251 в библиотеке System.Text.Encoding для C#. Бороться с такими проблемами можно только одним способом поскольку проблема в других дистрибутивах Linux не наблюдается, то следует написать в техподдержку разработчику этого дистрибутива, подробно описав проблему и сказать что в других дистрибутивах проблемы нет.

Вывод. Если не рассматривать защищённые версии Linux, то с точки зрения системных администраторов и программистов современные дистрибутивы очень похожи. Зачастую различия между различными поколениями дистрибутива у одного вендора более весомые, чем различия между современными дистрибутивами. С точки зрения пользователей основное различие в выборе и настройке среды рабочего стола и поставляемого в дистрибутиве программного обеспечения.
Подробнее..
Категории: *nix , Linux , Разработка под linux

Из песочницы Массивы bash

19.07.2020 16:19:03 | Автор: admin
Предлагаю вашему вниманию перевод статьи Митча Фрейзера (Mitch Frazier) "Bash Arrays" с сайта linuxjournal.com.

Если вы используете стандартную оболочку *NIX-системы, возможно, вы не знакомы с такой полезной особенностью bash как массивы. Хотя массивы в bash не так круты, как в P-языках (Perl, Python и PHP) и других языках программирования, они часто бывают полезны.
Bash-массивы имеют только численные индексы, но они не обязательны к использованию, то есть вы не должны определять значения всех индексов в явном виде. Массив целиком может быть определен путем заключения записей в круглые скобки:

  arr=(Hello World)

Отдельные записи могут быть определены с помощью знакомого всем синтаксиса (от Бейсика (да простит меня Дейкстра прим. переводчика) до Фортрана):

  arr[0]=Hello  arr[1]=World


Правда, обратное выглядит сравнительно более уродливо. Если нужно обратиться к определенной записи, тогда:

  echo ${arr[0]} ${arr[1]}

Из страницы man:

"Фигурные скобки нужны для предотвращения конфликтов при разворачивании полных путей к файлам."

Кроме того, доступны следующие странноватые конструкции:

  ${arr[*]} # Все записи в массиве  ${!arr[*]}# Все индексы в массиве  ${#arr[*]}# Количество записей в массиве  ${#arr[0]}# Длина первой записи (нумерация с нуля)

${!arr[*]} сравнительно новое дополнение в bash и не является частью оригинальной реализации. Следующая конструкция демонстрирует пример простого использования массива. Обратите внимание на "[index]=value", это позволяет назначить конкретное значение конкретному номеру записи.

#!/bin/basharray=(one two three four [5]=five)echo "Array size: ${#array[*]}"  # Выводим размер массиваecho "Array items:" # Выводим записи массиваfor item in ${array[*]}do    printf "   %s\n" $itemdoneecho "Array indexes:" # Выводим индексы массиваfor index in ${!array[*]}do    printf "   %d\n" $indexdoneecho "Array items and indexes:" # Выводим записи массива с их индексамиfor index in ${!array[*]}do    printf "%4d: %s\n" $index ${array[$index]}done

Запуск скрипта породит следующий вывод:

Array size: 5

Array items:

one
two
three
four
five

Array indexes:

0
1
2
3
5

Array items and indexes:

0: one
1: two
2: three
3: four
5: five

Обратите внимание, что символ "@" может быть использован вместо "*" в конструкциях типа {arr[*]}, результат будет одинаковым за исключением разворачивания записи в кавычках. "$*" и "$@" выведут записи в кавычках, "${arr[*]}" вернет каждую запись как одно слово, "${arr[@]}" вернет каждую запись в виде отдельных слов.

Следующий пример покажет, как кавычки и конструкции без кавычек возвращают строки (особенно важно, когда в этих строках есть пробелы):

#!/bin/basharray=("first item" "second item" "third" "item")echo "Number of items in original array: ${#array[*]}"for ix in ${!array[*]}do    printf "   %s\n" "${array[$ix]}"doneechoarr=(${array[*]})echo "After unquoted expansion: ${#arr[*]}"for ix in ${!arr[*]}do    printf "   %s\n" "${arr[$ix]}"doneechoarr=("${array[*]}")echo "After * quoted expansion: ${#arr[*]}"for ix in ${!arr[*]}do    printf "   %s\n" "${arr[$ix]}"doneechoarr=("${array[@]}")echo "After @ quoted expansion: ${#arr[*]}"for ix in ${!arr[*]}do    printf "   %s\n" "${arr[$ix]}"done

Вывод при запуске:

Number of items in original array: 4

first item
second item
third
item

After unquoted expansion: 6

first
item
second
item
third
item

After * quoted expansion: 1

first item second item third item

After @ quoted expansion: 4

first item
second item
third
item
Подробнее..
Категории: *nix , Bash scripting

Recovery mode Использование виртуальных машин для изучения Linux

19.07.2020 22:15:05 | Автор: admin
Привет всем! Данная статья будет полезна тем, кто хочет работать в операционных системах linux, но не уверен, стоит ли их устанавливать на компьютер.
На мой взгляд, в таких случаях будет полезным использовать виртуальные машины.

Виртуальная машина будет запускать ОС в изолированной среде, поэтому ошибки совершенные в виртуальной машины не будут затрагивать основную систему. Это позволит позволит начинающим пользователям linux в случае вылета системы иметь возможность искать документацию по поломке в основной ОС.
Также, файлы операционной системы размещенной в виртуальной машине не затронут файлы основной системы, сама же операционная система в виртуальной машине будет находится в папке указанной пользователем на выбранном носителе. Помимо этого, виртуальная машина позволяет избегать конфликта загрузчиков ОС.
Также, виртуальную ОС можно будет удалить из основной в меню программного обеспечения для работы с виртуальными машинами.
В качестве программного обеспечения стоит выделить Oracle VirtualBox и VMware Workstation. Конечно, для запуска виртуальных машин 64битной архитектуры необходим процессор с поддержкой аппаратной виртуализации. Включить аппаратную виртуализацию можно в bios материнской платы. Посмотреть, включена ли виртуализация, можно в дистпечере задач windows.
Также, стоит учитывать, что при работе с виртуальными машинами необходимо иметь свободное количество оперативной памяти, которое потребуется виртуальной операционной системе.
Всем спасибо за внимание.
Подробнее..

Из песочницы Tesla ожидания и прогнозы. Чего ждать от Маска и его конкурентов до конца 2020 года?

24.07.2020 18:19:41 | Автор: admin
Цена акций Tesla на момент создания этого материала превышала 1500 долларов США (после коррекции с уровня 1700). Будет ли она дальше расти? Это финансовый пузырь или компания будущего? Давайте разбираться.

Американская компания Tesla Motors (Пало-Альто, Калифорния) основана как стартап в июле 2003 г. М. Эберхардом и М. Тарпеннингом, позже покинувшим организацию. Названа в честь физика Николы Теслы. Продукция: электромобили, автономные (беспилотные) средства передвижения, решения для хранения электроэнергии. Тикер на бирже NASDAQ: TSLA.

Структура выручки:

  • Автомобили 94%
  • Оборудование для солнечной энергетики 4%
  • Продажа квот на выбросы парниковых газов 2%

На текущий момент компания является самым большим автопроизводителем в мире по капитализации: после того, как 2020 году стоимость акции превысила 1400 долл., она обогнала своего последнего соперника по данному параметру концерн Toyota.

Роль личности


Генеральным директором, идейным вдохновителем и лицом компании является Илон Рив Маск (род. 28.06.1971). В отличие от большинства руководителей других автомобильных компаний, Маск является медийной персоной, открытой для общения с публикой и способной на экстравагантные поступки и высказывания, которые сразу же становятся поводом для публикаций в СМИ. Следствием такого имиджа явилась впечатляющая известность Маска. А известность, является одним из стимулов доверия инвесторов.

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

За плечами у Маска солидный бэкграунд, который много может сообщить инвесторам. Его основные вехи:

  • создание первой платежной интернет-системы PayPal
  • создание первой частной космической компании SpaceX (30 мая 2020 года был произведен первый пилотируемый запуск космического корабля, являющегося собственной разработкой компании, впервые продемонстрировавшей возможность автоматического возвращения на космодром отделившейся ступени ракеты)
  • создание нескольких в той или иной степени успешных разнопрофильных компаний (искусственный интеллект, нейроинтерфейсы, солнечная энергия, строительство).
  • превращение стартапа Tesla в наиболее известную в мире фирму-производителя электрических и автоматически пилотируемых автомобилей.

Эти заслуги стимулировали инвесторов много лет терпимо относиться к хронической убыточности компании.

От чего зависел рост акций Tesla в 2019-2020 годах?


Все значимые достижения компаний Маска сопровождались ростом акций Tesla. Так, после просадки летом 2019 года, вызванной превзошедшим прогнозы убытком Tesla во втором квартале, стоимость акций резко выросла с $253 до $315 в конце октября 2019 года и пошла далее в рост в связи с впервые полученной компанией прибылью. В ноябре того же года была проведена презентация Tesla Cybertruck пассажирского грузовика компании с грузоподъемностью приблизительно в 14 тысяч фунтов (6350 кг), который заинтересовал обширное фермерское сообщество США. Декабрьский подьем был связан с запуском завода Gigafactory 3 в Шанхае (инвесторов впечатлил не только сам запуск и начало производства кроссовера Model Y, но и срок, прошедший с момента закладки до запуска Gigafactory 3 менее 10-ти месяцев). В целом же стало ясно, что после десятилетия невыполненных обещаний и убытков компания перешла в фазу стремительного роста. С 23 октября 2019 года по 3 февраля 2020 года акции Tesla выросли более чем на 300% и достигли отметки в $780. Вскоре они подорожали еще на 13,7% до $887,06.

В феврале-марте 2020 года, когда мировые рынки обрушились из-за пандемии коронавируса, акции отправились в долину смерти (несмотря на мартовское начало продаж спортивного внедорожника Model Y), растеряв свой рост до уровня начала января. В апреле они вновь начали расти в цене, пережив взрывной подъем в конце мая начале июня. Во многом это было связано не только с понижением цен на Model 3, Model X и Model S в целях сохранения динамик продаж, но и с успехом космической программы Маска: 30 мая компанией SpaceX был успешно запущен космический корабль Crew Dragon. Запуск ознаменовал начало эпохи частной пилотируемой космонавтики* и возобновление программы пилотируемых космических полетов в США после девятилетнего перерыва. Для инвесторов же это послужило явным сигналом: Если у этого парня получилось с ракетой, то и с беспилотным электрическим автомобилем тоже получится.

Агентство Bloomberg связало рекордное подорожание в июне 2020 года с растущим спросом на бюджетный электрокар Tesla Model 3 в Китае на фоне снятия карантинных мер. В июле с продолжением майской программы по стимулированию спроса (снижение цены на спортивный внедорожник Model Y) и ожиданием новостей по улучшению аккумуляторных батарей.

*Произведя запуск, Маск обошёл Virgin Galactic Ричарда Бренсона которая претендовала на роль первой частной космической фирмы, но ни одного собственного запуска так и не произвела. Согласно сообщению The Verge от 22.06.20202, Virgin Galactic возьмет на себя роль посредника между SpaceX и NASA в подготовке туристических полетов на МКС.

Неоправданный рост?


Таким образом, с начала 2020 года цена акций Tesla выросла в пять раз. По мнению ряда аналитиков, стремительный рост стоимости компании Tesla выглядит неестественно на фоне относительно небольшого количества её материальных активов и текущего состояния рынка электромобилей. Так, в 2019 году продажи автомобилей компании составили менее 4% от продаж Volkswagen глобального лидера по данному показателю. К тому же у компании всего 4 завода (пятый строится в Берлине, шестой планируется в Техасе), а концерн Toyota motor имеет 50 заводов. Аналитик Morgan Stanley Адам Джонас отмечает: Возможно, стоит напомнить инвесторам, что на долю автомобилей на аккумуляторах приходится не более 2% от глобального объема продаж. Иными словами, примерно 98% автомобилей в мире все еще работают на двигателях внутреннего сгорания. Он присвоил Tesla рейтинг Underweight (хуже рынка) и целевую цену в $360 за акцию.

Вера в мечту


По факту инвесторы готовы сейчас платить за компанию в 30 раз больше, чем она стоит. В середине июля 2020 года, когда цена акции Tesla составляла 1500 дол., аналитик американского инвестиционного банка Piper Sandler Александр Поттер указал в корпоративном обзоре, что бумаги Tesla в ближайшее время могут увеличить стоимость до $2322 за акцию. На это Илон Маск оставил под обзором в Твиттере Piper Sandler комментарий Вау.

На наш взгляд, Tesla является самой влиятельной компанией в транспортной экосистеме, и вряд ли это изменится в ближайшее десятилетие, заявил Поттер. Трудно понять, как конкуренты смогут догнать Tesla, добавил он.

Поттер считает, что валовая прибыль Tesla может вырасти на 30%, когда клиентам станут доступны автомобили с технологией полного автопилота (о приближении к созданию такой технологии Маск сообщил в июле). Высока вероятность того, что к 30-м годам, компания сможет продавать автомобили по себестоимости или даже ниже, но при этом получать высокую операционную прибыль, считает эксперт.

Вместе с тем, сервис Refinitiv, публикующий консенсус-прогноз по акциям Tesla, составленный группой из 33-х аналитиков, находится почти на 50% ниже текущей цены. А инвесторы ждут финансовые результаты второго квартала 2020 года, которые Tesla опубликует 22 июля.

Четыре фактора лидерства


Следует выделить четыре фактора, которые очень сильно подкрепляют веру в значительно более высокие ценовые рубежи акций Tesla:

  • удовлетворение cильной потребности общества в переходе с двигателей ДВС на более экологичные виды транспорта;
  • успехи в разработке новых аккумуляторов;
  • успехи в разработке полного автопилота (9 июля Маск анонсировал переход на данную технологию до конца 2020 года);
  • возможная монополия Маска на полеты для колонизации Луны и Марса, куда он пропустит только автомобили Tesla.

Риски покупки акций Tesla


С начала года акции Tesla по прибыльности превзошли биткоин, который до этого считался лидером по прибыльности среди всех существующих активов. Этот факт заставил многих вспомнить о таком же быстром падении биткоина со своего максимума в конце 2017 года почти в семь раз. Столь активный рост вкупе с переоцененностью компании заставил многих инвесторов ещё на уровне 800 дол. за акцию задуматься о продаже. В настоящее время действительно многие от акций избавляются, а биржевые аналитики осторожно советуют воздерживаться от покупок бумаг Tesla.

Рассмотрим факторы, которые помимо давно назревшей технической коррекции, могут вызвать существенный откат котировок.

Падение рынка


Падение рынка, вызванное экономическим кризисом и пандемией коронавируса, может затронуть и акции Tesla, которые сейчас являются фактически единственным драйвером роста американского рынка. Но даже такая лидирующая компания удара глобальных кризисных явлений может не выдержать.

Кто-то обгонит


Несмотря на то, что Tesla сопутствует успех в разработке новых технологий, конечный результат может оказаться не столь впечатляющим. Что если не произойдет внедрения обещанной технологии полного автопилота к концу 2020 года, или сверхпроизводительные аккумуляторные батареи будут созданы не Tesla а, к примеру, Lucid Motors? Ревностно к успехам Tesla относятся Porshe, Ford и General Motors. Перспективная Nicola Motor готовит к серийному выпуску электрогрузовик. К созданию оригинального электрокара проявляет интерес и глава Amazon Джефф Безос. Volkswagen в 2020 году запускает собственный бренд электромобилей. Это гонка, заявил глава Volkswagen Герберт Дисс агентству Bloomberg на Давосском форуме. Мы уверены, что сможем угнаться за Tesla, а в какой-то момент даже обогнать ее. По прогнозу исследовательской фирмы Wood Mackenzie, к 2028 году Volkswagen обгонит фирму Маска.

Превосходство недоброжелателей


Сравнивая Tesla и Toyota, мы увидели, что, несмотря на разницу в динамике развития, Toyota многократно превосходит Tesla по многим параметрам (объективно Tesla маленькая компания). На рынке ДВС гигантов с большими возможностями присутствует достаточно. Мы также не можем исключать лоббистской деятельности нефтяных магнатов и реализации интересов политических кругов целых стран (например России и ОАЭ). Эти очень разнородные и даже враждебные друг другу силы вполне могут объединить усилия ради окончательного решения проблемы Tesla.

Ненадежность Маска


Сам Илон Маск, несмотря на свою последовательность в достижении целей, не всегда выглядел достаточно надёжно с точки зрения инвестора. Когда-то он продал платежную систему PayPal, так почему ему не может прийти в голову продать и Tesla?

Выводы


Вышеперечисленные факторы могут сильно повлиять на стоимость акций как в долгосрочной, так и в краткосрочной перспективе (до конца 2020 года). В любом случае, отчет по финансовым результатам компании за второй квартал, который выйдет 22 июля, даст для краткосрочных инвесторов более четкую картину.

Что касается инвесторов, придерживающихся долгосрочной стратегии, то им лучше дождаться коррекции бумаг, и приобрести их на локальном минимуме. Даже несмотря на перекупленность, по нашему мнению, бумаги Tesla далеки от своей пиковой цены. Если указанные выше риски не реализуются (мы допускаем реализацию хотя бы одного из них на уровне вероятности 10-15%) и позитив в развитии компании сохранится, то на наш взгляд, цена акции достигнет уровня 7-10 тыс. дол. в течение ближайших 5-и лет.
Подробнее..

Кризис дистрибутивостроения или о Gentoo в последний раз

26.07.2020 00:10:08 | Автор: admin
Gentoo могла стать монополистом на рынке дистрибутивов. Но не стала. И
не станет. По причине того, что в дистрибутиве gentoo заложена
идеология, которая с момента основания не эволюционирует. А по
принципам мироздания всё, что не эволюционирует имеет вектор
направленности на смерть. Это может кому-то не нравится, но можно
сколь угодно долго отрицать то, что трава зеленая и от этого она
зеленой быть не перестанет

При этом управленческий состав дистрибутива Gentoo не имеет желания
разобраться в происходящем и ввиду этого, никаких шагов по
трансформации дистрибутива не происходит. И очень жаль!

Для начала, стоило бы разобраться в причине популярности дистрибутива
Gentoo(2005-2010 год) и дальнейшем спаде популярности и неминуемой
смерти дистрибутива в течении последующих 10 лет.

Причина популярности в 2005-2010 годах заключалась в том, что:

1. бинарные дистрибутивы, несмотря на их количество, не предоставляли
пользователю актуальных версий пакетов программного обеспечения в
стабильной ветке. Ветки тестинг и анстейбл не предоставляли
пользователю стабильную работу, с периодичной регулярностью приводящих
рабочую станцию в неработоспособное состояние. Далее дистрибутив
debian пересмотрел свою позицию и стабилизировал версии пакетов, на
которых пользователь смог работать(имеется ввиду контекст девелоп
студио и десктоп). И стал популярен. Именно по этой причине.

2. дистрибутив Gentoo имплементировал инновационную технологию
USE-флагов, которая не реализована в полной мере в других
дистрибутивах. Частично она реализована в NixOS. Эта технология
позволяла пользователю менять функциональный интерфейс ОС.

Управленческий состав Gentoo до сих пор считает, что причиной
популярности была идеология сборка программного обеспечения из
исходных текстов. Это не так. Конечному пользователю нужна гибкость в
плане функционального интерфейса. И только. Пользователь за эту
возможность готов даже ожидание, пока пакеты соберутся из исходных
текстов.

Отстуствие эволюционирования дистрибутива Gentoo привело к появлению
дистрибутивов, которые пытаются эту гибкость пользователю
предоставлять. В разных контекстах, даже самых невероятных. Вопиющий
пример это появление дистрибутива NixOS, который пытается
предоставить пользователям следующие возможности:

1. возможность использования нескольких версий программного обеспечения

2. возможность фиксирования состояния

3. декларативная настройка операционной системы

4. возможность изменения функционального интерфейса ОС(аналог USE-флагов)

Каждый из этих пуктов в этом дистрибутиве реализован. При этом
фиксация на 1, 2 пункте привела к многочисленным трудностям в
использовании этого дистрибутива. 3 пукнт переусложнён и имеет
тенденцию к дальнейшему переусложнению и уже привел к тому, что этот
дистрибутив потерял универсальность. Самый простейший пример:
попытайтесь сделать chroot из установочного образа NixOS в другой
дистрибутив

Итак, Gentoo предоставила инновационный интерфейс USE-флагов, который
позволяет менять функциональный интерфейс операционной
системы. Основной недостаток реализации время сборки из исходных
текстов. Вопрос: является ли сборка из исходных текстов единственно
возможной в вопросе реализации предоставления возможности изменения
функционального интерфейса? Мой ответ: НЕТ. Такую возможность можно
реализовать не применяя сборку из исходных текстов. И для того, чтобы
их решать(а решить их в конечном итоге можно, на практическом уровне
дистрибутив NixOS это показал) лежит исключительно в плоскости
трансформации идеологии управленческого состава дистрибутива Gentoo

Множество раз на просторах рунета(и не только), пользователями
поднимался вопрос бинарных кешей пакетов. Ответ всегда один: это
невозможно сделать, по причине того, что у каждой рабочей станции
процессор со своим набором CFLAGS и что пакет, который собран с одним
набором CFLAGS не обязательно будет работоспособным на другой рабочей
станции с другим набором CFLAGS. И ввиду этого технически невозможно
реализовать бинарный кеш пакетов, которые бы работали на других
рабочих станциях даже в пределах одной архитектуры(допустим
AMD64). Это утверждение верно, но пути решения есть:

1. использование GENERIC CFLAGS

2. сегментирование бинарных кешей по CFLAGS

И первый и второй пукнт есть возможность реализовать. Желания у
управленческого состава дистрибутива Gentoo нет. Что ожидает дистрибутив Gentoo, если у него появлятся бинарные кеши пакетов? Он обречен. На успех.

Я мечтаю, чтобы управленческий состав дистрибутива Gentoo пересмотрел свою идеологию и принял стратегическое решение по вектору направленности этого замечательного дистрибутива и стал по-настоящему инновационным в мире дистрибутивов
Подробнее..
Категории: *nix , Linux , Кризис , Gentoo , Дистрибутив

Дружим Docker и dnscrypt-proxy

30.07.2020 00:17:36 | Автор: admin

DNSCrypt довольно популярный вариант защиты обычно не шифруемого DNS-трафика от внешних лиц. Клиентский резолвер dnscrypt-proxy поддерживает в том числе протокол DNS-over-HTTPS, позволяя разрешать доменные имена через DoH.


Все бы ничего, только при использовании dnscrypt-proxy с настройками по умолчанию контейнеры Docker перестают корректно резолвить адреса. Исправим это, не включая слушатель DNS на публичных интерфейсах.


TL;DR поста
  1. Создаем dummy-адаптер, вешаем ему IP из частного диапазона.
  2. Заставляем dnscrypt-proxy слушать на этом IP, меняем настройки DNS соответственно.
  3. PROFIT

Суть проблемы


Для настройки DNS Docker копирует настройки DNS с хоста, копируя файл /etc/resolv.conf с хостовой машины.


При использовании dnscrypt-proxy и других кастомных резолверов обычно их запускают на 127.0.0.1:53, записывая этот адрес как nameserver в resolv.conf, эта же настройка приходит контейнеру. Так как контейнер находится в другом сетевом пространстве имен, 127.0.0.1 у хоста и контейнера разные.


Как исправить


Самым простым вариантом решения является запуск dnscrypt-proxy на публичном адресе хоста и добавление этого же адреса в /etc/resolv.conf. Однако в таком случае мы выставляем в сеть DNS-резолвер, чего хочется избежать.


Вместо этого мы создадим сетевой адаптер-затычку, через который не идет трафик, но на который можно повесить IP-адрес из частного диапазона; он будет роутабелен из контейнера, поскольку Docker-контейнеры с сетью через бридж используют в качестве шлюза по умолчанию хост. В Linux такой адаптер называется dummy.


Создаем адаптер


Если в вашей системе не загружен модуль ядра dummy (lsmod | grep dummy не показывает этот модуль), загрузите его и включите его загрузку на постоянной основе:


# modprobe dummy# echo "dummy" >> /etc/modules-load.d/net_dummy.conf

Для того, чтобы создать и настроить dummy-адаптер, в современной Linux-системе с iproute2 достаточно выполнить две следующие команды:


# ip link add type dummy name dummy0# ip addr add dev dummy0 10.0.197.1/24

Создание адаптера для его использования на постоянной основе будет разниться в зависимости от используемого вами сетевого конфигуратора. Например, для systemd-networkd понадобятся два конфигурационных файла:


/etc/systemd/network/50-dummy0.netdev:


[NetDev]Name=dummy0Kind=dummyDescription=Dummy network for dnscrypt-proxy

/etc/systemd/network/50-dummy0.network:


[Match]Name=dummy0[Network]DHCP=noAddress=10.0.197.1/24DefaultRouteOnDevice=false

Изменяем настройки DNS


Для того, чтобы заставить dnscrypt-proxy слушать на новом адресе, потребуется отредактировать /etc/dnscrypt-proxy/dnscrypt-proxy.toml. Отредактируем директиву listen_addresses и приведем ее к следующему виду:


listen_addresses = ['127.0.0.1:53', '[::1]:53', '10.0.197.1:53']

Перезапустим dnscrypt-proxy, после чего в /etc/resolv.conf (либо где в вашем сетевом конфигураторе находятся настройки DNS) оставим в списке серверов имен один: nameserver 10.0.197.1.


Проверяем


Запускаем контейнер:


% docker run -it --rm alpine:3.12# cat /etc/resolv.confnameserver 10.0.197.1# ping -c 1 ya.ru

Дополнительно


Если вы используете файрволл, разрешите входящий трафик на 10.0.197.1:53 из подсетей, из которых Docker выдает адреса контейнерам.


В случае, если вы используете в качестве локального резолвера systemd-resolved, направленный на dnscrypt-proxy (например, для кэширования или для использования разных DNS-серверов для разных интерфейсов), тот факт, что systemd-resolved слушает исключительно на 127.0.0.53 и не позволяет изменение этого адреса, вас смущать не должен: Docker определяет использование systemd-resolved и вместо содержимого /etc/resolv.conf копирует содержимое /run/systemd/resolve/resolv.conf, генерируемое из настроек systemd-resolved.

Подробнее..

Перевод От первого лица разработчик GNOME рассказал о новой идеологии и будущих улучшениях юзабилити

31.07.2020 10:05:30 | Автор: admin
Разработчик Эммануэле Басси уверен, что с новыми обновлениями юзабилити рабочего стола GNOME станет более гибким и удобным.



В 2005 году разработчики GNOME задались целью занять 10% мирового рынка десктопных компьютеров к 2010 году. Прошло 15 лет. Доля настольных компьютеров с Linux на борту балансирует около 2%. Изменится ли что-то после выхода нескольких новых релизов? И вообще, что в них особенного?


Среда рабочего стола GNOME претерпела множество изменений со времён своего первого релиза в марте 1999 года. С тех пор open source проект стабильно выпускал обновления два раза в год. Так что, теперь пользователи наперёд знают, когда ожидать появления новых функций.

Последний релиз GNOME 3.36 вышел в марте, и сейчас разработчики планируют следующий релиз на сентябрь. Я поговорил с Эммануэле Басси, чтобы узнать, что заслуживает особого внимания в текущей версии GNOME и самое главное, что будет нового в последующих версиях.

Эммануэле сотрудничает с командой GNOME более 15 лет. Сначала он занимался проектом, который давал разработчикам возможность использовать библиотеки GNOME с другими языками программирования, а затем перешёл в команду разработки GTK кроссплатформенного виджета для разработки приложений GNOME. В 2018 году GNOME принял Эммануэле в штат, в группу GTK Core, где он работает над библиотекой GTK и платформой разработки приложений GNOME.

GNOME 3.36 вышел в марте 2020 года. О каких его особенностях мы обязательно должны знать?

Эммануэле Басси: [Прежде всего хочу отметить, что] GNOME следует чёткому расписанию выпуска релизов уже 18 лет. Очередная версия GNOME выходит не по готовности каких-либо фич, а в соответствии с планом. Это упрощает работу над релизами. В GNOME мы не ждём, когда будет готова очередная жирная фича. Вместо этого мы просто выводим новый релиз каждые шесть месяцев. Мы всегда исправляем ошибки, добавляем новые фичи и вылизываем всё до блеска.

В этом релизе мы проверили, что всеми функциями пользоваться удобно и приятно. В GNOME 3.36 много улучшений юзабилити. Например, мне нравится возможность отключать уведомления. Эта фича была доступна в очень старой версии GNOME, но была удалена некоторое время назад, потому что работала не очень надёжно. Но мы вернули её, потому что эта функция очень полезна и важна для многих людей.

Вы можете включать и выключать уведомления сразу для всех приложений или настраивать их для каждого приложения, которое вы используете. Найти эту фичу можно в Настройках (GNOME Settings), в меню Приложения (Applications).



Мы также добавили доработали экран блокировки GNOME. Он был в работе целую вечность, но теперь он готов. При показе экрана блокировки фон текущей рабочей области становится размытым, но при этом запущенные приложения по-прежнему не видны. Мы работали над этой и связанной с ней задачами в течение последних трёх или четырёх итераций и преодолели много сложностей, чтобы всё работало хорошо.

Ещё одна вещь, которая нам показалось важной с точки зрения взаимодействия с пользователем, это доступ ко всем расширениям (Extensions). Раньше до расширений можно было добраться через Центр приложений (GNOME Software Center), но не все знали об этом. Теперь управление расширениями мы вынесли в отдельное приложение.



И саму оболочку GNOME мы тоже немного доработали. Например, папки в Лаунчере отличная новая фича. В панели запуска действительно стало легко создавать собственные группы приложений или папки. Многие пользователи долго просили об этом. Папки фактически были добавлены в более ранней версии GNOME, но [функция] требовала доработки, чтобы сделать её по-настоящему крутой. И я надеюсь, в GNOME 3.36 вы оценили её по достоинству.

Папки стали более заметными, и выглядят они великолепно. GNOME сам предложит имя для вашей папки, но при желании очень легко переименовать её.

Какие фичи GNOME недооценены или пока остаются незамеченными?

Э.Б.: Я не знаю, есть ли другие по-настоящему важные фичи в GNOME 3.36. Если вы активно используете GNOME, то самое главное, что вы должны оценить, это улучшенный пользовательский интерфейс. Речь идёт в том числе и о максимально тактичном [и дружественном] взаимодействии с пользователем. Система не должна доставлять вам никакого беспокойства.

[Ещё вспомнил, что] мы упростили работу с полем ввода пароля. Раньше всё приходилось делать через меню, которое вы должны были как-то найти, а теперь всё под рукой.



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

Э.Б.: Всё больше приложений в GNOME теперь реагируют на изменение размеров. В ответ на эти изменения пользовательский интерфейс перестраивается. Приложение Settings (Настройки) в этом смысле является хорошим примером. Если вы сделаете его окно слишком узким, оно по-другому отобразит элементы интерфейса. Мы работали над этим из-за появившихся требований адаптивности интерфейса: такие компании, как Purism, используют GNOME на экранах других размеров (в том числе на телефонах), а также с разными форм-факторами.

Вы не заметите некоторые изменения, пока не начнёте активно пользоваться рабочим столом GNOME. Есть много замечательных возможностей, которые позволяют вам настраивать GNOME с соответствии с вашими предпочтениями.



Вы не только разработчик, но и пользователь GNOME. Скажите, пожалуйста, какие функции GNOME вы считаете наиболее полезными в вашей повседневной работе?

Э.Б.: Я очень часто пользуюсь клавиатурной навигацией. Я использую клавиатуру все время: я живу, положив руки на клавиатуру. Используя мышь слишком часто, я даже могу получить RSI (мышечная боль или травма, возникшая из-за повторяющихся быстрых движений). Возможность использовать исключительно клавиатуру это здорово.

Развитая система горячих клавиш это одно из преимуществ и часть культуры GNOME. В этом же направлении развивается и наш дизайн, который опирается на парадигму использования быстрых клавиш. Так что, это основная часть языка дизайна, а не дополнительная функция, которая когда-нибудь будет удалена.

Кроме того, мне нужно открывать несколько окон на экране и организовывать их в пространстве. Обычно я размещаю два окна рядом. Я также использую несколько рабочих пространств. Я пытался управлять своими рабочими пространствами ещё в 1990-х годах, используя разные виртуальные рабочие столы. Но у меня всегда оставались лишние виртуальные рабочие столы, которые просто болтались без дела. В GNOME достаточно легко создать новое рабочее пространство, когда это вам понадобится. И оно так же легко исчезает, когда в нём пропадает нужда.

Что интересного ждать от GNOME 3.37 и от GNOME 3.38, который запланирован на сентябрь 2020 года?

Э.Б .: Изменения происходят постоянно. Например, сейчас мы работаем над сеткой приложений и её настройками. Прямо сейчас приложения отсортированы по названиям и размещены в алфавитном порядке, но скоро вы сможете перетаскивать их и расставлять произвольно. На этом мы завершаем масштабные изменения, над которыми работали в течение пяти или более лет. Наша цель сделать GNOME менее авторитарным и более ориентированным на пользователя.

Мы также поработали над GNOME Shell. Разработчики хотят сделать некоторые тесты с Overview. На сегодняшний день у вас есть панель слева, панель справа и окна в центре. Мы попробуем удалить дэшборд, потому что, на наш взгляд, она бесполезна. Но вы по-прежнему сможете её вернуть и настроить. Это своего рода реверанс в сторону mobile-first. Но на десктопном компьютере вы находитесь в ландшафтном режиме, и у вас есть много места на экране. А на мобильном устройстве места меньше, поэтому мы экспериментируем с новыми способами отображения контента. Некоторые из них появятся в GNOME 3.38, но всё это очень долгоиграющая история, так что не будем загадывать.

В GNOME Settings появится больше опций. В GNOME 3.38 появится многозадачная панель. Некоторые из новых настроек уже реализованы в приложении GNOME Tweaks, а некоторые из них перейдут из Tweaks в основное приложение Settings. Например, возможность отключить горячий уголок некоторым людям не нравится эта функция. Мы дадим вам возможность настраивать пользовательский интерфейс с несколькими экранами, разместив на каждом из них отдельное рабочее пространство. Многие из этих настроек не доступны прямо сейчас, поэтому мы перемещаем их из GNOME Tweaks.

[В заключении хочу отметить, что] каждый из нас проделал огромную работу, чтобы сделать GNOME лучше, в том числе, для людей, работающих на более ограниченных системах например, таких как Raspberry Pi. В общем, мы много работали и продолжаем работать, чтобы усовершенствовать GNOME [и сделать его более дружелюбным].



На правах рекламы


Нужен сервер с удалённым рабочим столом? У нас вы можете установить абсолютно любую операционную систему. Наши эпичные серверы с современными и мощными процессорами от AMD прекрасно подойдут. Широкий выбор конфигураций с посуточной оплатой.

Подробнее..

Последнее обновление CentOS ломает GRUB2-efi загрузчики

01.08.2020 14:17:18 | Автор: admin

После запуска yum update на CentOS при последующей перезагрузке вас может поджидать сюрприз в виде окирпиченного сервера, который зависает на заставке биоса.


О проблеме на форумах и багтрекерах начали писать вчера. Похоже, что проблема затрагивает все системы с UEFI загрузчиком и актуальна как минимум для версий CentOS 7.8 и 8.2. Вот и мне вчера под вечер не повезло обновиться и перезагрузить сервер, обеспечив себе ночь веселья.


Проблема проявляет себя в момент перезагрузки сервера в виде зависшего экрана с заставкой биоса, от чего сначала вообще не понятно, что происходит ни ошибок, ни консоли grub, только зависшая заставка bios.


Решение


Если после обновления сервер не перезагружался, то чтобы не получить кирпич при последующей перезагрузке достаточно откатить обновление grub2 пакетов и их зависимостей:


yum downgrade grub2\* shim\* mokutil

Если же сервер перезагрузили и кирпич все-таки получили, то чтобы восстановить загрузчик понадобится Live-CD диск или флешка. Последовательность действий для отката пакетов на не грузящейся системе будет следующей:


  • Загрузиться с Live-CD (7 версию я брал тут);
  • Настроить сеть;
  • Смонтировать корневой раздел в /mnt/sysimage;
  • Смонтировать раздел /boot в /mnt/sysimage/boot и раздел /boot/efi в /mnt/sysimage/boot/efi;
  • Выполнить последовательность команд:

    mount -o bind /dev/urandom /mnt/sysimage/dev/urandomecho 'nameserver 1.1.1.1' > /mnt/sysimage/etc/resolv.confchroot /mnt/sysimageyum downgrade grub2\* shim\* mokutil
    

После этого загрузчик обновится на старую версию и сервер должен загрузиться.


Исключение пакетов из обновления


Чтобы при следующем обновлении загрузчик опять не сломался, надо добавить проблемные пакеты в исключения (строка exclude=grub2* shim* mokutil) в файл конфигурации yum /etc/yum.conf.


Проблемные версии пакетов для CentOS 7, именно с ними ломается UEFI загрузчик:
grub2-2.02-0.86.el7.centos.x86_64
shim-x64-15-7.el7_9.x86_64

Подробнее..
Категории: *nix , Настройка linux , Linux. bug

Из песочницы NextCloud в качестве сервиса по созданию защищенных ссылок

04.08.2020 14:20:22 | Автор: admin
Привет, Хабр! Хочу поделиться немного нетривиальным кейсом по настройке NextCloud в качестве сервиса по созданию защищенных ссылок, для прямого скачивания данных с подключенного сетевого smb\cifs-диска. Опишу решения нюансов, с которыми столкнулся во время настройки.

Зачем это надо?


Удобная доставка контента конечному пользователю, минуя возню с FTP и невозможность (из-за NDA) воспользоваться публичными сервисами и облаками для передачи файлов (BTsync, Google-\Mail-\Yandex-Disk\Dropbox\etc).





Предисловие


Наш офис имеет определенную инфраструктуру, в неё входит в том числе и ActiveDirectory, в которой у нас находятся сотрудники, состоящие в группах.

Во время сеанса работы за ПК, после логина, средствами настроенных политик, у каждого сотрудника монтируется сетевой диск. Через него время-от-времени идет обмен данными. В диске есть определенная структура папок, права на которые настроены через эти самые группы. Каждый видит то, что ему позволено настройками.

Обычно, для отдачи данных во внешний мир поднимается, либо отдельный FTP, либо данные выгружаются на уже имеющийся. Признаюсь, это далеко не всегда удобно как минимум, создание и управление временными логинами и паролями (например, когда партнёрам нужно отдать готовый контент), контроль места на FTP-сервере, ручная выгрузка на FTP-сервер перед отправкой.

В какой-то момент нам потребовалось иметь возможность напрямую отдавать конечным пользователям данные во внешний мир именно с нашего сетевого диска и, желательно, чтобы это было относительно безопасно: можно создать ссылку для скачивания (у нее имелось время жизни, пароль, разграничение прав на исходные данные и так далее).

На такую идею нас натолкнули одни из партнеров, так как у них имелся внутренний сервис, но там он был самописным.

Готовых вариантов с ходу в поисковике не нашлось (если у вас есть оные на примете отпишитесь, пожалуйста в комментариях), а тратить потенциально много человеко-часов на разработку с нуля, тестирование и поддержку не было желания и ресурсов ни у кого. Да и зачем изобретать велосипед, если зачастую все уже придумано до. Так на ум и пришел сервис NextCloud, который умеет подключать к себе внешние ресурсы.

Речь пойдет о последней стабильной, на данный момент версии 19, но наш метод настройки подойдет и для более ранних версий мы изначально реализовали это на 16 версии и потом постепенно обновлялись. Недавно я как раз поднимал его с нуля на последней (19), и опираясь на неё пишу статью.

Что мы хотим получить в конечном итоге:


  • Только сотрудники могут заходить в наш сервис и только через ActiveDirectoty\LDAP, точно так же как заходят на офисный пк, в Jira, Confluence, Nexus и пр.
  • После авторизации в веб интерфейсе NextCloud, сотруднику должен быть подключен наш сетевой диск, с точно такими-же правами, как это происходит при заходе с рабочего компьютера.
  • При первом входе в NextCloud у каждой учетной записи создаются файлы-примеры в домашнем каталоге, которые занимают места на диске. По хорошему, от этого надо избавиться.
  • Сотрудник не должен иметь возможность загружать что либо, как на подключенный диск, так и в аккаунт NextCloud .*Это просто наша хотелка, на самом деле она не обязательная.
  • Сотрудник может создавать временные ссылки, защищенные паролем на любые доступные ему ресурсы будь то папка или отдельный файл. А также управлять ими (ссылками) отзывать, менять срок жизни и прочее.
  • Конечному пользователю, кому отправлена защищенная ссылка, достаточно её открыть и ввести пароль, чтобы получить возможность скачать расшаренные ему данные.



Развёртка и настройка зависимостей


Для начала, нам надо иметь отдельную виртуалку или сервер, где можно установить операционную систему, и после NextCloud.

На Хабре есть не одна статья, посвященная развёртке системы и сервиса.

AlexanderS достаточно хорошо и подробно описал процесс от установки системы до самой настройки облака (включая актуализацию статей по годам). Не вижу смысла в очередной раз это всё повторять.

1. Так как мы подключаем в NextCloud сетевой диск, то нам понадобятся пакеты в систему: smbclient, libsmbclient , php-ldap, и php-smbclient.

Ремарка, на случай использования Docker
Если вы тоже используете докер, то напомню официальный образ не имеет на борту пакетов для работы с samba и вам лучше создать форк, установив их в своем DockerFile. И, согласно документации, установка пакета php-smbclient внутри их образа немного отличается от классического apt install package.

Пример DockerFile
FROM nextcloud:latestRUN apt update -y &&  apt install -y --allow-unauthenticated smbclient libsmbclient libsmbclient-devRUN pecl install smbclientRUN docker-php-ext-enable smbclient



2. Из-за особенностей настроек нашего сервера samba (отключена поддержка smb1), на машине с nextcloud, в файлах /etc/samba/smb.conf и /usr/share/samba/smb.conf пришлось поменять строки, отвечающие за протокол:

[global] client min protocol = SMB2client max protocol = SMB3

Продолжение примера DockerFile
RUN rm -frv /etc/samba/smb.conf /usr/share/samba/smb.confADD smb.conf /etc/samba/ADD smb.conf /usr/share/samba/


В ином случае, nextcloud так и не смог подключиться к диску.



Настройка nextcloud


Итак, Nextcloud уже установлен, зависимости поставлены, а в сервисе заведен один внутренний юзер, который создался во время установки.

Шаг первый. Подготовка шаблона аккаунтов сотрудников.


Поскольку у нас будет не один сотрудник в системе, а постепенно их количество будет меняться если заранее не настроить шаблон создаваемого пользователя у каждого будет в домашней папке несколько файлов-примеров. Хорошо что по этому поводу у nextcloud есть отдельная настройка skeleton files, которая настраивается в config.php.

  'skeletondirectory' => '/var/www/html/data/donotdeletme',

То есть, можно создать пустую папку и указать в конфиге полный путь к ней.

Шаг Второй. Делаем пользователей read-only


Достаточно указать квоту в 1 B (1 байт) в разделе настроек пользователей (http(s)://nextcloud.domain.tld/settings/users).

Шаг третий заранее чиним ZipStreamer


ZipStreamer библиотека, используемая в бекенде NextCloud, она служит для создания архивов на лету, то есть во время скачивания пачки файлов.



Как это работает
Если вы перейдя по шареной ссылке, нажали кнопку "Dowload All Files"/"Скачать все файлы", то вы заметите, что вам не показывается в браузере (или в менеджере загрузок) конечный вес архива, а полоса загрузки будет неопределенной.



Это связано с тем, что по этой кнопке система в режиме реального времени создает и отдает вам на скачивание архив (в большинстве случаев .zip, в редких кейсах .tar)

Кстати, в силу особенности этой технологии, возобновление приостановленных загрузок в этом случае невозможно.

Похожее поведение есть у и аналогичных сервисов: Google Drive, Яндекс.Диск, и т.д.

Проблема кроется в том, что по неизвестным причинам, заложенная в NextCloud логика сбоит, и при случае, если в папке больше 65536 файлов, и\или их общий вес будет превышать 4гб скорее всего вы столкнетесь с проблемой, что скачанный файл будет либо побит, либо загрузка будет прерываться после скачанных 4гб.

Данной проблеме выделяли достаточное время, на GitHub даже есть, и не один, закрытый тикет (#1755, #15871, #8798), но несмотря на то, что якобы проблема решена у нас она так и осталась, и с переменным успехом воспроизводилась, очень мешая работе. Пришлось решать её более радикально.

Решение
Поскольку у нас 100% 64хбитная система, то мы принудительно говорим библиотеке использовать 64х-битный режим. Решение в лоб.

<папка, где установлен nextcloud>/lib/private/Streamer.php:
- $this->streamerInstance = new ZipStreamer(['zip64' => false]);+ $this->streamerInstance = new ZipStreamer(['zip64' => true]);

Ремарка, на случай использования Docker
В официальном образе происходит при каждом запуске контейнера некий Integrity Check и из одного места в другое распаковываются оригинальные файлы поверх установленных( из /usr/src/nextcloud/* в /var/www/html/*).

Поэтому просто в лоб замапить файл в условном /var/www не получится при запуске файл либо перетрется оригиналом, либо контейнер запустится и упадет сразу с ошибкой.

Так что мы подменяем патченым файлом исходный в папке /usr/src/nextcloud/lib/private/ еще при сборке в CI нашего форкнутого образа. Получается, наш поправленный файл будет гарантированно всегда использоваться.

Продолжение примера DockerFile
RUN rm -frv /usr/src/nextcloud/lib/private/Streamer.phpADD Streamer.php /usr/src/nextcloud/lib/private/RUN chown nobody:nogroup /usr/src/nextcloud/lib/private/Streamer.php

Эти манипуляции, по крайней мере при использовании докер-образа, в Панели Администрирования точно завалят вам встроенную проверку на подлинность, имейте это ввиду.




Но лично нас пока это устроило.

Шаг четвертый настраиваем параметры ссылок


В параметрах публикации настраиваем правила так, как будет удобно. Например, делаем обязательную защиту паролем и ставим обязательный срок жизни.

Шаг пятый подключаем сетевой диск


  1. Переходим в настройку внешних хранилищ. (http(s)://nextcloud.domain.tld/settings/admin/externalstorages)
  2. Выбираем добавление CMB \ CIFS хранилища.
  3. Заполняем поля имени, домена, папки и тд.
  4. Выбираем Учетные данные, хранить в базе данных именно этот пункт позволяет при заходе пользователя по его связке логина и пароля подключать диск к его учетной записи в NextCloud. (Пункт хранение логина и пароля во время сессии не взлетел).
  5. Не забываем в меню <...> отметить чекбоксами Только чтение и разрешение предоставление общего доступа.

Шаг шестой запускаем пользователей через LDAP


Теперь, когда мы все подготовили ставим из маркетплейса плагин, и сразу после подключаем LDAP. В нашей системе, мы давали доступ сотрудникам, которые находятся в группе NextcloudAccess. Можете сделать аналогично.



Заключение


Всё, после всех этих нехитрых, но местами не самых очевидных манипуляций сервис работает, диск подключен, сотрудники добавлены, а пользователи качают и довольны.

Полный пример нашего DockerFile
FROM nextcloud:latestENV DEBIAN_FRONTEND noninteractive#installing smbclientRUN apt update -y &&  apt install -y --allow-unauthenticated smbclient libsmbclient libsmbclient-devRUN pecl install smbclientRUN docker-php-ext-enable smbclient#fix of ZipStreammerRUN rm -frv /usr/src/nextcloud/lib/private/Streamer.phpADD Streamer.php /usr/src/nextcloud/lib/private/RUN chown nobody:nogroup /usr/src/nextcloud/lib/private/Streamer.php#fix of smb configRUN rm -frv /etc/samba/smb.conf /usr/share/samba/smb.confADD smb.conf /etc/samba/ADD smb.conf /usr/share/samba/




Нагрузочное тестирование


Как дела с нагрузкой? спросите вы напоследок.

Замеры в час пик




Наш инстанс сервиса крутится на ~ 6Gb Ram + 6CPU в виртуальной машине среди других VM.

При пике нагрузки на сеть оперативной памяти использовалось чуть более 2.5Gb, процессор забит не был, а отдача в среднем была около 5Gbit/s (рекорд доходило и до 8Gbit/s).

Единственное, что заметили при отдаче сверх 6Gbit/s во внешний мир, у нас периодически отваливается web-интерфейс, но сами загрузки у пользователей продолжают идти.



Спасибо, что дочитали. Если у вас есть вопросы, замечания или пожелания не стесняйтесь, всегда рад конструктивной критике.



Проверено на: nextcloud 16, 17, 18, 19Дата написания: 26.07.2020Дата правок: 02.08.2020Что поправлено: Сделал кликабельные скриншотыВерсия: 1.0.0.5
Подробнее..

Категории

Последние комментарии

© 2006-2020, personeltest.ru