LINUX.ORG.RU

В Ubuntu по умолчанию задействован sudo-rs, написанный на Rust

 , , ,


0

5

В ежедневно обновляемых экспериментальных сборках Ubuntu, отражающих развитие осеннего выпуска Ubuntu 25.10, вместо утилиты sudo по умолчанию задействован проект sudo-rs, написанный на языке Rust. Решение использовать sudo-rs в Ubuntu было принято в мае, но до последнего времени не было ясно, успеют ли разработчики реализовать в sudo-rs необходимые отсутствующие возможности до перехода Ubuntu 25.10 на стадию заморозки.

Для поставки sudo-rs в Ubuntu 25.10 были выполнены такие требования, как возможность работы в системах со старыми версиями ядра Linux (<5.9), поддержка механизма защиты NOEXEC и профилей AppArmor, исправление проблем со стабильностью, рецензирование пакета и его добавление в репозиторий main. Для возвращения классического sudo в Ubuntu-установках c sudo-rs можно использовать команду update-alternatives --set sudo /usr/bin/sudo.ws. В версии Ubuntu 26.10 в репозитории main планируют оставить только пакет sudo-rs. Что касается утилиты su, то в Ubuntu продолжает использоваться обычная утилита /usr/bin/su, но разработчики намерены в будущем начать эксперименты с использованием варианта su (su-rs) на языке Rust.

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

>>> Подробности на opennet



Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 2)
Ответ на: комментарий от greedyskoof

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

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

seiken ★★★★★
()

На их месте я бы doas из openbsd лучше взял… Ибо тащить компилятор раста для сборки базовой системы ну такое.

Кстати, когда в gcc появится поддержка нормальная раста?

cetjs2 ★★★★★
()
Ответ на: комментарий от gns

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

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

greedyskoof
()
Ответ на: комментарий от greedyskoof

Программы, написанные на Rust 2015, все так же собираются и работают.

Копии обычных программ переписанных на расте всё так же собираются и всё так же никому нахер не нужны.

Починил, не благодари.

Расту жить отсалось (о, опечатка прям в тему) годика 3 где-то. Большие дяди бабло на нём отмывать уже начали, а этот фарш назад не проворачивается - роль самого этого язычка и rust foundation уже определена и изменению не подлежит.

Забавно что Rust Foundation зарегистрирована как 501(c)(3) - то, принято именовать NGO, которые известны тем, что занимаются в основном отмыванием гос и корпоративного бабла, попутно либо вполняя политические заказы, либо изображая бурную деятельность.

501(c)(3) означает:

Organizations for any of the following purposes: religious, educational, charitable, scientific, literary, testing for public safety, fostering national or international amateur sports competition (as long as it doesn’t provide athletic facilities or equipment), or the prevention of cruelty to children or animals.

В отличии от той же Linux Foundation, например, которая всё-же 501(с)(6) -

Оrganization that promotes or addresses a specific common business interest.

Rust - даже не про бизнес, который хотя бы теоретически должен что-то полезное кому-то производить, это тупо НГО для отмывки бабла. :)

Внешние проявления деятельности Rust Foundation полностью соответствуют внешним проявлениям деятельности типичной активистской НГО, так что всё соответствует.

Stanson ★★★★★
()
Ответ на: комментарий от greedyskoof

Лучше не обращать внимание на всех. В том числе и на раст. Сравнивать раст с С++ уж точно бесполезно и не нужно, тут уж, как говорится, «оба хуже». Особенно, если рассматривать современный С++. Раст надо сравнивать с каким-нибудь С-шарпом скорее. А остальное — вкусовщина. Работа с памятью добавляет скрытую исполняющую систему, например, и это сильно ограничивает интеграцию языка. Если смотреть в то же ядро, так там сплошной unsafe extern «C». И что тогда от раста остается, кроме горбатого синтаксиса? А если не использовать unsafe, так код на расте тупо медленный из-за нескончаемых проверок.

gns ★★★★★
()
Ответ на: комментарий от cetjs2

