LINUX.ORG.RU

Запуск скрипта для приложения Kotlin

 , , ,


0

2

Есть некий DSL написанный на Kotlin, которые делает что-то. Живет оно в серверном приложении. Есть клиент, который может взаимодействовать с сервером. Хочется - отправить с клиента код написанный на этом чудо-DSL и выполнить его на стороне сервера.

Иными словами - через что в Kotlin можно сделать некий eval, который позволит не просто выполнить код на Kotlin, о и пропихнуть туда все нужные зависимости и некоторые данные.

Гуглить умею. Пока ничего из того, что нашел - не взлетело.

Хочется - отправить с клиента код написанный на этом чудо-DSL и выполнить его на стороне сервера

Ты собираешься встроить уязвимость в своё приложение. Нельзя разрешать клиенту выполнять код на сервере.

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

А куда конкретнее? У меня есть текст, который является кодом на DSL. Есть сервер. Как мне принятую строку выполнить на клиенте

small-entropy
() автор топика
Последнее исправление: small-entropy (всего исправлений: 1)

Если абстрактно, то:

  1. Компилируешь код используя JDK и Kotlin SDK,
  2. Загружаешь его класслоадером,
  3. Создаёшь объект через рефлексию,
  4. Дёргаешь его интерфейс, пихаешь в него данные.
  5. PROFIT

Если реально, то:

  1. Выкидываешь Kotlin,
  2. Пишешь DSL на Groovy,
  3. Загружаешь через ScriptEngine (JSR-223), …
  4. PROFIT

Для извращенцев есть Java on Truffle, которая даёт возможность запускать яву в яве (west_coast_customs.jpg).

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

С тех пор, как появился Kotlin, необходимость в Groovy примерно нулевая. Есть инерция рынка, но это вопрос времени.

Посмотри на развитие Gradle (но это не единственный успешный пример DSL на Kotlin).

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

Груви никогда и не был особо популярным, тащем-та. У него была и есть своя ниша, только и всего. А котлин – искусственный язык, который существует только благодаря трениям гугла с ораклом по поводу использования явы в андроиде. Если бы гугл тогда смог туда пихнуть яву 8+, то он бы не стал завязываться на эту хобби-поделку Бреслава.

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

        ▲ Кол-во прогеров на Котлине, без учёта андроидомакак
        │
        │
        │
        │
        │
        │
        │
        │
        │
        │
        │
        │
        │
        │
     1  ├────────────────────────────────┐
        │                                │
        │                                │
        │                                │
        │                                │
     0  └────────────────────────────────┴──────────────────────────────►
                                         ▲                                Время
                                         │
                                         │
                                         │
                                         │ Бреслав выгорел


cocucka_B_TECTE
()
Ответ на: комментарий от small-entropy

Какую задачу? Задача «дать клиенту выполнять свои скрипты на сервере» - анти-паттерн с т.з. кибербезопасности. На раннем этапе жизни *nix достаточно понаступали на грабли из-за command Injection и проч. порнографии.

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

Тут дело такое.

Когда ты скачиваешь некий проект с гитхаба к себе на машину и выполняешь ./configure; make all check или, прости Господи, ./gradlew build (или даже просто ./gradlew tasks) — ты слепо выполняешь чужой недоверенный код.

Когда ты открываешь проект в IDE, и среда строит тебе проектную модель — ты выполняешь недоверенный код.

И когда ты на условном гитхабе гоняешь тесты к своему проекту — гитхаб выполняет уже твой собственный недоверенный (с его точки зрения) код. А когда к тебе в проект пришёл какой-то незнакомый инженер и просит принять его PR — то это вообще ужас.

Я уж не говорю про всякие средства управления зависимостями, pip, npm, mvn, gradle, вот это вот всё.

Решается эта проблема запуском недоверенного кода в песочнице: docker, k8s, runsc, gvisor — решений масса.

Bass ★★★★★
()

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

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

Требуется собрать сложный XML. На сервере есть для этого DSL, нужно через клиент как-то передать по сути скрипт написанный на нем и выполнить на сервере. Один из вариантов - выполнить скрипт в каком-то изолированном для сервера окружении

small-entropy
() автор топика
Ответ на: комментарий от Bass

Тут дело такое.

Тут дело такое. При прочих равных, сравнивать свой локалхост с сервером некорректно.

И когда ты на условном гитхабе гоняешь тесты …

это ортогонально фиче DSL, т.е. опять некорректное сравнение.

Решается эта проблема запуском недоверенного кода в песочнице: docker

докер про удобство развёртывания, а не про безопасность

seiken ★★★★★
()
Ответ на: комментарий от small-entropy

Наверное, можно. Но если язык DSL полноценный Тьюринг-полный, встанет в полный рост проблема отказа в обслуживании. Ведь для произвольной программы невозможно определить, когда она завершится и сколько памяти выжрет.

seiken ★★★★★
()
Ответ на: комментарий от small-entropy
  1. В докере с интерпретатором вашего DSL (где же ещё-то) запущен демон с обычным веб интерфейсом.
  2. Порт, понятно, прокинут наружу.
  3. Скрипты передаются POST запросами.
  4. Данные для сборки XML доступны в контейнере через примонтированную файловую систему.

Как-то так.

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

Ставится разумный лимит и если скрипт не укладывается, то он принудительно убивается, а клиенту возвращается ответ «408 Request timeout». А дальше уже проблема клиента разбираться где он накосячил.

ugoday ★★★★★
()

Берешь и реализуешь парсер этого DSL, и потом интерпретатор.

Валидируешь по ходу интерпретации, что там можно вызывать клиенту, а что нет.

В чем проблема?

При чем тут именно котлин вообще? При чем тут даже JVM вообще? Без разницы на чем писать. Лучше всего, конечно, на лиспе, но от макак в этой нашей индус-трии, хер дождешься использования лиспа, они себе DSL на XML сделают, который будет компилировать XML в XML, лишь бы на лиспе не писать.

Для того чтобы почитать как реализовывать языки программирования, включая DSL - рекомендую почитать SICP, и потом Dragon Book.

lovesan ★★
()