Files
d.velop/_Vorlagen/Groovy-Skripte/taskAppMigration.groovy
2025-04-04 11:35:25 +02:00

158 lines
5.1 KiB
Groovy

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<HttpsURLConnection> 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<String> 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" )