1. Go / Говнокод #27261

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    // https://docs.docker.com/engine/api/v1.24/#create-a-container
    
    POST /v1.24/containers/create HTTP/1.1
    Content-Type: application/json
    Content-Length: 12345
    
    {
           "Hostname": "",
           "Domainname": "",
           "User": "",
           "AttachStdin": false,
           "AttachStdout": true,
           "AttachStderr": true,
           "Tty": false,
           "OpenStdin": false,
           "StdinOnce": false,
           "Env": [
                   "FOO=bar",
                   "BAZ=quux"
           ],
           ...
    }

    Ядро предоставляет сисколл execve. Execve принимает переменные окружения в виде массива строк A=B -
    не знаю конкретных причин, почему так сделано, но скорее всего просто потому что писать хэшмапу под
    это дело, которая еще и будет выкинута из памяти через относительно небольшое время - дело дорогое и
    ненужное, плюс наверняка какой-нибудь лишний пердолинг со стеком.
    https://man7.org/linux/man-pages/man2/execve.2.html

    Го, "человеческий язык" с поддержкой обычных мап из коробки, ничтоже сумляшеся не замечает никакой
    проблемы и заставляет пользователя передавать переменные окружения в том же формате, потому что у
    языка не только синтаксис должен быть таким же тупым, как программист на нём и вообще мы же тут
    делаем вид, что мы C, только лучше.
    https://golang.org/pkg/os/exec/#example_Command_environment

    Докер, "человеческий сервис" с HTTP API, использующим формат JSON с поддержкой обычных мап из коробки,
    ничтоже сумляшеся не замечает никакой проблемы и заставляет пользователя передавать переменные
    окружения в том же формате, потому что на программист на языке должен быть тупым, как этот язык.
    https://docs.docker.com/engine/api/v1.24/#create-a-container

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

    Запостил: Fike, 17 Февраля 2021

    Комментарии (42) RSS

    • Какой багор )))
      Ответить
    • што будет, если написат "GO=V=NO"? excve упадет?

      кстати, пинда тоже блок переменных строкой принимает
      Ответить
      • Да нет, его задача -- доставить эти строчки до запускаемой проги as is. Да и там парсер скорее всего разберёт это как переменную "GO" со значением "V=NO".
        Ответить
        • типа оно лежит в памяти программы блоком , а getenv в юзермоде это парсит?
          Ответить
          • Ну да.
            Ответить
            • понятно

              у винды это где-то в PEBе лежит вроде, у прыща не знаю как называется, PCB небось?. Но видно тут
              $ cat /proc/$$/environ
              Ответить
              • Это кстати стартовое окружение, putenv/setenv его не трогают вроде.
                Ответить
                • ну докер же небось новый процесс родит, так что он наследует
                  Ответить
                  • Видимо в момент exec'а они скукоживаются обратно в один блок и сохраняются, в отличие от остальных страничек.
                    Ответить
                    • не осилил распарсить твою фразу

                      ты имел ввиду, что остальные странички ведут себя как корова, а именно этот блок честно копируется?
                      Ответить
                      • > как корова

                        Большинство старых страничек тупо дропается. Мы же про exec, а не про fork.
                        Ответить
                        • а, тфу, я иблан. exec же поверх загружает.
                          а дескрипторы он не наследует разве? А терминал?
                          наследует же


                          Вообще обычно же делают fork, а потом exec, иначе ты сам себя заместишь, не завезли же NTшный CreateProcess
                          Ответить
                          • > дескрипторы

                            Это же просто циферки... Я так понимаю, в юзермодной части о них вообще ничего нет.

                            > терминал

                            Обычный дескриптор, не?
                            Ответить
                            • в юзерной да, а причем тут это?

                              Есть некоторая память, связанная с процессом.
                              Ну да, эта память скорее всего ядерная, юзермоду не доступная.
                              Но она же тоже копируется (точнее, не удаляется)

                              stdout (циферка) указывает же на тот же самый tty, например
                              Ответить
                            • вощем я читнул таки ман
                              execve замещает процесс with newly initialized stack, heap, and (initialized and uninitialized) data segments.


                              но!

                              By default, file descriptors remain open across an execve().

                              но !
                              File descriptors that are marked close-on-exec are closed;

                              так что файл может и закрыться, смотря как откроешь

                              ps: вектор (строку) с переменными можно явно передать, а если не передать, то онаскоприуется из переменной "environ" (глобальная позикс переменная с окружением)
                              Ответить
                          • > иначе ты сам себя замесишь

                            А есть, кстати, проги которые это абузят для горячего апдейта. Скидываешь данные в шаред мемори, обновляешь код exec'ом, а все сокеты да пайпы у тебя остаются унаследованы и связь с клиентами не прерывается.
                            Ответить
          • Блин, забавно:
            getenv("GO"); // "V=NO"
            getenv("GO=V"); // "NO"
            Т.е. это даже не парсинг, просто поиск префикса. Видимо поэтому мапа тут и не катит.
            Ответить
            • а почему тогда у меня getenv("SH") вертает пустую строку,а getenv("SH") нет?
              Ответить
            • заебца, можно DOS-атаку устраивать тупо напихав мегабайты говна в /etc/environment
              Ответить
              • это что за говно еще такое? от pam что ли?
                збс.

                итого, в линуксе есть /etc/profile, /etc/bash.bashrc (для интерактивных логинов) и блядь /etc/enviroment какой-то
                Ответить
                • Это самый верный способ сломать систему, если напердолить туда неперевариваемого. А вообще насколько понимаю там всгеда базовый $PATH задается.
                  Ответить
            • https://code.woboq.org/userspace/glibc/stdlib/getenv.c.html

              походу да, лол.
              Ответить
    • Goпники
      Ответить
    • Fike, тебе бы по-проще слова использовать и по-понятнее выражаться.
      Ответить

    Добавить комментарий