LINUX.ORG.RU

Сообщения intelfx

 

Как жить без специализации impl-ов?

enum Edge<T> {
	Edge(Option<T>),
	Nothing
}

impl<T> fmt::Display for Edge<T> {
	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
		write!(f, "{}", match self {
			&Edge::Edge(_)        => "E",
			&Edge::Nothing        => "-",
		})
	}
}

impl<T: fmt::Display> fmt::Display for Edge<T> {
	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
		write!(f, "{}({})", match self {
			&Edge::Edge(_)        => "E",
			&Edge::VirtualEdge(_) => "e",
			&Edge::Nothing        => "-",
		}, match self {
			&Edge::Edge(Some(v))        => v,
			&Edge::VirtualEdge(Some(v)) => v,
			_                           => "-"
		})
	}
}

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

Замысел состоит в том, что второй impl основной, а первый — fallback на тот случай, если Edge инстанцировали от чего-то, что нельзя распечатать.

 

intelfx
()

Fighting the borrow checker: обращение к объекту в аргументах при вызове метода из него же

struct Foo;

impl Foo {
    fn get(&self) -> usize {
        42
    }
    
    fn set(&mut self, b: usize) {
    }
}

fn main() {
    let mut f = Foo;
    
    f.set(f.get());
}

results in


<anon>:15:11: 15:12 error: cannot borrow `f` as immutable because it is also borrowed as mutable [E0502]
<anon>:15     f.set(f.get());
                    ^
<anon>:15:5: 15:6 note: previous borrow of `f` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `f` until the borrow ends
<anon>:15     f.set(f.get());
              ^
<anon>:15:19: 15:19 note: previous borrow ends here
<anon>:15     f.set(f.get());
                           ^
error: aborting due to previous error
playpen: application terminated with error code 101

Почему? Здесь всё верно, иммутабельное заимствование f при вызове get() кончается до вызова set().

 

intelfx
()

Современный архиватор-2016

навеяно недавней новостью про gzip

Собственно, вопрос: какой формат архива и какая его реализация сейчас претендует на звание Современного Универсального Архиватора™? Например, если нас совершенно не волнует обратная совместимость — то есть ли такой архиватор, который всегда сжимает лучше gzip и работает быстрее gzip (без учёта многопоточности)?

 , , , ,

intelfx
()

А что случилось с белкой?

Почему случился WВИМ? Поиск по сайту ничего не дал.

 

intelfx
()

Мамкин кулхацкер mode on: запретить доступ к некоторым файлам для всех процессов, кроме <...>

Приветствую.

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

А что делать, если мы хотим защититься «от себя», т. е. от недоверенных программ, запущенных с теми же user/group?

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

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

Возможно ли такое? SELinux?

Clarification. На самом деле SELinux — это последний вариант, потому что в арче придётся полсистемы пересобрать с ним, включая ядро. Тем, кто компетентен в SELinux, я лучше задам конкретный вопрос: можно ли его настроить так, чтобы не приходилось переписывать политику для каждого нового установленного приложения? Иными словами, в режиме «всем всё можно, кроме вот этой директории — в неё нельзя вообще никому, кроме помеченных в рантайме PID'ов».

 , ,

intelfx
()

Автоматически освободить мьютекс по выходу из функции (RAII-style) на Си

Сабж. Есть C99 (совместимость с компиляторами кроме gcc и clang не нужна, совместимость с libc кроме glibc — тоже); есть самописные мьютексы (mutex_t, mutex_lock(mutex_t *), mutex_unlock(mutex_t *)).

Хочется сделать автоматическое освобождение захваченного мьютекса при выходе из захватившей его функции (типа std::lock_guard в плюсах). Очевидное решение — локальная переменная с адресом мьютекса и __attribute__((cleanup(...))), но хочется сделать красивее, без лишних локальных переменных: ведь адрес мьютекса известен ещё на этапе компиляции.

Возможно?

 ,

intelfx
()

Как можно подождать собственный поток? (clone()+waitpid(), без pthread)

Приветствую.

Собственно, мне нужно заиметь вспомогательный поток, при этом не пользуясь pthread.

Заиметь-то я его заимел с помощью clone() (без CLONE_PARENT), поток завершается с помощью syscall(__NR_exit, 0) — а как теперь его подождать в основном потоке? waitpid(tid, NULL, __WALL) говорит -ECHILD.

UPD: окей, ман говорит, что так делать нельзя:

              A new thread created with CLONE_THREAD has the same parent
              process as the caller of clone() (i.e., like CLONE_PARENT), so
              that calls to getppid(2) return the same value for all of the
              threads in a thread group.  When a CLONE_THREAD thread
              terminates, the thread that created it using clone() is not
              sent a SIGCHLD (or other termination) signal; nor can the
              status of such a thread be obtained using wait(2).  (The
              thread is said to be detached.)

