This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch 4.11
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.11 by this push:
     new 170b6ce  CLOUDSTACK-10236: Enable dynamic roles for missing props file 
(#2426)
170b6ce is described below

commit 170b6ce20dd4fc2f1fd3ad84833f440d955d2987
Author: Rohit Yadav <ro...@apache.org>
AuthorDate: Wed Jan 24 13:11:08 2018 +0100

    CLOUDSTACK-10236: Enable dynamic roles for missing props file (#2426)
    
    Automate dynamic roles migration for missing props file
    
    - In case commands.properties file is missing, enables dynamic roles.
    - Adds a new -D or --default flag to migrate-dynamicroles.py script
      to simply update the global setting and use the default role-rule
      permissions.
    - Add warning message, ask admins to move to dynamic roles during upgrade
    
    Signed-off-by: Rohit Yadav <rohit.ya...@shapeblue.com>
---
 .../com/cloud/upgrade/dao/Upgrade41000to41100.java | 18 +++++++++++++++
 .../acl/StaticRoleBasedAPIAccessChecker.java       |  1 +
 scripts/util/migrate-dynamicroles.py               | 27 ++++++++++++++--------
 3 files changed, 37 insertions(+), 9 deletions(-)

diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade41000to41100.java 
b/engine/schema/src/com/cloud/upgrade/dao/Upgrade41000to41100.java
index 53c2340..20294d1 100644
--- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade41000to41100.java
+++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade41000to41100.java
@@ -31,6 +31,7 @@ import org.apache.commons.codec.binary.Base64;
 import org.apache.log4j.Logger;
 
 import com.cloud.hypervisor.Hypervisor;
+import com.cloud.utils.PropertiesUtil;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 public class Upgrade41000to41100 implements DbUpgrade {
@@ -65,10 +66,27 @@ public class Upgrade41000to41100 implements DbUpgrade {
 
     @Override
     public void performDataMigration(Connection conn) {
+        checkAndEnableDynamicRoles(conn);
         validateUserDataInBase64(conn);
         updateSystemVmTemplates(conn);
     }
 
+    private void checkAndEnableDynamicRoles(final Connection conn) {
+        final Map<String, String> apiMap = 
PropertiesUtil.processConfigFile(new String[] { "commands.properties" });
+        if (apiMap == null || apiMap.isEmpty()) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("No commands.properties file was found, enabling 
dynamic roles by setting dynamic.apichecker.enabled to true if not already 
enabled.");
+            }
+            try (final PreparedStatement updateStatement = 
conn.prepareStatement("INSERT INTO cloud.configuration (category, instance, 
name, default_value, value) VALUES ('Advanced', 'DEFAULT', 
'dynamic.apichecker.enabled', 'false', 'true') ON DUPLICATE KEY UPDATE 
value='true'")) {
+                updateStatement.executeUpdate();
+            } catch (SQLException e) {
+                LOG.error("Failed to set dynamic.apichecker.enabled to true, 
please run migrate-dynamicroles.py script to manually migrate to dynamic 
roles.", e);
+            }
+        } else {
+            LOG.warn("Old commands.properties static checker is deprecated, 
please use migrate-dynamicroles.py to migrate to dynamic roles. Refer 
http://docs.cloudstack.apache.org/projects/cloudstack-administration/en/latest/accounts.html#using-dynamic-roles";);
+        }
+    }
+
     private void validateUserDataInBase64(Connection conn) {
         try (final PreparedStatement selectStatement = 
conn.prepareStatement("SELECT `id`, `user_data` FROM `cloud`.`user_vm` WHERE 
`user_data` IS NOT NULL;");
              final ResultSet selectResultSet = selectStatement.executeQuery()) 
{
diff --git 
a/plugins/acl/static-role-based/src/org/apache/cloudstack/acl/StaticRoleBasedAPIAccessChecker.java
 
b/plugins/acl/static-role-based/src/org/apache/cloudstack/acl/StaticRoleBasedAPIAccessChecker.java
index fc78268..f3dc3a3 100644
--- 
a/plugins/acl/static-role-based/src/org/apache/cloudstack/acl/StaticRoleBasedAPIAccessChecker.java
+++ 
b/plugins/acl/static-role-based/src/org/apache/cloudstack/acl/StaticRoleBasedAPIAccessChecker.java
@@ -39,6 +39,7 @@ import com.cloud.utils.component.PluggableService;
 
 // This is the default API access checker that grab's the user's account
 // based on the account type, access is granted
+@Deprecated
 public class StaticRoleBasedAPIAccessChecker extends AdapterBase implements 
APIChecker {
 
     protected static final Logger LOGGER = 
Logger.getLogger(StaticRoleBasedAPIAccessChecker.class);
diff --git a/scripts/util/migrate-dynamicroles.py 
b/scripts/util/migrate-dynamicroles.py
index cbb83f9..35dfe66 100755
--- a/scripts/util/migrate-dynamicroles.py
+++ b/scripts/util/migrate-dynamicroles.py
@@ -55,6 +55,14 @@ def migrateApiRolePermissions(apis, conn):
             if (octetKey[role] & int(apis[api])) > 0:
                 runSql(conn, "INSERT INTO `cloud`.`role_permissions` (`uuid`, 
`role_id`, `rule`, `permission`, `sort_order`) values (UUID(), %d, '%s', 
'ALLOW', %d);" % (role, api, sortOrder))
                 sortOrder += 1
+    print("Static role permissions from commands.properties have been migrated 
into the db")
+
+
+def enableDynamicApiChecker(conn):
+    runSql(conn, "UPDATE `cloud`.`configuration` SET value='true' where 
name='dynamic.apichecker.enabled'")
+    conn.commit()
+    conn.close()
+    print("Dynamic role based API checker has been enabled!")
 
 
 def main():
@@ -71,6 +79,8 @@ def main():
                         help="Host or IP of the MySQL server")
     parser.add_option("-f", "--properties-file", action="store", 
type="string", dest="commandsfile", 
default="/etc/cloudstack/management/commands.properties",
                         help="The commands.properties file")
+    parser.add_option("-D", "--default", action="store_true", 
dest="defaultRules", default=False,
+                        help="")
     parser.add_option("-d", "--dryrun", action="store_true", dest="dryrun", 
default=False,
                         help="Dry run and debug operations this tool will 
perform")
     (options, args) = parser.parse_args()
@@ -89,8 +99,14 @@ def main():
             port=int(options.port),
             db=options.db)
 
+    if options.defaultRules:
+        print("Applying the default role permissions, ignoring any provided 
properties files(s).")
+        enableDynamicApiChecker(conn)
+        sys.exit(0)
+
     if not os.path.isfile(options.commandsfile):
-        print("Provided commands.properties cannot be accessed or does not 
exist, please check check permissions")
+        print("Provided commands.properties cannot be accessed or does not 
exist.")
+        print("Please check passed options, or run only with --default option 
to use the default role permissions.")
         sys.exit(1)
 
     while True:
@@ -122,15 +138,8 @@ def main():
 
     # Migrate rules from commands.properties to cloud.role_permissions
     migrateApiRolePermissions(apiMap, conn)
-    print("Static role permissions from commands.properties have been migrated 
into the db")
-
-    # Enable dynamic role based API checker
-    runSql(conn, "UPDATE `cloud`.`configuration` SET value='true' where 
name='dynamic.apichecker.enabled'")
-    conn.commit()
-    conn.close()
-
-    print("Dynamic role based API checker has been enabled!")
 
+    enableDynamicApiChecker(conn)
 
 if __name__ == '__main__':
     main()

-- 
To stop receiving notification emails like this one, please contact
ro...@apache.org.

Reply via email to