doas не совместим по флагам и конфигам. А компилятор все равно давно тащить уже надо, потому что та же Mesa например для полноценной сборки его требует.

GCC делает неплохой прогресс в имплементации, там говорят простенькие программы компилируется уже.

greedyskoof
()
Ответ на: комментарий от greedyskoof

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

gns ★★★★★
()
Ответ на: комментарий от gns

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

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

Нет, не добавляет. В расте все делается только явно, избегать скрытых подкапотных механизмов это как раз девиз языка.

так код на расте тупо медленный из-за нескончаемых проверок.

Тоже нет. Он очень хорош в устранении таких проверок. И даже лучше, потому что может на этапе компиляции гарантировать отсутствие pointer aliasing-а и прочего, что иногда позволяет оптимизировать результат даже лучше, чем в C/C++.

В общем вы просто какие-то свои абсолютно неправильные догадки проецируете на язык.

greedyskoof
()
Ответ на: комментарий от ulyssesjj

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

Правильно. Работаь надо исключительно из рута. В Кали так и сделано. Берите пример.

Для чувствительных - это сарказм.

her_s_gory ★★
()

Есличо, мой фейспалм там под новостью - это о новости, а не об авторе сообщения.

her_s_gory ★★
()
Ответ на: комментарий от greedyskoof

Сравнивать раст с шарпом смешно, у них абсолютно разные ниши применения.

Я не про применения, я про объектную модель самого языка. Про идею interface and implementation в частности.

Нет, не добавляет. В расте все делается только явно, избегать скрытых подкапотных механизмов это как раз девиз языка.

Даладно! А всякие там boundary checks и reference counting — тоже явно?

даже лучше, потому что может на этапе компиляции гарантировать отсутствие pointer aliasing-а <...>

Ну это может и хорошо в определенных случаях. То-то у него компилятор такой медленный. Сколько будет собираться миллион строк на расте мне даже и подумать страшно... :)

gns ★★★★★
()
Ответ на: комментарий от greedyskoof

Ага, мечтайте.

Точно так же говорили тыщи активистов аналогичных НГО, ровно до того момента, когда всего лишь USAID Трамп чутка поприжал. Или тыщи других активистов других аналогичных НГО, до того момента, когда оказывалось что CEO и прочие топы этих НГО «куда-то подевали все деньги» ни в чём не уиновных «благотворителей», которые щедро благотворили вынутые из-под налогов бабки этим НГО. :)

Stanson ★★★★★
()
Ответ на: комментарий от gns

Я не про применения, я про объектную модель самого языка. Про идею interface and implementation в частности.

Тут тоже раст на самом деле мне больше нравится. Как минимум потому что composition over inheritance. Да и в C# полно своих клопов. Но вкусовщина конечно.

Даладно! А всякие там boundary checks и reference counting — тоже явно?

Разумеется. Пока программист явно не завернет объект в Rc<T>, никакого счетчика ссылок нигде не появится. И даже инкремент счетчика тоже явный, путем вызова метода .clone() на объекте, само по себе ничего не размножится.

Если вы вдруг не в курсе, то в расте почти все делается явно. Никакого неявного боксинга (привет C#), никаких неявных копий. Тут вам даже i32 с i64 сложить не дадут без явного приведения типа. Все идиотские грабли, на которых радостно топтались целые поколения новичков в C-производных языках, постарались убрать.

Сколько будет собираться миллион строк на расте мне даже и подумать страшно… :)

Да, всегда придется некоторый трейдофф иметь. Все лучше, чем в рантайме потом ловить лицом сегфолты и уязвимости. Хотя я бы не сказал, что он собирается шибко дольше аналогичного проекта на C++ с портянками из темплейтов.

greedyskoof
()

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

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

thunar ★★★★★
()
Ответ на: комментарий от Stanson

Еще раз повторю, что все АБВГД сообщества это просто громкое меньшинство. Нормальные программисты используют раст не из-за политики, а из-за того, что это действительно хороший язык.

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

