Почему не обновлять программное обеспечение, не управляемое пакетами, с помощью сами?

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

Чтобы запустить awk с программой, вам нужно указать флаг -f , например:

awk -f my_program.awk my_data.txt

Эта реализация выводит только те переменные CONDx, которые она находит в файле.

# Initialize a couple of variables
BEGIN {
    fill_value = "xx"
    record_number = 0
}

# for any line that begins and ends with `foo` save the record
# and then move on to process the next line
/^foo$/ { save_record(); next }

# for any other line, grab the key and data, and mark that the record is valid
{
    fields[$1] = $1
    record[$1] = $2;
    record[1] = "exists"
}

# after reading in all of the records, output them
END {
    # sort the fields into alpha order
    asort(fields)
    delete fields["REF"]

    printf("%-8s", "REF")
    for (field in fields) {
        printf("%-8s", fields[field])
    }
    print ""

    # print the records
    for (i=0; i < record_number; i++) {
        record_name = record_number_str(i, "REF");
        printf("%-8s", records[record_name])

        for (field in fields) {
            record_name = record_number_str(i, fields[field])
            to_print = fill_value
            if (record_name in records)
                to_print = records[record_name]
            printf("%-8s", to_print)
        }
        print ""
    }
}

function save_record() {
    if (1 in record) {
        delete record[1]
        for (rec in record)
            records[record_number_str(record_number, rec)] = record[rec]
        record_number++
    }
    delete record
}

# awk only has single dimensional associative arrays.  So we need
# to construct a key for the array that has two dimensions
function record_number_str(record_number, rec) {
    return sprintf("%06d %s", record_number, rec)
}

Я считаю, что awk не идеальный язык для этого. Лучше, вероятно, будет что-то вроде: perl, ruby ​​или python. В отличие от реализации на Python. Обратите внимание, что это примерно 1/2 меньше строк:

import fileinput

record = {}
records = []
fields = set()
for line in [l.strip() for l in fileinput.input()]:
    if line == 'foo':
        if record:
            records.append(record)
            record = {}
    else:
        key, value = line.split()
        record[key] = value
        fields.add(key)

# print the header
print("%-8s" % "REF", end="")
fields.remove("REF")
for field in sorted(fields):
    print("%-8s" % field, end="")
print()

# print the records
for record in records:
    print("%-8s" % record["REF"], end="")
    for field in sorted(fields):
            print("%-8s" % record.get(field, ''), end="")
    print()
1
08.04.2017, 15:49
4 ответа

Реализовать этот тип функции довольно сложно, как со стороны «звонка домой» (чтобы узнать, было ли обновление), так и со стороны «обновления на месте»:

  • программное обеспечение, работающее на система пользователя должна знать, как проверить, доступна ли более новая версия (что означает добавление сетевого кода в ваше приложение, которое вполне может не иметь других причин для использования сети);
  • программное обеспечение должно работать независимо от сетевых условиях, в которых он находится (очевидно, когда он полностью отключен; но он также не должен давать сбоев со странными ошибками, когда обнаруживает, что частично подключен);
  • вам нужно каким-то образом решить, доступна ли более новая версия (как сравниваете ли вы версии, когда пользователи собирают исходный репозиторий?);
  • вам нужен сервер где-то на стороне сервера, который вам также может понадобиться разработать;
  • вам нужно убедиться, что обновления могут » не могут быть скомпрометированы либо на сервере, либо через атаку "злоумышленник посередине". k (так что вам нужно использовать TLS и / или какое-то сильное подписание);
  • вам необходимо сделать обновления доступными в форме, доступной вашим пользователям; они могут изначально собираться из исходного кода, но нет гарантии, что в системе, в которой они запускают программное обеспечение, есть все необходимое для восстановления новой версии из исходного кода, поэтому вам необходимо предоставить двоичные файлы (для всех возможных целевых платформ?).

(Это не исчерпывающий список.)

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

Еще один аспект, который следует учитывать, заключается в том, что значительному количеству людей никаким образом не нужно программное обеспечение, которое они используют для звонков домой. Некоторые дистрибутивы идут на некоторые меры, чтобы удалить код , который делает это, из программного обеспечения, которое они распространяют, или даже из других частей программного обеспечения, которые можно использовать для отслеживания его использования ( например, документация, которая загружает изображения, шрифты или CSS из Интернета). См., Например, все теги «нарушение конфиденциальности» в Debian Lintian .

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

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

