blob: 3703040771bd45ae0b291ad745178b3454edf9d8 [file] [log] [blame]
/*
* // Licensed to the Apache Software Foundation (ASF) under one
* // or more contributor license agreements. See the NOTICE file
* // distributed with this work for additional information
* // regarding copyright ownership. The ASF licenses this file
* // to you under the Apache License, Version 2.0 (the
* // "License"); you may not use this file except in compliance
* // with the License. You may obtain a copy of the License at
* //
* // http://www.apache.org/licenses/LICENSE-2.0
* //
* // Unless required by applicable law or agreed to in writing,
* // software distributed under the License is distributed on an
* // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* // KIND, either express or implied. See the License for the
* // specific language governing permissions and limitations
* // under the License.
*/
package com.cloud.upgrade.dao;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.log4j.Logger;
import com.cloud.utils.crypt.DBEncryptionUtil;
import com.cloud.utils.exception.CloudRuntimeException;
public class Upgrade41100to41110 implements DbUpgrade {
final static Logger LOG = Logger.getLogger(Upgrade41000to41100.class);
@Override
public String[] getUpgradableVersionRange() {
return new String[]{"4.11.0.0", "4.11.1.0"};
}
@Override
public String getUpgradedVersion() {
return "4.11.1.0";
}
@Override
public boolean supportsRollingUpgrade() {
return false;
}
@Override
public InputStream[] getPrepareScripts() {
final String scriptFile = "META-INF/db/schema-41100to41110.sql";
final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile);
if (script == null) {
throw new CloudRuntimeException("Unable to find " + scriptFile);
}
return new InputStream[] {script};
}
@Override
public void performDataMigration(Connection conn) {
markUnnecessarySecureConfigsAsUnsecure(conn);
}
private void markUnnecessarySecureConfigsAsUnsecure(Connection conn) {
/*
* the following config items where added as 'Secure' in the past. For some this made sense but for the ones below,
* this makes no sense and is a inconvenience at best. The below method will
** retrieve,
** unencrypt,
** mark as 'Advanced' and then
** store the item
*/
String[] unsecureItems = new String[] {
"ldap.basedn",
"ldap.bind.principal",
"ldap.email.attribute",
"ldap.firstname.attribute",
"ldap.group.object",
"ldap.group.user.uniquemember",
"ldap.lastname.attribute",
"ldap.search.group.principle",
"ldap.truststore",
"ldap.user.object",
"ldap.username.attribute"
};
for (String name : unsecureItems) {
uncrypt(conn, name);
}
}
/**
* if encrypted, decrypt the ldap hostname and port and then update as they are not encrypted now.
*/
private void uncrypt(Connection conn, String name)
{
String value = null;
try (
PreparedStatement prepSelStmt = conn.prepareStatement("SELECT conf.category,conf.value FROM `cloud`.`configuration` conf WHERE conf.name= ?");
) {
prepSelStmt.setString(1,name);
try (
ResultSet resultSet = prepSelStmt.executeQuery();
) {
if (LOG.isInfoEnabled()) {
LOG.info("updating setting '" + name + "'");
}
if (resultSet.next()) {
if ("Secure".equals(resultSet.getString(1))) {
value = DBEncryptionUtil.decrypt(resultSet.getString(2));
try (
PreparedStatement prepUpdStmt= conn.prepareStatement("UPDATE `cloud`.`configuration` SET category = 'Advanced', value = ? WHERE name = ?" );
) {
prepUpdStmt.setString(1, value);
prepUpdStmt.setString(2, name);
prepUpdStmt.execute();
} catch (SQLException e) {
if (LOG.isInfoEnabled()) {
LOG.info("failed to update configuration item '" + name + "' with value '" + value + "'");
if (LOG.isDebugEnabled()) {
LOG.debug("no update because ", e);
}
}
}
}
}
}
} catch (SQLException e) {
throw new CloudRuntimeException("failed to update configuration item '" + name + "' with value '" + value + "'", e);
}
}
@Override
public InputStream[] getCleanupScripts() {
final String scriptFile = "META-INF/db/schema-41100to41110-cleanup.sql";
final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile);
if (script == null) {
throw new CloudRuntimeException("Unable to find " + scriptFile);
}
return new InputStream[] {script};
}
}