From a61b99b48dc295e864c0d54440c993395fab146f Mon Sep 17 00:00:00 2001 From: Darshancisco Date: Tue, 18 Jun 2024 12:21:10 +0530 Subject: [PATCH] SQL extensions support for Windows auth in the case of MSSQL DB --- pom.xml | 6 +++ src/main/java/SQLDatabaseConnection.java | 45 ++++++++++++++++++ .../extensions/sql/JDBCConnectionAdapter.java | 47 ++++++++++++++----- .../extensions/sql/SQLMonitor.java | 12 +++++ .../com/appdynamics/extensions/sql/Util.java | 2 +- 5 files changed, 99 insertions(+), 13 deletions(-) create mode 100644 src/main/java/SQLDatabaseConnection.java diff --git a/pom.xml b/pom.xml index d511f05..a766b84 100644 --- a/pom.xml +++ b/pom.xml @@ -50,6 +50,12 @@ mysql-connector-java 8.0.20 + + com.microsoft.sqlserver + mssql-jdbc + 12.6.2.jre11 + + org.powermock powermock-api-mockito diff --git a/src/main/java/SQLDatabaseConnection.java b/src/main/java/SQLDatabaseConnection.java new file mode 100644 index 0000000..8857c93 --- /dev/null +++ b/src/main/java/SQLDatabaseConnection.java @@ -0,0 +1,45 @@ +import java.sql.*; +import java.util.Properties; + +public class SQLDatabaseConnection { + + // Connect to your database. + // Replace server name, username, and password with your credentials + public static void main(String[] args) { + String connectionUrl = + args.length == 3 ? args[2] : "jdbc:sqlserver://localhost:1434;servername=localhost\\MSSQLSERVER01;database=master;integratedSecurity=true;encrypt=false;trustServerCertificate=false"; + + ResultSet resultSet = null; + try{ + //System.loadLibrary(args[2]); + System.setProperty("java.library.path", args[0]); + Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + Connection connection = DriverManager.getConnection(connectionUrl); + DatabaseMetaData metadata = connection.getMetaData(); + Statement statement = connection.createStatement(); + + // Create and execute a SELECT SQL statement. + String selectSql = "SELECT TOP (1000) [lastrun]" + + " ,[cpu_busy]" + + " ,[io_busy]" + + " ,[idle]" + + " ,[pack_received]" + + " ,[pack_sent]" + + " ,[connections]" + + " ,[pack_errors]" + + " ,[total_read]" + + " ,[total_write]" + + " ,[total_errors]" + + " FROM [master].[dbo].[spt_monitor]"; + resultSet = statement.executeQuery(selectSql); + + // Print results from select statement + while (resultSet.next()) { + System.out.println(resultSet.getString(Integer.parseInt(args[1]))); + } + } + catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/appdynamics/extensions/sql/JDBCConnectionAdapter.java b/src/main/java/com/appdynamics/extensions/sql/JDBCConnectionAdapter.java index 7171ee8..8b97696 100644 --- a/src/main/java/com/appdynamics/extensions/sql/JDBCConnectionAdapter.java +++ b/src/main/java/com/appdynamics/extensions/sql/JDBCConnectionAdapter.java @@ -12,9 +12,14 @@ import com.google.common.base.Strings; import org.slf4j.Logger; -import java.sql.*; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; import java.util.Map; import java.util.Properties; +import java.util.logging.Level; public class JDBCConnectionAdapter { @@ -23,6 +28,10 @@ public class JDBCConnectionAdapter { private final String connUrl; private final Map connectionProperties; + private String winLibPath; + + private boolean enableWindowsAuthentication; + private JDBCConnectionAdapter(String connStr, Map connectionProperties) { this.connUrl = connStr; @@ -36,20 +45,26 @@ static JDBCConnectionAdapter create(String connUrl, Map connecti Connection open(String driver) throws SQLException, ClassNotFoundException { Connection connection; + java.util.logging.Logger log = java.util.logging.Logger.getLogger("com.microsoft.sqlserver.jdbc"); + log.setLevel(Level.FINE); Class.forName(driver); - - Properties properties = new Properties(); - - if (connectionProperties != null) { - for (String key : connectionProperties.keySet()) { - if (!Strings.isNullOrEmpty(connectionProperties.get(key))) - properties.put(key, connectionProperties.get(key)); + logger.info("driver====>"+driver); + logger.info("Passed all checks for properties and attempting to connect to =====>"+ connUrl); + long timestamp1 = System.currentTimeMillis(); + if(enableWindowsAuthentication){ + System.setProperty("java.library.path", winLibPath); + logger.info("setting the libreary path :"+ winLibPath); + connection = DriverManager.getConnection(connUrl); + } else { + Properties properties = new Properties(); + if (connectionProperties != null) { + for (String key : connectionProperties.keySet()) { + if (!Strings.isNullOrEmpty(connectionProperties.get(key))) + properties.put(key, connectionProperties.get(key)); + } } + connection = DriverManager.getConnection(connUrl, properties); } - - logger.debug("Passed all checks for properties and attempting to connect to: "+ connUrl); - long timestamp1 = System.currentTimeMillis(); - connection = DriverManager.getConnection(connUrl, properties); long timestamp2 = System.currentTimeMillis(); logger.debug("Connection received in JDBC ConnectionAdapter in :"+ (timestamp2-timestamp1)+ " ms"); @@ -67,4 +82,12 @@ void closeStatement(Statement statement) throws SQLException { void closeConnection(Connection connection) throws SQLException { connection.close(); } + + public void setWinLibPath(String winLibPath) { + this.winLibPath = winLibPath; + } + + public void setEnableWindowsAuthentication(boolean enableWindowsAuthentication) { + this.enableWindowsAuthentication = enableWindowsAuthentication; + } } \ No newline at end of file diff --git a/src/main/java/com/appdynamics/extensions/sql/SQLMonitor.java b/src/main/java/com/appdynamics/extensions/sql/SQLMonitor.java index d7c786a..d6d3e60 100644 --- a/src/main/java/com/appdynamics/extensions/sql/SQLMonitor.java +++ b/src/main/java/com/appdynamics/extensions/sql/SQLMonitor.java @@ -80,6 +80,13 @@ private SQLMonitorTask createTask(Map server, TasksExecutionServicePr Map connectionProperties = getConnectionProperties(server); JDBCConnectionAdapter jdbcAdapter = JDBCConnectionAdapter.create(connUrl, connectionProperties); + boolean windowsAuthentication = (System.getProperty("os.name").toLowerCase().contains("win") && connUrl.contains("integratedSecurity")); + logger.info("setting the connUrl==============================>"+ connUrl); + if(windowsAuthentication) { + jdbcAdapter.setEnableWindowsAuthentication(windowsAuthentication); + jdbcAdapter.setWinLibPath(getWinLibPath(server)); + } + logger.debug("Task Created for "+server.get("displayName")); @@ -108,6 +115,11 @@ private String createConnectionUrl(Map server) { return url; } + private String getWinLibPath(Map server) { + String url = Util.convertToString(server.get("driverDllFolderPath"), ""); + return url; + } + private Map getConnectionProperties(Map server) { Map connectionProperties = (Map) server.get("connectionProperties"); String password = connectionProperties.get("password"); diff --git a/src/main/java/com/appdynamics/extensions/sql/Util.java b/src/main/java/com/appdynamics/extensions/sql/Util.java index eb923c7..84d4149 100644 --- a/src/main/java/com/appdynamics/extensions/sql/Util.java +++ b/src/main/java/com/appdynamics/extensions/sql/Util.java @@ -15,7 +15,7 @@ static String convertToString(final Object field,final String defaultStr){ if(field == null){ return defaultStr; } - return field.toString(); + return field+""; }