в centos, debian, docker

Установка и активация JIRA Software Server 7.5.0


Однажды мне стало интересно посмотреть, как устроена защита в одном из самых известных и популярных инструментов для разработчиков — JIRA Software.

ВНИМАНИЕ! Информация в статье доступна только в образовательных целях, НЕ ИСПОЛЬЗУЙТЕ ее для получения несанкционированного доступа к рассматриваемому ПО!

Для «лицензирования» JIRA Software Server 7.5.0 необходимо внести изменения в два файла (приведены актуальные версии файлов на момент установки): atlassian-extras-3.2.jar и atlassian-universal-plugin-manager-plugin-2.22.5.jar.

В стандартной установке на Linux файлы находятся в каталогах /opt/atlassian/jira/atlassian-jira/WEB-INF/lib/ и /opt/atlassian/jira/atlassian-jira/WEB-INF/atlassian-bundled-plugins/ соответственно.

Скачиваем файлы на локальный компьютер, устанавливаем инструмент JD-GUI. Далее:

  • открываем atlassian-extras-3.2.jar с помощью декомпилятора JD-GUI;
  • жмем «File -> Save All Sources» или Ctrl+Alt+S (сохранится архив atlassian-extras-3.2.jar.src.zip);
  • распаковываем полученный архив с помощью архиватора;
  • в atlassian-extras-3.2.jar.src/com/atlassian/extras/decoder/v2/Version2LicenseDecoder.java находим метод loadLicenseConfiguration (в моем случае выглядел так):
/*     */   private Properties loadLicenseConfiguration(Reader text)
/*     */   {
/*     */     try
/*     */     {
/* 218 */       Properties props = new Properties();
/* 219 */       new DefaultPropertiesPersister().load(props, text);
/* 220 */       return props;
/*     */     }
/*     */     catch (IOException e)
/*     */     {
/* 224 */       throw new LicenseException("Could NOT load properties from reader", e);
/*     */     }
/*     */   }

и добавляем в данный метод информацию о лицензии:

/*     */   private Properties loadLicenseConfiguration(Reader text)
/*     */   {
/*     */     try
/*     */     {
/* 218 */       Properties props = new Properties();
/* 219 */       new DefaultPropertiesPersister().load(props, text);

                props.setProperty("LicenseExpiryDate", "2099-01-01");
                props.setProperty("MaintenanceExpiryDate", "2099-01-01");
                props.setProperty("Evaluation", "false");
                props.setProperty("NumberOfUsers", "-1");
                props.setProperty("Organisation", "MyCorp");
                props.setProperty("PurchaseDate", "2017-01-01");
                props.setProperty("SEN", "SEN-L10306231");

/* 220 */       return props;
/*     */     }
/*     */     catch (IOException e)
/*     */     {
/* 224 */       throw new LicenseException("Could NOT load properties from reader", e);
/*     */     }
/*     */   }
  • сохраняем файл;
  • копируем commons-codec-1.9.jar в директорию с исходниками (atlassian-extras-3.2.jar.src);
  • переходим в каталог с исходниками (atlassian-extras-3.2.jar.src) и компилируем класс из java-файла, который мы правили командой:
javac -cp commons-codec-1.9.jar -sourcepath ./ com/atlassian/extras/decoder/v2/Version2LicenseDecoder.java 
  • могут быть ошибки (вызваны “кривостью” декомпиляции исходников), например:
./com/atlassian/extras/common/LicenseException.java:7: error: class, interface, or enum expected
/*    */  * @deprecated
          ^
./com/atlassian/extras/common/LicenseException.java:8: error: class, interface, or enum expected
/*    */  */
          ^
./com/atlassian/extras/common/org/springframework/util/StringUtils.java:101: error: variable strLen is already defined in method hasText(String)
/*     */     int strLen;
                  ^
./com/atlassian/extras/common/org/springframework/util/StringUtils.java:486: error: variable strLen is already defined in method changeFirstCharacterCase(boolean,String)
/*     */     int strLen;
                  ^
Note: ./com/atlassian/extras/common/org/springframework/util/StringUtils.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
  • устраняем ошибки и еще раз компилируем класс. После успешного выполнения в каталоге com/atlassian/extras/decoder/v2/ появится файл Version2LicenseDecoder.class
  • полученныей файл копируем с заменой (по такому же пути com/atlassian/extras/decoder/v2/) в архив atlassian-extras-3.2.jar (проще всего это сделать через mc — Midnight Commander);
  • в общем случае “новый” архив atlassian-extras-3.2.jar необходимо положить (с заменой) на сервере с Jira в каталог /opt/atlassian/jira/atlassian-jira/WEB-INF/lib/ и перезапустить Jira. Если вы запускаете JIRA Software Server 7.5.0 в docker-контейнере, то нужно пересобрать docker-образ согласно инструкциям в Dockerfile (см. ниже)