Хотя в таком случае сам язык скорее просто форкнут или создадут похожий. Что возможно даже пойдет ему на пользу.

greedyskoof
()
Ответ на: комментарий от greedyskoof

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

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

Нормальные программисты они такие - им совершенно не интересно переписывать чужие программы на расте. Этот идиотизм может быть интересен только купившимся на маркетинг Rust Evangelism Strike Force «вкатывателям», либо тем, для кого раст это религия по каким-то причинам. И как раз эти категории ничего нового и полезного придумать-то и неспособны.

И нет, под линукс далеко не всё написано. Например, под линукс нет (почти нет) например опенсурсного софта аналогичного дилерской проприетарщине для настройки, диагностики и перепрошивки ЭБУ автомобилей, несмотря на то, что он даже не особо сложный, и даже есть некоторые опенсурсные бибилотеки/юзерспейсные драйвера (разумеется на сишечке) разной степени готовности для всяких D-PDU J2534/ISO22900 и пр. через которые такой софт в основном и работает.

Но, очевидно, растаманы в такое не способны от слова совсем.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

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

Их есть и довольно много уже. Если вы о них не знаете, это ваша проблема.

Да и вообще аргумент такой себе. Как сказать, что какой-нибудь Lisp или Haskell плохие языки, потому что вы не знаете софта, написанного на них.

Но, очевидно, растаманы в такое не способны от слова совсем.

А сишники получается тоже неспособны? Гениальная логика конечно. Или переписать существующий виндовый софт под линукс тоже зашкваром будет считаться?

greedyskoof
()
Последнее исправление: greedyskoof (всего исправлений: 2)

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

zabbal ★★★★☆
()
Ответ на: комментарий от Stanson

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

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

gns ★★★★★
()
Ответ на: комментарий от greedyskoof

Их есть и довольно много уже. Если вы о них не знаете, это ваша проблема.

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

gns ★★★★★
()

в арче sudo-rs тоже есть в стандартной репе. там есть что-то ломающее? не охота с загрузочной флешки грузиться, если он мне попячит систему

rtxtxtrx ★★★
()

В рамках попила бюджета ненужно переписали на ненужно.

Давно пользуюсь doas, там просто нечему ломаться.

Lrrr ★★★★★
()
Ответ на: комментарий от zabbal

Что значит переедут? Можно использовать run0 прямо сейчас вместо sudo, они друг с другом не конфликтуют.

Эта замена в принципе нужна только тем, кто не хочет переходить на альтернативные решения, а хочет сохранить имеющиеся скрипты и конфиги к sudo. Так-то никто не запрещает использовать альтернативы в виде run0, doas или чего-то еще.

greedyskoof
()
Ответ на: комментарий от Lrrr

а кому-то и systemd хватит - это самое безопасное из безопасных, только пока не весь функционал sudo поддерживает и не дружит с de (может сейчас и дружит)

rtxtxtrx ★★★
()
Ответ на: комментарий от greedyskoof

Разумеется. Пока программист явно не завернет объект в Rc<T>, никакого счетчика ссылок нигде не появится. И даже инкремент счетчика тоже явный, путем вызова метода .clone() на объекте, само по себе ничего не размножится.

А вот это и называется скрытая семантика и неявная исполняющая система. То есть указатель — это не просто 8 байт памяти, а некоторая структура скрытой от программиста длины.

Все лучше, чем в рантайме потом ловить лицом сегфолты и уязвимости.

Лучше как раз ловить сегфолты, от них стектрейс получается одной командой. Самая лучшая ОС для отладки — это Солярис/Интел. Он устанавливает бит исключения при обращении по невыровненному адресу (чего я не видел где-то еще). Я там столько сегфолтов наловился... И спасибо Солярису за это!

gns ★★★★★
()
Ответ на: комментарий от rtxtxtrx

НИНУЖНО, большое ЛОРовское :) Очевидно жЫ :)

gns ★★★★★
()
Ответ на: комментарий от gns

