HowTo, linux

Linux: Очистка дюз в принтерах Epson

exampleЛюбой струйный принтер должен печатать как минимум раз в неделю. В противном случае чернила в соплах засыхают и на итоговом изображении видны полосы там, где дюзы забиты.

На превью как раз такая проблема — забита часть сопел.

Читать далее

Разработка

PHP: Самые распространенные проблемы при работе с сессиями

phpsessionsС сессиями в php существует множество непонятных проблем. С появлением виртуальных окружений проблем стало больше.

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

session_start(): open(filename, O_RDWR) failed: No such file or directory

Очевидно, что ошибка возникает, когда не существует пути, по которому пишутся данные. Но при этом вы знаете, что на диске каталог, который был указан как аргумент session_save_path(), существует.

Например.

$ mkdir /tmp/sessions
$ chmod 777 /tmp/sessions
session_save_path('/tmp/sessions');
session_start();

Вы увидите на экране или в логах ошибку из заголовка (не во всех дистрибутивах).

Можно посмотреть audit.log из selinux, но если там нет ничего подозрительного и каталог действительно есть (а вы его создали выше), то причина такого поведения достаточно неожиданна.

Происходит это потому что вы работаете в centos 7 версии (или redhat\fedora) и выше. Именно в этой версии ввели параметр PrivateTmp для сервисов. Что это означает для нас?

Сделайте второй скрипт, который перечисляет содержимое директории /tmp, а так же выводит реальный путь каталога /tmp/sessions.

var_dump(glob('/tmp/*'));

Откройте скрипт в браузере. Вы увидите, что содержимое в браузере кардинально отличается от содержимого реальной папки /tmp. На скриншоте мы видем вывод из консоли и из браузера — результат совершенно разный.

2018-06-02-12:32:03_1625x863

Как это побороть? Использовать другой каталог для хранения сессий. Или перед стартом приложения проверять и создавать в случае необходимости нужную файловую структуру.

session_start(): Session data file is not created by your uid

Не самая распространенная ошибка. Чаще всего возникает в виртуальных окружениях.

Ошибка возникает в случае, когда uid владельца файла сессии не совпадает с uid текущего пользователя под которым запущен интерпретатор.

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

$file = __DIR__ . DIRECTORY_SEPARATOR . 'file.name';
$fd = fopen($file, 'w');
fwrite($fd, 'test data');
fclose($fd);
if (file_exists($file)) {
    $stat = stat($file);
    var_dump($stat['uid'] == posix_getuid());
}

Если мы увидим false, то да. Проблема имеет мысто быть. И вам нужно переместить сессии в другое место.

Так же подобное поведение характерно при некоторых способах монтирования nfs.

session_start(): open(filename, O_RDWR) failed: Permission denied

Каталог недоступен для записи и достаточно дать права 777. Но тут не все так очевидно и данный трюк действует не всегда. Если вы работаете в дистрибутивах, которые используют selinux, то даже при установке полных прав система можем вам не позволить писать по выбранному пути.

Это происходит потому что контекст процесса отличается от контекста папки. Вы всегда можете посмотреть в /var/log/audit/audit.log чтобы убедиться.

Как обращаться с контекстами можно подробнее посмотреть в документации и в книге.

Литература

HowTo, linux

Fedora: сборка пакетов из src.rpm

2018-05-19-12:35:39_1076x631Чаще всего то не требуется обычному пользователю. Но бывает ситуации, когда пакет собран с поддержкой библиотеки исключенной из дистрибутива.

Недавно это случилось с chromium в centos, а с драйверами от epson случается постоянно.

$ cd imagescan-bundle-fedora-27-1.3.23.x64.rpm/
$ ./install.sh
[sudo] пароль для penguin:
Последняя проверка окончания срока действия метаданных: 2:53:00 назад, Сб 19 мая 2018 09:42:23.
Ошибка:
 Проблема 1: conflicting requests
 - nothing provides libboost_filesystem.so.1.64.0()(64bit) needed by imagescan-3.33.0-1epson4fedora27.x86_64
 Проблема 2: package imagescan-plugin-networkscan-1.1.1-1epson4fedora27.x86_64 requires imagescan >= 3.9.0, but none of the providers can be installed
 - conflicting requests
 - nothing provides libboost_filesystem.so.1.64.0()(64bit) needed by imagescan-3.33.0-1epson4fedora27.x86_64
 Проблема 3: package imagescan-plugin-gt-s650-1.0.0-1epson4fedora27.x86_64 requires imagescan >= 3.28.0, but none of the providers can be installed
 - conflicting requests
 - nothing provides libboost_filesystem.so.1.64.0()(64bit) needed by imagescan-3.33.0-1epson4fedora27.x86_64
 Проблема 4: package imagescan-plugin-ocr-engine-1.0.0-1epson4fedora27.x86_64 requires imagescan >= 3.14.0, but none of the providers can be installed
 - conflicting requests
 - nothing provides libboost_filesystem.so.1.64.0()(64bit) needed by imagescan-3.33.0-1epson4fedora27.x86_64