Аналогичным образом патчим файл atlassian-universal-plugin-manager-plugin-2.22.5.jar:

  • открываем atlassian-universal-plugin-manager-plugin-2.22.5.jar с помощью декомпилятора JD-GUI;
  • жмем «File -> Save All Sources» или Ctrl+Alt+S (сохранится архив atlassian-universal-plugin-manager-plugin-2.22.5.jar.src.zip);
  • распаковываем полученный архив с помощью архиватора;
  • в atlassian-universal-plugin-manager-plugin-2.22.5.jar.src/com/atlassian/extras/decoder/v2/Version2LicenseDecoder.java находим метод loadLicenseConfiguration (в моем случае выглядел так):
private Properties loadLicenseConfiguration(Reader text)
{
  try
  {
    Properties props = new Properties();
    new DefaultPropertiesPersister().load(props, text);
    return props;
  }
  catch (IOException e)
  {
    throw new LicenseException("Could NOT load properties from reader", e);
  }
}

и добавляем в данный метод информацию о лицензии:

private Properties loadLicenseConfiguration(Reader text)
{
  try
  {
    Properties props = new Properties();
    new DefaultPropertiesPersister().load(props, text);
    props.setProperty("LicenseExpiryDate", "2099-01-01");
    props.setProperty("MaintenanceExpiryDate", "2099-01-01");
    props.setProperty("Evaluation", "false");
    props.setProperty("NumberOfUsers", "-1");
    return props;
  }
  catch (IOException e)
  {
    throw new LicenseException("Could NOT load properties from reader", e);
  }
}
  • сохраняем файл;
  • копируем commons-codec-1.9.jar в директорию с исходниками (atlassian-universal-plugin-manager-plugin-2.22.5.jar.src);
  • переходим в каталог с исходниками (atlassian-universal-plugin-manager-plugin-2.22.5.jar.src) и компилируем класс из java-файла, который мы правили такой командой:
javac -cp commons-codec-1.9.jar -sourcepath ./ com/atlassian/extras/decoder/v2/Version2LicenseDecoder.java
  • могут быть ошибки (вызваны “кривостью” декомпиляции исходников), устраняем их и еще раз компилируем класс. После успешного выполнения в каталоге com/atlassian/extras/decoder/v2/ появится файл Version2LicenseDecoder.class;
  • полученныей файл копируем с заменой (по такому же пути com/atlassian/extras/decoder/v2/) в архив atlassian-universal-plugin-manager-plugin-2.22.5.jar (проще всего это сделать через mc — Midnight Commander);
  • в общем случае “новый” архив atlassian-universal-plugin-manager-plugin-2.22.5.jar необходимо положить (с заменой) на сервере с Jira в каталог /opt/atlassian/jira/atlassian-jira/WEB-INF/atlassian-bundled-plugins/, после чего удалить каталоги ${JIRA_HOME}/plugins/.bundled-plugins и ${JIRA_HOME}/plugins/.bundled-plugins/.osgi-plugins и перезапустить Jira. Если вы запускаете JIRA Software Server 7.5.0 в docker-контейнере, то нужно пересобрать docker-образ согласно инструкциям в Dockerfile

Инструкции по сборке docker-образа (Dockerfile) выглядят так:

FROM cptactionhank/atlassian-jira-software:7.5.0

COPY atlassian-universal-plugin-manager-plugin-2.22.5.jar ${JIRA_INSTALL}/atlassian-jira/WEB-INF/atlassian-bundled-plugins/atlassian-universal-plugin-manager-plugin-2.22.5.jar
COPY atlassian-extras-3.2.jar ${JIRA_INSTALL}/atlassian-jira/WEB-INF/lib/atlassian-extras-3.2.jar

CMD ["/opt/atlassian/jira/bin/catalina.sh", "run"]

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

