View Javadoc
1   /*
2    * Copyright 2012-2021 CodeLibs Project and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  package org.codelibs.fess.util;
17  
18  import java.io.File;
19  import java.util.function.Consumer;
20  
21  import org.apache.logging.log4j.LogManager;
22  import org.apache.logging.log4j.Logger;
23  import org.codelibs.core.exception.ResourceNotFoundRuntimeException;
24  import org.codelibs.core.io.FileUtil;
25  import org.codelibs.curl.CurlResponse;
26  import org.codelibs.fesen.action.ActionListener;
27  import org.codelibs.fesen.action.admin.indices.exists.indices.IndicesExistsResponse;
28  import org.codelibs.fesen.action.admin.indices.mapping.get.GetFieldMappingsResponse;
29  import org.codelibs.fesen.action.admin.indices.mapping.get.GetFieldMappingsResponse.FieldMappingMetadata;
30  import org.codelibs.fesen.action.admin.indices.mapping.get.GetMappingsResponse;
31  import org.codelibs.fesen.action.admin.indices.mapping.put.PutMappingRequestBuilder;
32  import org.codelibs.fesen.action.index.IndexRequest;
33  import org.codelibs.fesen.action.support.master.AcknowledgedResponse;
34  import org.codelibs.fesen.client.Client;
35  import org.codelibs.fesen.client.IndicesAdminClient;
36  import org.codelibs.fesen.cluster.metadata.MappingMetadata;
37  import org.codelibs.fesen.common.collect.ImmutableOpenMap;
38  import org.codelibs.fesen.common.xcontent.XContentType;
39  import org.codelibs.fess.mylasta.direction.FessConfig;
40  
41  public final class UpgradeUtil {
42      private static final Logger logger = LogManager.getLogger(UpgradeUtil.class);
43  
44      private UpgradeUtil() {
45      }
46  
47      public static boolean uploadResource(final String indexConfigPath, final String indexName, final String path) {
48          final String filePath = indexConfigPath + "/" + indexName + "/" + path;
49          try {
50              final String source = FileUtil.readUTF8(filePath);
51              try (CurlResponse response =
52                      ComponentUtil.getCurlHelper().post("/_configsync/file").param("path", path).body(source).execute()) {
53                  if (response.getHttpStatusCode() == 200) {
54                      logger.info("Register {} to {}", path, indexName);
55                      return true;
56                  }
57                  logger.warn("Invalid request for {}", path);
58              }
59          } catch (final Exception e) {
60              logger.warn("Failed to register {}", filePath, e);
61          }
62          return false;
63      }
64  
65      public static boolean createAlias(final IndicesAdminClient indicesClient, final String indexConfigPath, final String indexName,
66              final String aliasName) {
67          final FessConfig fessConfig = ComponentUtil.getFessConfig();
68          final String aliasConfigPath = indexConfigPath + "/" + indexName + "/alias/" + aliasName + ".json";
69          try {
70              final File aliasConfigFile = org.codelibs.core.io.ResourceUtil.getResourceAsFile(aliasConfigPath);
71              if (aliasConfigFile.exists()) {
72                  final String source = FileUtil.readUTF8(aliasConfigFile);
73                  final AcknowledgedResponse response = indicesClient.prepareAliases().addAlias(indexName, aliasName, source).execute()
74                          .actionGet(fessConfig.getIndexIndicesTimeout());
75                  if (response.isAcknowledged()) {
76                      logger.info("Created {} alias for {}", aliasName, indexName);
77                      return true;
78                  }
79                  if (logger.isDebugEnabled()) {
80                      logger.debug("Failed to create {} alias for {}", aliasName, indexName);
81                  }
82              }
83          } catch (final ResourceNotFoundRuntimeException e) {
84              // ignore
85          } catch (final Exception e) {
86              logger.warn("{} is not found.", aliasConfigPath, e);
87          }
88          return false;
89      }
90  
91      public static boolean addMapping(final IndicesAdminClient indicesClient, final String index, final String type,
92              final String indexResourcePath) {
93          final FessConfig fessConfig = ComponentUtil.getFessConfig();
94          final GetMappingsResponse getMappingsResponse =
95                  indicesClient.prepareGetMappings(index).execute().actionGet(fessConfig.getIndexIndicesTimeout());
96          final ImmutableOpenMap<String, MappingMetadata> indexMappings = getMappingsResponse.mappings().get(index);
97          if (indexMappings == null || !indexMappings.containsKey(type)) {
98              String source = null;
99              final String mappingFile = indexResourcePath + "/" + type + ".json";
100             try {
101                 source = FileUtil.readUTF8(mappingFile);
102             } catch (final Exception e) {
103                 logger.warn("{} is not found.", mappingFile, e);
104             }
105             try {
106                 final AcknowledgedResponse putMappingResponse = indicesClient.preparePutMapping(index).setSource(source, XContentType.JSON)
107                         .execute().actionGet(fessConfig.getIndexIndicesTimeout());
108                 if (putMappingResponse.isAcknowledged()) {
109                     logger.info("Created {}/{} mapping.", index, type);
110                     return true;
111                 }
112                 logger.warn("Failed to create {}/{} mapping.", index, type);
113             } catch (final Exception e) {
114                 logger.warn("Failed to create {}/{} mapping.", index, type, e);
115             }
116         }
117         return false;
118     }
119 
120     public static boolean addFieldMapping(final IndicesAdminClient indicesClient, final String index, final String type, final String field,
121             final String source) {
122         final GetFieldMappingsResponse gfmResponse =
123                 indicesClient.prepareGetFieldMappings(index).addTypes(type).setFields(field).execute().actionGet();
124         final FieldMappingMetadata fieldMappings = gfmResponse.fieldMappings(index, type, field);
125         if (fieldMappings == null || fieldMappings.isNull()) {
126             try {
127                 final AcknowledgedResponse pmResponse =
128                         indicesClient.preparePutMapping(index).setSource(source, XContentType.JSON).execute().actionGet();
129                 if (pmResponse.isAcknowledged()) {
130                     return true;
131                 }
132                 logger.warn("Failed to add {} to {}/{}", field, index, type);
133             } catch (final Exception e) {
134                 logger.warn("Failed to add {} to {}/{} ", field, index, type, e);
135             }
136         }
137         return false;
138     }
139 
140     public static boolean putMapping(final IndicesAdminClient indicesClient, final String index, final String source) {
141         return putMapping(indicesClient, index, null, source);
142     }
143 
144     public static boolean putMapping(final IndicesAdminClient indicesClient, final String index, final String type, final String source) {
145         try {
146             final PutMappingRequestBuilder builder = indicesClient.preparePutMapping(index).setSource(source, XContentType.JSON);
147             final AcknowledgedResponse pmResponse = builder.execute().actionGet();
148             if (pmResponse.isAcknowledged()) {
149                 return true;
150             }
151             logger.warn("Failed to update {} settings.", index);
152         } catch (final Exception e) {
153             logger.warn("Failed to update {} settings.", index, e);
154         }
155 
156         return false;
157     }
158 
159     public static boolean addData(final Client fessEsClient, final String index, final String id, final String source) {
160         try {
161             final IndexRequest indexRequest = new IndexRequest(index).id(id).source(source, XContentType.JSON);
162             fessEsClient.index(indexRequest).actionGet();
163             return true;
164         } catch (final Exception e) {
165             logger.warn("Failed to add {} to {}", id, index, e);
166         }
167         return false;
168     }
169 
170     public static boolean existsIndex(final IndicesAdminClient indicesClient, final String index, final boolean expandWildcardsOpen,
171             final boolean expandWildcardsClosed) {
172         final FessConfig fessConfig = ComponentUtil.getFessConfig();
173         try {
174             final IndicesExistsResponse response = indicesClient.prepareExists(index).setExpandWildcardsClosed(expandWildcardsClosed)
175                     .setExpandWildcardsOpen(expandWildcardsOpen).execute().actionGet(fessConfig.getIndexSearchTimeout());
176             return response.isExists();
177         } catch (final Exception e) {
178             // ignore
179         }
180         return false;
181     }
182 
183     public static void deleteIndex(final IndicesAdminClient indicesClient, final String index,
184             final Consumer<AcknowledgedResponse> comsumer) {
185         indicesClient.prepareDelete(index).execute(new ActionListener<AcknowledgedResponse>() {
186 
187             @Override
188             public void onResponse(final AcknowledgedResponse response) {
189                 logger.info("Deleted {} index.", index);
190                 comsumer.accept(response);
191             }
192 
193             @Override
194             public void onFailure(final Exception e) {
195                 logger.warn("Failed to delete {} index.", index, e);
196             }
197         });
198     }
199 }