А как тогда?

 , , ,

intelfx
()

навеяно тредом в толксах: ThinkPad T540p + 802.11ac

Доброго седьмого дня недели, бояре. Собственно, вопрос навеян этим тредом: как обстоит дело со сменой WLAN-карточки у ThinkPad T540p?

Сейчас у меня 0x8086:0x08b2, т. е. «Intel Corporation Wireless-N 7260». Хочу что-нибудь с 802.11ac и как можно более future-proof. В то же время совокупляться с говноблобами, которые не умеют в cfg80211, нет никакого желания. Что посоветуете?

 , ,

intelfx
()

Плеер с хорошей поддержкой метаданных (в частности, чтения текстов из тегов)

Разыскивается аудиоплеер, который:

  • имеет неубогий интерфейс
  • умеет вести базу данных коллекции (хотя это необязательно)
  • умеет группировать треки по albumartist'у (в отличие от Rhythmbox, например)
  • умеет читать и показывать тексты песен из тегов самих файлов (а не фетчить откуда попало)

Последнее требование самое важное. Даже офигенный Ex Falso/Quod Libet (казалось бы, кому, если не разработчику mutagen'а, знать про теги всё?) этого не умеет.

UPD: теперь умеет. Подходящий плеер найден путём патчинга неподходящего.

 , ,

intelfx
()

SailfishOS: управление курсором жестами

Сабж. Есть ли в сейлфише способ управлять текстовым курсором жестами? Например, было бы удобно, если бы горизонтальное перемещение пальца по экранной клавиатуре вызывало бы соответствующие перемещения курсора. (Чтобы было понятно, о чём я — в iOS это достигается твиком SwipeSelection.)

 ,

intelfx
()

Примитивный статический file-based генератор блогосайтов из Markdown

Сабж. Допустим, я хочу вести бложик с заметочками и каким-то там about-разделом. Также хотелось бы, чтобы:

  • не было монструозности (один формат, статический реген, никаких встроенных языков программирования, никаких встроенных стилей)
  • маркдаун (желательно pandoc markdown)
  • один пост — один файл
  • естественная структура (/a/b/c/file.md ⇒ рубрики a⇒b⇒c, запись file)
  • теги симлинками, дата модификации из mtime или из Git

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

Есть подобный софт в мире?

 ,

intelfx
()

Форвардинг в файрволле OpenWRT, или «surprise motherfucker!»

Сижу, долблюсь в файрволл опенвртшный. Есть админская зона, есть пользовательская, есть гостевая. Ещё есть VPN'ный интерфейс, который тоже в отдельной зоне (точнее, сразу в двух, по подсетям).

Разрешил форвардинг из VPN'а в нормальную пользовательскую зону, дабы дать человеку remote access к его машине. Обратно, соответственно, по умолчанию, т. е. reject. Проверил, что форвардинг ESTABLISHED/RELATED тоже разрешён. Пингую девайс из пользовательской зоны — хрен. И счётчик реджектов растёт.

Удостоверился в том, что conntrack для ICMP вообще существует в природе. Офигел, почесал репу. Полез на опенвртшное вики. А там —

By default, the firewall will disable connection tracking

Surprise, motherfucker. И зачем так делать, да ещё и по дефолту? И вместе с тем форвардинг между зонами по дефолту однонаправленный, т. е. по сути априори неработающий. Принцип наименьшей неожиданности нервно курит в сторонке.

 , ,

intelfx
()

Деградация zfs, btrfs при заполнении диска

Не так давно я перевёл свою домашнюю файлопомойку (1x1TB, 2x500GB) на zfs. Дисков мало, все они разные, поэтому никакого рейда — просто критические данные лежат на подтоме, для которого включено дублирование данных.

Сначала всё было хорошо. Потом ввод-вывод стал дико тормозить. А потом я наткнулся на статью, в которой красочно рассказано, как расп-дорашивает zfs от случайных перезаписей, если забить её данными хотя бы наполовину. А у меня из 1.8T занято 1.5T, и, видимо, так дальше жить нельзя.

Отсюда три вопроса:

  1. что делать (помимо того, что «вдоль» и «докупать больше дисков»)?
  2. как будут обстоять дела в подобных ситуациях у btrfs?
  3. какие ещё есть ФС из «комбайнов» со снапшотами, подтомами, компрессией и так далее?

Update #1. Нагрузка на ФС — торренты и sqlite-овая БД размером в один гигабайт. Тормоза наблюдаются с последней.

Update #2. После того, как я сделал synchronous = 0; для sqlite-овой БД, всё стало сильно лучше. Вопрос «какого хрена?» всё ещё в силе, т. к. intent log имеется.

 ,

intelfx
()

systemd.conf 2015

$subj. (После)завтра. Я, конечно, вовремя, но всё же.

Вдруг кто-то с ЛОРа туда едет?

 , , , ,

intelfx
()

Linux-роутер, шейпинг и QoS

Вечер добрый.

Имеется ряд идиотских вопросов по настройке tc/QoS/шейпинга/etc. на роутере с OpenWRT. А именно:

  • Есть ethernet-интерфейс (свитч), который разделён на несколько VLAN-ов, часть которых объединена в мост с WLAN-интерфейсом. На что из этого нужно вешать qdisc-и?

    По умолчанию на wlan0 висит mq, на eth0 — fq_codel, на остальных — ничего (noqueue):

    # ip link
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 14:cc:20:62:c1:ab brd ff:ff:ff:ff:ff:ff
    5: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
        link/ether 14:cc:20:62:c1:ab brd ff:ff:ff:ff:ff:ff
    6: eth0.3@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-lan state UP mode DEFAULT group default 
        link/ether 14:cc:20:62:c1:ab brd ff:ff:ff:ff:ff:ff
    7: eth0.1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
        link/ether 14:cc:20:62:c1:aa brd ff:ff:ff:ff:ff:ff
    8: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br-lan state UP mode DEFAULT group default qlen 1000
        link/ether 14:cc:20:62:c1:ac brd ff:ff:ff:ff:ff:ff
    170: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 100
        link/none
    
    # tc qdisc
    qdisc fq_codel 0: dev eth0 root refcnt 2 limit 1024p flows 1024 quantum 300 target 5.0ms interval 100.0ms ecn 
    qdisc mq 0: dev wlan0 root 
    qdisc fq_codel 0: dev wlan0 parent :1 limit 1024p flows 1024 quantum 300 target 5.0ms interval 100.0ms ecn 
    qdisc fq_codel 0: dev wlan0 parent :2 limit 1024p flows 1024 quantum 300 target 5.0ms interval 100.0ms ecn 
    qdisc fq_codel 0: dev wlan0 parent :3 limit 1024p flows 1024 quantum 300 target 5.0ms interval 100.0ms ecn 
    qdisc fq_codel 0: dev wlan0 parent :4 limit 1024p flows 1024 quantum 300 target 5.0ms interval 100.0ms ecn 
    qdisc fq_codel 0: dev tun0 root refcnt 2 limit 1024p flows 1024 quantum 300 target 5.0ms interval 100.0ms ecn
    

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

    Но у меня роутер, и вопрос звучит так: почему вместо плясок с перенаправлением ingress'а WAN-интерфейса нельзя повесить шейпинг на egress LAN-интерфейса?

  • Вообще, в какую сторону следует конфигурить tc, если особых проблем с задержками не наблюдается, а нужно исключительно заставить гостевую WLAN-сеть не мешать основной?

    Какие qdisc стоит использовать? Как классифицировать трафик?

    Другими словами, нужно ли делать что-то сверх банального «на корень HTB, на листья fq_codel, трафик с этих IP в один класс, с этих IP в другой», если я ещё не знаю точно, чего я хочу?

Я сейчас читаю LARTC и, честно говоря, немного охреневаю от количества вещей, которые требуется одновременно держать в голове.

Алсо, devl547. Я где-то видел тебя рассуждающим про traffic control — может, тебе есть, что сказать?

 , , ,

intelfx
()

Hairpin NAT: Linux vs. RouterOS, или «что я делаю не так?»

Добрый вечер, суровые админы.

В вики Mikrotik встречается такой термин, как «hairpin NAT». Это когда устройство, сидящее за NAT'ом, обращается к какому-то порту внешнего IP-адреса этого NAT'а, а шлюз (если на нём настроен форвардинг этого порта) перенаправляет запрос обратно во внутреннюю сеть.

(В принципе, это достаточно удобная фича: изнутри сети можно сделать, скажем, ssh domain.tld, и достучаться до SSH-сервера внутри этой самой сети, вместо того, чтобы вспоминать внутренний IP-адрес этого SSH-сервера или же поднимать свой локальный DNS.)

Так вот. Если шлюз — это Mikrotik RouterOS, то этот самый hairpin NAT по умолчанию не работает. Его нужно настраивать, загоняя в таблицы файрволла значительное количество неочевидных правил. С другой стороны, если шлюз — это GNU/Linux (скажем, OpenWRT), то описанный эффект присутствует совершенно из коробки.

Вопрос: почему? У RouterOS и GNU/Linux различные принципы функционирования файрволла? Или я что-то делаю не так? Или hairpin NAT — это моветон, и то, что оно работает в линуксе, является лишь совпадением/недоразумением/etc.?

 , ,

intelfx
()

Перенаправление портов через SSH + нестабильное соединение

Имеется роутер в жопе мира (с выходом в сеть через 3G-модем, со всеми вытекающими из этого свойствами соединения в виде «ни единого разрыва»). Чтобы этот роутер по-разному админить, я запускаю оттуда обратный SSH-туннель до машинки с globally routable адресом: ssh -N -R 12200:localhost:22 host. При завершении ssh он перезапускается.

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

В openssh есть клиентская опция ExitOnForwardFailure, которая гипотетически может помочь (соединение будет циклически подниматься и отваливаться, пока старая сессия на сервере не умрёт), но на роутере dropbear, в котором аналогичной опции нет.

Следовательно, вопрос: как сэмулировать это поведение server-side? Или, ещё лучше, как заставить сервер при появлении нового соединения немедленно терминировать старое, чтобы оно не мешалось?

 

intelfx
()

Ищу (удалённую) работу на должности (помощника/стажёра) админа либо разработчика C/C++ с уклоном в low-level

Добрый день. 1 (один) студент в лице меня желает работать: либо помощником системного администратора Linux, либо стажёром где-нибудь там, где требуется писать на C/C++/ассемблере (x86, ARM) с уклоном в системщину/низкоуровневые вещи.

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

Опыт оплачиваемой работы (то есть стаж) отсутствует, но опыт разработки как таковой всё же имеется. А именно:

  • участвовал в НИР (научно-исследовательской работе) в Parallels на тему бинарной трансляции ARMv7 в ARMv7 и x86;
  • (немного, но всё же) коммитил в различные open-source проекты (из которых наиболее значимый вклад — это, наверное, реализация поддержки TRIM/discard в ФС reiser4).

Другими словами,

  • Хорошо знаю C/C++11;
  • Достаточно хорошо знаю язык ассемблера x86;
  • Имею представление о языке ассемблера ARM(v7);
  • Хорошо знаю устройство GNU/Linux (больше со стороны юзерспейса, потому и GNU/);
  • Владею английским (и техническим, и вообще) и умею читать маны.

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

 , ,

intelfx
()

Тривиальный в настройке мониторинг с веб-интерфейсом

Добрый день, господа. Разыскивается $subj для домашней файлопомойки/всёподрядсервера. Поскольку админ из меня никакой, от этого самого сабжа необходима сравнительная простота настройки (не хочу писать тысячестрочный конфиг и/или руками конфигурить какой-нибудь мускуль в качестве бэкенда хранения) и удобный веб-интерфейс.

По фичам:

  • состояние системы:
    • load average;
    • память;
    • датчики hwmon;
    • произвольные поля из SMART;
    • статистика I/O по разделам;
    • сеть;
    (Если оно ещё будет уметь забирать данные из соответствующих контроллеров цгрупп (сколько кто отожрал с точностью до сервиса) или сразу из systemd'шных API — строго не в ущерб.)
  • примитивный агрегатор логов (хотя бы статистику по количеству сообщений per-priority за промежуток времени);
    (Опять же, хотелось бы интеграцию с journald: фильтр по полям сообщений и отдельные счётчики для логов каждого юнита как частный случай.)
  • графики по всему, что описано выше;
  • оповещения на мыло (например, при превышении каких-то заданных порогов + скажем, ежедневный дайджест вида «среднее и пограничные значения по каждому из параметров»);
  • возможность воткнуть собственные источники данных (вот это обязательно, особенно при отсутствии чего-нибудь из вышеописанного).

Такое вообще существует? Да, нужен комбайн «всё-в-одном», потому что мне влом настраивать и интегрировать друг с другом пятнадцать софтин.

P. S.: это всё — одна машина. Мониторинг должен крутиться на ней же.

 

intelfx
()

«set -e»-корректные функции-обёртки в bash

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

function pkgbuild_is_devel() {
    local NAME="$1"
    [[ "$NAME" =~ -(svn|cvs|git|hg)$ ]]
}

Проблема в том, что при выполнении скрипта с set -e («Exit immediately if a pipeline (which may consist of a single simple command), a list, or a compound command, exits with a non-zero status») так не напишешь: последняя строка совершенно правомерно валит скрипт. Приходится писать так:

function pkgbuild_is_devel() {
    local NAME="$1"
    if [[ "$NAME" =~ -(svn|cvs|git|hg)$ ]]; then
        return 0
    else
        return 1
    fi
}

Так работает, потому что команды-условия исключаются из этой проверки. Но это слишком громоздко. Отсюда вопрос: каким образом это можно сделать компактнее? Отключить set -e не предлагать.

(Я надеюсь, что на ЛОРе есть хотя бы один человек, которому вообще не пофиг на обработку ошибок в скриптах: судя по инит-срачам, все местные скриптолюбители всегда пишут едва ли не идеальный код.)

 

intelfx
()

RSS подписка на новые темы