А вот это и называется скрытая семантика и неявная исполняющая система. То есть указатель — это не просто 8 байт памяти, а некоторая структура скрытой от программиста длины.

Нет никакой скрытой семантики, обычные широкие/умные указатели как в C++. И размер их всегда известен программисту, это обычные структуры.

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

Расскажите это конечному пользователю. И сегфолты это еще наилучший сценарий.

Проблемы с памятью не всегда так очевидны. Отладка происходящей чертовщины в следствие undefined behavior это целая отдельная народная забава в кодовых базах на C/C++.

Ну и уязвимости конечно. Стоит лишь глянуть сколько из появляющихся каждый месяц новых 0-day уязвимостей в Chomium являются банальным use-after-free, все сразу становится понятно.

greedyskoof
()
Ответ на: комментарий от rtxtxtrx

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

greedyskoof
()
Ответ на: комментарий от greedyskoof

Нет никакой скрытой семантики, обычные широкие/умные указатели как в C++.

В С++ пока еще остался raw pointer. Вот типичная каша в голове — воспринимать всякие умные указатели как примитивные типы. В расте, конечно, примитивные указатели тоже есть, но оно сильно с геморроем.

Расскажите это конечному пользователю. И сегфолты это еще наилучший сценарий.

Я за всю свою карьеру (30+ лет) столкнулся с тем, что моя программа падает у пользователя по моей вине раз или два. Остальные сегфорлты как-то сам вылавливал. НЕ аргумент, на самом деле.

Ну и уязвимости конечно. Стоит лишь глянуть сколько из появляющихся каждый месяц новых 0-day уязвимостей в Chomium являются банальным use-after-free, все сразу становится понятно.

О! этого там дофига. Недавно столкнулся с забавным багом в Фаерфоксе и Хроме, связанным с его песочницей (там код общий, файерфокс в этой части код заимствует у хрома), приводящему к сегфолту в ядре. Так песочница там на расте писана :) Так что, не показатель это все. Пока деталей мы не поняли, если раскопаем, то статью на Хабре писать придется, случай интересный.

gns ★★★★★
()

И пал sudo, годами нам служивший верой и правдой. На смену ему пришёл, о чудо, обновлённый sudo-rs. А дальше-то что, на какой хрене перепишут. Вот удивительно, как люди отказываются от привычек, от утилит, годами служивших нам. Это предательство с нашей стороны.

riokor-v2
()
Ответ на: комментарий от gns

В С++ пока еще остался raw pointer. Вот типичная каша в голове — воспринимать всякие умные указатели как примитивные типы. В расте, конечно, примитивные указатели тоже есть, но оно сильно с геморроем.

Так вот как раз применение сырых указателей является бичом проектов на C++. Там кстати недавно выкатили инициативу safe C++, которая флагом компилятора все это дело запрещает. Будем посмотреть что получится.

Я за всю свою карьеру (30+ лет) столкнулся с тем, что моя программа падает у пользователя по моей вине раз или два.

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


Касательно области применения кстати. На самом деле я против того, чтобы раст тащили во все сферы. Он отлично ложится на относительно низкоуровневые кодовые базы, то есть как замена C/C++. Но вот когда его затаскивают в написание веб приложений например, асинхронный раст это настоящее чудовище, которое легко соревнуется с худшими примерами на C++.

Для таких вещей все же следует брать какой-то более высокоуровневый язык со сборщиком. Тот же C#, Java или Go.

greedyskoof
()
Ответ на: комментарий от greedyskoof

То есть если код написан на редакции Rust 2021, он таким остается навсегда, и будет компилироваться в исходном виде спустя десятилетия, так же как и си.

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

Все эти «редакции» раста - фикция. Макросня, которая поставляется в крейтах не имеет понятия, под какой редакцией запускается, из-за чего, если проект использует редакцию 21, а крейт 21+, то если крейт использует макросы - то никакой совместимости не будет, потому что они могут использовать синтаксис/функционал из 21+. Из-за чего (так как макросня в хрусте буквально то же самое, что в С) ваш код, который пытается собираться под 21й редакцией сломается. Никакой изоляции в этом плане нет и ваш основной проект должен будет как бешеный прыгать по новым редакциям, потому что по ним прыгают крейты. Ну или переписывайте код каждые пару месяцев, потому что дочерне-дочерне-дочерне-дочерний крейт сменил редакцию на более новую и всё по цепочке поломалось.