3
27.01.2020, 23:12

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

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

  • В Linux и большинстве других современных вариантов Unix операционная система поставляется с менеджером пакетов . Большая часть программного обеспечения устанавливается через этот диспетчер пакетов, и диспетчер пакетов обновляет программное обеспечение, когда доступна новая версия.
  • Windows не поставлялась с диспетчером пакетов до недавнего времени, поэтому поставщики программного обеспечения Windows привыкли иметь свой собственный код для установки обновлений.

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

Преимущество подхода Linux перед подходом Windows заключается в том, что он позволяет программным пакетам взаимодействовать друг с другом. Это сложно в подходе Windows, потому что, если программное обеспечение A и программное обеспечение B хотят что-то делать вместе, они должны отслеживать, установлен ли их партнер, справляться с обновлениями, следить за тем, чтобы не оставлять крошек после удаления одного ... Это, в частности, почему программное обеспечение Windows должно объединять все библиотеки, которые оно использует, а это означает, что если в библиотеке будет обнаружена ошибка, то все программное обеспечение, использующее библиотеку, должно быть обновлено. Напротив, в Linux необходимо обновлять только пакет, содержащий библиотеку, независимо от того, сколько программ ее используют.

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

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

Если вы хотите иметь последнюю версию программного обеспечения, даже если она вам не нужна, вам следует установить скользящий выпуск, такой как Debian unstable или Arch Linux. Дистрибутивы с согласованными выпусками, такие как Ubuntu, Mint или Debian stable, предназначены для людей, которые не хотят ломать свою систему каждую неделю.

2
27.01.2020, 23:12

Если само программное обеспечение не имеет возможности «звонить домой», чтобы проверить наличие обновлений, как и некоторые браузеры и такие вещи, как Syncthing, обычно не существует механизма, который сможет автоматически предупредить пользователя/администратора о наличии более новой версии программного обеспечения.

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

Тот, кто упаковывает, например.Ansible, или GNU coreutils, или оболочка Yash, или CMake, или любой другой из тысяч программных проектов, доступных для конкретная система Unix, скорее всего (но не обязательно), будет подписана на соответствующие списки рассылки для этих проектов и/или будет иметь специальные инструменты для регулярного просмотра репозиториев исходного кода или исходных файлов дистрибутива. Когда они узнают о новом выпуске, они будут загружать, компилировать, тестировать, исправлять (и т. д.) и упаковывать программное обеспечение соответствующими способами в зависимости от процедур упаковки в их Unix. Это может включать информирование как вышестоящих (разработчику программного обеспечения), так и нижестоящих (пользователей программного обеспечения) о несовместимостях или других проблемах, возникающих в процессе сборки/упаковки.

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

Мне важно, например, чтобы GNU Stow был доступен для OpenBSD (я являюсь "мейнтейнером порта" для этого программного обеспечения). Время от времени я проверяю текущий статус Stow на веб-сайте GNU (он не очень часто обновляется), и когда я замечаю новую версию, я устанавливаю ее и убеждаюсь, что она работает, и обновляю порт OpenBSD. на моей частной машине. Затем я отправляю по электронной почте список портов OpenBSD с патчем для порта (порты распространяются в виде набора файлов Makefile в OpenBSD).Затем кто-то с правами на фиксацию удостоверится, что мой патч применяется правильно и что порт выглядит правильно, прежде чем фиксировать его в CVS-дереве портов OpenBSD.

В следующий раз, когда пользователь обновит дерево CVS и перестроит порт или загрузит бинарный порт, который в конечном итоге появится, его установка GNU Stow будет обновлена. Но GNU Stow сам по себе не знает, доступна ли его новая версия. GNU Stow просто не должен этим заниматься. Это инструмент, который используется для установки стороннего программного обеспечения в автономных иерархиях каталогов, и было бы серьезно странно, если бы он пытался «звонить домой» каждый раз, когда он использовался (так же странно, как если бы ls внезапно потребовался доступ к сети для запуска).

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

3
27.01.2020, 23:12

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

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

1
27.01.2020, 23:12

Теги

Похожие вопросы