[Console] Сохраняем код в файл

Продолжаю традицию Василия делиться с обществом полезными решениями. В этот раз речь пойдет о компоненте Console (автор Николай Ланец). Для разработчика вещь незаменимая. Я очень часто пользуюсь им. Но у него не хватает одной маленькой, но очень удобной фичи — возможности сохранять код. Благодаря Илье Уткину, консоль научилась хранить код в сессии. Но этого мало. Я для себя немного доработал консоль и теперь она может сохранять код в файл и загружать из файла. Вот этим решением я и готов поделится с обществом. Разработчики должны оценить.

Инструкция простая. При сохранении указываем имя файла, при загрузке выбираем нужный файл.
Вот мой форк консоли. Если Николай даст согласие, я готов отправить пулреквест.

Продолжение темы сохранения.
Сергей Шлоков
31 августа 2015, 13:09
modx.pro
5
2 570
+23
Поблагодарить автора Отправить деньги

Комментарии: 36

Антон Фомичёв
31 августа 2015, 16:14
0
О, это просто отличная доработка!
Особенно учитывая тот факт, что АСЕ плохо оптимизирован под мобильные платформы и вставить текст в окно консоли из буфера обмена на планшетах и смартфонах не получается.

Спасибо!:))
Наумов Алексей
31 августа 2015, 16:51
+2
А мож лучше не в файл, а в табличку? А в админке список вывести, для быстрого доступа.
p.s. это не критика, это предложение))) а плюсик заметке поставил))
    Сергей Шлоков
    31 августа 2015, 18:12
    +1
    Честно говоря не понимаю, чем лучше. Я, например, работая с несколькими объектами, сохраняю файлы для каждого (правильные addPackage и т.п. ) Потом открываю нужный и работаю. Легко и быстро. И доработка простейшая — поправил один файл и создал 3 процессора.
    Так что, лично я не вижу никаких преимуществ табличного варианта.
      Павел Гвоздь
      01 сентября 2015, 07:20
      0
      + файлы, я так понимаю, можно легко перенести в другой проект?
        Сергей Шлоков
        01 сентября 2015, 08:10
        +1
        Ну если файлы легкие, то легко. А если тяжелые, то тяжело. :)
    yani
    31 августа 2015, 18:21
    +2
    Отлично) а то приходилось писать сниппет и выполнять на левой страничке)
      Виталий Киреев
      31 августа 2015, 18:50
      +1
      Нужная штука!
        Илья Уткин
        31 августа 2015, 20:16
        +1
        Классно, мне нравится
          Максим
          01 сентября 2015, 01:47
          +1
          Было бы удобно еще и в сниппеты сохранять/загружать.
          Boris Akimenko
          01 сентября 2015, 13:27
          +1
          Супер!
            Павел Ширяев
            01 сентября 2015, 15:48
            0
            Может быть, стоит разместить пулл реквест к компоненту? Или Николаю напрямую отправить (он у нас зарегистрирован кстати, недавно пост его авторства читал). Нужная штука в некоторых случаях.
              Сергей Шлоков
              01 сентября 2015, 18:00
              0
              Если Николай посчитает нужным такой функционал и его все устроит, я готов отправить pullrequest.
                Воеводский Михаил
                01 сентября 2015, 18:58
                0
                Если я правильно понимаю, сделать PR тебе достаточно легко (все равно все изменения уже на Гите). Поскольку функционал полезный, отправляй запрос, а Николай уже по факту решит. Но такой вариант может ускорить процесс появления обновленной версии.
              Fi1osof
              03 сентября 2015, 11:07
              +2
              Сергей, спасибо за пулл-реквест. Сегодня ближе к вечеру погоняю и скорее всего одобрю.
                Fi1osof
                03 сентября 2015, 11:39
                +1
                Сергей, пробежался я по коду быстренько. Первое, что кидается в глаза — это отсутствие проверки прав при сохранении файлов в процессоре. Это меганесекурно. Любой, залогиненный в админке, сможет записать свой исполняемый код. Это я поправлю.

                Второй большой недостаток, хотя и не такой важный: не использование источников файлов. Там не только работа с нужными директориями, но и сразу проверка прав на них. понятно дело, что в большинстве случаев консоль используют только разрабы самих сайтов, но все же.
                  Сергей Шлоков
                  03 сентября 2015, 12:15
                  0
                  Я решил, что если на выполнение кода права проверяются, то этого достаточно. А так как файлы сохраняются в директорию core и доступ снаружи туда закрыт, то посчитал, что это безопасно.
                  А по источникам файлов… Не все сразу. :)
                    Fi1osof
                    03 сентября 2015, 13:18
                    +1
                    А так как файлы сохраняются в директорию core и доступ снаружи туда закрыт, то посчитал, что это безопасно.
                    Ну да. Только прикол в том, что пользователь можете затереть сам же процессор консоли, записав в него нужный код, и его же вызывать через консоль-коннектор. А может там же создать новый файл, к которому опять-таки будет иметь доступ на выполнение через коннектор консоли, передав нужный action.
                      Сергей Шлоков
                      03 сентября 2015, 13:39
                      0
                      Точно. Добавил basename().
                      Теперь файл сохраняется только в /core/components/console/files/, не выше и не ниже.
                      Так безопасно?
                      П.С. Учиться и учиться ещё.
                        Fi1osof
                        03 сентября 2015, 13:44
                        +1
                        Вот так безопасно: github.com/sergant210/modx-console/pull/2/files
                        А ограничивать только текущей директорией, это, во-первых, не добавляет безопасности, во-вторых, ограничивает функционал (может я хочу поредактировать статический сниппет какого-нибудь стороннего модуля).
                          Сергей Шлоков
                          03 сентября 2015, 13:51
                          0
                          может я хочу поредактировать статический сниппет какого-нибудь стороннего модуля
                          Я такое не закладывал. Я-то думал чтобы сохранять файлы как временные.
                          Вот так безопасно
                          Теперь нужно добавлять это разрешение 'console.save_file' в базу при обновлении компонента.
                            Fi1osof
                            03 сентября 2015, 13:55
                            0
                            Пока не обязательно. Этот компонент изначально ориентирован только на sudo-юзеров, потому прописывать можно любые права — все будет разрешено судошникам. Главное тут — чтобы остальным было запрещено.
                              Сергей Шлоков
                              03 сентября 2015, 14:04
                              0
                              Еще добавил проверку на пустое имя файла. Точно помню, что была, но в процессе видимо пропала.
                                Fi1osof
                                03 сентября 2015, 14:12
                                0
                                Подобные проверки не очень информативны. Проверка идет сразу и наличия кода и имени файла. Если что-то не соблюдается, запись в файл не выполняется, при этом на клиент вернется ответ Успешно. Здесь сразу несколько сценариев с логическими ошибками. К примеру, я сохраняю файл, но по какой-то причине у меня данные кода на сервер не отправились (не важно какие). Сервер мне вернет Успех, я радостный закрываю браузер, потом возвращаюсь к коду через пару дней и начинаю приунывать.
                                Сценарий второй: я что-то там накодил, а потом решил все затереть, дабы никто из напарников не увидел мой быдлокод. Стераю код и отправляю Сохранить. Опять-таки получаю Успех и закрываю браузер. А потом тот же Сергей Прохоров обнаруживаем мой не затертый файл и начинает тыкать в меня пальцем.

                                И еще момент: вот отсутствие кода в запросе не всегда следует расценивать как ошибку (может я хочу стереть все в файл). Возвращать ошибочный ответ здесь нельзя. При этом и не записывать в файл здесь нельзя.
                                А вот отсутствие названия файла — конкретная ошибка, и в данном случае следует возвращать сообщение об ошибке.
                                  Сергей Шлоков
                                  03 сентября 2015, 14:43
                                  0
                                  Поправил.
                                  Сделал так — если код есть — записываем, если нет — удаляем файл.
                                    Fi1osof
                                    03 сентября 2015, 15:05
                                    0
                                    ОК
                                    Сергей Шлоков
                                    03 сентября 2015, 15:49
                                    0
                                    Новый PR слать?
                                    Fi1osof
                                    03 сентября 2015, 15:51
                                    0
                                    Да. Вечером предметней посмотрю.
                Fi1osof
                04 сентября 2015, 21:23
                0
                Сорри, что вчера так и не выкатил новую консоль, до позднего вечера был занят. Сегодня позанимался ей плотно, но не все еще закончил. Там довольно объемный кодрефакторинг пришлось делать. Но завтра уже консоль точно появится. Новшество поюзал, весьма юзабельно получилось.
                  Роман
                  10 января 2017, 22:16
                  0
                  Извините, а как поставить это приложение?
                    Роман
                    10 января 2017, 22:44
                    0
                    точнее, как поставить — это я разобрался. Почти. Поясню:
                    Console у меня стояла, версии 2.0.2. Работало. Но сохранялся код только в Session. Сейчас увидел этот пост, решил надо поставить. Проверил обновленя установленной консоли, пишет обновлений нет. Поискал в Репозитории, нашел, поставил. Сейчас пишет, что версия 2.2.0, однако кнопок «Сохранить/Загрузить в/из файла» не появилось. Кроме всего прочего, если раньше я писал такой код
                    echo "1";
                    то в итоге получал в выводе
                    1
                    А сейчас я получаю вот это
                    {"completed":true,"output":"1
                    
                    \nSQL time: 0.0000 s\nSQL queries: 0\nPHP time: 0.0001 s\nTotal time: 0.0001 s\nMemory: 0 MB<\/pre>"}
                      Сергей Шлоков
                      10 января 2017, 22:50
                      0
                      Напрашивается только один вывод — автор дополнения удалил данный функционал.
                        Роман
                        10 января 2017, 23:05
                        0
                        странно, а написано
                        Console-2.2.0-beta
                        =============================================================
                        - Added execution report
                        
                        Console-2.1.0-beta
                        =============================================================
                        - Added a feature to save the console code to file and load from file.
                        - Added a feature to save the console code to snippet and load from snippet.
                        Ладно удалил сохранение в файл и сниппет, зачем вывод портить было. Э-эх… хорошее было приложение
                          Fi1osof
                          10 января 2017, 23:12
                          +4
                          Напрашивается только один вывод — кто-то не почистил кеш своего браузера после установки обновления.
                            Роман
                            10 января 2017, 23:23
                            +2
                            Поставил +1
                            " — а старушка засвистела?
                            — Нет
                            — Так чего же Вы приперлись?! Болван!
                            — Согласен" © «Операция Ы»
                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                      36