소스 검색

Preserve config files from RPM install

This commit modifies the packaging for the RPM package so that edits to
config files will not get lost during removal and upgrade.

Relates #18188
Jason Tedor 9 년 전
부모
커밋
0eaa831f48

+ 9 - 4
distribution/build.gradle

@@ -322,12 +322,13 @@ configure(subprojects.findAll { ['deb', 'rpm'].contains(it.name) }) {
     configurationFile '/etc/elasticsearch/elasticsearch.yml'
     configurationFile '/etc/elasticsearch/jvm.options'
     configurationFile '/etc/elasticsearch/logging.yml'
-    into('/etc') {
-      from "${packagingFiles}/etc"
+    into('/etc/elasticsearch') {
       fileMode 0750
       permissionGroup 'elasticsearch'
       includeEmptyDirs true
       createDirectoryEntry true
+      fileType CONFIG | NOREPLACE
+      from "${packagingFiles}/etc/elasticsearch"
     }
 
     into('/usr/lib/tmpfiles.d') {
@@ -335,21 +336,25 @@ configure(subprojects.findAll { ['deb', 'rpm'].contains(it.name) }) {
     }
     configurationFile '/usr/lib/systemd/system/elasticsearch.service'
     into('/usr/lib/systemd/system') {
+      fileType CONFIG | NOREPLACE
       from "${packagingFiles}/systemd/elasticsearch.service"
     }
     into('/usr/lib/sysctl.d') {
+      fileType CONFIG | NOREPLACE
       from "${packagingFiles}/systemd/sysctl/elasticsearch.conf"
     }
     configurationFile '/etc/init.d/elasticsearch'
     into('/etc/init.d') {
-      from "${packagingFiles}/init.d/elasticsearch"
       fileMode 0755
+      fileType CONFIG | NOREPLACE
+      from "${packagingFiles}/init.d/elasticsearch"
     }
     configurationFile project.expansions['path.env']
     into(new File(project.expansions['path.env']).getParent()) {
-      from "${project.packagingFiles}/env/elasticsearch"
       fileMode 0644
       dirMode 0755
+      fileType CONFIG | NOREPLACE
+      from "${project.packagingFiles}/env/elasticsearch"
     }
 
     /**

+ 7 - 0
distribution/src/main/packaging/scripts/postrm

@@ -55,6 +55,7 @@ LOG_DIR="/var/log/elasticsearch"
 PLUGINS_DIR="/usr/share/elasticsearch/plugins"
 PID_DIR="/var/run/elasticsearch"
 DATA_DIR="/var/lib/elasticsearch"
+CONF_DIR="/etc/elasticsearch"
 
 # Source the default env file
 if [ "$SOURCE_ENV_FILE" = "true" ]; then
@@ -102,6 +103,12 @@ if [ "$REMOVE_DIRS" = "true" ]; then
     if [ -d "$DATA_DIR" ]; then
         rmdir --ignore-fail-on-non-empty "$DATA_DIR"
     fi
+
+    # delete the conf directory if and only if empty
+    if [ -d "$CONF_DIR" ]; then
+        rmdir --ignore-fail-on-non-empty "$CONF_DIR"
+    fi
+
 fi
 
 if [ "$REMOVE_USER_AND_GROUP" = "true" ]; then

+ 6 - 0
distribution/src/main/packaging/scripts/prerm

@@ -64,4 +64,10 @@ if [ "$STOP_REQUIRED" = "true" ]; then
     echo " OK"
 fi
 
+SCRIPTS_DIR="/etc/elasticsearch/scripts"
+# delete the scripts directory if and only if empty
+if [ -d "$SCRIPTS_DIR" ]; then
+    rmdir --ignore-fail-on-non-empty "$SCRIPTS_DIR"
+fi
+
 ${scripts.footer}

+ 39 - 6
qa/vagrant/src/test/resources/packaging/scripts/40_rpm_package.bats

@@ -116,7 +116,7 @@ setup() {
 
     assert_file_not_exist "/etc/elasticsearch"
     assert_file_not_exist "/etc/elasticsearch/elasticsearch.yml"
-    assert_file_not_exist  "/etc/elasticsearch/jvm.options"
+    assert_file_not_exist "/etc/elasticsearch/jvm.options"
     assert_file_not_exist "/etc/elasticsearch/logging.yml"
 
     assert_file_not_exist "/etc/init.d/elasticsearch"
@@ -125,7 +125,6 @@ setup() {
     assert_file_not_exist "/etc/sysconfig/elasticsearch"
 }
 
-
 @test "[RPM] reinstall package" {
     rpm -i elasticsearch-$(cat version).rpm
 }
@@ -134,14 +133,48 @@ setup() {
     rpm -qe 'elasticsearch'
 }
 
-@test "[RPM] verify package reinstallation" {
-    verify_package_installation
-}
-
 @test "[RPM] reremove package" {
+    echo "# ping" >> "/etc/elasticsearch/elasticsearch.yml"
+    echo "# ping" >> "/etc/elasticsearch/jvm.options"
+    echo "# ping" >> "/etc/elasticsearch/logging.yml"
+    echo "# ping" >> "/etc/elasticsearch/scripts/script"
     rpm -e 'elasticsearch'
 }
 
+@test "[RPM] verify preservation" {
+    # The removal must disable the service
+    # see prerm file
+    if is_systemd; then
+        run systemctl is-enabled elasticsearch.service
+        [ "$status" -eq 1 ]
+    fi
+
+    # Those directories are deleted when removing the package
+    # see postrm file
+    assert_file_not_exist "/var/log/elasticsearch"
+    assert_file_not_exist "/usr/share/elasticsearch/plugins"
+    assert_file_not_exist "/var/run/elasticsearch"
+
+    assert_file_not_exist "/etc/elasticsearch/elasticsearch.yml"
+    assert_file_exist "/etc/elasticsearch/elasticsearch.yml.rpmsave"
+    assert_file_not_exist "/etc/elasticsearch/jvm.options"
+    assert_file_exist "/etc/elasticsearch/jvm.options.rpmsave"
+    assert_file_not_exist "/etc/elasticsearch/logging.yml"
+    assert_file_exist "/etc/elasticsearch/logging.yml.rpmsave"
+    assert_file_exist "/etc/elasticsearch/scripts.rpmsave"
+    assert_file_exist "/etc/elasticsearch/scripts.rpmsave/script"
+
+    assert_file_not_exist "/etc/init.d/elasticsearch"
+    assert_file_not_exist "/usr/lib/systemd/system/elasticsearch.service"
+
+    assert_file_not_exist "/etc/sysconfig/elasticsearch"
+}
+
+@test "[RPM] finalize package removal" {
+    # cleanup
+    rm -rf /etc/elasticsearch
+}
+
 @test "[RPM] package has been removed again" {
     run rpm -qe 'elasticsearch'
     [ "$status" -eq 1 ]