import com.dvelop.d3.server.core.D3Interface import javax.net.ssl.HttpsURLConnection D3Interface d3 = getProperty( 'd3' ) as D3Interface def LOG_PREFIX = 'taskAppMigration: ' /** * Angabe des Hostnamens ohne Slash am Ende. */ String hostname = "" /** * Der API_KEY muss vor der Ausführung gesetzt werden **/ String API_KEY = "" /** * Dieser User wird anstelle der gesperrten / nicht vorhandenen d.3-User in die wieder_vorlage geschrieben. * d.3 user-id: */ String d3ServiceUserSender = "" String d3ServiceUserReceiver = "" def query = """\ SELECT DISTINCT wv.sender wv_user, ben.idp_id, CASE WHEN sia.sid IS NOT NULL THEN 1 ELSE 0 END ist_gesperrt FROM wieder_vorlage wv JOIN benutzer ben ON ben.benutzername = wv.sender LEFT OUTER JOIN sid_assign sia ON sia.auth_id = ben.benutzername AND sia.delete_flag = 0 AND sia.sid = ( SELECT sil.sid FROM sid_list sil WHERE sil.caption = 'Konto ist deaktiviert' ) WHERE wv.wv_typ = 'W' AND wv.sender != 'd3_async' UNION ALL SELECT DISTINCT wv.benutzername wv_user, ben.idp_id, CASE WHEN sia.sid IS NOT NULL THEN 1 ELSE 0 END ist_gesperrt FROM wieder_vorlage wv JOIN benutzer ben ON ben.benutzername = wv.benutzername LEFT OUTER JOIN sid_assign sia ON sia.auth_id = ben.benutzername AND sia.delete_flag = 0 AND sia.sid = ( SELECT sil.sid FROM sid_list sil WHERE sil.caption = 'Konto ist deaktiviert' ) WHERE wv.wv_typ = 'W' """.stripIndent() Closure connection = { String url -> URL theUrl = new URL( url ) HttpsURLConnection con = ( HttpsURLConnection ) theUrl.openConnection() con.addRequestProperty( 'Authorization', 'Bearer ' + API_KEY ) con.addRequestProperty( 'Accept', 'application/json' ) con.setDoInput( true ) con.setDoOutput( true ) return con } def rows = d3.sql.executeAndGet( query ) List brokenUsers = [ ] int gesperrt = 0 int nichtinIdp = 0 int aktiv = 0 rows.each{ d3.log.error( LOG_PREFIX + it.wv_user + ": " + it.idp_id ) d3.log.info( LOG_PREFIX + 'looking up ' + it.wv_user ) if( it.ist_gesperrt ){ gesperrt++ if( !brokenUsers.contains( it.wv_user)){ brokenUsers.add( it.wv_user ) } d3.log.info( LOG_PREFIX + "Der user '$it.wv_user' ist gesperrt." ) return } HttpsURLConnection con = connection( hostname + '/identityprovider/scim/users/' + it.idp_id ) con.connect() if( con.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND ){ d3.log.info( LOG_PREFIX + "Der User $it.wv_user existiert nicht als user im IDP." ) con.disconnect() con = connection( hostname + '/identityprovider/scim/Groups/' + it.idp_id ) con.connect() if( con.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND ){ nichtinIdp++ d3.log.info( LOG_PREFIX + "Der User $it.wv_user existiert nicht als Gruppe im idp." ) if( !brokenUsers.contains( it.wv_user)){ brokenUsers.add( it.wv_user ) } con.disconnect() } else{ aktiv++ d3.log.info( LOG_PREFIX + "Der User $it.wv_user ist eine Gruppe im idp." ) } } else{ aktiv++ d3.log.info( LOG_PREFIX + "Der User $it.wv_user ist im idp." ) } } def updateUser = 'UPDATE wieder_vorlage SET benutzername = ? WHERE benutzername = ?' def updateSender = 'UPDATE wieder_vorlage SET sender = ? WHERE sender = ?' d3.log.info( LOG_PREFIX + "Aktualisiere Nicht-IDP-User in Tabelle wieder_vorlage...") brokenUsers.each{ d3.log.info( LOG_PREFIX + "Ersetze user $it in 'benutzername' durch Service-User $d3ServiceUserReceiver") def changed = d3.sql.execute(updateUser, [d3ServiceUserReceiver, it]) d3.log.info( LOG_PREFIX + "Zeilen geändert: $changed") d3.log.info( LOG_PREFIX + "Ersetze user $it in 'sender' durch Service-User $d3ServiceUserSender") changed = d3.sql.execute(updateSender, [d3ServiceUserSender, it]) d3.log.info( LOG_PREFIX + "Zeilen geändert: $changed") } //Zur Sicherheit noch ein Commit ausführen, wenn kein Autocommit aktiv: d3.sql.execute( 'Commit' ) d3.log.info( LOG_PREFIX + 'Abgeschlossen.' ) d3.log.info( LOG_PREFIX + "Anzahl gesperrter User: $gesperrt" ) d3.log.info( LOG_PREFIX + "Anzahl nicht registrierter IDP-User: $nichtinIdp" ) d3.log.info( LOG_PREFIX + "Anzahl aktiver User: $aktiv" ) d3.log.info( LOG_PREFIX + "Betroffene User: $brokenUsers" )