А еще это может потребоваться если мы хотим поставить пакет, который распространяется только в src.rpm.

Читать далее

HowTo, linux

Garmin в Linux: загрузка карт OSM

2018-05-12-15:21:02_1485x851Долгое время считалось, что загрузка карт в гарминовские навигаторы — это очень сложный процесс (на самом деле так и есть, особенно если вы подготавливаете карты вручную).

Но оказалось, что загружать карты все же возможно и можно делать это достаточно быстро. Нам потребуется wine, mapsource и дампы карты проекта gis-lab.

Читать далее

linux

sudo: sorry, you must have a tty to run sudo

Потребовалось выполнить команду из-под sudo на удаленном сервере.

Самое простое, что могло прийти в голову — это использовать stdin чтобы передать пароль для sudo (скрипт не ждет пользовательского ввода).

$ ssh server "echo password | sudo command"

Увы. Было получено сообщение из заголовка статьи.

Почему вообще такое происходит? Причина в том, что конфиг /etc/sudoers содержит опцию (если ее нет, то включите :))

Defaults requiretty
     requiretty        If set, sudo will only run when the user is logged in
                       to a real tty.  When this flag is set, sudo can only be
                       run from a login session and not via other means such
                       as cron(8) or cgi-bin scripts.  This flag is off by
                       default.

Как обойти эту опцию не правя конфиги? Довольно просто.

Нам потребуется использовать опцию -t для ssh, которая заставляет клиента принудительно открывать псевдотерминал даже если нужды в нем нет (работаем с stdin). А для sudo потребуется опция -S, которая заставляет считывать пароль из stdin.

$ ssh -t server "echo password | sudo -S command"

Работает.

Разработка, HowTo

Android Studio: на устройстве не осталось свободного места

2018-05-09-13:48:05_911x394Кто из вас не сталкивался с этим сообщением при обновлении студии под linux? Пожалуй каждый, кому доводилось с ней работать эту ошибку уже видел хотя бы раз и спешно шел в гугель для поиска ответа на вопрос что же ей не нравится и как это фиксить.

java.io.IOException: На устройстве не осталось свободного места
java.io.IOException: No space left on device

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

И чаще всего места там катастрофически недостает.

$ df -h |grep \/tmp
tmpfs 3,9G 455M 3,4G 12% /tmp

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

Читать далее

HowTo, linux

Fedora/CentOS: Не работает vpn подключение по pptp

How_to_vpn_workИногда нам нужно подключится по протоколу PPTP к рабочему vpn (корпоративная сеть). А соединения не происходит и система показывается, что произошел сбой при попытке подключиться.

В логах наблюдается что-то подобное.

май 06 17:45:37 localhost.localdomain pppd[17294]: Connection terminated.
май 06 17:45:37 localhost.localdomain pppd[17294]: LCP: timeout sending Config-Requests

Можно запустить wireshark и посмотреть, что на каждый lcp-запрос есть lcp-ответ.

2018-05-06-19:10:05_358x148

Можно просто попробовать включить данный протокол поскольку firewalld не имеет правила по-умолчанию, которое позволяет системе принимать нужные пакеты. А именно в gre инкапсулируются пакеты lcp, которые отвечают за настройку соединения).

В интернетах часто рекомендуют делать нативное правило как-то так.

$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p gre -j ACCEPT
$ sudo firewall-cmd --direct --add-rule ipv6 filter INPUT 0 -p gre -j ACCEPT
$ sudo firewall-cmd --reload

Не делайте так — потом этими правилами сложнее управлять.

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

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

$ sudo firewall-cmd --zone=home --add-protocol=gre
$ sudo firewall-cmd --zone=home --query-protocol=gre

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

Не забудьте указать нужную зону через параметр —zone как в первом, так и во втором случае.

$ sudo firewall-cmd --permanent --zone=home --add-protocol=gre
$ sudo firewall-cmd --permanent --zone=home --query-protocol=gre
$ sudo firewall-cmd --reload

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

Литература