PPP328 ★★★★★
()
Ответ на: комментарий от vbr

раньше означал функцию с произвольным числом аргументов

Рассказать, в каком году вышло второе издание K&R, в котором настоятельно советуют явно писать void в таком случае, или сам нагуглишь?

buddhist ★★★★★
()
Ответ на: комментарий от greedyskoof

Так вот как раз применение сырых указателей является бичом проектов на C++. Там кстати недавно выкатили инициативу safe C++, которая флагом компилятора все это дело запрещает. Будем посмотреть что получится.

Ну вот ответ в духе «а у вас негров линчуют». Я Вам про Фому, а Вы про Ерему. Когда мне примитивный тип заменяют каким-то объектом со скрытой семантикой, то мне делается некомфортно жить. Или raw pointer, и я сам несу ответственность за его применение, или какой-то объект, за поведение которого я уже не отвечаю. В отсутствие ошибок в исполняющей системе Раста, равно как и в стандартной библиотеке C++ я не верю. И уж всяко я перестаю понимать, каких накладные расходы имеет вот это самое Ваше Rc<T>, равно как я уже перестал понимать семантику копирования объектов по ссылкам в С++. Особенно после появления r-value references :)

gns ★★★★★
()
Ответ на: комментарий от gns

указатели тоже есть, но оно сильно с геморроем.

Чё, в расте сейчас самые продвинутые указатели, и сырые - нет диких нелепых УБ как в сишочке, а в отличие от плюсишечки их таки можно зерокостно завернуть и отгородиться, и апи для провенанса появилось.

zurg
()
Ответ на: комментарий от buddhist

Чот я тут краем уха слышал, что в последних стандартах на Си f() значит теперь то же, что и в С++, то есть функцию без аргументов. Или это пока не так, слава ТНБ?

gns ★★★★★
()
Ответ на: комментарий от PPP328

«Дядя Петя, ты дурак?» ©

Ну да, ведь если в проекте на С++11 подключить хедеры из библиотеки на C++17, то все конечно же так замечательно скомпилируется. Или все же нет? Получается стандарты C и C++ тоже фикция?

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

greedyskoof
()
Ответ на: комментарий от gns

Нет, я как раз об этом. Сырые указатели изжили себя, времена когда C++ был просто «C с классами» давно прошли. В умных указателях нет никакой скрытой семаники, это обычные классы, которые просто написали за вас.

Если что скрытая семантика это когда компилятор или среда исполнения вставляет код, который не отражен в исходнике. В случае C++ и Rust все поведение полностью описано в исходном коде стандартной библиотеки и никуда не скрыто.

В отсутствие ошибок в исполняющей системе Раста, равно как и в стандартной библиотеке C++ я не верю.

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

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

greedyskoof
()
Последнее исправление: greedyskoof (всего исправлений: 4)
Ответ на: комментарий от greedyskoof

Во-вторых, с таким подходом вам вообще никуда.

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

gns ★★★★★
()
Последнее исправление: gns (всего исправлений: 1)
Ответ на: комментарий от gns

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

Но скажем так, далеко не во всех типах проектов такой подход приемлем и в принципе не все хотят этим заниматься.

greedyskoof
()
Ответ на: комментарий от greedyskoof

Да и вообще аргумент такой себе. Как сказать, что какой-нибудь Lisp

Emacs

или Haskell

pandoc

плохие языки, потому что вы не знаете софта, написанного на них.

Знаю. А вот на расте - не знаю.

А сишники получается тоже неспособны?

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

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

Stanson ★★★★★
()
Ответ на: комментарий от cetjs2

Кстати, когда в gcc появится поддержка нормальная раста?

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

hobbit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.