18 Комментария

  1. Все сделал, как по инструкции, но лицензия не подтягивается, в поле лицензии пусто.
    Есть идеи?

  2. «./com/atlassian/extras/common/LicenseException.java:7: error: class, interface, or enum expected
    /* */ * @deprecated
    ^
    ./com/atlassian/extras/common/LicenseException.java:8: error: class, interface, or enum expected
    /* */ */
    ^
    ./com/atlassian/extras/common/org/springframework/util/StringUtils.java:101: error: variable strLen is already defined in method hasText(String)
    /* */ int strLen;
    ^
    ./com/atlassian/extras/common/org/springframework/util/StringUtils.java:486: error: variable strLen is already defined in method changeFirstCharacterCase(boolean,String)
    /* */ int strLen;
    ^
    Note: ./com/atlassian/extras/common/org/springframework/util/StringUtils.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.»

    «могут быть ошибки (вызваны “кривостью” декомпиляции исходников), например:»

    Извините за тупой вопрос а как это сделать?

    Спасибо.

    • Смотрите сам файл, на указанные строки — возможно там комментарии, которые можно удалить или отступы поправить…
      Если визуально в файле вас ничего не смущает и не появляется никаких идей — начинаете гуглить. Google все знает

  3. env | grep JIRA_HOME ничего не выводит.

    Каталог plugins есть, но в нем нет нужного каталога, есть какието два других.

    П.С : Чет здесь не получается ответить на ответ в комментариях((

    • У меня в каталоге plugins есть такие папки:

      drwxr-x--- 2 daemon daemon 4096 Oct 2 10:31 .bundled-plugins
      drwxr-x--- 2 daemon daemon 4096 Oct 2 10:32 install-app-info
      drwxr-x--- 2 daemon daemon 12288 Feb 6 16:27 installed-plugins
      drwxr-x--- 5 daemon daemon 4096 Oct 2 10:31 .osgi-plugins

      Если в вашем случае нет каталогов .bundled-plugins и .osgi-plugins (хотя это странно), то и удалять ничего не нужно…

      • Там есть только каталоги install-app-info и installed-plugins.

        Простой рестарт сервиса после замены двух джар файлов ни к чему не приводит. В то же время под виндой все хорошо. Каталоги удалил и все взлетело.

          • хз мож и так. Решил вопрос без их удаления. Просто подложил jar файлы в нужные каталоги и ребутнул машину, НЕ ОСТАНАВЛИВАЯ при этом службу.

  4. Как удалить каталоги ${JIRA_HOME}/plugins/.bundled-plugins и ${JIRA_HOME}/plugins/.bundled-plugins/.osgi-plugin

    Если по пути /var/atlassian/application-data/jira/plugins их нет?

    • Здравствуйте!
      Для начала посмотрите значение переменной ${JIRA_HOME} — сделать это можно набрав команду env | grep JIRA_HOME в терминале.

      Внимание — если вы запускаете Jira в docker-контейнере, то эту команду нужно запускать внутри контейнера.
      В моем случае (у меня используется docker-контейнер) значение переменной выглядит так:

      env | grep JIRA_HOME
      JIRA_HOME=/var/atlassian/jira

      В каталоге /var/atlassian/jira есть все необходимые директории:

      ls -la /var/atlassian/jira/
      total 64
      drwxrwxrwx 14 root root 4096 Oct 4 07:17 .
      drwxr-xr-x 3 root root 4096 Sep 6 22:27 ..
      -rw-r----- 1 daemon daemon 0 Feb 6 14:27 .jira-home.lock
      drwxr-x--- 2 daemon daemon 4096 Feb 8 00:35 analytics-logs
      drwxr-x--- 5 daemon daemon 4096 Feb 7 09:17 caches
      drwxr-x--- 5 daemon daemon 4096 Oct 2 07:45 data
      -rw-r----- 1 daemon daemon 1156 Oct 2 07:32 dbconfig.xml
      drwxr-x--- 5 daemon daemon 4096 Feb 8 01:00 export
      drwxr-x--- 4 daemon daemon 4096 Oct 2 08:58 import
      -rw-r----- 1 daemon daemon 278 Oct 2 07:42 jira-healthcheck-eol.json
      drwxr-x--- 2 daemon daemon 4096 Feb 7 07:33 log
      drwx------ 2 daemon daemon 4096 Nov 16 09:45 logos
      drwxr-x--- 2 daemon daemon 4096 Oct 2 07:33 monitor
      drwxr-x--- 6 daemon daemon 4096 Oct 2 07:32 plugins
      drwxr-x--- 3 daemon daemon 4096 Oct 2 13:41 scriptrunner
      drwxr-x--- 2 daemon daemon 4096 Oct 2 13:32 scripts
      drwxr-x--- 3 daemon daemon 4096 Oct 2 07:31 tmp

      Опять же, если вы запускаете Jira в docker-контейнере, советую использовать тома (volume) для монтирования этого каталога на хост-машину, например так:

      ... -v /opt/jira:/var/atlassian/jira ...

      • env | grep JIRA_HOME не выводит ничего.

        OS Ubuntu 16

        Каталог plugins есть, но в нем нет каталога .bundled-plugins

        leo@sinapi:/var/atlassian$ sudo ls -la /var/atlassian/application-data/jira/
        total 56
        drwx—— 12 jira root 4096 Feb 7 16:30 .
        drwxr-xr-x 3 root root 4096 Feb 7 15:37 ..
        drwxr-x— 2 jira jira 4096 Feb 8 02:31 analytics-logs
        drwxr-x— 4 jira jira 4096 Feb 7 16:30 caches
        drwxr-x— 3 jira jira 4096 Feb 7 15:37 data
        -rw-r—— 1 jira jira 1043 Feb 7 15:38 dbconfig.xml
        drwxr-x— 3 jira jira 4096 Feb 8 03:40 export
        drwxr-x— 4 jira jira 4096 Feb 7 15:39 import
        -rw-r—— 1 jira jira 322 Feb 7 15:43 jira-healthcheck-eol.json
        -rw-r—— 1 jira jira 0 Feb 7 16:30 .jira-home.lock
        drwxr-x— 2 jira jira 4096 Feb 7 15:39 log
        drwxr-x— 2 jira jira 4096 Feb 7 15:43 logos
        drwxr-x— 2 jira jira 4096 Feb 7 15:39 monitor
        drwxr-x— 6 jira jira 4096 Feb 7 15:38 plugins
        drwxr-x— 3 jira jira 4096 Feb 7 15:37 tmp

      • Здравствуйте.

        Ubuntu 16

        env | grep JIRA_HOME ничего не выводит

        в каталоге /var/atlassian/application-data/jira/ есть каталог plugins, но там нет каталога .bundled-plugins