LPS:IdM/midPoint

Z Support
< LPS:IdM(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(upgrade)
(Self-management skupina: - klatba na custom OID od midPoint 4.4)
 
(Není zobrazeno 487 mezilehlých verzí od 3 uživatelů.)
Řádka 1: Řádka 1:
 
= ZČU =
 
= ZČU =
  
* https://themis3.civ.zcu.cz/midpoint
+
* vývojová instance ZČU: '''themis3.civ.zcu.cz''' (testovací prostředí emulované v MySQL, bez liveSync u databází)
* https://alfresco.zcu.cz/midpoint (ke zrušení)
+
* vývojová instance AMI: '''agenor.civ.zcu.cz'''
* <tt>git clone /afs/.zcu.cz/project/software/git/idm/midpoint.git</tt>
+
* <s>testovací instance: '''themis.civ.zcu.cz''' (napojeno na stejné DB jako agenor)</s>
 +
* <s>testovací instance (MP 3.6): '''themis4.civ.zcu.cz'''</s>
 +
* testovací instance: '''eos-test.zcu.cz''' (napojeno na stejné DB jako agenor)
 +
* produkční instance: '''midpoint.zcu.cz''' (eos2.zcu.cz)
 +
* <s>personální portál: '''eos.zcu.cz''' (docker, port 444 + 8444), viz [[LPS:IdM/midPoint/Personální_portál]]</s>
 +
* repozitáře:
 +
** <s><tt>/afs/.zcu.cz/project/software/git/idm/midpoint.git</tt></s> - počáteční testování midPointu
 +
** <tt>https://ipmil.civ.zcu.cz/midpoint/midpoint-overlay</tt> - pro vygenerování .war k deploymentu
 +
** <tt>https://ipmil.civ.zcu.cz/midpoint/xml-objects</tt> - pro import pomocí eclipse pluginu
 +
** <tt>ssh://root@agenor.zcu.cz:/var/lib/git/server-configuration.git</tt> - dokumentace dalších konfigurací v OS
 +
** <tt>https://gitlab.meta.zcu.cz/midpoint/testsuite</tt> - automatizovaná testsuita
 +
** <tt>https://ipmil.civ.zcu.cz/midpoint/ConnIdDBBundle</tt> - DB connector
 +
** <tt>https://ipmil.civ.zcu.cz/midpoint/scripts</tt> - skripty pro správu midPointu
 +
** (v plánu) <tt>https://github.com/CESNET/kerberos-connector</tt> - Kerberos connector
 +
** (experimenty) <tt>/afs/zcu.cz/project/software/git/idm/afs-connector.git</tt> - AFS PTS connector
 +
* aktuální zkompilované binárky:
 +
** <tt>/afs/zcu.cz/project/software/register/midpoint</tt>
 +
 
 +
Viz také [[#Vývoj]].
  
 
= Dokumentace =
 
= Dokumentace =
Řádka 10: Řádka 28:
 
* URL: https://evolveum.com/midpoint/
 
* URL: https://evolveum.com/midpoint/
 
* First steps: https://wiki.evolveum.com/display/midPoint/First+Steps
 
* First steps: https://wiki.evolveum.com/display/midPoint/First+Steps
* API+schemas: https://evolveum.com/downloads/midpoint/3.3.1/
+
* API+schemas: https://evolveum.com/downloads/midpoint/
 
* source code: https://github.com/Evolveum/midpoint
 
* source code: https://github.com/Evolveum/midpoint
 
* '''examply''':
 
* '''examply''':
** https://github.com/Evolveum/midpoint/tree/v3.3.1/samples (jednotlivé resourcy)
+
** https://github.com/Evolveum/midpoint/tree/master/samples (jednotlivé resourcy)
 
** https://github.com/Evolveum/midpoint/tree/master/testing/story/src/test/resources (komplexnější příklady)
 
** https://github.com/Evolveum/midpoint/tree/master/testing/story/src/test/resources (komplexnější příklady)
 
* demo: http://demo.evolveum.com/midpoint
 
* demo: http://demo.evolveum.com/midpoint
Řádka 20: Řádka 38:
 
*** https://wiki.evolveum.com/display/midPoint/Profiling+Concepts
 
*** https://wiki.evolveum.com/display/midPoint/Profiling+Concepts
 
*** https://wiki.evolveum.com/display/midPoint/Administration+Interface#AdministrationInterface-ProfilingConfiguration
 
*** https://wiki.evolveum.com/display/midPoint/Administration+Interface#AdministrationInterface-ProfilingConfiguration
 
+
** funkce v groovy skriptech: https://wiki.evolveum.com/display/midPoint/Script+Expression+Functions
 +
** autorizace: [https://wiki.evolveum.com/display/midPoint/Authorization+Configuration Authorization+Configuration] - [https://wiki.evolveum.com/display/midPoint/IDM+Model+Authorizations Core Auth], [https://wiki.evolveum.com/display/midPoint/GUI+Authorizations GUI Auth], [https://wiki.evolveum.com/display/midPoint/Service+Authorizations Service Auth]
 +
* seznam '''groovy funkcí''': [https://github.com/Evolveum/midpoint/blob/master/model/model-common/src/main/java/com/evolveum/midpoint/model/common/expression/functions/BasicExpressionFunctions.java basic] [https://github.com/Evolveum/midpoint/blob/master/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java midpoint]
 +
* WS API: https://evolveum.com/downloads/midpoint/3.5.1/schema-3.5.1-schemadoc/
  
 
Connectors:
 
Connectors:
Řádka 31: Řádka 52:
 
#* '''URL''': https://wiki.evolveum.com/display/midPoint/Identity+Connectors
 
#* '''URL''': https://wiki.evolveum.com/display/midPoint/Identity+Connectors
 
#* source code: https://github.com/Evolveum/polygon
 
#* source code: https://github.com/Evolveum/polygon
 +
 +
Triky:
 +
* environments: https://evolveum.com/blog/storing-extended-attributes-in-system-configuration-extended-attributes/
 +
* multi-tenant (např. role správce, ale pouze spojená s pracovištěm): https://evolveum.com/blog/working-multi-tenant-roles/
  
 
= Instalace =
 
= Instalace =
  
  # version of midPoint
+
== Postup ==
  v='3.3.1'
+
 
 +
  git clone https://:@ipmil.civ.zcu.cz:443/midpoint/scripts.git
 +
  scripts/autodeployment.sh --wait
 +
 
 +
Tento skript automaticky:
 +
 
 +
# stáhne z Jenkins CI postavené konektory (Stag číselníky + studenti + učitelé, JIS, Kerberos, Magion RW, ...)
 +
# stáhne z Jenkins CI postavený war soubor s midPointem a deployne
 +
 
 +
=== Řádkový klient ===
 +
 
 +
TODO: jsou tam natvrdo cesty, tj. buildovat na serveru nebo lokálně se stejnými cestami
 +
 
 +
Potřeba postavit midPoint, pak k nalezení v <tt>./samples/model-client-sample/target</tt>.
 +
 
 +
Je potřeba vlastní spouštěč (např. <tt>/usr/local/bin/runscript</tt>):
 +
 
 +
#!/bin/sh
 
   
 
   
  apt-get install -y less mc screen vim man
+
  DIR='/opt/midpoint-model-client-3.5.1'
  apt-get install -y bzip2 net-tools sudo wget
+
  java -cp `ls -1 ${DIR}/*.xml ${DIR}/*.jar ${DIR}/lib/*.jar | tr '\n' :` com.evolveum.midpoint.testing.model.client.sample.RunScript "$@"
  apt-get install -y openjdk-7-jdk tomcat8 apache2
+
 
 +
Použití: https://wiki.evolveum.com/display/midPoint/runscript+command+line+tool
 +
 
 +
=== Řádkový klient II. ===
 +
 
 +
Možno využít skripty na <tt>https://ipmil.civ.zcu.cz/midpoint/scripts</tt>.
 +
 
 +
== Na serveru ==
 +
 
 +
  # version of midPoint
 +
v='3.9'
 +
e='DEVEL'
 
   
 
   
  # apache2
+
apt-get install -y git less mc screen vim man net-tools
  cat > /etc/apache2/conf-available/midpoint.conf <<EOF
+
  # graphviz - for GUI features
  ProxyRequests          Off
+
  # (xlmstaret - scripts)
ProxyPreserveHost      On     
+
# tomcat8 additional packages - to prevent warnings
 +
# libapache2-mod-jk - for apache/tomcat integration
 +
apt-get install -y apache2 bzip2 graphviz libmysql-java openjdk-8-jdk tomcat8 libservlet3.1-java libcommons-dbcp-java libcommons-pool-java wget libapache2-mod-jk
 +
  #xmlstarlet
 
   
 
   
  ProxyPass              /midpoint      http://localhost:8080/midpoint
+
  git clone ssh://root@agenor.zcu.cz:/var/lib/git/server-configuration.git
ProxyPassReverse        /midpoint      http://localhost:8080/midpoint
+
 
   
 
   
  RewriteEngine On
+
  #hikari (much worse then c3p0 anyway)
  RewriteRule            ^/?$    /midpoint/ [R]
+
  cat > /etc/hikari.properties <<EOF
 +
dataSource.oracle.jdbc.implicitStatementCacheSize=800
 +
dataSource.oracle.jdbc.explicitCachingEnabled=true
 +
dataSource.oracle.jdbc.implicitCachingEnabled=true
 +
dataSource.oracle.net.keepAlive=true
 +
registerMbeans=true
 +
maxLifetime=1440000
 
  EOF
 
  EOF
 
   
 
   
 
  # tomcat8
 
  # tomcat8
  echo 'JAVA_OPTS="${JAVA_OPTS} -Xms256m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256m -Dmidpoint.home=/var/opt/midpoint/ -Djavax.net.ssl.trustStore=/var/opt/midpoint/keystore.jceks -Djavax.net.ssl.trustStoreType=jceks"' >> /etc/default/tomcat8
+
  cat << EOF >> /etc/default/tomcat8
 +
JAVA_OPTS="\${JAVA_OPTS} -Xms1024m -Xmx2048m -Dmidpoint.home=/var/opt/midpoint/ -Djavax.net.ssl.trustStore=/var/opt/midpoint/keystore.jceks -Djavax.net.ssl.trustStoreType=jceks -Doracle.net.tns_admin=/usr/lib/oracle/12.1/client64/network/admin -Djava.library.path=/opt/kerberos -Dcom.sun.management.jmxremote -Dorg.apache.cxf.stax.maxChildElements=200000 -Dhikaricp.configurationFile=/etc/hikari.properties -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=ssoenv"
 +
TZ=CET
 +
LANG="en_US.UTF-8"
 +
EOF
 +
 +
vimdiff server-configuration/${e}/etc/default/tomcat8 /etc/default/tomcat8
 +
 
  mkdir /var/opt/midpoint
 
  mkdir /var/opt/midpoint
 
  chown tomcat8:tomcat8 /var/opt/midpoint
 
  chown tomcat8:tomcat8 /var/opt/midpoint
Řádka 61: Řádka 129:
 
  # mc (cosmetics)
 
  # mc (cosmetics)
 
  mkdir -p ~/.config/mc/ || :
 
  mkdir -p ~/.config/mc/ || :
  echo 'ENTRY "/var/opt/midpoint" URL "/var/opt/midpoint"' >> ~/.config/mc/hotlist
+
  cat <<EOF >> ~/.config/mc/hotlist
  ln -s /usr/lib/mc/mc.csh /etc/profile.d/ || :
+
ENTRY "/var/opt/midpoint" URL "/var/opt/midpoint"
ln -s /usr/lib/mc/mc.sh /etc/profile.d/ || :
+
  ENTRY "/var/lib/tomcat8/webapps/" URL "/var/lib/tomcat8/webapps/"
 +
EOF
 
   
 
   
  # midpoint
+
  # repo-ninja
  wget -nv https://evolveum.com/downloads/midpoint/${v}/midpoint-${v}-dist.tar.bz2
+
  wget -nv https://evolveum.com/downloads/midpoint/${v}/midpoint-${v}-dist.tar.bz2 -P ~/
  tar xjf midpoint-${v}-dist.tar.bz2
+
  tar xjf ~/midpoint-${v}-dist.tar.bz2
  echo "alias repo-ninja='`pwd`/midpoint-${v}/bin/repo-ninja'" > /etc/profile.d/midpoint.sh
+
  sed -e "s,^\(BASEDIR\).*,\1=\"/opt/midpoint-${v}\"," /opt/midpoint-${v}/bin/repo-ninja > /usr/local/bin/repo-ninja
 +
chmod +x /usr/local/bin/repo-ninja
 
   
 
   
 
  # initial launch without anything
 
  # initial launch without anything
  a2enmod rewrite proxy proxy_http
+
cp -vp server-configuration/${e}/etc/apache2/sites-available/midpoint.conf /etc/apache2/sites-available/
 +
  a2enmod rewrite
 +
a2enmod ssl
 +
a2enmod webauth
 +
a2enmod webauthldap
 
  a2dissite 000-default
 
  a2dissite 000-default
  a2enconf midpoint
+
  a2ensite midpoint
  service apache2 start
+
  service apache2 restart
  service tomcat8 start
+
   
  service postgresql start
+
# JDBC
 +
ln -sfv /usr/share/java/mysql-connector-java.jar /var/lib/tomcat8/lib/
 +
  ln -sfv /usr/lib/oracle/12.1/client64/lib/ojdbc7.jar /var/lib/tomcat8/lib/
 +
mkdir -p /usr/local/share/java 2>/dev/null || :
 +
(cd /usr/local/share/java; wget -N -nv http://central.maven.org/maven2/com/microsoft/sqlserver/mssql-jdbc/7.2.0.jre8/mssql-jdbc-7.2.0.jre8.jar)
 +
ln -sfv /usr/local/share/java/mssql-jdbc-7.2.0.jre8.jar /var/lib/tomcat8/lib/
 
   
 
   
 
  # midpoint initial deployment
 
  # midpoint initial deployment
  cp -vp midpoint-${v}/war/midpoint.war /var/lib/tomcat8/webapps/
+
  install -vp -o tomcat8 -g tomcat8 ~/midpoint.war /var/lib/tomcat8/webapps/
ln -s /usr/share/java/mysql-connector-java.jar /var/lib/tomcat8/lib/
+
 
  service tomcat8 start
 
  service tomcat8 start
 
  while ! test -f /var/opt/midpoint/config.xml; do sleep 0.5; done
 
  while ! test -f /var/opt/midpoint/config.xml; do sleep 0.5; done
  wget -nv -P /var/opt/midpoint/icf-connectors http://nexus.evolveum.com/nexus/content/repositories/openicf-releases/org/forgerock/openicf/connectors/scriptedsql-connector/1.1.2.0.em3/scriptedsql-connector-1.1.2.0.em3.jar
+
  chmod 0640 /var/opt/midpoint/config.xml
 +
service tomcat8 stop
 +
 +
# deployment of the connectors
 +
#cp -v ... /var/opt/midpoint/icf-connectors/
  
== Oracle ==
+
=== Oracle ===
  
TODO: vyzkoušet
+
1) vyžaduje Oracle clienta
 +
 
 +
dpkg -i /afs/zcu.cz/project/departments/civ/oracle-install/instant_client/12.1.0.2/linux64/deb/oracle*.deb
  
Vyžaduje Oracle clienta.
+
2) JDBC ovladač pro tomcat
  
 
  ln -s /usr/lib/oracle/12.1/client64/lib/ojdbc7.jar /var/lib/tomcat8/lib/
 
  ln -s /usr/lib/oracle/12.1/client64/lib/ojdbc7.jar /var/lib/tomcat8/lib/
 +
 +
3) do ''/etc/default/tomcat8'':
 +
 +
* přidat k ''JAVA_OPTS'' (kvuli fungování tnsnames): ''-Doracle.net.tns_admin=/usr/lib/oracle/12.1/client64/network/admin'
 +
* přidat: ''TZ=CET'' (jinak hláška o časových zónách z Oraclu, a vůbec je dobré mít kvuli lokálnímu času ;-))
 +
* přidat: ''NLS_LANG='CZECH_CZECH REPUBLIC.AL32UTF8''' (na žádost databázistů, RT [https://rt.zcu.cz/rt/Ticket/Display.html?id=277811 #277811])
  
 
== Switch repository ==
 
== Switch repository ==
Řádka 103: Řádka 193:
 
  sudo -u postgres psql -U postgres postgres -c "CREATE USER midpoint password '${pass}'"
 
  sudo -u postgres psql -U postgres postgres -c "CREATE USER midpoint password '${pass}'"
 
  sudo -u postgres createdb --owner=midpoint midpoint
 
  sudo -u postgres createdb --owner=midpoint midpoint
  sudo -u midpoint psql midpoint < midpoint-${v}/config/sql/_all/postgresql-3.3-all.sql
+
  sudo -u midpoint psql midpoint < midpoint-${v}/config/sql/_all/postgresql-3.4.1-all.sql
 
   
 
   
 
  # also for repo-ninja
 
  # also for repo-ninja
Řádka 131: Řádka 221:
 
  ln -s /usr/share/java/mysql-connector-java.jar midpoint-${v}/lib/
 
  ln -s /usr/share/java/mysql-connector-java.jar midpoint-${v}/lib/
 
   
 
   
  mysql -e "CREATE DATABASE midpoint"
+
cat > /etc/mysql/conf.d/midpoint.cnf <<EOF
  mysql -e "GRANT ALL ON midpoint.* TO midpoint IDENTIFIED BY '${pass}'"
+
[global]
  mysql -u midpoint -p${pass} midpoint < midpoint-${v}/config/sql/_all/mysql-3.3-all.sql  
+
max_allowed_packet = 256M
 +
# tuning
 +
#query_cache_type=0
 +
#innodb_buffer_pool_size=1G
 +
#innodb_buffer_pool_instances=1
 +
#innodb_log_file_size=400M
 +
EOF
 +
  mysql -e "CREATE DATABASE midpoint CHARACTER SET utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin DEFAULT COLLATE utf8_bin"
 +
  mysql -e "GRANT ALL ON midpoint.* TO 'midpoint'@'localhost' IDENTIFIED BY '${pass}'"
 +
  mysql -u midpoint -p${pass} midpoint < midpoint-${v}/config/sql/_all/mysql-3.4.1-all.sql  
 
   
 
   
 +
service mysql restart
 
  service tomcat8 stop
 
  service tomcat8 stop
  
 
Manually edit ''/var/opt/midpoint/config.xml'' (replace ${pass}):
 
Manually edit ''/var/opt/midpoint/config.xml'' (replace ${pass}):
  <repository>
+
 
    <repositoryServiceFactoryClass>com.evolveum.midpoint.repo.sql.SqlRepositoryFactory</repositoryServiceFactoryClass>
+
<repository>
    <embedded>false</embedded>
+
  <repositoryServiceFactoryClass>com.evolveum.midpoint.repo.sql.SqlRepositoryFactory</repositoryServiceFactoryClass>
    <driverClassName>org.gjt.mm.mysql.Driver</driverClassName>
+
  <embedded>false</embedded>
    <jdbcUsername>midpoint</jdbcUsername>
+
  <driverClassName>com.mysql.jdbc.Driver</driverClassName>
    <jdbcPassword>${pass}</jdbcPassword>
+
  <jdbcUsername>midpoint</jdbcUsername>
    <jdbcUrl>jdbc:mysql://localhost/midpoint</jdbcUrl>
+
  <jdbcPassword>${pass}</jdbcPassword>
    <hibernateDialect>com.evolveum.midpoint.repo.sql.util.MidPointMySQLDialect</hibernateDialect>
+
  <jdbcUrl>jdbc:mysql://localhost/midpoint?characterEncoding=utf8</jdbcUrl>
    <hibernateHbm2ddl>validate</hibernateHbm2ddl>
+
  <hibernateDialect>com.evolveum.midpoint.repo.sql.util.MidPointMySQLDialect</hibernateDialect>
  </repository>
+
  <hibernateHbm2ddl>validate</hibernateHbm2ddl>
 +
</repository>
 +
 
 +
=== Oracle ===
 +
 
 +
Create (na ZČU máme jinak, viz [[#Oracle_3]]):
 +
CREATE USER midpoint IDENTIFIED BY apassword;
 +
GRANT connect,resource TO midpoint;
 +
 
 +
Apply: ''midpoint-3.4.1/config/sql/_all/oracle-3.4.1-all.sql''
 +
 
 +
Edit: ''/var/opt/midpoint/config.xml'' (replace for real values):
 +
<repository>
 +
  <repositoryServiceFactoryClass>com.evolveum.midpoint.repo.sql.SqlRepositoryFactory</repositoryServiceFactoryClass>
 +
  <database>oracle</database>
 +
  <jdbcUsername>midpoint</jdbcUsername>
 +
  <jdbcPassword>${pass}</jdbcPassword>
 +
  <jdbcUrl>jdbc:oracle:thin:@localhost:1521/xe</jdbcUrl>
 +
</repository>
  
 
=== Common ===
 
=== Common ===
Řádka 169: Řádka 287:
 
   <xmlCipher>http://www.w3.org/2001/04/xmlenc#aes256-cbc</xmlCipher>
 
   <xmlCipher>http://www.w3.org/2001/04/xmlenc#aes256-cbc</xmlCipher>
 
  </keystore>
 
  </keystore>
 
== Fix security policy ==
 
 
# maxFailedLogins: 3 -> 10
 
# loginTimeout: 15 -> 2
 
vim /var/lib/tomcat8/webapps/midpoint/WEB-INF/ctx-web-security.xml
 
service tomcat8 restart
 
  
 
== Admin password ==
 
== Admin password ==
Řádka 183: Řádka 294:
 
* initial user: ''administrator''
 
* initial user: ''administrator''
 
* initial password: ''5ecr3t''
 
* initial password: ''5ecr3t''
 +
 +
== CA ==
 +
 +
Potřeba přidat CA certifikáty potřebné pro SSL spojení se všemi koncovými systémy do interního truststore midPointu. Např. (pro každý CA certifikát v řetězu):
 +
 +
keytool -keystore /var/opt/midpoint/keystore.jceks -storetype jceks -importcert -alias ca1 -file /tmp/ca1.pem
 +
keytool -keystore /var/opt/midpoint/keystore.jceks -storetype jceks -importcert -alias ca2 -file /tmp/ca2.pem
 +
# pro captcha
 +
keytool -printcert -rfc -sslserver www.google.com/recaptcha/api/siteverify > recaptcha.pem
 +
keytool -keystore /var/opt/midpoint/keystore.jceks -storetype jceks -importcert -file recaptcha.pem
 +
 +
(koukání do trustanchor je přepnuté na vlastní soubor, viz ''/etc/default/tomcat*'' - IMHO to pak nepoužívá CA ze systému)
 +
 +
== WebAuth ==
 +
 +
* Obecné info o SSO (příklady s CAS): https://wiki.evolveum.com/display/midPoint/MidPoint+and+SSO+HOWTO
 +
 +
* Majlen vyrobil třídu na chroustání proměnných prostředí: https://github.com/spring-projects/spring-security/pull/3978
 +
 +
* název třídy filtru změnit z '''EnvironmentVariableAuthenticationFilter''' na '''RequestAttributeAuthenticationFilter''' podle změn v pull-requestu
 +
 +
Kterak nakonfigurovat:
 +
 +
<ol>
 +
<li>'''deployment'''<br>
 +
 +
Pro deployment použít ''war'' vygenerovaný z repozitáře ''midpoint-overlay.git'' - obsahuje zkompilovanou třídu filtru a konfiguraci nastavení přihlašování.
 +
 +
</li>
 +
 +
<li>'''nakonfiguravat apache'''
 +
* smazat původní konfiguraci pro midPoint bez webauthu
 +
* základ nakonfiguruje sám cfengine
 +
* běžná konfigurace pro webauth, např. něco jako:
 +
 +
<pre>...
 +
JkMount /* tomcat8_worker
 +
JkEnvVar WEBAUTH_USER "<UNSET>"
 +
...
 +
<Location />
 +
    AuthType WebAuth
 +
    Require privgroup lps
 +
    ...
 +
</Location></pre>
 +
 +
Také:
 +
* povolit AJP13 v tomcatu
 +
 +
Také:
 +
apt-get install -y libapache2-mod-jk
 +
adduser tomcat8 ssl-cert
 +
a2enmod headers
 +
a2enmod rewrite
 +
a2enmod ssl
 +
a2enmod webauth
 +
a2enmod webauthldap
 +
a2ensite midpoint
 +
# apache tuning
 +
a2dismod php5
 +
# apache tuning
 +
a2dismod mpm_prefork
 +
 +
# apache tuning
 +
a2enmod mpm_event
 +
service apache2 restart
 +
service tomcat8 restart
 +
 +
<li>'''vyrobit uživatele''' se správnými access rolemi (End User, Super User, Approver, ...)
 +
 +
<li>'''vidlička mimo webauth''' - funguje to pouze pro API (např. Eclipse plugin)
 +
 +
<ol>
 +
<li>''/etc/apache2/site-available/01midpoint.conf'': mít sekci ''&lt;VirtualHost localhost:8443&gt;''
 +
<li>''/etc/tomcat8/server.xml'': žádné SSL a řádka:
 +
<pre><Connector port="8009" protocol="AJP/1.3" redirectPort="443" /></pre>
 +
<li>na eclipse plugin pak používat tunel <tt>ssh ... -L 8443:localhost:8443</tt>
 +
</ol>
 +
 +
</ol>
 +
 +
Výsledek konfigurace:
 +
* na stránky midpointu se lze dostat pouze přes webauth s nakonfigurovanými omezeními
 +
* pokud neexistuje přihlášený uživatel v midpointu, otevře se přihlašovací formulář midpointu
 +
 +
== Drobnosti ==
 +
 +
* ''graphviz'': na vizualuzace v GUI
 +
* ''xmlstarlet'': používá skript na import XML
 +
* ''elinks''
 +
* ''cmake'' >= 2.8.12, ''libkrb5-dev'' >= 0.15; nebo balík z kerberos-connector: Kerberos resource
 +
 +
== Monitoring ==
 +
 +
* v Nagiosu command ''check_midpoint.pl (MIDPOINT)'' - sonda v perlu, co nacucne několik XML a podívá se dovnitř
 +
* jeden parametr s properties souborem (viz ''Edit static config files'' -&gt; ''static_cfg'')
 +
 +
== Registace ==
 +
 +
Nastavit Captchu:
 +
 +
* https://www.google.com/recaptcha/admin/site/349666473/settings
 +
 +
Import SSL CA:
 +
 +
* https://pki.goog/repository/ (funguje gts1o1)
  
 
= Upgrade =
 
= Upgrade =
 +
 +
Postupovat podle release notes a podle obecných pravidel na https://wiki.evolveum.com/display/midPoint/Upgrade+HOWTO .
  
 
== Upgrade databáze ==
 
== Upgrade databáze ==
  
Např.:
+
MySQL např.:
  
 
  cd /opt/newMidpoint/midpoint-3.4/config/sql/_all
 
  cd /opt/newMidpoint/midpoint-3.4/config/sql/_all
 
  mysql -u root -p midpoint < mysql-upgrade-3.3-3.4.sql
 
  mysql -u root -p midpoint < mysql-upgrade-3.3-3.4.sql
 +
 +
Oracle:
 +
 +
1. pod ''midpoint_repo_admin'':
 +
 +
-- 1a) pustit upgrade skript z:
 +
-- https://github.com/Evolveum/midpoint/blob/master/config/sql/_all/
 +
 +
-- 1b) granty (pro každou novou tabulku)
 +
GRANT SELECT, INSERT, UPDATE, DELETE ON MIDPOINT_REPO_ADMIN.##### to  MIDPOINT_REPO_WRITE_ROLE;
 +
 +
2. pod ''midpoint_repo'':
 +
 +
-- 2a) synonyma (pro každou novou tabulku a sekvenci)
 +
CREATE OR REPLACE SYNONYM ##### FOR MIDPOINT_REPO_ADMIN.#####;
 +
 +
-- 2b) rušené tabulky
 +
DROP SYNONYM #####;
 +
 +
Detaily viz [[#Oracle]]
  
 
== Deployment war ==
 
== Deployment war ==
Řádka 206: Řádka 444:
 
* radši i restart midPointu (natáhne si případně omylem smazané objekty)
 
* radši i restart midPointu (natáhne si případně omylem smazané objekty)
  
= Docker =
+
== repo-ninja ==
  
https://hub.docker.com/r/valtri/docker-midpoint/
+
Funguje, ale nepůjdou parametry (templaty). Raději použít midPoint Eclipse plugin.
  
docker pull valtri/docker-midpoint
+
* úprava cesty v ''/usr/local/bin/repo-ninja''
docker run -itd --name midpoint valtri/docker-midpoint
+
* ''ln -s /usr/share/java/mysql-connector-java.jar /opt/midpoint.../lib''
 +
* vyzkoušet: ''repo-ninja --validate''
  
= Tipy =
+
= Oracle =
  
== XML ==
+
Extra zabezpečené nastavení Oracle repozitáře: dva uživatelé ''midpoint_repo'' a ''midpoint_repo_admin''.
  
=== Klonování konfigurace resource ===
+
== midpoint_repo_admin ==
  
Při kopírování XML nutno smazat sekci <schema></schema>, doporučeno i další.
+
Obsahuje vlastní tabulky - pod ním pouštět SQL script se schematem pro midPoint.
  
Smazat:
+
Pak nastavit dodatečná práva.
* schema
+
* fetchResult
+
* metadata
+
* operationalState
+
  
Také smazat nebo vymyslet nové OID resourcu.
+
Pro každou tabulku (nahradit ''#####'' za název tabulky):
  
=== Import do git repozitáře ===
+
GRANT SELECT, INSERT, UPDATE, DELETE ON MIDPOINT_REPO_ADMIN.##### to MIDPOINT_REPO_WRITE_ROLE;
  
Připravit XML, u resourců viz také [[#Klonování konfigurace resource]].
+
== midpoint_repo ==
  
Vhodné mít v XML i OID (nechat midPointem vygenerovat nové nebo si něco vymyslet). Možno využít i tzv. [https://wiki.evolveum.com/display/midPoint/Object+References "Smart References"], např.:
+
Obsahuje synonyma do ''midpoint_repo_admin''. Navíc potřebuje práva pro temporary tabulky vyráběné midPointem:
  
  <resource>
+
  GRANT CREATE TABLE TO midpoint_repo;
  ...
+
  REVOKE UNLIMITED TABLESPACE FROM midpoint_repo;
  <connectorRef type="ConnectorType">
+
    <filter>
+
      <q:equal>
+
        <q:path>c:connectorType</q:path>
+
        <q:value>org.identityconnectors.ldap.LdapConnector</q:value>
+
      </q:equal>
+
    </filter>
+
  </connectorRef>
+
  ...
+
  </resource>
+
  
Repozitář: viz [[#ZČU]]
+
Pro každou tabulku '''kromě GLOBAL TEMPORARY TABLE''' a pro každou '''sekvenci'''  vyrobit synonyma (nahradit ''#####'' za název tabulky):
 +
 
 +
CREATE OR REPLACE SYNONYM ##### FOR MIDPOINT_REPO_ADMIN.#####;
 +
 
 +
Pro každou zrušenou tabulku (např. při upgradu):
 +
 
 +
DROP SYNONYM #####;
 +
 
 +
= Docker =
 +
 
 +
'''Image''': https://hub.docker.com/r/valtri/docker-midpoint/
 +
 
 +
'''Pomocné skripty''': ''/afs/zcu.cz/projekt/software/git/idm/docker.git''
 +
 
 +
Prakticky se pouští nějak takhle (data vytažená mimo container do adresáře ''midpoint'', pomocný adresář ''docker'' pro administraci a vystavení Oracle klienta do containeru):
 +
 
 +
docker pull valtri/docker-midpoint
 +
 
 +
NAME=midpoint
 +
docker run -itd --restart=on-failure:0 \
 +
  --name $NAME \
 +
    -v `pwd`/midpoint:/var/opt/midpoint \
 +
    -v `pwd`/docker:/docker \
 +
    -v $ORACLE_HOME:$ORACLE_HOME:ro \
 +
    valtri/docker-midpoint
 +
 
 +
Dobré mít vyrobenou vlastní síť a používat statické adresy (tj. přidat parametry ''--network XXXXX --ip 172.18.0.XXX'').
 +
 
 +
Více viz [[LPS:IdM/midPoint/Personální portál#Docker]]
 +
 
 +
= Tipy =
  
 
== Mapování atributů ==
 
== Mapování atributů ==
Řádka 254: Řádka 509:
 
=== Matching rule ===
 
=== Matching rule ===
  
V mapování nezapomínat na matching rule, např.: <br/>
+
V mapování myslet na matching rule.
  
<matchingRule xmlns:mr="http://prism.evolveum.com/xml/ns/public/matching-rule-3">mr:stringIgnoreCase</matchingRule>
+
Jak to funguje: default se bere podle schematu z resourcu. Bacha, např. LDAP mívá většinou ''stringIgnoreCase'' a na striktní porovnávání se to musí explicitně přerazit:
  
Jinak to začne duplikovat atributy (nové hodnoty se přidávají místo nahrazování).
+
<matchingRule xmlns:mr="http://prism.evolveum.com/xml/ns/public/matching-rule-3">mr:default</matchingRule>
 +
 
 +
Seznam pravidel:
 +
 
 +
* ''mr:default'' - striktní porovnání (řetezec nebo číslo)
 +
* ''mr:distinguishedName'' - DN
 +
* ''mr:polyStringNorm'' - pouze normalizovaná hodnota (polyString)
 +
* ''mr:polyStringOrig'' - pouze originální hodnota (polyString)
 +
* ''mr:polyStringStrict'' - striktní porovnání (polyString), prakticky totožné s ''mr:polyStringOrig'' (hypoteticky by se to mohlo lišit u neupdatovaných objektů po změně normalizační politiky)
 +
* ''mr:stringIgnoreCase'' - case-insensitive
 +
* ''mr:uuid'' - case-insensitive s trimováním
 +
* ''mr:xml'' - ignoruje XML formátování
  
 
=== Multiplicity ===
 
=== Multiplicity ===
Řádka 279: Řádka 545:
 
   <minOccurs>0</minOccurs>
 
   <minOccurs>0</minOccurs>
 
  </limitations>
 
  </limitations>
 +
 +
=== Detaily ===
 +
'''atribut''':
 +
 +
* '''exclusiveStrong''' (pro multihodnoty): do výsledku míchat pouze strong (true) nebo i normal (false)
 +
* tolerant (pro výstup?): zda mohou přicházet hodnoty i z koncového systému
 +
 +
'''inbound'''/'''outbound''' mappings:
 +
 +
* '''authoritative''' (autoritativní): odebrat hodnotu při odstranění resourcu/role
 +
* '''exclusive''' (exkluzivní): vrátit chybu, pokud přijde hodnota i z jiného zdroje
 +
* '''strength''' (váha):
 +
** ''weak'' (slabý): jen default (nepřepisovat)
 +
** ''normal'' (normální): přepisovat
 +
*** pozor, pokud je v mapování uveden jakýkoliv ''&lt;source&gt;&lt;/source&gt;'', nová hodnota se posílá <span style="color:red">pouze při změně daného atributu!</span>
 +
*** dokumentace IMHO lže o NULL, při výskytu NULL má danou hodnotu také přepsat, resp. smazat (TODO: ověřit/reportovat)
 +
** ''strong'' (silný): přepisovat, změnu pošle dále do provisioningu vždy
 +
*** pozor v object template: u single-hodnotových atributů dobré použít ve skriptech také ''relativityMode=absolute'', jinak je midPoint rozhozen z neznámých hodnot (hodnot, co neodpovýdají starému i novému stavu atributů)
 +
* '''source''' (zdroj):
 +
** seznam atributů k dispozici pro výpočet nové hodnoty
 +
** vyžadováno pro ''<expression><script>&lt;code>...&lt;/code></script></expression>'', bez výrazu pouze s target není potřeba
 +
** midPoint to nějak používá k detekcí změn a práci s multihodnotami
 +
** příklad:
 +
*** xml: ''<c:path>$account/attributes/ri:MOBIL</c:path>''
 +
*** GUI: ''$account/attributes/MISTNOST''
 +
** nepovinný tag ''<name>'': normálně je daný atribut k dispozici ve výrazu pod svým jménem, tagem ''name'' lze změnit
 +
* '''target''' (cíl): kam hodnotu uložit, příklad:
 +
** xml: ''<c:path>$user/honorificSuffix</c:path>''
 +
** GUI: ''$user/honorificSuffix''
 +
* '''condition''' (podmínka) - pozor, chová se "specificky" co se týče mizení - aby se změna projevila, hodnota condition se musí lišit mezi původní verzí a novou verzí atributů (TODO: ověřit: zřejmě se ignoruje i "return null" a výsledek null je třeba naučit i tu condition)
 +
* '''tolerant''': ''true'' znamená nemazat ostatní hodnoty, pokud jde o multihodnotu (u single-hodnot se chová podivně - první update maže, další vyrobí novou aktuální hodnotu)
  
 
== Synchronizace ==
 
== Synchronizace ==
Řádka 298: Řádka 595:
 
  </reaction>
 
  </reaction>
  
= Úkoly =
+
Nebo nejlepší způsob - zapnout synchronizaci (modifikace se provede automaticky a pouze pokud je potřeba):
  
S nároky na nové IdM se bude potřeba s midPoint naučit. Příklad úkolů, které bude zřejmě potřeba umět:
+
<reaction>
 +
  <name>linked reaction</name>
 +
  <situation>linked</situation>
 +
  <synchronize>true</synchronize>
 +
</reaction>
  
== JDBC connector ==
+
=== Deleted ===
* případně i jako generátor skupin a pracovišť, ale nevíme, jak dobře je to podporované
+
  
== Aktivace identit ==
+
# pro situaci ''deleted'' '''nezapínat ''reconcile''''', jinak vyskakují šílené výjimky
* midPoint má nějaký komplexnější způsob na aktivace/deaktivace identit, které jsou spojené s datumy
+
# nastavování atributů při smazání nelze řešit na úrovni resourcu [[https://jira.evolveum.com/browse/MID-1693 MID-1693]] ==&gt; použít ''ObjectTemplate'' a ''&lt;synchronize&gt;true&lt;/synchronize&gt;''
* prozkoumání, jak na disablování identit (někde jiné atributy, někde smazané, ...), v Sun Idm na to máme speciální role
+
* datum deaktivace případně k využití na expirace hostovských kont nebo odchody identit
+
  
== Sosání skupin ==
+
Příklad ''Resource'':
* engine midPointu to zatím neumí tím správným způsobem krz entitlements, ale lze nějak obejít (<focusType>c:RoleType</focusType> v ObjectSynchronization)
+
* viz také email thread "Sync Entitlements to Role/Org Object with CSVFileConnector"
+
* otázka mimo midPoint: budem nahrazovat i trychtýř, co máme před Grouperem? (tj. budem se napojovat přímo do několika databází nebo budem sosat sadu csv souborů? nevýhoda přímého napojení by byl větší chaos uvnitř midPointu)
+
  
== Groupová aritmetika ==
+
<resource ...>
* sčítání nám stačí, lze dělat přidáváním rolí do jiných rolí
+
...
* máme informace o členství jak "dopředné" (memberUid v LDAPu u skupin), tak "zpětné" (memberof v LDAPu u identit)
+
<synchronization>
* jak na update identit po přeskupení rolí? (memberof v LDAPu): ruční update lidí v daných skupinách/rolích?
+
<objectSynchronization>
 +
...
 +
<reaction>
 +
<name>Example resource account deleted</name>
 +
<situation>deleted</situation>
 +
<synchronize>true</synchronize>
 +
<reconcile>false</reconcile>
 +
<objectTemplateRef oid="template-example-resource-user-disable" type="c:ObjectTemplateType">
 +
<targetName>Example-resource: User Disable Template</targetName>
 +
</objectTemplateRef>
 +
</reaction>
 +
...
 +
</objectSynchronization>
 +
</synchronization>
 +
...
 +
</resource>
  
== Korelační pravidla ==
+
Příklad ''ObjectTemplate'' (bacha, při jakémkoliv ''&lt;source&gt;...&lt;/source&gt;'' je potřeba i ''strength strong'' - zdrojové atributy se nám vlastně smazáním na resourcu sami nemění):
* budeme potřebovat "dělat CRO": umět se vypořádat se změnami klíčů
+
* zkusit se napojovat podle rodných čísel a umět se vypořádat s jejich změnami:
+
** napojit si nějaký systém podle RČ a přenášet změny z CRO
+
** zkoušet dělat změny RČ
+
** zkoušet dělat duplicity: jaké reporty, aby šly pozat? resuscitační emaily nebo workflow?
+
  
== midPoint API ==
+
<objectTemplate ...
 +
  oid="template-example-resource-user-disable">
 +
<name>Example-resource: User Disable Template</name>
 +
<description>
 +
Example Resource User Disable Template Object.
 +
</description>
 +
...
 +
<mapping>
 +
<name>Disable status</name>
 +
<expression>
 +
<value>B1</value>
 +
</expression>
 +
<target>
 +
<c:path>$user/extension/idmStatus</c:path>
 +
</target>
 +
</mapping>
 +
...
 +
</objectTemplate>
  
Určitě bude potřeba nějaké rozhraní pro uživatele (registrace kont, projekty, self-management).
+
== Profiling ==
  
* umí něco přímo midPoint? (3.4 slibuje "Custom GUI forms" na wicketech)
+
''Konfigurace - Profiling''
* jaká midPoint má API?
+
* (šlo by mít i nějakou propojovací tabulku, ale dokumentace midPoint slibuje víc)
+
  
=== WebAuth SSO ===
+
Koukání do logu jen na tasky >= 1s:
  
Pokud by šlo využít přímo GUI midPointu, bude potřeba umět plně WebAuth.
+
tail -f /var/log/tomcat8/idm-profile.log | egrep '[0-9]{3}\.[0-9]{3} ms$'
  
Info o SSO: https://wiki.evolveum.com/display/midPoint/MidPoint+and+SSO+HOWTO
+
== Filtry ==
 +
 
 +
Jak použít:
 +
 
 +
* GUI: ''&lt;searchFilter&gt;...&lt;/searchFilter&gt;''
 +
* eclipse plugin query: ''&lt;query&gt;&lt;filter&gt;...&lt;/filter&gt;&lt;/query&gt;''
 +
* bulk action: ''&lt;s:searchFilter&gt;...&lt;/s:searchFilter&gt;'', přidat namespacy - ''q:org'', ''q:path'', ''q:orgRef''
 +
* REST API query: ''&lt;q:query&gt;&lt;q:filter&gt;...&lt;/q:filter&gt;&lt;/q:query&gt;''
 +
 
 +
Dokumentace:
 +
* https://wiki.evolveum.com/display/midPoint/XML+Object+Query
 +
 
 +
Source:
 +
* [https://github.com/Evolveum/midpoint/blob/support-3.9/infra/prism/src/main/resources/xml/ns/public/query-3.xsd query-3.xsd 3.9]
 +
* [https://github.com/Evolveum/midpoint/blob/master/infra/prism-impl/src/main/resources/xml/ns/public/query-3.xsd query-3.xsd 4+]
 +
 
 +
Seznam operací:
 +
* ''q:equal(q:path, q:value|q:oid|c:expression|c:rightHandSidePath|q:matching|...)''
 +
* ''q:equal(q:path)'': test na neexistenci atributu
 +
* ''q:greater(q:path, q:value|q:oid|c:expression|...)''
 +
* ''q:greaterOrEqual(q:path, q:value|q:oid|c:expression|...)''
 +
* ''q:less(q:path, q:value|q:oid|c:expression|...)''
 +
* ''q:lessOrEqual(q:path, q:value|q:oid|c:expression|...)''
 +
* ''q:substring(q:path, q:value|q:oid|c:expression|...[,q:anchorStart][,q:anchorEnd])''
 +
* ''q:ref([q:path,] q:oid)''
 +
* ''q:org(q:isRoot)''
 +
* ''q:org(q:ref[,q:maxDepth][q:scope="SUBSTREE"|"ONE_LEVEL"])''
 +
* ''q:inOid(q:value|..., boolean considerOwner)''
 +
 
 +
* ''q:and(A, B)''
 +
* ''q:or(A, B)''
 +
* ''q:not(A)''
 +
 
 +
* ''q:type(QName type, FILTER)''
 +
* ''q:exists(string q:path, FILTER)'' - bacha, týká se prohledávání multihodnot (např. pro assigment), kdy je cílem aplikovat komplexní filter na jednu konkrétní hodnotu, "závorka"
 +
 
 +
Příklady operandů:
 +
* ''q:path'': ''c:intent, c:resourceRef, ...''
 +
* ''q:ref'': ''&lt;q:oid&gt;...&lt;/q:oid&gt;''
 +
* každá operace má nepovinný parametr ''q:matching'' (pokud má smysl/je podporovaný): ''norm, orig, strict, polyStringNorm''
 +
 
 +
=== Příklady ===
 +
 
 +
Jméno:
 +
 
 +
<equal>
 +
  <path>name</path>
 +
  <value>1</value>
 +
</equal>
 +
 
 +
Podřetězec:
 +
 
 +
<substring>
 +
  <path>name</path>
 +
  <value>ka</value>
 +
</substring>
 +
 
 +
Někdy nutno přepnout na polystring:
 +
 
 +
<equal>
 +
  <matching>polyStringNorm</matching>
 +
  <path>displayName</path>
 +
  <value>kps</value>
 +
</equal>
 +
 
 +
<equal>
 +
  <matching>polyStringOrig</matching>
 +
  <path>displayName</path>
 +
  <value>ZČU</value>
 +
</equal>
 +
 
 +
Členové pracoviště:
 +
 
 +
  <org>
 +
    <path>parentOrgRef</path>
 +
    <orgRef oid="20010718-1801-0005-0000-200000000000"/>
 +
  </org>
 +
 
 +
Departmenty z Magionu:
 +
 
 +
<equal>
 +
  <path>orgType</path>
 +
  <value>department</value>
 +
</equal>
 +
 
 +
Objekt podle OID:
 +
 
 +
<inOid>
 +
  <value>20010718-1801-0005-0000-200000000000</value>
 +
</inOid>
 +
 
 +
Konkrétní organizace k přiřazení v templatu (tady např. ZČU):
 +
 
 +
<assignmentTargetSearch>
 +
  <targetType>c:OrgType</targetType>
 +
  <oid>20010718-1801-0005-0000-200000000000</oid>
 +
</assignmentTargetSearch>
 +
 
 +
Nalezení organizace k přiřazení (klasický příklad):
 +
 
 +
<assignmentTargetSearch>
 +
  <targetType>c:OrgType</targetType>
 +
  <filter>
 +
    <q:equal>
 +
      <q:path>c:name</q:path>
 +
      <expression>
 +
        <path>$costCenter</path>
 +
      </expression>
 +
    </q:equal>
 +
  </filter>
 +
</assignmentTargetSearch>
 +
 
 +
Objekty vyrobené uživatelem:
 +
 
 +
<q:ref>
 +
  <q:path>metadata/creatorRef</q:path>
 +
  <q:value oid="user-admin-cro"/>
 +
</q:ref>
 +
 
 +
Objekty s nalinkovaným resourcem:
 +
 
 +
<q:ref>
 +
  <q:path>linkRef/@/resourceRef</q:path>
 +
  <q:value oid="resource-cro"/>
 +
</q:ref>
  
 
== Bulk action ==
 
== Bulk action ==
  
Základ umíme (modifikace křesního jména u jedné identity).
+
* hezká wiki: https://wiki.evolveum.com/pages/viewpage.action?pageId=13991970
 +
* příklady: [https://github.com/Evolveum/midpoint/tree/master/samples/tasks/bulk-actions samples], [https://github.com/Evolveum/midpoint/tree/master/model/model-intest/src/test/resources/scripting integration tests]
 +
* REST interface: [https://wiki.evolveum.com/display/midPoint/Bulk+password+generation+HOWTO Bulk password generation HOWTO]
  
Příklady:
+
TODO příklady:
 
* vynucený update nebo rekoncilace u seznamu identit
 
* vynucený update nebo rekoncilace u seznamu identit
 
* přidání/odebrání role
 
* přidání/odebrání role
      Ohledně přidání odebrání role bych to viděl pokud by to byla nějaká multihodnota v někde uložena.
 
 
* aktivace/deaktivace
 
* aktivace/deaktivace
      Aktivace/deaktivace by šla řešit sloupcem který by reprezentoval aktivovaný/deaktivovaný účet. Pak při live synchronizaci nebo rekoncilaci by šlo detekovat a dle toho nastavit
+
 
 +
TODO: vyzkoušet informace z mailinglistu (http://lists.evolveum.com/pipermail/midpoint/2017-May/003806.html)
 +
 
 +
=== Příklady ===
 +
 
 +
Ve formě pro ''Configuration -&gt; Bulk actions''.
 +
 
 +
Mazání všech uživatelů načínajících na "STAG*":
 +
 
 +
<pre><s:search xmlns:s="http://midpoint.evolveum.com/xml/ns/public/model/scripting-3"
 +
          xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
 +
          xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3">
 +
    <s:type>UserType</s:type>
 +
    <s:searchFilter>
 +
        <q:substring>
 +
            <q:path>name</q:path>
 +
            <q:value>STAG</q:value>
 +
            <q:anchorStart>true</q:anchorStart>
 +
        </q:substring>
 +
    </s:searchFilter>
 +
    <s:action>
 +
        <s:type>delete</s:type>
 +
    </s:action>
 +
</s:search></pre>
 +
 
 +
Mazání všech shadow objektů odpovídajících uživatelům ve Stagu:
 +
 
 +
* search: omezení na objectClass je povinné
 +
* action: trik s mazáním s raw opšnou (aby to nemazalo na resourcu)
 +
 
 +
<pre><s:search xmlns:s="http://midpoint.evolveum.com/xml/ns/public/model/scripting-3"
 +
xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
 +
xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
 +
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 +
xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3">
 +
<s:type>ShadowType</s:type>
 +
<s:searchFilter>
 +
<q:and>
 +
<q:ref>
 +
<q:path>c:resourceRef</q:path>
 +
<q:value oid="resource-stag-students" xsi:type="c:objectReferenceType"/>
 +
</q:ref>
 +
<q:equal>
 +
<q:path>objectClass</q:path>
 +
<q:value>ri:AccountObjectClass</q:value>
 +
</q:equal>
 +
</q:and>
 +
</s:searchFilter>
 +
<s:action>
 +
<s:type>execute-script</s:type>
 +
<s:parameter>
 +
<s:name>script</s:name>
 +
<c:value>
 +
<c:code>
 +
  import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
 +
  import com.evolveum.midpoint.model.api.ModelExecuteOptions;
 +
 
 +
log.info('deleting: {}', input.oid);
 +
midpoint.deleteObject(ShadowType.class, input.oid, ModelExecuteOptions.createRaw())
 +
</c:code>
 +
</c:value>
 +
</s:parameter>
 +
</s:action>
 +
</s:search></pre>
 +
 
 +
Vypsání do logu všech "admin-*" uživatelů, příklad akce ''execute-script'':
 +
 
 +
<pre><s:search xmlns:s="http://midpoint.evolveum.com/xml/ns/public/model/scripting-3"
 +
          xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
 +
          xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3">
 +
    <s:type>UserType</s:type>
 +
    <s:searchFilter>
 +
        <q:substring>
 +
            <q:path>name</q:path>
 +
            <q:value>admin-</q:value>
 +
            <q:anchorStart>true</q:anchorStart>
 +
        </q:substring>
 +
    </s:searchFilter>
 +
    <s:action>
 +
        <s:type>execute-script</s:type>
 +
        <s:parameter>
 +
            <s:name>script</s:name>
 +
            <c:value>
 +
                <c:code>
 +
log.info('log: {}', input.name);
 +
                </c:code>
 +
            </c:value>
 +
        </s:parameter>
 +
    </s:action>
 +
</s:search></pre>
 +
 
 +
== Interní atributy ==
 +
 
 +
'''Oficiální dokumentace''':
 +
 
 +
https://wiki.evolveum.com/display/midPoint/MidPoint+Common+Schema
 +
 
 +
'''Zdrojový kód''' (seznam interních atributů, hledat ''name="UserType"'', ''name="OrgType"'', ''name="RoleType"'' a jejich rodičovské typy):
 +
 
 +
https://github.com/Evolveum/midpoint/blob/master/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd
 +
 
 +
 
 +
=== midPoint '''UserType''' ===
 +
 
 +
* ''name'' (*): hlavní ID (myšleno jako jméno objektu prezentované administrátorům, podle schématu nepovinné, prakticky povinné)
 +
* ''description'' (*): popis (pro GUI)
 +
* ''familyName'' (*): jméno
 +
* ''givenName'' (*): příjmení
 +
* ''additionalName'' (0-1): prostřední jméno (nebo jiné kulturní specialitky)
 +
* ''fullName'' (*): (mít na to vlastní pravidlo v mapping)
 +
* ''honorifixPrefix'' (0-1): titul před
 +
* ''honorifixSuffix'' (0-1): titul za
 +
* ''title'' (0-1): myšlena funkce (ale pouze jedna)
 +
* ''nickName'' (0-1): přezdívka (oficiální použití fak pro familiární přezdívku)
 +
* ''prefferedLanguage'' (0-1): jazyk
 +
* ''locale'' (0-1): lokalizace
 +
* ZČU:
 +
** ''extension/croId'' (0-1) [int]
 +
** ''extension/rc'' (0-1)
 +
** ''extension/uidNumber'' (0-1) [int]
 +
 
 +
=== midPoint '''OrgType''' ===
 +
 
 +
* ''orgType'' (*): typ stromu
 +
* ''tenant'' [boolean] (0-1): top-level
 +
* ''costCenter'' (0-1)
 +
* ''locality'' (0-1)
 +
* ''mailDomain'' (*): mailová doména
 +
* ''displayName'' (*): lidský název
 +
* ''identifier'' (*): identifikátor (číselník, apod.)
 +
* ...
 +
 
 +
=== midPoint '''RoleType''' ===
 +
 
 +
* ''roleType'' (*): univerzální informační políčko (midPoint používá ''system'' role, ...)
 +
* ''displayName'' (*): lidský název
 +
* ''identifier'' (*): identifikátor
 +
* ''requestable'' [boolean] (0-1): koncoví uživatelé mohou požádat
 +
* ZČU:
 +
** ''extension/gidNumber'' (0-1) [int]
 +
 
 +
=== Resource ===
 +
 
 +
* ''icsc:name'': přejmenovatelné ID na resourcu
 +
* ''icsc:uid'': nepřejmenovatelné ID na resourcu (např. read-only UUID, ...), někdy totožné s ''icsc:name''
 +
* ''ri:*'': atributy na koncovém resourcu
 +
 
 +
== Synchronizace pracovišť ==
 +
 
 +
midPoint velmi dobře podporuje. Implementováno vč. hierarchie v ''magion.xml'' (JDBC resource) a ''department.xml'' (template).
 +
 
 +
Viz také [https://github.com/Evolveum/midpoint/tree/master/testing/story/src/test/resources/orgsync orgsync story].
 +
 
 +
== SSL ==
 +
 
 +
Self-signed certifikáty vzdálených služeb potřeba importovat do úložiště pro midPoint, např.:
 +
 
 +
keytool -import -alias hernajs -file ./hernajs.pem -keystore /var/opt/midpoint/keystore.jceks -storetype jceks
 +
 
 +
== Logování ==
 +
 
 +
V ''Configuration'' -&gt; ''Logging'' (v objektu ''SystemConfiguration'', tag ''logging'').
 +
 
 +
Scripted SQL (verze od Tirasy):
 +
 
 +
* loguje pouze '''od úrovně ''DEBUG'''''!
 +
* ''net.tirasa.connid.commons.scripted.AbstractScriptedConnector'' (tuhle třídu nepoužívat: ''net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector'' - to je jen wrapper třída, která neloguje)
 +
 
 +
== Přenesení MySQL repozitáře ==
 +
 
 +
Příklad: z lokální databáze ''midpoint'' na stroj ''eos.zcu.cz'' s databází ''midpoint_test'':
 +
 
 +
<ol>
 +
<li>vyrobit cílovou databázi, radši včetne nahrnutí schema
 +
<li>přenesení:<br/>
 +
 
 +
<tt>mysqldump -u root -p$pass1 --ignore-table=midpoint.m_audit_delta --ignore-table=midpoint.m_audit_event --ignore-table=midpoint.m_audit_item midpoint | mysql -u midpoint_test -h eos.zcu.cz -p$pass2 midpoint_test</tt><br/>
 +
</ol>
 +
 
 +
== Standardní tasky ==
 +
 
 +
'''Cleanup''' - promazává staré záznamy (audity, ale i dlouho nespuštěné úlohy!)
 +
 
 +
'''Validity scanner''' - kontrola nastavení od-do a spouštění potřebných enable/disable událostí
 +
 
 +
'''Trigger scanner''' - obsluha WF
 +
 
 +
== Aktivace identit ==
 +
 
 +
* aktivace: https://wiki.evolveum.com/display/midPoint/Activation
 +
* stav účtu z resourcu:
 +
** v capabilities resourcu lze nastavit jméno atributu a hodnoty odpovídající aktivnímu/neaktivnímu stavu
 +
** nebo umí resourcy nativně (stav jako takový i datumové rozsahy platnosti)
 +
** jak na to: https://wiki.evolveum.com/display/midPoint/Resource+Schema+Handling:+Activation
 +
 
 +
Příklad přenosu stavu z resourcu do midPointu ze ''schemaMapping'':
 +
 
 +
<activation>
 +
  <administrativeStatus>
 +
    <inbound>
 +
      <expression>
 +
        <asIs/>
 +
      </expression>
 +
    </inbound>
 +
  </administrativeStatus>
 +
</activation>
 +
 
 +
== Sosání skupin ==
 +
 
 +
* engine midPointu to zatím neumí tím správným způsobem krz entitlements, ale lze obejít (<focusType>c:RoleType</focusType> v ObjectSynchronization)
 +
** funguje to a ničemu to nevadí
 +
** viz také email thread "Sync Entitlements to Role/Org Object with CSVFileConnector"
 +
 
 +
== Mazání atributů ==
 +
 
 +
Mazání atributů umí midPoint "od přírody" pouze v rámci mapování u resourcu (''&lt;value/&gt;'' společně se ''strength strong'' a ''tolerant false'').
 +
 
 +
Zrušit hodnotu atributu lze ručně groovy skriptem:
 +
 
 +
<pre><mapping>
 +
<name>HR_ZAC</name>
 +
<source>
 +
<path>$user/extension/HR_ZAC</path>
 +
</source>
 +
<expression>
 +
<script>
 +
<code>
 +
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
 +
import javax.xml.namespace.QName;
 +
import com.evolveum.midpoint.model.api.ModelExecuteOptions;
 +
import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder;
 +
import com.evolveum.midpoint.prism.path.ItemPath;
 +
import com.evolveum.midpoint.prism.PrismConstants;
 +
 
 +
if (HR_ZAC) {
 +
//def path = UserType.F_NAME;
 +
def path = new ItemPath(
 +
new ItemPath(PrismConstants.EXTENSION_LOCAL_NAME),
 +
new QName('http://zcu.cz/xml/ns/idm', 'HR_ZAC'));
 +
 
 +
def delta = DeltaBuilder.deltaFor(UserType.class, midpoint.getPrismContext())
 +
.item(path).delete(HR_ZAC)
 +
.asObjectDelta(user.getOid());
 +
log.info('DELETED: HR_ZAC delta: {}', delta);
 +
 
 +
midpoint.modifyObject(delta, ModelExecuteOptions.createRaw());
 +
} else {
 +
log.info('DELETED: HR_ZAC is already empty');
 +
}
 +
</code>
 +
</script>
 +
</expression>
 +
</mapping></pre>
  
 
== Reporty ==
 
== Reporty ==
  
Naučit se s audity a reporty. Umět poznat, kdy se co měnilo a proč.
+
Kombinace Jasperu a midPointu.
 +
 
 +
Vizáž pomocí Jaspersoft studia:
 +
 
 +
* https://community.jaspersoft.com/project/jaspersoft-studio
 +
 
 +
== Koncové systémy ==
 +
 
 +
'''Primární klíč''':
 +
* je tam nějaký "immutable" klíč? (např. UUID) - ideální pro __UID__
 +
** lze i bez - uid se smí updatem "předrátovávat"
 +
* další měnitelný klíč do __NAME__
 +
 
 +
'''Paralelizmus''':
 +
* zkontrolovat schopnost paralelizování (umí to? nebude vytížené?)
 +
* pokud nelze: nastavit hodnoty 1 v connection poolu
 +
 
 +
'''Běžné úvahy''':
 +
* přejmenování identity
 +
* blokace identity
 +
* mazání identity
 +
* discovery - potřeba koexistence s identitami "mimo systém"?
 +
* merge - duplicitní identity a co s nimi
 +
 
 +
== Diagnostika ==
 +
 
 +
Přidat ''-Dcom.sun.management.jmxremote'' do JAVA_OPTS (''/etc/default/tomcat8'').
 +
 
 +
=== connection pool: c3p0 ===
 +
 
 +
Pro midPoint <= 3.7.2. Plnohodnotný connection pool.
 +
 
 +
# lokálně pustit ''jconsole''
 +
# připojit se na org.apache.catalina
 +
# ''MBeans/com.mchange.v2.c3p0/PooledDataSource/*/*/Attributes''
 +
 
 +
Zajímavé atributy jsou např.:
 +
 
 +
* maxPoolSize (default 20)
 +
* minPoolSize (default 8)
 +
* '''maxStatements''' (default 0!)
 +
** Oracle: zvýšen výkon rekonciliací o 30-50% + lepší chování na DB serveru
 +
** M$ SQL: žádné zlepšení (test od AMI Praha)
 +
* maxStatementsPerConnection (default 0) - tahle asi nic nedělá (testováno na Oracle)
 +
 
 +
Konfigurace: skrz ''WEB-INF/classes/c3p0-config.xml''
 +
 
 +
=== connection pool: HikariCP ===
 +
 
 +
Pro midPoint >= 3.8. Poor-man connection pool (minimalistický, o dost horší výkon, jen mikrooptimalizace na velikost kódu).
 +
 
 +
Konfigurace: ''-Dhikaricp.configurationFile=hikari.properties'' (zadaný soubor se pak poctivě hledá na filesystému i v jarech)
 +
 
 +
Jakákoliv property začínající ''dataSource.'' se použije jako parameter pro JDBC driver.
 +
 
 +
''hikari.properties'' (pomohlo jen zčásti):
 +
 
 +
dataSource.oracle.jdbc.implicitStatementCacheSize=500
 +
 
 +
== Map attribute only when account is created ==
 +
 
 +
<tt>AFAIK you can use condition for the mapping, and there is internal
 +
variable "operation" which will have value "add" for adding the account
 +
(i.e. create).</tt>
 +
 
 +
== Korelace ==
 +
 
 +
+ další info kolem možných kontrol RČ, ...
 +
 
 +
Příklad (v GUI je kód stejný - ale pouze tag ''q:equal'' včetně):
 +
        <correlation>
 +
            <q:description>korelace1_1</q:description>
 +
            <q:equal>
 +
                <q:path xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3">c:name</q:path>
 +
                <expression>
 +
                    <c:path xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3">declare namespace icfs='http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3'; $account/attributes/icfs:name</c:path>
 +
                </expression>
 +
            </q:equal>
 +
        </correlation>
 +
 
 +
        <correlation>
 +
          <q:description>korelace_rc</q:description>
 +
          <q:equal>
 +
              <q:path>c:extension/rc</q:path>
 +
              <expression>
 +
                <c:path>declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance-3'; $account/attributes/ri:RODNE_CISLO</c:path>
 +
              </expression>
 +
          </q:equal>
 +
        </correlation>
 +
 
 +
Košatější příklad:
 +
 
 +
[https://github.com/Evolveum/midpoint/blob/master/testing/story/src/test/resources/trafo/resource-dummy-mail.xml trafo story]
 +
 
 +
Alternativní jednodušší zápis (TODO: vyzkoušet, v examplech není tak častý):
 +
 
 +
<correlation>
 +
  <q:equal>
 +
    <q:path>c:name</q:path>
 +
    <valueExpression>
 +
      <path>$shadow/attributes/icfs:name</path>
 +
    </valueExpression>
 +
  </q:equal>
 +
</correlation>
 +
 
 +
Poznámky:
 +
 
 +
* Pokus o nalinkování vlastníkovi již s nalinkovaným jiným účtem selže (jedná se vlastně o duplicitu klíče - korelace spolu s confirmation pravidlem musí dávat jednoznačnost)
 +
* Hlídání duplicity jiného atributu je možné:
 +
** vyhození vyjímky (pouze hlídání): [https://wiki.evolveum.com/display/midPoint/Unique+property+value+HOWTO Unique+property+value+HOWTO]
 +
** karanténí organizace (dynamický assignement): ''template-people-with-rc-check.xml'' v našem gitu
 +
 
 +
= Troubleshooting =
 +
 
 +
== Nejde synchronizace ==
 +
 
 +
=== Live nic nenačte ===
 +
 
 +
Normální chování při prvním puštění je nic nedělat (tj. čte jen změny).
 +
 
 +
==&gt;:
 +
* potřeba pustit import nebo rekonciliaci
 +
* nebo: JDBC script RA lze instruovat, aby při prvním puštění syncnul vše (dát token na 0 - unixový počátek vesmíru)
 +
 
 +
=== Not applicable for task ===
 +
 
 +
Zkontrolovat svatou trojici ''Kind'' + ''Object Class'' + ''Intent''. '''Všude''' (!):
 +
 
 +
* Resource - Schema handling
 +
* Resource - Synchronization
 +
* Server Task
 +
 
 +
MID-2831: jednou se možná sloučí ''schemaHandlin/objectType'' a ''synchronization/objectSynchronization''
 +
 
 +
=== No sync policy ===
 +
 
 +
Viz výše.
 +
 
 +
=== liveSync token se neaktualizuje ===
 +
 
 +
...a sync se dokola opakuje.
 +
 
 +
Dva problémy:
 +
# Nová opšna '''retryLiveSyncErrors''' - způsobí neaktualizaci tokenu při jakékoliv chybě, i při neopravitelné
 +
#* od midPoint 4.x existuje capability ''liveSync/preciseTokenValue'', pak se při chybě použije token z poslední neselhané změny
 +
# Zkontrolovat v tasku také sekci "Errors" - někdy to nevadí, někdy ano (třeba šlo jen o upgrade na midPoint 4.x?)
 +
 
 +
== Heslo administrátora ==
 +
 
 +
'''Reset hesla''':
 +
# v repozitáři najít ''m_object WHERE oid='00000000-0000-0000-0000-000000000002'
 +
# ve ''fullObject'' smazat ''<password><value>...</value></password>'' a nahradit za ''<value><clearValue>...</clearValue></value>''
 +
# po úspěšném přihlášení pak administrátora přeuložit (interně se heslo zase zašifruje aktuálním klíčem)
 +
 
 +
'''Přegenerování celého účtu'''
 +
# zkontrolovat/změnit default password ve ''WEB-INF/classes/initial-objects/050-user-administrator.xml'' (musí odpovídat politice)
 +
# smazat z repozitáře objekt z ''m_object'' a ''m_user''
 +
# restart midPoint
 +
 
 +
== Reset hesla ==
 +
 
 +
# v repozitáři najít ''m_object WHERE oid='...'
 +
# ve ''fullObject'' smazat ''<password><value>...</value></password>'' a nahradit za ''<value><clearValue>...</clearValue></value>''
 +
# po úspěšném přihlášení pak objekt přeuložit (interně se heslo zase zašifruje aktuálním klíčem)
 +
 
 +
== Warningy ==
 +
 
 +
=== There is no owner of account ===
 +
 
 +
Pozorováno ve verzi: 3.6.1
 +
 
 +
Známý interní warning, který má Evolveum už reportovaný. Na funkci MP nemá vliv.
 +
 
 +
Viz [https://helpdesk.ami.cz/show_bug.cgi?id=24374#c1 AMI #24374].
 +
 
 +
<tt>WARN (com.evolveum.midpoint.notifications.impl.AccountOperationListener): There is no owner of account c29e30e5-7496-4423-be68-4bb9779b764d (in repo nor in task).</tt>
 +
 
 +
== Výjimky ==
 +
 
 +
=== java.util.ConcurrentModificationException ===
 +
 
 +
Pozorováno ve verzi: 3.6.1, 3.6.2-SNAPSHOT (2017-11-16 + commit 35c7b13)
 +
 
 +
Zřejmě bug v midPointu, race-condition je známa. Ale NEJEDNÁ se o bug [https://jira.evolveum.com/browse/MID-4088 MID-4088].
 +
 
 +
<pre>2017-11-23 11:46:19,128 [] [pool-1-thread-38] WARN (com.evolveum.midpoint.prism.PrismProperty): Adding value to property {http://midpoint.evolveum.com/xml/ns/public/common/common-3}resultStatus that already exists (overwriting), value: PPV(OperationResultStatusType:IN_PROGRESS)
 +
2017-11-23 11:46:19,138 [] [pool-1-thread-38] ERROR (com.evolveum.midpoint.model.impl.lens.Clockwork): Couldn't record operation execution. Model context:
 +
LensContext: state=FINAL, Wave(e=2,p=3,max=0), focus, 1 projections, 2 changes, fresh=true, reqAutz=true
 +
  Channel: http://midpoint.evolveum.com/xml/ns/public/provisioning/channels-3#reconciliation
 +
...
 +
java.util.ConcurrentModificationException: null
 +
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:907) ~[na:1.8.0_151]
 +
at java.util.ArrayList$Itr.remove(ArrayList.java:871) ~[na:1.8.0_151]
 +
at com.evolveum.midpoint.prism.PrismProperty.addValue(PrismProperty.java:263) ~[prism-3.6.1.jar:na]
 +
at com.evolveum.midpoint.prism.PrismProperty.setValue(PrismProperty.java:234) ~[prism-3.6.1.jar:na]
 +
at com.evolveum.midpoint.prism.xjc.PrismForJAXBUtil.setPropertyValue(PrismForJAXBUtil.java:141) ~[prism-3.6.1.jar:na]
 +
at com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.setResultStatus(TaskType.java:390) ~[schema-3.6.1.jar:na]
 +
at com.evolveum.midpoint.task.quartzimpl.TaskQuartzImpl.getTaskPrismObject(TaskQuartzImpl.java:265) ~[task-quartz-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.model.impl.lens.Clockwork.setOperationContext(Clockwork.java:914) [model-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.model.impl.lens.Clockwork.recordOperationExecution(Clockwork.java:827) [model-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.model.impl.lens.Clockwork.recordProjectionOperationExecution(Clockwork.java:801) [model-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.model.impl.lens.Clockwork.recordOperationExecution(Clockwork.java:753) [model-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.model.impl.lens.Clockwork.processFinal(Clockwork.java:735) [model-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.model.impl.lens.Clockwork.click(Clockwork.java:477) [model-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.model.impl.lens.Clockwork.run(Clockwork.java:207) [model-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.model.impl.sync.SynchronizationServiceImpl.reactToChange(SynchronizationServiceImpl.java:781) [model-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.model.impl.sync.SynchronizationServiceImpl.notifyChange(SynchronizationServiceImpl.java:311) [model-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.provisioning.impl.ChangeNotificationDispatcherImpl.notifyChange(ChangeNotificationDispatcherImpl.java:146) [provisioning-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.model.impl.sync.SynchronizeAccountResultHandler.handleObjectInternal(SynchronizeAccountResultHandler.java:204) [model-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.model.impl.sync.SynchronizeAccountResultHandler.handleObject(SynchronizeAccountResultHandler.java:126) [model-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeResultHandler.processRequest(AbstractSearchIterativeResultHandler.java:331) [model-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeResultHandler.access$200(AbstractSearchIterativeResultHandler.java:52) [model-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeResultHandler$WorkerHandler.run(AbstractSearchIterativeResultHandler.java:292) [model-impl-3.6.1.jar:na]
 +
at com.evolveum.midpoint.task.quartzimpl.TaskManagerQuartzImpl$1.run(TaskManagerQuartzImpl.java:844) [task-quartz-impl-3.6.1.jar:na]
 +
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_151]
 +
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_151]
 +
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_151]
 +
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_151]
 +
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_151]</pre>
 +
 
 +
=== NPE com.evolveum.midpoint.model.impl.controller.SchemaTransformer ===
 +
 
 +
Pozorováno ve verzi: 3.9.1
 +
 
 +
Padá to při vyhodnocování assignments (GUI Assignemnts/Show All, preview, save).
 +
 
 +
Celkem univerzální výjimka. Přihodí se při:
 +
 
 +
* chybějícím subjektu v asociaci (1):
 +
*# uživatel má asociace
 +
*# je ve skupině
 +
*# podle rolí není přiřazen na resourcu (pokud jen není na resourcu kuli podmínkám, tak cajk)
 +
* chybějícím subjektu v asociaci (2):
 +
*# uživatel má asociace
 +
*# je ve skupině
 +
*# podle rolí je přiřazen na resourcu, ale ty nejsou přepočítané po změnách
 +
* předchozí chybě při updatu (a např. show assignments chodí):
 +
*# jakkoliv selhalo vyrobení identity na nějakém konektoru (např. generic ConnectorException)
 +
*# anebo něco selhalo kvuli chybám výše (associations+assignments)
 +
 
 +
Po opravě příčin (associations+assigments) je nutno znovupřepočítat identitu, ale bez preview.
 +
 
 +
ERROR (com.evolveum.midpoint.web.page.admin.PageAdminFocus): Could not create assignments preview..
 +
java.lang.NullPointerException: null
 +
at com.evolveum.midpoint.model.impl.controller.SchemaTransformer.applySecurityConstraints(SchemaTransformer.java:446)
 +
at com.evolveum.midpoint.model.impl.controller.SchemaTransformer.lambda$applySchemasAndSecurityElementContext$2(SchemaTransformer.java:319)
 +
at com.evolveum.midpoint.model.impl.lens.LensFocusContext.forEachDelta(LensFocusContext.java:595)
 +
at com.evolveum.midpoint.model.impl.controller.SchemaTransformer.applySchemasAndSecurityElementContext(SchemaTransformer.java:318)
 +
at com.evolveum.midpoint.model.impl.controller.SchemaTransformer.applySchemasAndSecurityFocus(SchemaTransformer.java:274)
 +
at com.evolveum.midpoint.model.impl.controller.SchemaTransformer.applySchemasAndSecurity(SchemaTransformer.java:253)
 +
at com.evolveum.midpoint.model.impl.controller.ModelInteractionServiceImpl.previewChanges(ModelInteractionServiceImpl.java:255)
 +
at com.evolveum.midpoint.model.impl.controller.ModelInteractionServiceImpl.previewChanges(ModelInteractionServiceImpl.java:210)
 +
at sun.reflect.GeneratedMethodAccessor2016.invoke(Unknown Source)
 +
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 +
at java.lang.reflect.Method.invoke(Method.java:498)
 +
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
 +
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:197)
 +
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
 +
at com.evolveum.midpoint.util.aspect.MidpointInterceptor.wrapSubsystem(MidpointInterceptor.java:137)
 +
at com.evolveum.midpoint.util.aspect.MidpointInterceptor.invoke(MidpointInterceptor.java:53)
 +
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
 +
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
 +
at com.sun.proxy.$Proxy221.previewChanges(Unknown Source)
 +
at sun.reflect.GeneratedMethodAccessor2016.invoke(Unknown Source)
 +
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 +
at java.lang.reflect.Method.invoke(Method.java:498)
 +
at org.apache.wicket.proxy.LazyInitProxyFactory$JdkHandler.invoke(LazyInitProxyFactory.java:508)
 +
at com.sun.proxy.$Proxy298.previewChanges(Unknown Source)
 +
at com.evolveum.midpoint.web.page.admin.PageAdminFocus.showAllAssignmentsPerformed(PageAdminFocus.java:802)
 +
at com.evolveum.midpoint.web.component.assignment.AbstractRoleAssignmentPanel.showAllAssignments(AbstractRoleAssignmentPanel.java:143)
 +
at com.evolveum.midpoint.web.component.assignment.AbstractRoleAssignmentPanel$1.onClick(AbstractRoleAssignmentPanel.java:123)
 +
at org.apache.wicket.ajax.markup.html.AjaxLink$1.onEvent(AjaxLink.java:85)
 +
at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:155)
 +
at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:601)
 +
at sun.reflect.GeneratedMethodAccessor1261.invoke(Unknown Source)
 +
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 +
at java.lang.reflect.Method.invoke(Method.java:498)
 +
at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:258)
 +
at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:241)
 +
at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:248)
 +
at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:234)
 +
at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:895)
 +
at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)
 +
at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:265)
 +
at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:222)
 +
at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:293)
 +
at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:261)
 +
at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:203)
 +
at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:284)
 +
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
 +
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
 +
at com.evolveum.midpoint.web.util.MidPointProfilingServletFilter.doFilter(MidPointProfilingServletFilter.java:87)
 +
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
 +
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
 +
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320)
 +
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
 +
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
 +
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
 +
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
 +
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
 +
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
 +
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
 +
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
 +
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
 +
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
 +
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
 +
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
 +
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
 +
at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:155)
 +
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
 +
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
 +
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
 +
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
 +
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
 +
at org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter.doFilter(AbstractPreAuthenticatedProcessingFilter.java:121)
 +
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
 +
at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:100)
 +
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
 +
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
 +
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
 +
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
 +
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
 +
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
 +
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
 +
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215)
 +
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)
 +
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
 +
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)
 +
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
 +
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
 +
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
 +
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
 +
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
 +
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
 +
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
 +
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
 +
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
 +
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
 +
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
 +
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
 +
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
 +
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
 +
at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:130)
 +
at org.springframework.boot.web.servlet.support.ErrorPageFilter.access$000(ErrorPageFilter.java:66)
 +
at org.springframework.boot.web.servlet.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:105)
 +
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
 +
at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:123)
 +
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
 +
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
 +
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
 +
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
 +
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
 +
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
 +
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200)
 +
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
 +
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
 +
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
 +
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
 +
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
 +
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
 +
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
 +
at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:482)
 +
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
 +
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:810)
 +
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1623)
 +
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
 +
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
 +
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
 +
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
 +
at java.lang.Thread.run(Thread.java:748)
 +
 
 +
=== org.apache.cxf.binding.soap.SoapFault: Couldn't convert query. ===
 +
 
 +
Pozorováno ve verzi: 3.9.1
 +
 
 +
Výjimka podobně univerzální jako ta předchozí - generic ConnectorException nebo chyba v korelacích při komunikaci s midPointem skrz web services.
 +
 
 +
=== A different object with the same identifier value was already associated with the session ===
 +
 
 +
...''com.evolveum.midpoint.repo.sql.data.common.any.ROExtString#ROExtStringId''
 +
 
 +
Pozorováno ve verzi: 4.0.2
 +
 
 +
Nabořené repozitory. Neodpovídá '''m_object.fullobject''' s hodnotami vytaženými do databáze (např. '''m_object_ext_string''').
 +
 
 +
Oprava: reindex task (trvá dlouho ==&gt; stačí pro daný typ objektu a paralelizovat).
 +
 
 +
== Chyby ==
 +
 
 +
=== ORA-12899: value too large for column XXX."M_AUDIT_EVENT"."TARGETOID" ===
 +
 
 +
Překročena maximální povolená délka OID, kterážto je 36 znaků.
 +
 
 +
=== Prism context is not set in PrismTestUtil. Maybe a missing call to resetPrismContext(..) in test initialization? ===
 +
 
 +
Jde o nabořené shadow, stává se to při některých druzích výpadků resourců ve verzi midPoint 3.8. Chyba je pak při jakékoliv práci se shadows (např. get), tj. i při updatu identity.
 +
 
 +
'''Oprava''': jedině smazáním shadow přes repo ninju, kde se nedělají kontroly (nahradit ''$OID'' za skutečné oid):
 +
 
 +
ninja.sh delete --oid $OID
 +
 
 +
'''Hromadná oprava''' (na čerstvých dumpech získaných přes ''snapshot.sh''):
 +
 
 +
# kontrola stáří dumpu
 +
ls -la /var/opt/midpoint/audit/shadows.xml
 +
 +
# jen vylistování:
 +
# fix-shadow-object-change.py
 +
 +
# oprava
 +
./fix-shadow-object-change.sh
 +
 
 +
== Force updaty ==
 +
 
 +
=== Atributy ===
 +
 
 +
Jednotlivé atributy se přepočítají krz force+reconcile na identitě.
 +
 
 +
Ale ne vždy! Propagace se provádí jen podle detekovaných změn. Pokud se jedná pouze o výstupní systém (CRO-OUT, MAGION-OUT), může se hodit tam account úplně smazat a nově nahrát.
 +
 
 +
=== Členství v organizacích ===
 +
 
 +
Pozor, tady je třeba velmi často jít přes role (PPV, STUDIUM).
 +
 
 +
== Sequence ==
 +
 
 +
Objekt typu ''sequence'' generuje ID (např. ''CroId Sequence'' pro CRO ID).
 +
 
 +
Položka ''count'' musí být '''větší než největší přidělené ID'''! A žádná ''unusedValues'' '''nesmí být přidělená'''! Pokud to tak není, bude docházet ke konfliktům a k opakovaným pokusům o použití té samé hodnoty (reclamation feature).
 +
 
 +
Mezery v řadě je možno řešit nastavením ''unusedValues''.
 +
 
 +
Další featury: ''maxCounter'', ''allowRewind'' - po přesažení maxima začne od nuly
 +
 
 +
== Autorizace ==
 +
 
 +
Ladění:
 +
 
 +
Každé autorizaci dát &lt;name&gt;&lt;/name&gt; a pak zapnout logování:
 +
 
 +
com.evolveum.midpoint.security: TRACE
 +
 
 +
= Úkoly =
 +
 
 +
== Práce s RČ ==
 +
 
 +
Aktuálně funguje: počáteční "objevení" na základě RČ a propojení, a pak se aktualizuje.
 +
 
 +
Hodilo by se:
 +
* kontrola na základě data narození a jména (případně nějaká heurstika na podobnost jmen?) + ruční reakce/schválení
 +
* např. karanténí organizace je možná (ale ne nuná): ''template-people-with-rc-check.xml'' v našem gitu
 +
 
 +
== midPoint API + GUI ==
 +
 
 +
Určitě bude potřeba nějaké rozhraní pro uživatele (registrace kont, projekty, self-management).
 +
 
 +
* umí GUI přímo midPoint? 3.4 slibuje "Custom GUI forms" na wicketech
 +
* k dispozici Web Services (vč. košatých typů)
 +
* k dispozici REST+XML
 +
* (šlo by mít i nějakou propojovací tabulku, ale dokumentace midPoint slibuje víc)
 +
* hodila by se '''delegovaá autentizace'''
 +
 
 +
Potřeba:
 +
 
 +
* ?registrace kont?
 +
**Šlo by řešit pomocí web service použitím SOAP jsem našel i docela pěkné example jak udělat danou operaci. https://wiki.evolveum.com/display/midPoint/IDM+Model+Web+Service+Interface+Examples
 +
* kukátko na skupiny (pro alfresco)
 +
* ?výběr primární emailové domény?
 +
* ?projekty?
 +
 
 +
== Audit ==
 +
 
 +
Rádi bychom audit vybraných operací:
 +
* vznik/zánik/změna osoby v autorizovaných agendách
 +
* import CROID z CRO, přidělení CRO ID
 +
* registrace konta (import loginu)
 +
* aktivace/deaktivace identity
 +
* důležité atributy (klíče, ...)
 +
 
 +
Dokumentace:
 +
* auditní událost: https://wiki.evolveum.com/display/midPoint/Auditing
 +
* konfigurace: https://wiki.evolveum.com/display/midPoint/Audit+configuration
 +
 
 +
midPoint API pro logger:
 +
* různé události: ADD, MODIFY, DELETE, RECONCILIATION, ...
 +
* delta pro každou změnu (a pro každý měněný resource)
 +
* různé typy objektů (user, role)
 +
 
 +
Stav:
 +
* <span style="color:orange">'''PROOF-OF-CONCEPT'''</span>
 +
* repozitář <tt>midpoint-overlay</tt>, branch <tt>audit</tt>
 +
* <span style="color:green">'''nakonec jiné řešení'''</span> - dump repozitáře a sledování rozdílů
 +
 
 +
== Grouper GUI ==
 +
 
 +
* prozkoumat možnost propojení s mailinglisty (správci mailinglistů)
 +
** víc "typů" skupin
 +
** jednotné GUI (=náhrada mailmana)?
 +
* portálová aplikace (koncepčnější a pracnější) vs nativní GUI midPointu (škoda nevyužít, ale nejde čistě zandat o portálu)
 +
 
 +
== Import ==
 +
 
 +
(náhodné poznámky)
 +
 
 +
* nejprve promazat tabulky v CRO-OUT a/nebo provézt rekonciliace CRO-OUT
 +
 
 +
TRUNCATE TABLE IDM_MRTVOLY;
 +
TRUNCATE TABLE IDM_OSOBY;
 +
TRUNCATE TABLE IDM_POZICE;
 +
 
 +
* po importu zkontrolovat identity v CRO, co nejsou v midPointu (kvuli duplicitám CRO_ID!)
 +
* TODO: historie CRO_ID...
 +
 
 +
== Krátkodobé úkoly ==
 +
 
 +
=== Rozšíření pohledů MAGION ===
 +
 
 +
* RODNE_PRIJMENI
 +
* STAT_IDNO_OBCA_NAME: jmenná hodnota státního občanství
 +
* STAT_IDNO_OBCANSTVI: číselníková hodnota
 +
 
 +
=== Archivní CRO ID ===
 +
 
 +
Do midPointu nahrát i "stub" identity s informacemi:
 +
 
 +
* CRO_ID
 +
* poslední RČ
 +
 
 +
U nás asi připravit pohled. Pak buď UNIONovat v existujícím MP resourcu CRO nebo umět jednorázový import.
 +
 
 +
== Reporty ==
 +
 
 +
* zauvažovat o reportování změn RČ v Magionu [[https://rt.zcu.cz/rt/Ticket/Display.html?id=274023#txn-3829025 RT #274023]]
 +
* další věci: viz "Co hlídat" v dokumentaci jednotlivých resourců
 +
 
 +
== Autentizace ==
 +
 
 +
* náhrada Webauth za Shibboleth
 +
* delegace do REST API - akce pouštěné uživateli pomocí GUI mimo midPoint
 +
 
 +
Info k midPiout 4.1: https://wiki.evolveum.com/display/midPoint/Flexible+Authentication+Configuration .
 +
 
 +
== Revize ==
 +
 
 +
* revize rolí a dalších objektů v midPoint s ohledem na nové funkce od 3.9+ a 4+ (archetype, nové best practices, kontrola postupných inkrementálních změn...)
 +
* zřejmě chyby kolem managerů skupin - je-li managerem role
 +
* https://wiki.evolveum.com/display/midPoint/Linked+objects (4.2+) - např. závislost PPV/uživatel u HR, studium/student u IS/STAG
 +
* využít midPrivacy (budoucnost) - náhrada výpočtu kombinací atributů z Magion/Stag za profily?
 +
 
 +
== Výkon ==
 +
 
 +
Optimalizace. Např. vzorek z výkonu recompute:
 +
 
 +
<table>
 +
<tr><th>Containing object</th><th>Invocations count</th><th>Avg time</th><th>Min</th><th>Max</th><th>Total time</th>
 +
<tr><td>ZCU: Posix Group</td><td>12337136</td><td>1</td><td>0</td><td>48675</td><td>15216562</td>
 +
<tr><td>USER: Template</td><td>3000655</td><td>1</td><td>0</td><td>41052</td><td>3724207</td>
 +
<tr><td>STAG-Teachers</td><td>183528</td><td>3</td><td>0</td><td>39328</td><td>669999</td>
 +
</table>
 +
 
 +
==&gt; zřejmě nějak omezit výpočty skupin? Viz také revize.
 +
 
 +
== Grouper -&gt; midPoint ==
 +
 
 +
Revize a konzultace kolem přechodu z Grouper na midPoint.
 +
 
 +
# Magion - nemizí PM
 +
# Magion - chybí členové v dohodářích
 +
# Magion + Stag - máme všude správně hierarchie?
 +
# manažeři vs členství - vyoadá to, že se managerství skupiny indukuje na uživatele
 +
 
 +
= Úkoly - hotovo =
 +
 
 +
* grupová aritmetika: přes inducement/assignement, asociace+[https://wiki.evolveum.com/display/midPoint/Entitlements#Entitlements-AssociationShortcut shortcut]
 +
 
 +
= Vývoj =
 +
 
 +
== Infrastruktura ==
 +
 
 +
'''Git repozitáře + continuous integration''':
 +
 
 +
* https://gitlab.meta.zcu.cz/midpoint - GitLab (poslední drobnosti)
 +
* https://ipmil.civ.zcu.cz/midpoint/ - GitLab
 +
 
 +
'''Maven repozitáře''':
 +
 
 +
* https://maven.civ.zcu.cz - Nexus od Sonatype
 +
 
 +
== Testovací prostředí ==
 +
 
 +
Malé lokální prostředí - emulace a testovací data v lokálních databázích, vlastní Stag WS, instalační postupy, ...
 +
 
 +
* https://ipmil.civ.zcu.cz/midpoint/test-environment
 +
* + v některých konektorech kvuli unit-testům
 +
 
 +
== Testsuite ==
 +
 
 +
Automatizované testy: midPoint + testovací prostředí
 +
 
 +
https://gitlab.meta.zcu.cz/midpoint/testsuite
 +
 
 +
== Eclipse GUI ==
 +
 
 +
Eclipse + midPoint plugin.
 +
 
 +
* https://wiki.evolveum.com/display/midPoint/Eclipse+plugin+installation+HOWTO
 +
* https://wiki.evolveum.com/display/midPoint/Eclipse+plugin+HOWTO#EclipsepluginHOWTO-Server-specificproperties
 +
 
 +
== Best practices ==
 +
 
 +
=== Import do git repozitáře ===
 +
 
 +
<ol>
 +
 
 +
<li>Před importem objektu do repozitáře dobré XML promazat. U konektorů generované schema a native cap.
 +
 
 +
<li>U konektorů: parametry resourcu přesunout do properties
 +
 
 +
<li>U konektorů: lze využít i [https://wiki.evolveum.com/display/midPoint/Object+References "Smart References"], např.:
 +
 
 +
<pre><resource>
 +
  ...
 +
  <connectorRef type="ConnectorType">
 +
    <filter>
 +
      <q:equal>
 +
        <q:path>c:connectorType</q:path>
 +
        <q:value>org.identityconnectors.ldap.LdapConnector</q:value>
 +
      </q:equal>
 +
    </filter>
 +
  </connectorRef>
 +
  ...
 +
</resource></pre>
 +
 
 +
</ol>
 +
 
 +
=== Tolerance atributu - tag tolerant ===
 +
 
 +
Default je '''true''' (tedy non-intrusive). Ale u single-valued hodnot doporučeno použít vždy '''<tt>&lt;tolerant&gt;false&lt;/tolerant&gt;</tt>''' (pouze s outbound mapping!), protože tolerant true by rušenou hodnotu nesmazala.
 +
 
 +
Bacha: nenechat se zmást existujícím inbound mapping. Mazání hodnoty s <tt>tolerant=false</tt> se provede vždy, pokud chybí outbound mapping.
 +
 
 +
Novinka v midPoint 4.x:
 +
* v inbound u multihodnot vždy používat '''<tt>&lt;set&gt;&lt;predefined&gt;all&lt;/predefined&gt;&lt;/set&gt;</tt>'''
 +
 
 +
=== FATAL ERROR z konektorů ===
 +
 
 +
Jít po "FATAL ERROR" z konektorů.
 +
 
 +
Obecná vyjímka ''ConnectorException'' způsobuje FATAL ERROR na celé identitě. V kódu konektorů je dobré používat podrobnější rozlišení podle https://wiki.evolveum.com/display/midPoint/Connector+Development+Guide#ConnectorDevelopmentGuide-Errorhandling , kdy pak midPoint "nepanikaří" a reaguje správně podle dané situace.
 +
 
 +
=== Normalizační politika ===
 +
 
 +
Výchozí politika midPointu je dost nepoužitelná. Nastavit alespoň méně agresivní ''Ascii7PolyStringNormalizer''.
 +
 
 +
V ''SystemConfiguration'':
 +
 
 +
<internals>
 +
        <polyStringNormalizer>
 +
                <t:className>Ascii7PolyStringNormalizer</t:className>
 +
        </polyStringNormalizer>
 +
</internals>
 +
 
 +
Po změně je potřeba přeindexovat repozitář. Bacha, admin pouštící reindex task nesmí mít žádné atributy typu ''PolyString'', jejichž normalizovaná hodnota by byla ovlivněna změnou normalizační politiky (např. titul obsahující tečku, apod.).
 +
 
 +
== Connector connection pool ==
 +
 
 +
Viz [https://github.com/Evolveum/ConnId/blob/master/java/connector-framework/src/main/java/org/identityconnectors/common/pooling/ObjectPoolConfiguration.java connector-framework: ObjectPoolConfiguration.java]
 +
 
 +
=== Parametry ===
 +
 
 +
'''maxObjects''' = 10:
 +
 
 +
Max objects (idle+active).
 +
 
 +
'''maxIdle''' = 10:
 +
 
 +
Max idle objects.
 +
 
 +
'''maxWait''' = 150 * 1000:
 +
 
 +
Max time to wait if the pool is waiting for a free object to become
 +
available before failing. Zero means don't wait.
 +
 
 +
'''minEvictableIdleTimeMillis''' = 120 * 1000:
 +
 
 +
Minimum time to wait before evicting an idle object. Zero means don't
 +
wait.
 +
 
 +
'''minIdle''' = 1:
 +
 
 +
Minimum number of idle objects.
 +
 
 +
=== Poznámky ===
 +
 
 +
Musí platit ''maxObjects &gt;= maxIdle''.
 +
 
 +
V konektoru je dobré mít spolehlivý test ''checkAlive()''.
 +
 
 +
Pokud ''checkAlive()'' není a víme, že je potřeba omezit čas idle spojení (různé timeouty, apod.), je možno nastavit ''minIdle=0'' (tj. žádné trvale otevřené spojení) a ''minEvictableIdleTimeMillis'' na čas menší než timeout.
 +
 
 +
== Odstranění resourcu ==
 +
 
 +
Při odstraňování resourcu je dobré nejprve odstranit většinu závislostí:
 +
 
 +
# zkontrolovat customizace (XML objekty)
 +
# modifikovat a pustit tasky ''Purge Org linkRefs, Purge User linkRefs, ...''
 +
# v ''Repository objects'' odstranit odpovídající shadow objekty
 +
 
 +
Odkazy na resource v midPointu zůstávají i jinde (audity - odrotuje se časem pryč, historie operací u objektů, ...).
 +
 
 +
== Release konektoru ==
 +
 
 +
Best-practice - hodí se znát verze aktuálně používaných konektorů a SW nebo při vystavování konektorů všem.
 +
 
 +
Releasujeme ''midpont-overlay, midpoint-utils, connector-parent'' a většinu konektorů. Využívá se <tt>maven-release-plugin</tt>.
 +
 
 +
Postup:
 +
 
 +
1) housekeeing (rok copyrightu v licenci, ''bundle.version'', verze ''connector-parent'', verze závislostí v ''.gitlab-ci.xml'', apod.)
 +
* tip: <small><tt>find . -type f -exec bash -c 'grep -q "Copyright.*CESNET" {} && sed -i "0,/2020/s//2021/" {}' \;</tt></small>
 +
 
 +
2) kontrola + testy lokálně
 +
 
 +
3) vlastní release - zeptá se na verzi (major, minor, patch)
 +
 
 +
    mvn release:clean release:prepare release:perform
 +
    git log -p
 +
    git push origin HEAD --tags
 +
 
 +
4) gitLab CI
 +
 
 +
"keep" na buildu.
 +
 
 +
5) upload na AFS, adresář ''/afs/zcu.cz/project/software/register/midpoint/icf-connectors''
 +
 
 +
6) midPoint
 +
 
 +
Při změně <tt>bundle.version</tt>: a) promazat původní verzi connector objektu z repozitáře, b) <tt>./autodeployment.sh</tt>, c) znovunaimportovat resource.
 +
 
 +
== Přidání resourcu ==
 +
 
 +
'''Analýza''':
 +
* jaké identity, primární klíč, workflow (enable, deprovisioning), atributy
 +
 
 +
'''Postup - tipy''':
 +
 
 +
* activation/existence: nutno použít při použití skupin (např. v nějakých skupinách podle IS/STAG, ale nemá orion konto, ...)
 +
* ObjectTemplate v Sychronization object: include User-Template, případně další (např. pokud sync ovlivňuje globální stav, ...)
 +
 
 +
Jedná se o zdroj identit?  (Magion, IS/STAG, externí identity):
 +
 
 +
# pomocné interní atributy v midpoint-overlay (potřebujeme vědět, co je zdrojem, při výpočtu atributů v IdM - jméno, příjmení, midPoint name, stav/ektivita, ...)
 +
# pokud jde o zapisovací resource (importují se pouze externisti):
 +
#* výhybka pro $projection/attributes/ri:*
 +
#* rozšířit ZCU-Utils.xml/getAttributeValue() - zahrnutí do výpočtů
 +
# rozšířit základní atributy v User-Template (name, givenName, familyName)
 +
 
 +
= Aktuální stav =
 +
 
 +
== Resourcy ==
 +
 
 +
Atributy evidovány tady:
 +
 
 +
https://docs.google.com/spreadsheets/d/1BDuMNR9ztIugXJ4-Spqzo6hLhHBTPg1hMhk3ZFMgwA8
 +
 
 +
=== Kerberos ===
 +
 
 +
Existuje nativní connector pro Kerberos:
 +
 
 +
* https://stash.forgerock.org/projects/OPENICF/repos/kerberos-connector/browse
 +
 
 +
Napsali jsme si nativní MIT kerneros connector:
 +
 
 +
* https://github.com/CESNET/kerberos-connector
 +
* implementace RA v Javě a používající C knihovnu (JNI), pouze MIT
 +
 
 +
TODO: používat OP_ALLOW_PARTIAL_ATTRIBUTE_VALUES podle http://connid.tirasa.net/apidocs/1.4/org/identityconnectors/framework/common/objects/OperationOptions.html#OP_ALLOW_PARTIAL_ATTRIBUTE_VALUES
 +
 
 +
=== Magion ===
 +
 
 +
[[LPS:IdM/midPoint/Magion]]
 +
 
 +
=== Stag číselníky ===
 +
 
 +
Pracoviště a číselníky.
 +
 
 +
[[LPS:IdM/midPoint/Stag#Stag číselníky]]
 +
 
 +
Co hlídat:
 +
 
 +
* stub pracoviště
 +
* pracoviště bez rodiče
 +
 
 +
=== Stag učitelé ===
 +
 
 +
[[LPS:IdM/midPoint/Stag#Stag učitelé]]
 +
 
 +
* UCIT_IDNO - stejný identifikátor pro externisty i zaměstnance
 +
* STAT_IDNO_OBCANSTVI - CRO čerpá z V_PE_ZCU_ZAM.PRISLUSNOST, "???" nahrazovat za "CZ"; ale nahrazovat podle Stag číselníku :-(
 +
 
 +
=== Stag studenti ===
 +
 
 +
[[LPS:IdM/midPoint/Stag#Stag studenti]]
 +
 
 +
* studia: role vázaná na osobu
 +
* předměty: role vázaná na roli studia
 +
 
 +
Co hlídat:
 +
* ''STAG_STAV_STUDENTA'': N=bez studijních rolí, S=má studijní role
 +
 
 +
=== Grouper ===
 +
 
 +
[[LPS:IdM/midPoint/Grouper]]
 +
 
 +
* skupiny: ''mng'' stem z grouperu (vyjma ''mng:sprava'') + členství
 +
* administrace: ''mng:sprava'' - bez členství (jen na experimenty)
 +
 
 +
=== CRO-OUT ===
 +
 
 +
[[LPS:IdM/midPoint/CRO-OUT]]
 +
 
 +
=== Sun IdM ===
 +
 
 +
[[LPS:IdM/midPoint/SunIdM]]
 +
 
 +
== Role ==
 +
 
 +
Typy rolí:
 +
 
 +
* ''login-role''
 +
* ''auth-role'' - role pro autorizace (monitoring)
 +
* ''pm'' - pracovní místo z Magionu ("funkce na osobě/úvazku")
 +
* ''system'' (Approver, End User, Reviewer, Superuser)
 +
* (null) (Delegator)
 +
 
 +
== Rekonciliace ==
 +
 
 +
Aktuální časy viz ''object/tasks/*Recon.xml'' z repozitáře ''xml-objects''.
 +
 
 +
{| class="wikitable"
 +
! čas
 +
! task
 +
|-
 +
| 0 0 1 * * ?
 +
| HR: Org.Str. Recon
 +
|-
 +
| 0 0 2 * * ?
 +
| HR: PM-Recon
 +
|-
 +
| 0 0 3 * * ?
 +
| STAG: Pracoviste-Recon
 +
|-
 +
| 0 0 3 * * ?
 +
| CRO-OUT: User-Recon
 +
|-
 +
| 0 0 4 * * ?
 +
| CRO-OUT: PPV-Recon
 +
|-
 +
| 0 0 4 * * ?
 +
| HR: PPV-Recon
 +
|-
 +
| 0 20 4 * * ?
 +
| CRO-OUT: Studium-Recon
 +
|-
 +
| 0 40 4 * * ?
 +
| CRO-OUT: Doktorand-Recon
 +
|-
 +
| 0 40 4 * * * ?
 +
| HR: User-Recon
 +
|-
 +
| 0 30 5 * * ?
 +
| STAG: Studiums-Recon
 +
|-
 +
| 0 0 6 * * ?
 +
| SunIdm: Users-Recon
 +
|-
 +
| 0 30 6 * * ?
 +
| STAG: Students-Recon
 +
|-
 +
| 0 0 7 * * ?
 +
| STAG: Predmety-Recon
 +
|- style="color:gray"
 +
| 0 0 8 ? * SAT
 +
| MAGION-OUT: Person-Recon
 +
|-
 +
| 0 15 8 * * ?
 +
| STAG: Ucitel-Recon
 +
|- style="color:gray"
 +
| 0 30 8 ? * SAT
 +
| MAGION-OUT: User-Recon
 +
|-
 +
| 0 0 22 * * ?
 +
| HR: Global Staff Recon
 +
|-
 +
| 0 5 22 * * ?
 +
| HR: Global DPP-DPČ Recon
 +
|-
 +
| 0 10 22 * * ?
 +
| STAG: Global Doktorand Recon
 +
|-
 +
| 0 15 22 * * ?
 +
| STAG: Global Subject Recon
 +
|-
 +
| 0 20 22 * * ?
 +
| HR: Global Manager Dpt Recon
 +
|-
 +
| 0 20 22 * * ?
 +
| STAG: Global Student Recon
 +
|-
 +
| 0 25 22 * * ?
 +
| HR: Global Secretariat Recon
 +
|-
 +
| 0 25 22 * * ?
 +
| STAG: Global Typ Studia Recon
 +
|-
 +
| 0 30 22 * * ?
 +
| HR: Global Secretary Dpt Recon
 +
|-
 +
| 0 30 22 * * ?
 +
| STAG: Global Forma Studia Recon
 +
|-
 +
| 0 15 23 ** ?
 +
| Grouper: Group-Recon
 +
|-
 +
| 0 20 23 ** ?
 +
| Grouper: Memberships-Recon
 +
|-
 +
| 0 30 23 ** ?
 +
| MAGION-OUT: Access-Recon
 +
|-
 +
| 0 40 23 ** ?
 +
| Souhlas: User-Recon
 +
|-
 +
|}
 +
 
 +
== Upstream ==
 +
 
 +
Problémy:
 +
 
 +
* listování uživatelů: nepoužitelně dlouho trvá, error 500 - možná kvuli končící podpoře pro Oracle
 +
* nelze slibovat spolehlivost v rychlosti (liveSync občas selže), viz MID-4930
 +
 
 +
Bugs:
 +
 
 +
* <s>https://jira.evolveum.com/browse/MID-4694 Reconciliation - multiple "Oid must not null or empty" after finish</s>
 +
* <s>https://jira.evolveum.com/browse/MID-4664 Reconciliation sometimes generates NPE</s> - fixed in '''3.9'''
 +
* <s>https://jira.evolveum.com/browse/MID-4515 Cannot create users with the same normalized names</s> - '''feature od 3.8''': https://wiki.evolveum.com/display/midPoint/PolyString+Normalization+Configuration
 +
* https://jira.evolveum.com/browse/MID-4502 Random password generator sometimes generates passwords that do not meet policies
 +
* <s>https://jira.evolveum.com/browse/MID-4088 ConcurrentModificationException when displaying a task</s> - fixed in '''4.0'''
 +
* https://jira.evolveum.com/browse/MID-3950 Investigate the HHH000010 hiernate messages
 +
* https://jira.evolveum.com/browse/MID-4776 User list is slow - (něco se opravovalo, ale nás se asi oprava netýká)
 +
* https://jira.evolveum.com/browse/MID-4930 Sometimes LockAcquisitionException (could not execute batch)
 +
* https://jira.evolveum.com/browse/MID-5655 Xerces DOM thread (un)safety - např. u MID-5627 nějaká vyjímka furt vyskakuje, i když jiná
 +
 
 +
Features:
 +
 
 +
* https://jira.evolveum.com/browse/MID-3934 Synchronization with Kind/Intent settings and multiple intents
 +
* https://jira.evolveum.com/browse/MID-1693 Add an option to update (midPoint user) attribute value when account is deleted
 +
* <s>pouštění tasků přes SOAP WS</s> - SOAP WS označen za '''deprecated'''
 +
* tagované atributy u LDAP, nebo možnost lokálního rozšiřování resource schematu ==&gt; '''vlastní fork konektoru''' https://ipmil.civ.zcu.cz/midpoint/connector-ldap
 +
* hikari zabilo výkon - hodila by se možnost použití c3p0
 +
* tomcat bundlovaný v ''midpoint.war'' - externí tomcat funguje a provozujem tak, ale to není podporováno
 +
* málo stabilních releasů - stabilní větve jsou
 +
* odklon vývojářů on Oracle - v budoucnu bude podporován pouze postgresql
 +
 
 +
== TODO ==
 +
 
 +
(k implementaci nebo otestování)
 +
 
 +
* RT [https://rt.zcu.cz/rt/Ticket/Display.html?id=188152#txn-2502358 #188152]
 +
 
 +
<cite>
 +
Uživatelské jméno se smazalo, i když pracovní poměr měl další den pokračování.
 +
Předávám ještě požadavek dál s návrhem, zda v podobných případech, kdy orion konto nekončí, aby uživatelské jméno ve Stagu zůstalo.
 +
</cite>
 +
 
 +
* pohledy do CRO: vylepšit filtrování duplicit mezi aktivními a neaktivními identitami
 +
 
 +
* ověřit možnost registrace 20 dní před aktivací v Magionu (aktuálně člověk nateče, ale jako naktivní)
 +
 
 +
* primárná pozice při úplném zmizení PPV/studium role (na změnu asi reaguje OK, ale při selhaném updatu je midPoint rozhozen)
 +
 
 +
= Use-casy =
 +
 
 +
... konkrétní současné problémy z produkce.
 +
 
 +
[[https://rt.zcu.cz/rt/Ticket/Display.html?id=274023 RT #274023]]
 +
* problém: při změně RČ v Magionu se změní "globální" RČ v CRO a tím pádem zmizí propojení v tabulce učitelů ve Stagu
 +
* midPoint: link je přes jiný identifikátor s učiteli (zatím croId, ale asi bychom chtěli ucitidni), RČ jen jako korelace
 +
 
 +
[[https://rt.zcu.cz/rt/Ticket/Display.html?id=252162]] ISKaM
 +
* přenášet i národnost
 +
 
 +
= Postupy =
 +
 
 +
== Seznam emailů zaměstnanců ==
 +
 
 +
Např. přes skripty:
 +
 
 +
./query-user.py --csv=extension/ext:HR_OS_CIS,emailAddress extension/ext:HR_ENABLED=true
 +
 
 +
== Přejmenování konta ==
 +
 
 +
<ol>
 +
<li>Sun IdM: ''CRO Unlink User''
 +
<li>midPoint:
 +
* remove login
 +
* change status na "N1" (jak ''zcuStatus'', tak ''SUNIDM_WFSTATUS'', jinak se to pak nepřeklopí správně pří registrace konta)
 +
* reset Unix ID
 +
* nastavení registračního hesla
 +
* rename to CRO ID
 +
* unlink Kerberos (aby nezmizelo staré heslo)
 +
* unlink Email (aby nebyl pokus o smazání schránky - i když neblokované jsou chráněné)
 +
* unlink Office365 (aby neskončilo v koši - špatně se to z koše vyndavá)
 +
</li>
 +
<li>Sun IdM: čekat na dotečení přes activeSync CRO
 +
<li> registrace konta
 +
<li>ruční práce - návazné systémy používající na login
 +
* Magion [sis]: <s>detekuje a upozorňuje Sun IdM (někteří zaměstnanci)</s> zkontrolovat v midPointu
 +
* Courseware [sis]: (zaměstanci nebo doktorandi, co mají nějaký předmětm)
 +
* vizitka [dané pracoviště]: (zaměstnanci)
 +
* ...a další
 +
</li>
 +
<li>midPoint - import starého konta (nový LDAP a shibboleth, ...)
 +
<pre>read oldName newName givenName sn croId unixId mx
 +
 
 +
cat >cloned.csv <<EOF
 +
name,extension/ext:login,extension/ext:zcuStatus,subtype,givenName,familyName,employeeNumber,extension/ext:unixId,extension/ext:zcuMX,extension/ext:validToHost
 +
$oldName,$oldName,A2,HOST,$givenName,$sn,$croId,$unixId,$mx,`date --date='+14 days' --iso=seconds`
 +
EOF
 +
./create.py --csv cloned.csv -a types-org-str-renamed:org
 +
./merge.py $oldName $newName -s now -d 'Přejmenování loginu' -i https://rt.zcu.cz/rt/Ticket/Display.html?id=...</pre>
 +
</li>
 +
<li>import z Office365 (nějaký problém s discovery v midPointu)
 +
<li>dát vědět do ext-apps: potřeba ruční zásah v Office365 (i když kritické je to možná až před fyzickým mazáním)
 +
</ol>
 +
Krok 2 je nově po náhradě původního CRO za emulované z midPointu - není tak těsná iterakce Sun IdM s emulovaným CRO.
 +
 
 +
== Propojení konta a osoby ==
 +
 
 +
Složitější - někdy přepojit pouze Stag/Magion, ...
 +
 
 +
TODO2: nezapomenout na PPV a studium role (při přepojení osoby/změně CRO ID)
 +
 
 +
=== Prohození Stagu ===
 +
 
 +
* unlink Stag-Students
 +
* prohodit ''Stag: ID osoby''
 +
* merge (aby se nekorelovalo s neaktivní identitou)
 +
* import
 +
 
 +
=== Křížový update JIS ===
 +
 
 +
* TODO: není vyřešen merge
 +
* TODO2: není vyřešena situace, kdy jsou prohozené CRO ID a RČ (oba údaje musí být unikátní, ...)
 +
=&gt; ruční update přes fakk RČ
 +
 
 +
=== Přepojení Magionu ===
 +
 
 +
* na deaktivované identitě smazat ''HR: osobní číslo'' a uložit k aktivované (aby se správně přepojilo PPV)
 +
* také opravit PPV (nutno odlinkovat Magion a smazat CRO a pak import)
 +
 
 +
== Oprava blokace ==
 +
 
 +
Někeré selhané updaty při blokaci nelze vyřešit pomocí ''Recompute'' - reakce jsou často na změnu.
 +
 
 +
Teoreticky lze provézt opravu pouze ručním překmitem stavových atributů "HR: Aktivní" a/nebo "Stag: stav studia". Ale při přepínání identity stavu do A1 se posílají notifikace.
 +
 
 +
Postup opravy:
 +
 
 +
# '''kontrola''', zda má být identita blokována (není Magion, není Stag nebo stav studia N) + kontrola/vyřešení původních příčin selhání (známý bug kolem DB zámků, duplicita shadow, ...)
 +
# '''rekonciliace rolí''' (případně lze updatovat jednotlivé role)
 +
#* PPV (z Magionu)
 +
#* STUDIUM (ze Stagu)
 +
# '''ruční update''' identity:
 +
#* atributy:
 +
#** smazat ''Typ vztahu'' (řízení některých výpočtů)
 +
#** smazat/zkontrolovat ''HR: PPV'', ''Stag: Studium'' (řízení rolí - pozic)
 +
#** nastavit/zkontrolovat ''HR: Aktivní'', ''HR: Aktuálně aktivní'' na ''false'' (řízení mnoha výpočtů)
 +
#** nastavit/zkontrolovat ''HR: Datum výstupu'' (řízení expirace ve workflow, ale hlídá se v reportech)
 +
#** nastavit/zkontrolovat ''Stag: stav studia'', 'Stag: aktuální stav studia' na ''N'' (řízení mnoha výpočtů)
 +
#** nastavit/zkontrolovat ''Stag: Datum výstupu'' (řízení expirace ve workflow, ale hlídá se v reportech)
 +
#** smazat/zkontrolovat ''Stag: souhrn*'' (jen kosmetika, ale mátlo by to)
 +
#** smazat ''Kolej'' (pokud nejde o hosta nebo ISKaM identitu)
 +
#* assignments: zrušit přiřazení resourců (CRO OUT, JIS Osoby, Magion OUT*, Teachers, ...), rolí (''ZCU People*'', ''ZCU User*''; ale nechat ''ZCU User'' a ''ZCU Active User''), organizací (''Aktivní'')
 +
#* activationStatus: disable
 +
 
 +
== Přepojení identity na jiný účet na resourcu ==
 +
 
 +
...tj. změna account name.
 +
 
 +
# ''Resources'' ->&gt; ''List resources''
 +
# na resourcu smazat účet
 +
# přeuložit identitu - správný účet se připojí/založí v rámci discovery
 +
 
 +
<small>Poznámka: Nejde smazat a popřepojovat resource přímo na identitě.</small>
 +
 
 +
== Audity ==
 +
 
 +
Každé 4 hodiny se pouští získávání všech uživatelů, rolí a shadow, ukládá se ve formě CSV souborů.
 +
 
 +
Umístění: ''/var/opt/midpoint/audit/<ROK>''.
 +
 
 +
== Kontroly ==
 +
 
 +
V rámci získávání auditů se pouští i kontroly dat (interní konzistence v midPointu, porovnání s JIS resource, ...).
 +
 
 +
Výsledky: ''/var/opt/midpoint/audit/snapshot.log'' (jen interní konzisence) a ''/var/opt/midpoint/audit/report.log'' (podrobnější)
 +
 
 +
Příklady dalších dodatečných kontrol:
 +
 
 +
./query-user.py activation/administrativeStatus=enabled subtype=NEAKTIVNI extension/ext:STAG_STAV_STUDIA=N -p max_size=100 --csv name,employeeNumber,zcuStatus,subtype,extension/ext:rodneCislo
 +
./query-user.py activation/administrativeStatus=enabled subtype=NEAKTIVNI extension/ext:HR_ENABLED=false -p max_size=100 --csv name,employeeNumber,zcuStatus,subtype,extension/ext:rodneCislo
 +
 
 +
== Změna primárního emailu ==
 +
 
 +
Řízeno midPointem, změna přenášena do Sun IdM. (2020-01-18, od záři 2020)
 +
 
 +
Změna v midPointu administrátorem (nahradit ''$LOGIN'' na login a ''$DOMAIN'' za doménu bez ".zcu.cz"):
 +
 
 +
./modify-user-by-name.py $LOGIN extension/ext:IDM_DEFAULT_EMAIL_DOMAIN_SELECTED=false extension/ext:IDM_CUSTOM_EMAIL_DOMAIN=$DOMAIN
 +
 
 +
== Duplicita identit ==
 +
 
 +
Potřeba dát vědět na UIA (nejrůznější detaily v IS/STAG: přihlášky, ... a v Magionu, omylem zadané slovenské RČ jako české, apod.). Ve finále potřeba také merge v ISKaMu.
 +
 
 +
Většinou vede na kontrolu na personální (Magion) nebo studijní oddělení (IS/STAG). Ve Stagu může být pak potřeba merge od databázistů, podle aktuálního napojení na JIS/Orion pak dobré preferovat jako hlavní tu správnou identitu ve Stagu. (tohle vše řeší UIA, lze dodat to doporučení pro Stag)
 +
 
 +
Postup:
 +
 
 +
<ol>
 +
<li>RT do sis kvůli úpravám v Magion / IS/STAG<br/>
 +
Příklad získání dat (pro každou identitu): ''./details.py -f id name=NAME''</li>
 +
<li>opravit v IdM (zkontrolovat, správně propojit, updatovat, ...)</li>
 +
<li>opravit v Sun IdM - propojení Aleph nebo pročištšní v Alephu</li>
 +
<li>uložit informaci do IdM (využívá se v korelačních pravidlech, ale teoreticky by šlo i někam exportovat):
 +
<pre>./merge.py NAME_FROM NAME_TO -i RT_URL -d POPIS -s now</pre>
 +
<small>Poznámka: tool očekává v argumenteh názvy identit (tj. login, a pokud není konto, tak CRO ID)</small><br/>
 +
<small>Poznámka2: výsledek je, že mergovaná identita obsahuje atribut ''merge'' ukazující na originál.</small><br/>
 +
<small>Poznámka3: Script nedělá vše, např. promazání/modifikace "HR: PPV" a "Stag: studium".</small>
 +
</li>
 +
</ol>
 +
 
 +
== Stínové identity - klonování ==
 +
 
 +
Použití:
 +
* zbytek po přejmenování (Orion)
 +
* fyzické mazání (Orion)
 +
 
 +
Stejný mechanizmus jako u duplicit.
 +
 
 +
Postup (TODO: komplikovaný, doladit):
 +
<ol>
 +
<li>blokace: např. stav NB2 nebo B2<br/>(smazat také shadow čekající na smazání v ISKaMu)
 +
<li>promazání "HR: PPV" a "Stag: studium"
 +
<li>TODO: vyrobení nové identity
 +
<li><pre>./merge.py NAME_OLD NAME_NEW -d "fyzické mazání ROK" -s now</pre>
 +
<li>pro každý zdrojový systém: rekonciliace
 +
</ol>
 +
 
 +
== Import hostovských karet ==
 +
 
 +
Jde o hostovské karty importované do ISKaMu. Importuje se z CSV souboru ve formátu: ''RC;JIS_CHIP;JIS_NO;CRO_ID''
 +
 
 +
<ol>
 +
<li>zkontrolovat CRO_ID (namátkově, že první je volné)
 +
<li>kouknout na následující pořadové číslo
 +
<li>vybrat si typ karty:
 +
* CS: 7777777100 ... 7777779000
 +
* E: ostatní
 +
<li>kontrola importu - pořadí položek, apod., např. (upravit parametry):
 +
<pre>./create-jis-host.py --csv karty_cizi_student_20.csv --seq 1400 --type CS --given-name Cizí --family-name Student --dry-run
 +
./create-jis-host.py --csv Witte_karty5b.csv --seq 86 --type E --given-name Witte  --family-name Automotive --dry-run</pre>
 +
<li>puštšní importu (odstanit ''--dry-run'')
 +
</ol>
 +
 
 +
== Katedry a pracoviště ==
 +
 
 +
TODO: zkonzolidovat s hlavním postupem na [[LPS:IdM/Katedry a pracoviště]]
 +
 
 +
=== Poštovní doména ===
 +
 
 +
Počítá se podle "pozic" osoby a hierarchicky podle pracovišť:
 +
 
 +
# midPoint: na základě organizačních stromů z "HR" a "IS/STAG".
 +
# Sun IdM: na základě tabulky *IDM_PRACOVISTE@GINA*
 +
 
 +
Postup změny poštovní domény:
 +
 
 +
# nastavit položku *c:mailDomain* na organizačních jednotkách v midPointu
 +
# nastavit položku *DOMENA* v tabulce *IDM_PRACOVISTE@GINA*
 +
# recompute postižených uživatelů
 +
 
 +
=== Fakulta ===
 +
 
 +
Oproti katedrám a nefaktulnícm pracovištím kroky navíc - založení skupiny a dalších věcí.
 +
 
 +
GID=... # <1000
 +
fak=... # zkratka fakulty malými
 +
FAK=${fak^^} # zkratka fakulty velkými
 +
 
 +
1) zaměstnanci "$fak" (zkontrolovat, že to našlo )
 +
./group-department.py ${fak}
 +
 
 +
Zkontrolovat:
 +
 
 +
* "HR: ${FAK} (${depno})"
 +
* "GLOBAL: Doktorandi ${FAK} (${depno})"
 +
 
 +
2) studenti "students-$fak"
 +
./group-department.py -g $GID -s "Studenti $FAK" students-${fak}
 +
#./query-role.py extension/ext:GROUP_ZKRATKA=${FAK} subtype=stag-global-group-student | head -n 10
 +
##==> $OID
 +
#read OID
 +
#./modify-role.py --oid $OID -a role-group-students-${fak}:role
 +
./modify-role.py -q "name startsWith GLOBAL: Studenti $FAK (" -a role-group-students-${fak}:role
 +
./modify-role.py -q subtype=stag-global-group-doktorand extension/ext:GROUP_ZKRATKA=${FAK} -a role-group-students-${fak}:role
 +
 
 +
3) shibboleth entitlement (viz [[LPS:IdM/midPoint/LDAP#SAML]])
 +
 
 +
./modify-role-by-name.py "GROUP: $fak" -a role-login-ldap-edu-faculties:role
 +
./modify-role-by-name.py "GROUP: students-$fak" -a role-login-ldap-edu-faculties:role
 +
 
 +
# zvážit, zda jde o technickou fakultu
 +
#./modify-role-by-name.py "GROUP: $fak" -a role-login-ldap-edu-technical:role
 +
#./modify-role-by-name.py "GROUP: students-$fak" -a role-login-ldap-edu-technical:role
 +
 
 +
4) funkční skupiny
 +
 
 +
# tajemnici-FAK
 +
 +
./query-role.py "name startsWith GROUPER: mng:tajemnici-$fak"
 +
MNG_TAJEMNICI_FAK_OID=...
 +
TAJEMNICI_FAK_GID=...
 +
 +
./group.py -g $TAJEMNICI_FAK_GID tajemnici-$fak -s "Tajemníci $FAK"
 +
./modify-role.py --query "name startsWith GLOBAL: Tajemník $FAK" -a role-group-tajemnici-$fak:role
 +
./modify-role.py --query "name startsWith GLOBAL: Tajemník $FAK" -a $MNG_TAJEMNICI_FAK_OID:role
 +
 
 +
== Hostovská konta ==
 +
 
 +
Zakládají se v midPointu. Spolu s ostatními konty se pak ještě přenáší do Sun IdM.
 +
 
 +
<small>Poznámka: hostovská role řízena položkou ''hostValidTo''. Pozor na její rušení.</small>
 +
 
 +
TODO: volitelně může mít i CRO ID (<tt>employeeNumber</tt>). Aktuálně se generuje pouze uživatelům aktivních v ZČU agendách.
 +
 
 +
=== Založení ===
 +
 
 +
Import (může být i z GUI):
 +
 
 +
<pre>read login givenName sn domain
 +
 
 +
cat > hosts.csv <<EOF
 +
extension/ext:login,subtype,givenName,familyName,extension/ext:zcuStatus,extension/ext:validToHost,extension/ext:IDM_DEFAULT_EMAIL_DOMAIN
 +
$login,HOST,$givenName,$sn,A2,`date --date='+1 year' --iso=seconds`,$domain
 +
EOF
 +
./create.py --csv ./hosts.csv -g GARANT_LOGIN</pre>
 +
 
 +
=== Blokace ===
 +
 
 +
Update položek:
 +
 
 +
* '''zcuStatus''': na B1 (pouze pokud nemá být aktivní z jiných důvodů, pak má zůstat A1)
 +
* '''hostValidTo''': na dnes (nemazat!)
 +
* '''validTo''': na dnes (tady jde jen o správnou informace o blokaci např. kvuli fyzickému mazání)
 +
* ('''garant'''): možno smazat, pokud bylo konto zároveň napojeno na univerzitní agendy a garant se již ke kontu nehlásí
 +
 
 +
=== Přidělení CRO ID ===
 +
 
 +
Problematické z důvodu, že se nesmí nikdy recyklovat u stejného člověka. Tj. je nutno zamezit problémům s duplicitami.
 +
 
 +
Podmínky pro přidělení (alespoň jedna):
 +
 
 +
* konto nenapojené na člověka ("nelidské konto" - servisní, firma, nikdy se nebude propojovat s člověkem...)
 +
* hostovské konto s ověřeným RČ (ideálně bývalý student/zaměstnanec)
 +
 
 +
Postup pro servisní konto:
 +
 
 +
# vybrat volné číslo z rozsahu 666000 a výš
 +
# kontrola, že CRO ID není použité (v položce ''employeeNumber'')
 +
# editace položek: '''employeeNumber''' (CRO ID)
 +
 
 +
Postup pro hostovské konto:
 +
 
 +
# globálně vypnout tasky
 +
# zkontrolovat, že neběží žádný task typu liveSync
 +
# ''Repository objects'' -&gt; ''Sequence'', editace ''CroId Sequence'' zvýšit counter o 1 ==&gt; půvoní counter je CRO ID
 +
# kontrola, že CRO ID není použité (v položce ''employeeNumber'')
 +
# editace položek: '''employeeNumber''' (CRO ID), případně '''rodneCislo'''
 +
# globálně znovupuštění tasků
 +
 
 +
=== Převedení na hostovské ===
 +
 
 +
Musí o to žádat/souhlasit garant (bezpečnost) i vlastník konta (ochrana soukromí).
 +
 
 +
<ol>
 +
<li>nastavení garanta a prodloužení:
 +
<pre style="white-space: pre-wrap;">./modify-user.py --query name=$LOGIN -g $GARANT_LOGIN -- extension/ext:validToHost=`date -d '1 year' '+%Y-%m-%dT00:00:00+01:00'` extension/ext:zcuStatus=A2</pre>
 +
<li>(pokud požadováno) role učitel:<tt>./modify-user.py --query name=$LOGIN -a role-idm-teachers:role:ext:managed</tt> - lze pouze s předem zadanými externisty v IS/STAG nebo bývalými zaměstnanci/doktorandy; doplní mj. login do tabulky ORION_UCITELE
 +
<li>(pokud požadováno) gapps: self-management skupina v midPointu
 +
</ol>
 +
 
 +
== Registrace ==
 +
 
 +
=== Jak to funguje ===
 +
 
 +
<ol>
 +
<li>Prvotní natečení identity z agend ZČU:
 +
# midPoint: přiteče identita - pro aktivní (IS/STAG, Magion) počáteční stav '''N0''' (jinak NB a nic dalšího se nedělá)
 +
# midPoint: task ''Get Pwd From JIS Task (N0-N1)'' nebo přeuložení - nastaví registrační heslo a přepne stav '''N0''' -&gt; '''N1''' a pošle do CRO (pro Sun IdM a další DB pohledy)
 +
# Sun IdM: activeSync ''CRO'': nacucne si identitu bez loginu a pošle do všech odpovídajících resourců spravovaných ještě postaru (Aleph, DB, ...)<br/>
 +
==&gt; máme identitu ve stavu '''N1''' a '''s registračním heslem'''
 +
<li>Registrace konta:
 +
# uživatel: registrace na [https://registrace.zcu.cz] - v midPointu to přepne stav na '''A0''', nastaví '''login''' a '''heslo''' lokálně v midPointu, v DB nastaví '''souhlasy'''
 +
# midPoint: task ''Post-Registration Task (A0-A1)'': přepnutí identity do '''A1''' a nastavení všech spravovaných resourců - mj. '''Kerberos''' (heslo), '''Orion''' (Sun IdM), '''LDAP''' (shibboleth a další), '''Email''', ...
 +
# Sun IdM: activeSync ''midPoint'': přiteče identita, zavolá se interní registrační proces, propagace do všech zbylých resourců spravovaných ještě postaru (rename na login v DB, '''AFS, starý LDAP''', ...)
 +
# další procesy: '''Grouper''' trychtýř (perioda 1 hodina), '''SMP''' (perioda 1 hodina)
 +
==&gt; celý proces vč. wifi: cca 2,5 hodiny
 +
</ol>
 +
 
 +
=== Co kontrolovat ===
 +
 
 +
* procesy v midPointu (icinga)
 +
* jestli se uživatel založil v Kerberu (první fáze registrace v midPointu)
 +
* stav registrace v midPoinut
 +
* stav synchronizace midPoint -&gt; Sun IdM (viz dále)
 +
 
 +
Nedoběhlé registrace v midPoint:
 +
 
 +
./query-user.py 'extension/ext:login?' extension/ext:zcuStatus=N1 --csv name,employeeNumber,extension/ext:zcuStatus
 +
 
 +
Nedoběhlé registrace v Sun IdM:
 +
 
 +
* find users -&gt; "user has midPoint resource", "user in Top:ZCU:People"
 +
* naládovat do Server tasks -&gt; Run task -&gt; ZCU Netscape, vybrat ''POST_REGISTRATION''
 +
 
 +
Nebo důkladnější kontrola v DB:
 +
 
 +
SELECT o.* FROM idm_orion o, sun_idm.idm_users u WHERE o.login=u.login(+) AND (u.login IS NULL OR u.wfstatus='N1');
 +
 
 +
== Statistiky ==
 +
 
 +
'''Studenti na fakultě''':
 +
 
 +
SELECT DISTINCT login || '@' || domena || '.zcu.cz' AS email FROM idm_orion o, (SELECT cro_id FROM idm_pozice WHERE typ_osoby IN ('STUDENT', 'DOKTORAND') AND (stredisko LIKE '2342%' OR stredisko LIKE '42%')) p WHERE o.cro_id(+)=p.cro_id AND o.stav='A1';
 +
 
 +
'''Pivo s rektorem''':
 +
 
 +
-- TODO: mainDepartmentNumber
 +
SELECT o.cro_id, regexp_replace(jmeno, ',', '?') AS jmeno, prijmeni, jis_cislo_karty, jis_cislo_na_karte, p.typ_osoby, MAX(p.stredisko) AS stredisko FROM idm_osoby o, idm_pozice p WHERE o.cro_id=p.cro_id AND jis_cislo_karty IS NOT NULL AND jis_cislo_na_karte IS NOT NULL GROUP BY (o.cro_id, jmeno, prijmeni, jis_cislo_karty, jis_cislo_na_karte, p.typ_osoby) ORDER BY stredisko, o.cro_id;
 +
 
 +
== Rezervace loginů ==
 +
 
 +
=== Fronta v RT ===
 +
 
 +
n=NAZEV_FRONTY
 +
 +
python2 ./create-user.py name=$n familyName=$n emailAddress=$n@service.zcu.cz description='fronta v RT' subtype=SYSTEM -a types-org-str-rt:org
 +
 
 +
== Self-management skupina ==
 +
 
 +
* self-management skupina
 +
 
 +
id=googleplus
 +
./create-role.py subtype=self-role "name=SELF: $id" displayName="$id" description="Skupina pro přiřazení učitelské licence na gapps"  requestable=false
 +
OID=$(./query-role.py subtype=self-role displayName="$id")
 +
./modify-role.py --oid $OID extension/ext:requestableGroups+=staff
 +
./modify-role.py --oid $OID extension/ext:requestableGroups+=doktorand
 +
 
 +
* export do LDAP
 +
 
 +
# vyrobení skupiny
 +
./group.py $id
 +
# přičítání self-management skupiny
 +
./modify-role.py --oid $OID -a role-group-$id:role
 +
 
 +
* po kontrole a počátečním nastavení členů povolit pro GUI
 +
 
 +
./modify-role.py --oid $OID requestable=true
 +
 
 +
Pro kritické věci zvážení doplnění dodatačného čisticího kódu do role "SELF: $id".
  
 
[[Kategorie:IdM]]
 
[[Kategorie:IdM]]
  
 
[[Kategorie:Interní dokumentace]]
 
[[Kategorie:Interní dokumentace]]

Aktuální verze z 16:14, 22 říjen 2021

Obsah

[editovat] ZČU

Viz také #Vývoj.

[editovat] Dokumentace

midPoint:

Connectors:

  1. OpenICF:
  2. ConnId:
  3. Polygon (ConnId+OpenICF):

Triky:

[editovat] Instalace

[editovat] Postup

git clone https://:@ipmil.civ.zcu.cz:443/midpoint/scripts.git
scripts/autodeployment.sh --wait

Tento skript automaticky:

  1. stáhne z Jenkins CI postavené konektory (Stag číselníky + studenti + učitelé, JIS, Kerberos, Magion RW, ...)
  2. stáhne z Jenkins CI postavený war soubor s midPointem a deployne

[editovat] Řádkový klient

TODO: jsou tam natvrdo cesty, tj. buildovat na serveru nebo lokálně se stejnými cestami

Potřeba postavit midPoint, pak k nalezení v ./samples/model-client-sample/target.

Je potřeba vlastní spouštěč (např. /usr/local/bin/runscript):

#!/bin/sh

DIR='/opt/midpoint-model-client-3.5.1'
java -cp `ls -1 ${DIR}/*.xml ${DIR}/*.jar ${DIR}/lib/*.jar | tr '\n' :` com.evolveum.midpoint.testing.model.client.sample.RunScript "$@"

Použití: https://wiki.evolveum.com/display/midPoint/runscript+command+line+tool

[editovat] Řádkový klient II.

Možno využít skripty na https://ipmil.civ.zcu.cz/midpoint/scripts.

[editovat] Na serveru

# version of midPoint
v='3.9'
e='DEVEL'

apt-get install -y git less mc screen vim man net-tools
# graphviz - for GUI features
# (xlmstaret - scripts)
# tomcat8 additional packages - to prevent warnings
# libapache2-mod-jk - for apache/tomcat integration
apt-get install -y apache2 bzip2 graphviz libmysql-java openjdk-8-jdk tomcat8 libservlet3.1-java libcommons-dbcp-java libcommons-pool-java wget libapache2-mod-jk
#xmlstarlet

git clone ssh://root@agenor.zcu.cz:/var/lib/git/server-configuration.git

#hikari (much worse then c3p0 anyway)
cat > /etc/hikari.properties <<EOF
dataSource.oracle.jdbc.implicitStatementCacheSize=800
dataSource.oracle.jdbc.explicitCachingEnabled=true
dataSource.oracle.jdbc.implicitCachingEnabled=true
dataSource.oracle.net.keepAlive=true
registerMbeans=true
maxLifetime=1440000
EOF

# tomcat8
cat << EOF >> /etc/default/tomcat8
JAVA_OPTS="\${JAVA_OPTS} -Xms1024m -Xmx2048m -Dmidpoint.home=/var/opt/midpoint/ -Djavax.net.ssl.trustStore=/var/opt/midpoint/keystore.jceks -Djavax.net.ssl.trustStoreType=jceks -Doracle.net.tns_admin=/usr/lib/oracle/12.1/client64/network/admin -Djava.library.path=/opt/kerberos -Dcom.sun.management.jmxremote -Dorg.apache.cxf.stax.maxChildElements=200000 -Dhikaricp.configurationFile=/etc/hikari.properties -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=ssoenv"
TZ=CET
LANG="en_US.UTF-8"
EOF

vimdiff server-configuration/${e}/etc/default/tomcat8 /etc/default/tomcat8

mkdir /var/opt/midpoint
chown tomcat8:tomcat8 /var/opt/midpoint
service tomcat8 stop

# mc (cosmetics)
mkdir -p ~/.config/mc/ || :
cat <<EOF >> ~/.config/mc/hotlist
ENTRY "/var/opt/midpoint" URL "/var/opt/midpoint"
ENTRY "/var/lib/tomcat8/webapps/" URL "/var/lib/tomcat8/webapps/"
EOF

# repo-ninja
wget -nv https://evolveum.com/downloads/midpoint/${v}/midpoint-${v}-dist.tar.bz2 -P ~/
tar xjf ~/midpoint-${v}-dist.tar.bz2
sed -e "s,^\(BASEDIR\).*,\1=\"/opt/midpoint-${v}\"," /opt/midpoint-${v}/bin/repo-ninja > /usr/local/bin/repo-ninja
chmod +x /usr/local/bin/repo-ninja

# initial launch without anything
cp -vp server-configuration/${e}/etc/apache2/sites-available/midpoint.conf /etc/apache2/sites-available/
a2enmod rewrite
a2enmod ssl
a2enmod webauth
a2enmod webauthldap
a2dissite 000-default
a2ensite midpoint
service apache2 restart

# JDBC
ln -sfv /usr/share/java/mysql-connector-java.jar /var/lib/tomcat8/lib/
ln -sfv /usr/lib/oracle/12.1/client64/lib/ojdbc7.jar /var/lib/tomcat8/lib/
mkdir -p /usr/local/share/java 2>/dev/null || :
(cd /usr/local/share/java; wget -N -nv http://central.maven.org/maven2/com/microsoft/sqlserver/mssql-jdbc/7.2.0.jre8/mssql-jdbc-7.2.0.jre8.jar)
ln -sfv /usr/local/share/java/mssql-jdbc-7.2.0.jre8.jar /var/lib/tomcat8/lib/

# midpoint initial deployment
install -vp -o tomcat8 -g tomcat8 ~/midpoint.war /var/lib/tomcat8/webapps/
service tomcat8 start
while ! test -f /var/opt/midpoint/config.xml; do sleep 0.5; done
chmod 0640 /var/opt/midpoint/config.xml
service tomcat8 stop

# deployment of the connectors
#cp -v ... /var/opt/midpoint/icf-connectors/

[editovat] Oracle

1) vyžaduje Oracle clienta

dpkg -i /afs/zcu.cz/project/departments/civ/oracle-install/instant_client/12.1.0.2/linux64/deb/oracle*.deb

2) JDBC ovladač pro tomcat

ln -s /usr/lib/oracle/12.1/client64/lib/ojdbc7.jar /var/lib/tomcat8/lib/

3) do /etc/default/tomcat8:

  • přidat k JAVA_OPTS (kvuli fungování tnsnames): -Doracle.net.tns_admin=/usr/lib/oracle/12.1/client64/network/admin'
  • přidat: TZ=CET (jinak hláška o časových zónách z Oraclu, a vůbec je dobré mít kvuli lokálnímu času ;-))
  • přidat: NLS_LANG='CZECH_CZECH REPUBLIC.AL32UTF8' (na žádost databázistů, RT #277811)

[editovat] Switch repository

[editovat] PostgreSQL

pass=`dd if=/dev/random bs=9 count=1 2>/dev/null | base64`

export PATH=$PATH:/usr/lib/postgresql/9.4/bin
useradd -s /bin/bash midpoint
sudo -u postgres psql -U postgres postgres -c "CREATE USER midpoint password '${pass}'"
sudo -u postgres createdb --owner=midpoint midpoint
sudo -u midpoint psql midpoint < midpoint-${v}/config/sql/_all/postgresql-3.4.1-all.sql

# also for repo-ninja
apt-get install -y postgresql libpostgresql-jdbc-java
ln -s /usr/share/java/postgresql.jar midpoint-${v}/lib/
 
service tomcat8 stop

Manually edit /var/opt/midpoint/config.xml (replace ${pass}):

 <repository>
   <repositoryServiceFactoryClass>com.evolveum.midpoint.repo.sql.SqlRepositoryFactory</repositoryServiceFactoryClass>
   <embedded>false</embedded>
   <driverClassName>org.postgresql.Driver</driverClassName>
   <jdbcUsername>midpoint</jdbcUsername>
   <jdbcPassword>${pass}</jdbcPassword>
   <jdbcUrl>jdbc:postgresql://localhost/midpoint</jdbcUrl>
   <hibernateDialect>com.evolveum.midpoint.repo.sql.util.MidPointPostgreSQLDialect</hibernateDialect>
   <hibernateHbm2ddl>validate</hibernateHbm2ddl>
 </repository>

[editovat] MySQL

pass=`dd if=/dev/random bs=9 count=1 2>/dev/null | base64`

# also for repo-ninja
apt-get install -y mariadb-server libmysql-java
ln -s /usr/share/java/mysql-connector-java.jar midpoint-${v}/lib/

cat > /etc/mysql/conf.d/midpoint.cnf <<EOF
[global]
max_allowed_packet = 256M
# tuning
#query_cache_type=0
#innodb_buffer_pool_size=1G
#innodb_buffer_pool_instances=1
#innodb_log_file_size=400M
EOF
mysql -e "CREATE DATABASE midpoint CHARACTER SET utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin DEFAULT COLLATE utf8_bin"
mysql -e "GRANT ALL ON midpoint.* TO 'midpoint'@'localhost' IDENTIFIED BY '${pass}'"
mysql -u midpoint -p${pass} midpoint < midpoint-${v}/config/sql/_all/mysql-3.4.1-all.sql 

service mysql restart
service tomcat8 stop

Manually edit /var/opt/midpoint/config.xml (replace ${pass}):

<repository>
  <repositoryServiceFactoryClass>com.evolveum.midpoint.repo.sql.SqlRepositoryFactory</repositoryServiceFactoryClass>
  <embedded>false</embedded>
  <driverClassName>com.mysql.jdbc.Driver</driverClassName>
  <jdbcUsername>midpoint</jdbcUsername>
  <jdbcPassword>${pass}</jdbcPassword>
  <jdbcUrl>jdbc:mysql://localhost/midpoint?characterEncoding=utf8</jdbcUrl>
  <hibernateDialect>com.evolveum.midpoint.repo.sql.util.MidPointMySQLDialect</hibernateDialect>
  <hibernateHbm2ddl>validate</hibernateHbm2ddl>
</repository>

[editovat] Oracle

Create (na ZČU máme jinak, viz #Oracle_3):

CREATE USER midpoint IDENTIFIED BY apassword;
GRANT connect,resource TO midpoint;

Apply: midpoint-3.4.1/config/sql/_all/oracle-3.4.1-all.sql

Edit: /var/opt/midpoint/config.xml (replace for real values):

<repository>
  <repositoryServiceFactoryClass>com.evolveum.midpoint.repo.sql.SqlRepositoryFactory</repositoryServiceFactoryClass>
  <database>oracle</database>
  <jdbcUsername>midpoint</jdbcUsername>
  <jdbcPassword>${pass}</jdbcPassword>
  <jdbcUrl>jdbc:oracle:thin:@localhost:1521/xe</jdbcUrl>
</repository>

[editovat] Common

Finaly:

service tomcat8 stop
killall java
rm -fv /var/opt/midpoint/midpoint*.db
service tomcat8 start

[editovat] Stronger key

su -s /bin/bash -c "keytool -genseckey -alias strong -keystore /var/opt/midpoint/keystore.jceks -storetype jceks -storepass changeit -keyalg AES -keysize 256 -keypass midpoint" tomcat8

Manualy edit /var/opt/midpoint/config.xml:

<keystore>
  <keyStorePath>${midpoint.home}/keystore.jceks</keyStorePath>
  <keyStorePassword>changeit</keyStorePassword>
  <encryptionKeyAlias>strong</encryptionKeyAlias>
  <xmlCipher>http://www.w3.org/2001/04/xmlenc#aes256-cbc</xmlCipher>
</keystore>

[editovat] Admin password

Change admin password.

  • initial user: administrator
  • initial password: 5ecr3t

[editovat] CA

Potřeba přidat CA certifikáty potřebné pro SSL spojení se všemi koncovými systémy do interního truststore midPointu. Např. (pro každý CA certifikát v řetězu):

keytool -keystore /var/opt/midpoint/keystore.jceks -storetype jceks -importcert -alias ca1 -file /tmp/ca1.pem
keytool -keystore /var/opt/midpoint/keystore.jceks -storetype jceks -importcert -alias ca2 -file /tmp/ca2.pem
# pro captcha
keytool -printcert -rfc -sslserver www.google.com/recaptcha/api/siteverify > recaptcha.pem
keytool -keystore /var/opt/midpoint/keystore.jceks -storetype jceks -importcert -file recaptcha.pem

(koukání do trustanchor je přepnuté na vlastní soubor, viz /etc/default/tomcat* - IMHO to pak nepoužívá CA ze systému)

[editovat] WebAuth

  • název třídy filtru změnit z EnvironmentVariableAuthenticationFilter na RequestAttributeAuthenticationFilter podle změn v pull-requestu

Kterak nakonfigurovat:

  1. deployment
    Pro deployment použít war vygenerovaný z repozitáře midpoint-overlay.git - obsahuje zkompilovanou třídu filtru a konfiguraci nastavení přihlašování.
  2. nakonfiguravat apache
    • smazat původní konfiguraci pro midPoint bez webauthu
    • základ nakonfiguruje sám cfengine
    • běžná konfigurace pro webauth, např. něco jako:
    ...
    JkMount /* tomcat8_worker
    JkEnvVar WEBAUTH_USER "<UNSET>"
    ...
    <Location />
        AuthType WebAuth
        Require privgroup lps
        ...
    </Location>

    Také:

    • povolit AJP13 v tomcatu

    Také:

    apt-get install -y libapache2-mod-jk
    adduser tomcat8 ssl-cert
    a2enmod headers
    a2enmod rewrite
    a2enmod ssl
    a2enmod webauth
    a2enmod webauthldap
    a2ensite midpoint
    # apache tuning
    a2dismod php5
    # apache tuning
    a2dismod mpm_prefork
    
    # apache tuning
    a2enmod mpm_event
    service apache2 restart
    service tomcat8 restart
    
  3. vyrobit uživatele se správnými access rolemi (End User, Super User, Approver, ...)
  4. vidlička mimo webauth - funguje to pouze pro API (např. Eclipse plugin)
    1. /etc/apache2/site-available/01midpoint.conf: mít sekci <VirtualHost localhost:8443>
    2. /etc/tomcat8/server.xml: žádné SSL a řádka:
      <Connector port="8009" protocol="AJP/1.3" redirectPort="443" />
    3. na eclipse plugin pak používat tunel ssh ... -L 8443:localhost:8443

Výsledek konfigurace:

  • na stránky midpointu se lze dostat pouze přes webauth s nakonfigurovanými omezeními
  • pokud neexistuje přihlášený uživatel v midpointu, otevře se přihlašovací formulář midpointu

[editovat] Drobnosti

  • graphviz: na vizualuzace v GUI
  • xmlstarlet: používá skript na import XML
  • elinks
  • cmake >= 2.8.12, libkrb5-dev >= 0.15; nebo balík z kerberos-connector: Kerberos resource

[editovat] Monitoring

  • v Nagiosu command check_midpoint.pl (MIDPOINT) - sonda v perlu, co nacucne několik XML a podívá se dovnitř
  • jeden parametr s properties souborem (viz Edit static config files -> static_cfg)

[editovat] Registace

Nastavit Captchu:

Import SSL CA:

[editovat] Upgrade

Postupovat podle release notes a podle obecných pravidel na https://wiki.evolveum.com/display/midPoint/Upgrade+HOWTO .

[editovat] Upgrade databáze

MySQL např.:

cd /opt/newMidpoint/midpoint-3.4/config/sql/_all
mysql -u root -p midpoint < mysql-upgrade-3.3-3.4.sql

Oracle:

1. pod midpoint_repo_admin:

-- 1a) pustit upgrade skript z:
-- https://github.com/Evolveum/midpoint/blob/master/config/sql/_all/

-- 1b) granty (pro každou novou tabulku)
GRANT SELECT, INSERT, UPDATE, DELETE ON MIDPOINT_REPO_ADMIN.##### to  MIDPOINT_REPO_WRITE_ROLE;

2. pod midpoint_repo:

-- 2a) synonyma (pro každou novou tabulku a sekvenci)
CREATE OR REPLACE SYNONYM ##### FOR MIDPOINT_REPO_ADMIN.#####;

-- 2b) rušené tabulky
DROP SYNONYM #####;

Detaily viz #Oracle

[editovat] Deployment war

...chtělo to i promazat starý adresář ve /var/lib/tomcat8/webapps/midpoint

[editovat] Upgrade connectorů

Viz také: https://wiki.evolveum.com/display/midPoint/Connector+Upgrade

  • překlikat resourcy na novější connectory
  • smazat <schema>...</schema> a znovu schéma nacucnout
  • odstranit staré reference z midPointu: Configuration - Repository Objects - Connector
  • radši i restart midPointu (natáhne si případně omylem smazané objekty)

[editovat] repo-ninja

Funguje, ale nepůjdou parametry (templaty). Raději použít midPoint Eclipse plugin.

  • úprava cesty v /usr/local/bin/repo-ninja
  • ln -s /usr/share/java/mysql-connector-java.jar /opt/midpoint.../lib
  • vyzkoušet: repo-ninja --validate

[editovat] Oracle

Extra zabezpečené nastavení Oracle repozitáře: dva uživatelé midpoint_repo a midpoint_repo_admin.

[editovat] midpoint_repo_admin

Obsahuje vlastní tabulky - pod ním pouštět SQL script se schematem pro midPoint.

Pak nastavit dodatečná práva.

Pro každou tabulku (nahradit ##### za název tabulky):

GRANT SELECT, INSERT, UPDATE, DELETE ON MIDPOINT_REPO_ADMIN.##### to MIDPOINT_REPO_WRITE_ROLE;

[editovat] midpoint_repo

Obsahuje synonyma do midpoint_repo_admin. Navíc potřebuje práva pro temporary tabulky vyráběné midPointem:

GRANT CREATE TABLE TO midpoint_repo;
REVOKE UNLIMITED TABLESPACE FROM midpoint_repo;

Pro každou tabulku kromě GLOBAL TEMPORARY TABLE a pro každou sekvenci vyrobit synonyma (nahradit ##### za název tabulky):

CREATE OR REPLACE SYNONYM ##### FOR MIDPOINT_REPO_ADMIN.#####;

Pro každou zrušenou tabulku (např. při upgradu):

DROP SYNONYM #####;

[editovat] Docker

Image: https://hub.docker.com/r/valtri/docker-midpoint/

Pomocné skripty: /afs/zcu.cz/projekt/software/git/idm/docker.git

Prakticky se pouští nějak takhle (data vytažená mimo container do adresáře midpoint, pomocný adresář docker pro administraci a vystavení Oracle klienta do containeru):

docker pull valtri/docker-midpoint
NAME=midpoint
docker run -itd --restart=on-failure:0 \
  --name $NAME \
   -v `pwd`/midpoint:/var/opt/midpoint \
   -v `pwd`/docker:/docker \
   -v $ORACLE_HOME:$ORACLE_HOME:ro \
   valtri/docker-midpoint

Dobré mít vyrobenou vlastní síť a používat statické adresy (tj. přidat parametry --network XXXXX --ip 172.18.0.XXX).

Více viz LPS:IdM/midPoint/Personální portál#Docker

[editovat] Tipy

[editovat] Mapování atributů

[editovat] Matching rule

V mapování myslet na matching rule.

Jak to funguje: default se bere podle schematu z resourcu. Bacha, např. LDAP mívá většinou stringIgnoreCase a na striktní porovnávání se to musí explicitně přerazit:

<matchingRule xmlns:mr="http://prism.evolveum.com/xml/ns/public/matching-rule-3">mr:default</matchingRule>

Seznam pravidel:

  • mr:default - striktní porovnání (řetezec nebo číslo)
  • mr:distinguishedName - DN
  • mr:polyStringNorm - pouze normalizovaná hodnota (polyString)
  • mr:polyStringOrig - pouze originální hodnota (polyString)
  • mr:polyStringStrict - striktní porovnání (polyString), prakticky totožné s mr:polyStringOrig (hypoteticky by se to mohlo lišit u neupdatovaných objektů po změně normalizační politiky)
  • mr:stringIgnoreCase - case-insensitive
  • mr:uuid - case-insensitive s trimováním
  • mr:xml - ignoruje XML formátování

[editovat] Multiplicity

[editovat] 1) Max

Pokud je na koncovém systému víc hodnot jednoho atributu a midPoint by to měl napravovat (nahradit jednou), pak nastavit omezení v mapování:

<limitations>
 <maxOccurs>1</maxOccurs>
</limitations>

Což se vlastně hodí vždy. Není třeba, pokud je omezení již na úrovni schématu z resource adaptéru.

[editovat] 2) Min

Byly potíže s GUI, pokud schéma z resource adaptéru vyžadovalo minimální počet výskytu 1. Lze přerazit v mapování:

<limitations>
 <minOccurs>0</minOccurs>
</limitations>

[editovat] Detaily

atribut:

  • exclusiveStrong (pro multihodnoty): do výsledku míchat pouze strong (true) nebo i normal (false)
  • tolerant (pro výstup?): zda mohou přicházet hodnoty i z koncového systému

inbound/outbound mappings:

  • authoritative (autoritativní): odebrat hodnotu při odstranění resourcu/role
  • exclusive (exkluzivní): vrátit chybu, pokud přijde hodnota i z jiného zdroje
  • strength (váha):
    • weak (slabý): jen default (nepřepisovat)
    • normal (normální): přepisovat
      • pozor, pokud je v mapování uveden jakýkoliv <source></source>, nová hodnota se posílá pouze při změně daného atributu!
      • dokumentace IMHO lže o NULL, při výskytu NULL má danou hodnotu také přepsat, resp. smazat (TODO: ověřit/reportovat)
    • strong (silný): přepisovat, změnu pošle dále do provisioningu vždy
      • pozor v object template: u single-hodnotových atributů dobré použít ve skriptech také relativityMode=absolute, jinak je midPoint rozhozen z neznámých hodnot (hodnot, co neodpovýdají starému i novému stavu atributů)
  • source (zdroj):
    • seznam atributů k dispozici pro výpočet nové hodnoty
    • vyžadováno pro <expression><script><code>...</code></script></expression>, bez výrazu pouze s target není potřeba
    • midPoint to nějak používá k detekcí změn a práci s multihodnotami
    • příklad:
      • xml: <c:path>$account/attributes/ri:MOBIL</c:path>
      • GUI: $account/attributes/MISTNOST
    • nepovinný tag <name>: normálně je daný atribut k dispozici ve výrazu pod svým jménem, tagem name lze změnit
  • target (cíl): kam hodnotu uložit, příklad:
    • xml: <c:path>$user/honorificSuffix</c:path>
    • GUI: $user/honorificSuffix
  • condition (podmínka) - pozor, chová se "specificky" co se týče mizení - aby se změna projevila, hodnota condition se musí lišit mezi původní verzí a novou verzí atributů (TODO: ověřit: zřejmě se ignoruje i "return null" a výsledek null je třeba naučit i tu condition)
  • tolerant: true znamená nemazat ostatní hodnoty, pokud jde o multihodnotu (u single-hodnot se chová podivně - první update maže, další vyrobí novou aktuální hodnotu)

[editovat] Synchronizace

Opatrně při modifikaci účtů při rekoncilaci (="atributová rekoncilace"), může jít o náročnější operaci.

TODO: ověřit. Náročnost se IMHO týkala údržby velké skupiny v LDAPu, což SunIdM zvládá, resp. dělá v rámci ActiveSync najednou a odděleně od účtů.

Modifikaci je možno přeskočit, ale přesto nechat dělat pro live synchronizaci:

<reaction>
    <name>Linked reaction</name>
    <situation>linked</situation>
    <channel>http://midpoint.evolveum.com/xml/ns/public/provisioning/channels-3#liveSync</channel>
    <action>
        <name>Modify Action</name>
        <handlerUri>http://midpoint.evolveum.com/xml/ns/public/model/action-3#modifyUser</handlerUri>
    </action>
</reaction>

Nebo nejlepší způsob - zapnout synchronizaci (modifikace se provede automaticky a pouze pokud je potřeba):

<reaction>
  <name>linked reaction</name>
  <situation>linked</situation>
  <synchronize>true</synchronize>
</reaction>

[editovat] Deleted

  1. pro situaci deleted nezapínat reconcile, jinak vyskakují šílené výjimky
  2. nastavování atributů při smazání nelze řešit na úrovni resourcu [MID-1693] ==> použít ObjectTemplate a <synchronize>true</synchronize>

Příklad Resource:

<resource ...>
...
<synchronization>
	<objectSynchronization>
		...
		<reaction>
			<name>Example resource account deleted</name>
			<situation>deleted</situation>
			<synchronize>true</synchronize>
			<reconcile>false</reconcile>
			<objectTemplateRef oid="template-example-resource-user-disable" type="c:ObjectTemplateType">
				<targetName>Example-resource: User Disable Template</targetName>
			</objectTemplateRef>
		</reaction>
		...
	</objectSynchronization>
</synchronization>
...
</resource>

Příklad ObjectTemplate (bacha, při jakémkoliv <source>...</source> je potřeba i strength strong - zdrojové atributy se nám vlastně smazáním na resourcu sami nemění):

<objectTemplate ...
 oid="template-example-resource-user-disable">
	<name>Example-resource: User Disable Template</name>
	<description>
		Example Resource User Disable Template Object.
	</description>
	...
	<mapping>
		<name>Disable status</name>
		<expression>
			<value>B1</value>
		</expression>
		<target>
			<c:path>$user/extension/idmStatus</c:path>
		</target>
	</mapping>
	... 
</objectTemplate>

[editovat] Profiling

Konfigurace - Profiling

Koukání do logu jen na tasky >= 1s:

tail -f /var/log/tomcat8/idm-profile.log | egrep '[0-9]{3}\.[0-9]{3} ms$'

[editovat] Filtry

Jak použít:

  • GUI: <searchFilter>...</searchFilter>
  • eclipse plugin query: <query><filter>...</filter></query>
  • bulk action: <s:searchFilter>...</s:searchFilter>, přidat namespacy - q:org, q:path, q:orgRef
  • REST API query: <q:query><q:filter>...</q:filter></q:query>

Dokumentace:

Source:

Seznam operací:

  • q:equal(q:path, q:value|q:oid|c:expression|c:rightHandSidePath|q:matching|...)
  • q:equal(q:path): test na neexistenci atributu
  • q:greater(q:path, q:value|q:oid|c:expression|...)
  • q:greaterOrEqual(q:path, q:value|q:oid|c:expression|...)
  • q:less(q:path, q:value|q:oid|c:expression|...)
  • q:lessOrEqual(q:path, q:value|q:oid|c:expression|...)
  • q:substring(q:path, q:value|q:oid|c:expression|...[,q:anchorStart][,q:anchorEnd])
  • q:ref([q:path,] q:oid)
  • q:org(q:isRoot)
  • q:org(q:ref[,q:maxDepth][q:scope="SUBSTREE"|"ONE_LEVEL"])
  • q:inOid(q:value|..., boolean considerOwner)
  • q:and(A, B)
  • q:or(A, B)
  • q:not(A)
  • q:type(QName type, FILTER)
  • q:exists(string q:path, FILTER) - bacha, týká se prohledávání multihodnot (např. pro assigment), kdy je cílem aplikovat komplexní filter na jednu konkrétní hodnotu, "závorka"

Příklady operandů:

  • q:path: c:intent, c:resourceRef, ...
  • q:ref: <q:oid>...</q:oid>
  • každá operace má nepovinný parametr q:matching (pokud má smysl/je podporovaný): norm, orig, strict, polyStringNorm

[editovat] Příklady

Jméno:

<equal>
  <path>name</path>
  <value>1</value>
</equal>

Podřetězec:

<substring>
  <path>name</path>
  <value>ka</value>
</substring>

Někdy nutno přepnout na polystring:

<equal>
  <matching>polyStringNorm</matching>
  <path>displayName</path>
  <value>kps</value>
</equal>
<equal>
  <matching>polyStringOrig</matching>
  <path>displayName</path>
  <value>ZČU</value>
</equal>

Členové pracoviště:

  <org>
    <path>parentOrgRef</path>
    <orgRef oid="20010718-1801-0005-0000-200000000000"/>
  </org>

Departmenty z Magionu:

<equal>
  <path>orgType</path>
  <value>department</value>
</equal>

Objekt podle OID:

<inOid>
  <value>20010718-1801-0005-0000-200000000000</value>
</inOid>

Konkrétní organizace k přiřazení v templatu (tady např. ZČU):

<assignmentTargetSearch>
  <targetType>c:OrgType</targetType>
  <oid>20010718-1801-0005-0000-200000000000</oid>
</assignmentTargetSearch>

Nalezení organizace k přiřazení (klasický příklad):

<assignmentTargetSearch>
  <targetType>c:OrgType</targetType>
  <filter>
    <q:equal>
      <q:path>c:name</q:path>
      <expression>
        <path>$costCenter</path>
      </expression>
    </q:equal>
  </filter>
</assignmentTargetSearch>

Objekty vyrobené uživatelem:

<q:ref>
  <q:path>metadata/creatorRef</q:path>
  <q:value oid="user-admin-cro"/>
</q:ref>

Objekty s nalinkovaným resourcem:

<q:ref>
  <q:path>linkRef/@/resourceRef</q:path>
  <q:value oid="resource-cro"/>
</q:ref>

[editovat] Bulk action

TODO příklady:

  • vynucený update nebo rekoncilace u seznamu identit
  • přidání/odebrání role
  • aktivace/deaktivace

TODO: vyzkoušet informace z mailinglistu (http://lists.evolveum.com/pipermail/midpoint/2017-May/003806.html)

[editovat] Příklady

Ve formě pro Configuration -> Bulk actions.

Mazání všech uživatelů načínajících na "STAG*":

<s:search xmlns:s="http://midpoint.evolveum.com/xml/ns/public/model/scripting-3"
          xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3">
    <s:type>UserType</s:type>
    <s:searchFilter>
        <q:substring>
            <q:path>name</q:path>
            <q:value>STAG</q:value>
            <q:anchorStart>true</q:anchorStart>
        </q:substring>
    </s:searchFilter>
    <s:action>
        <s:type>delete</s:type>
    </s:action>
</s:search>

Mazání všech shadow objektů odpovídajících uživatelům ve Stagu:

  • search: omezení na objectClass je povinné
  • action: trik s mazáním s raw opšnou (aby to nemazalo na resourcu)
<s:search xmlns:s="http://midpoint.evolveum.com/xml/ns/public/model/scripting-3"
	xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
	xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3">
	<s:type>ShadowType</s:type>
	<s:searchFilter>
		<q:and>
			<q:ref>
				<q:path>c:resourceRef</q:path>
				<q:value oid="resource-stag-students" xsi:type="c:objectReferenceType"/>
			</q:ref>
			<q:equal>
				<q:path>objectClass</q:path>
				<q:value>ri:AccountObjectClass</q:value>
			</q:equal>
		</q:and>
	</s:searchFilter>
	<s:action>
		<s:type>execute-script</s:type>
		<s:parameter>
			<s:name>script</s:name>
			<c:value>
				<c:code>
				  	import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
				  	import com.evolveum.midpoint.model.api.ModelExecuteOptions;

log.info('deleting: {}', input.oid);
midpoint.deleteObject(ShadowType.class, input.oid, ModelExecuteOptions.createRaw())
				</c:code>
			</c:value>
		</s:parameter>
	</s:action>
</s:search>

Vypsání do logu všech "admin-*" uživatelů, příklad akce execute-script:

<s:search xmlns:s="http://midpoint.evolveum.com/xml/ns/public/model/scripting-3"
          xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3">
    <s:type>UserType</s:type>
    <s:searchFilter>
        <q:substring>
            <q:path>name</q:path>
            <q:value>admin-</q:value>
            <q:anchorStart>true</q:anchorStart>
        </q:substring>
    </s:searchFilter>
    <s:action>
        <s:type>execute-script</s:type>
        <s:parameter>
            <s:name>script</s:name>
            <c:value>
                <c:code>
log.info('log: {}', input.name);
                </c:code>
            </c:value>
        </s:parameter>
    </s:action>
</s:search>

[editovat] Interní atributy

Oficiální dokumentace:

https://wiki.evolveum.com/display/midPoint/MidPoint+Common+Schema

Zdrojový kód (seznam interních atributů, hledat name="UserType", name="OrgType", name="RoleType" a jejich rodičovské typy):

https://github.com/Evolveum/midpoint/blob/master/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd


[editovat] midPoint UserType

  • name (*): hlavní ID (myšleno jako jméno objektu prezentované administrátorům, podle schématu nepovinné, prakticky povinné)
  • description (*): popis (pro GUI)
  • familyName (*): jméno
  • givenName (*): příjmení
  • additionalName (0-1): prostřední jméno (nebo jiné kulturní specialitky)
  • fullName (*): (mít na to vlastní pravidlo v mapping)
  • honorifixPrefix (0-1): titul před
  • honorifixSuffix (0-1): titul za
  • title (0-1): myšlena funkce (ale pouze jedna)
  • nickName (0-1): přezdívka (oficiální použití fak pro familiární přezdívku)
  • prefferedLanguage (0-1): jazyk
  • locale (0-1): lokalizace
  • ZČU:
    • extension/croId (0-1) [int]
    • extension/rc (0-1)
    • extension/uidNumber (0-1) [int]

[editovat] midPoint OrgType

  • orgType (*): typ stromu
  • tenant [boolean] (0-1): top-level
  • costCenter (0-1)
  • locality (0-1)
  • mailDomain (*): mailová doména
  • displayName (*): lidský název
  • identifier (*): identifikátor (číselník, apod.)
  • ...

[editovat] midPoint RoleType

  • roleType (*): univerzální informační políčko (midPoint používá system role, ...)
  • displayName (*): lidský název
  • identifier (*): identifikátor
  • requestable [boolean] (0-1): koncoví uživatelé mohou požádat
  • ZČU:
    • extension/gidNumber (0-1) [int]

[editovat] Resource

  • icsc:name: přejmenovatelné ID na resourcu
  • icsc:uid: nepřejmenovatelné ID na resourcu (např. read-only UUID, ...), někdy totožné s icsc:name
  • ri:*: atributy na koncovém resourcu

[editovat] Synchronizace pracovišť

midPoint velmi dobře podporuje. Implementováno vč. hierarchie v magion.xml (JDBC resource) a department.xml (template).

Viz také orgsync story.

[editovat] SSL

Self-signed certifikáty vzdálených služeb potřeba importovat do úložiště pro midPoint, např.:

keytool -import -alias hernajs -file ./hernajs.pem -keystore /var/opt/midpoint/keystore.jceks -storetype jceks

[editovat] Logování

V Configuration -> Logging (v objektu SystemConfiguration, tag logging).

Scripted SQL (verze od Tirasy):

  • loguje pouze od úrovně DEBUG!
  • net.tirasa.connid.commons.scripted.AbstractScriptedConnector (tuhle třídu nepoužívat: net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector - to je jen wrapper třída, která neloguje)

[editovat] Přenesení MySQL repozitáře

Příklad: z lokální databáze midpoint na stroj eos.zcu.cz s databází midpoint_test:

  1. vyrobit cílovou databázi, radši včetne nahrnutí schema
  2. přenesení:
    mysqldump -u root -p$pass1 --ignore-table=midpoint.m_audit_delta --ignore-table=midpoint.m_audit_event --ignore-table=midpoint.m_audit_item midpoint | mysql -u midpoint_test -h eos.zcu.cz -p$pass2 midpoint_test

[editovat] Standardní tasky

Cleanup - promazává staré záznamy (audity, ale i dlouho nespuštěné úlohy!)

Validity scanner - kontrola nastavení od-do a spouštění potřebných enable/disable událostí

Trigger scanner - obsluha WF

[editovat] Aktivace identit

Příklad přenosu stavu z resourcu do midPointu ze schemaMapping:

<activation>
  <administrativeStatus>
    <inbound>
      <expression>
        <asIs/>
      </expression>
    </inbound>
  </administrativeStatus>
</activation>

[editovat] Sosání skupin

  • engine midPointu to zatím neumí tím správným způsobem krz entitlements, ale lze obejít (<focusType>c:RoleType</focusType> v ObjectSynchronization)
    • funguje to a ničemu to nevadí
    • viz také email thread "Sync Entitlements to Role/Org Object with CSVFileConnector"

[editovat] Mazání atributů

Mazání atributů umí midPoint "od přírody" pouze v rámci mapování u resourcu (<value/> společně se strength strong a tolerant false).

Zrušit hodnotu atributu lze ručně groovy skriptem:

<mapping>
	<name>HR_ZAC</name>
	<source>
		<path>$user/extension/HR_ZAC</path>
	</source>
	<expression>
		<script>
			<code>
				import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
				import javax.xml.namespace.QName;
				import com.evolveum.midpoint.model.api.ModelExecuteOptions;
				import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder;
				import com.evolveum.midpoint.prism.path.ItemPath;
				import com.evolveum.midpoint.prism.PrismConstants;

				if (HR_ZAC) {
					//def path = UserType.F_NAME;
					def path = new ItemPath(
						new ItemPath(PrismConstants.EXTENSION_LOCAL_NAME),
						new QName('http://zcu.cz/xml/ns/idm', 'HR_ZAC'));

					def delta = DeltaBuilder.deltaFor(UserType.class, midpoint.getPrismContext())
						.item(path).delete(HR_ZAC)
						.asObjectDelta(user.getOid());
					log.info('DELETED: HR_ZAC delta: {}', delta);

					midpoint.modifyObject(delta, ModelExecuteOptions.createRaw());
				} else {
					log.info('DELETED: HR_ZAC is already empty');
				}
			</code>
		</script>
	</expression>
</mapping>

[editovat] Reporty

Kombinace Jasperu a midPointu.

Vizáž pomocí Jaspersoft studia:

[editovat] Koncové systémy

Primární klíč:

  • je tam nějaký "immutable" klíč? (např. UUID) - ideální pro __UID__
    • lze i bez - uid se smí updatem "předrátovávat"
  • další měnitelný klíč do __NAME__

Paralelizmus:

  • zkontrolovat schopnost paralelizování (umí to? nebude vytížené?)
  • pokud nelze: nastavit hodnoty 1 v connection poolu

Běžné úvahy:

  • přejmenování identity
  • blokace identity
  • mazání identity
  • discovery - potřeba koexistence s identitami "mimo systém"?
  • merge - duplicitní identity a co s nimi

[editovat] Diagnostika

Přidat -Dcom.sun.management.jmxremote do JAVA_OPTS (/etc/default/tomcat8).

[editovat] connection pool: c3p0

Pro midPoint <= 3.7.2. Plnohodnotný connection pool.

  1. lokálně pustit jconsole
  2. připojit se na org.apache.catalina
  3. MBeans/com.mchange.v2.c3p0/PooledDataSource/*/*/Attributes

Zajímavé atributy jsou např.:

  • maxPoolSize (default 20)
  • minPoolSize (default 8)
  • maxStatements (default 0!)
    • Oracle: zvýšen výkon rekonciliací o 30-50% + lepší chování na DB serveru
    • M$ SQL: žádné zlepšení (test od AMI Praha)
  • maxStatementsPerConnection (default 0) - tahle asi nic nedělá (testováno na Oracle)

Konfigurace: skrz WEB-INF/classes/c3p0-config.xml

[editovat] connection pool: HikariCP

Pro midPoint >= 3.8. Poor-man connection pool (minimalistický, o dost horší výkon, jen mikrooptimalizace na velikost kódu).

Konfigurace: -Dhikaricp.configurationFile=hikari.properties (zadaný soubor se pak poctivě hledá na filesystému i v jarech)

Jakákoliv property začínající dataSource. se použije jako parameter pro JDBC driver.

hikari.properties (pomohlo jen zčásti):

dataSource.oracle.jdbc.implicitStatementCacheSize=500

[editovat] Map attribute only when account is created

AFAIK you can use condition for the mapping, and there is internal variable "operation" which will have value "add" for adding the account (i.e. create).

[editovat] Korelace

+ další info kolem možných kontrol RČ, ...

Příklad (v GUI je kód stejný - ale pouze tag q:equal včetně):

       <correlation>
           <q:description>korelace1_1</q:description>
           <q:equal>
               <q:path xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3">c:name</q:path>
               <expression>
                   <c:path xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3">declare namespace icfs='http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3'; $account/attributes/icfs:name</c:path>
               </expression>
           </q:equal>
       </correlation>
       <correlation>
          <q:description>korelace_rc</q:description>
          <q:equal>
             <q:path>c:extension/rc</q:path>
             <expression>
                <c:path>declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance-3'; $account/attributes/ri:RODNE_CISLO</c:path>
             </expression>
          </q:equal>
       </correlation>

Košatější příklad:

trafo story

Alternativní jednodušší zápis (TODO: vyzkoušet, v examplech není tak častý):

<correlation>
  <q:equal>
    <q:path>c:name</q:path>
    <valueExpression>
      <path>$shadow/attributes/icfs:name</path>
    </valueExpression>
  </q:equal>
</correlation>

Poznámky:

  • Pokus o nalinkování vlastníkovi již s nalinkovaným jiným účtem selže (jedná se vlastně o duplicitu klíče - korelace spolu s confirmation pravidlem musí dávat jednoznačnost)
  • Hlídání duplicity jiného atributu je možné:
    • vyhození vyjímky (pouze hlídání): Unique+property+value+HOWTO
    • karanténí organizace (dynamický assignement): template-people-with-rc-check.xml v našem gitu

[editovat] Troubleshooting

[editovat] Nejde synchronizace

[editovat] Live nic nenačte

Normální chování při prvním puštění je nic nedělat (tj. čte jen změny).

==>:

  • potřeba pustit import nebo rekonciliaci
  • nebo: JDBC script RA lze instruovat, aby při prvním puštění syncnul vše (dát token na 0 - unixový počátek vesmíru)

[editovat] Not applicable for task

Zkontrolovat svatou trojici Kind + Object Class + Intent. Všude (!):

  • Resource - Schema handling
  • Resource - Synchronization
  • Server Task

MID-2831: jednou se možná sloučí schemaHandlin/objectType a synchronization/objectSynchronization

[editovat] No sync policy

Viz výše.

[editovat] liveSync token se neaktualizuje

...a sync se dokola opakuje.

Dva problémy:

  1. Nová opšna retryLiveSyncErrors - způsobí neaktualizaci tokenu při jakékoliv chybě, i při neopravitelné
    • od midPoint 4.x existuje capability liveSync/preciseTokenValue, pak se při chybě použije token z poslední neselhané změny
  2. Zkontrolovat v tasku také sekci "Errors" - někdy to nevadí, někdy ano (třeba šlo jen o upgrade na midPoint 4.x?)

[editovat] Heslo administrátora

Reset hesla:

  1. v repozitáři najít m_object WHERE oid='00000000-0000-0000-0000-000000000002'
  2. ve fullObject smazat <password><value>...</value></password> a nahradit za <value><clearValue>...</clearValue></value>
  3. po úspěšném přihlášení pak administrátora přeuložit (interně se heslo zase zašifruje aktuálním klíčem)

Přegenerování celého účtu

  1. zkontrolovat/změnit default password ve WEB-INF/classes/initial-objects/050-user-administrator.xml (musí odpovídat politice)
  2. smazat z repozitáře objekt z m_object a m_user
  3. restart midPoint

[editovat] Reset hesla

  1. v repozitáři najít m_object WHERE oid='...'
  2. ve fullObject smazat <password><value>...</value></password> a nahradit za <value><clearValue>...</clearValue></value>
  3. po úspěšném přihlášení pak objekt přeuložit (interně se heslo zase zašifruje aktuálním klíčem)

[editovat] Warningy

[editovat] There is no owner of account

Pozorováno ve verzi: 3.6.1

Známý interní warning, který má Evolveum už reportovaný. Na funkci MP nemá vliv.

Viz AMI #24374.

WARN (com.evolveum.midpoint.notifications.impl.AccountOperationListener): There is no owner of account c29e30e5-7496-4423-be68-4bb9779b764d (in repo nor in task).

[editovat] Výjimky

[editovat] java.util.ConcurrentModificationException

Pozorováno ve verzi: 3.6.1, 3.6.2-SNAPSHOT (2017-11-16 + commit 35c7b13)

Zřejmě bug v midPointu, race-condition je známa. Ale NEJEDNÁ se o bug MID-4088.

2017-11-23 11:46:19,128 [] [pool-1-thread-38] WARN (com.evolveum.midpoint.prism.PrismProperty): Adding value to property {http://midpoint.evolveum.com/xml/ns/public/common/common-3}resultStatus that already exists (overwriting), value: PPV(OperationResultStatusType:IN_PROGRESS)
2017-11-23 11:46:19,138 [] [pool-1-thread-38] ERROR (com.evolveum.midpoint.model.impl.lens.Clockwork): Couldn't record operation execution. Model context:
LensContext: state=FINAL, Wave(e=2,p=3,max=0), focus, 1 projections, 2 changes, fresh=true, reqAutz=true
  Channel: http://midpoint.evolveum.com/xml/ns/public/provisioning/channels-3#reconciliation
...
java.util.ConcurrentModificationException: null
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:907) ~[na:1.8.0_151]
	at java.util.ArrayList$Itr.remove(ArrayList.java:871) ~[na:1.8.0_151]
	at com.evolveum.midpoint.prism.PrismProperty.addValue(PrismProperty.java:263) ~[prism-3.6.1.jar:na]
	at com.evolveum.midpoint.prism.PrismProperty.setValue(PrismProperty.java:234) ~[prism-3.6.1.jar:na]
	at com.evolveum.midpoint.prism.xjc.PrismForJAXBUtil.setPropertyValue(PrismForJAXBUtil.java:141) ~[prism-3.6.1.jar:na]
	at com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.setResultStatus(TaskType.java:390) ~[schema-3.6.1.jar:na]
	at com.evolveum.midpoint.task.quartzimpl.TaskQuartzImpl.getTaskPrismObject(TaskQuartzImpl.java:265) ~[task-quartz-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.model.impl.lens.Clockwork.setOperationContext(Clockwork.java:914) [model-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.model.impl.lens.Clockwork.recordOperationExecution(Clockwork.java:827) [model-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.model.impl.lens.Clockwork.recordProjectionOperationExecution(Clockwork.java:801) [model-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.model.impl.lens.Clockwork.recordOperationExecution(Clockwork.java:753) [model-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.model.impl.lens.Clockwork.processFinal(Clockwork.java:735) [model-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.model.impl.lens.Clockwork.click(Clockwork.java:477) [model-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.model.impl.lens.Clockwork.run(Clockwork.java:207) [model-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.model.impl.sync.SynchronizationServiceImpl.reactToChange(SynchronizationServiceImpl.java:781) [model-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.model.impl.sync.SynchronizationServiceImpl.notifyChange(SynchronizationServiceImpl.java:311) [model-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.provisioning.impl.ChangeNotificationDispatcherImpl.notifyChange(ChangeNotificationDispatcherImpl.java:146) [provisioning-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.model.impl.sync.SynchronizeAccountResultHandler.handleObjectInternal(SynchronizeAccountResultHandler.java:204) [model-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.model.impl.sync.SynchronizeAccountResultHandler.handleObject(SynchronizeAccountResultHandler.java:126) [model-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeResultHandler.processRequest(AbstractSearchIterativeResultHandler.java:331) [model-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeResultHandler.access$200(AbstractSearchIterativeResultHandler.java:52) [model-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeResultHandler$WorkerHandler.run(AbstractSearchIterativeResultHandler.java:292) [model-impl-3.6.1.jar:na]
	at com.evolveum.midpoint.task.quartzimpl.TaskManagerQuartzImpl$1.run(TaskManagerQuartzImpl.java:844) [task-quartz-impl-3.6.1.jar:na]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_151]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_151]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_151]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_151]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_151]

[editovat] NPE com.evolveum.midpoint.model.impl.controller.SchemaTransformer

Pozorováno ve verzi: 3.9.1

Padá to při vyhodnocování assignments (GUI Assignemnts/Show All, preview, save).

Celkem univerzální výjimka. Přihodí se při:

  • chybějícím subjektu v asociaci (1):
    1. uživatel má asociace
    2. je ve skupině
    3. podle rolí není přiřazen na resourcu (pokud jen není na resourcu kuli podmínkám, tak cajk)
  • chybějícím subjektu v asociaci (2):
    1. uživatel má asociace
    2. je ve skupině
    3. podle rolí je přiřazen na resourcu, ale ty nejsou přepočítané po změnách
  • předchozí chybě při updatu (a např. show assignments chodí):
    1. jakkoliv selhalo vyrobení identity na nějakém konektoru (např. generic ConnectorException)
    2. anebo něco selhalo kvuli chybám výše (associations+assignments)

Po opravě příčin (associations+assigments) je nutno znovupřepočítat identitu, ale bez preview.

ERROR (com.evolveum.midpoint.web.page.admin.PageAdminFocus): Could not create assignments preview..
java.lang.NullPointerException: null
	at com.evolveum.midpoint.model.impl.controller.SchemaTransformer.applySecurityConstraints(SchemaTransformer.java:446)
	at com.evolveum.midpoint.model.impl.controller.SchemaTransformer.lambda$applySchemasAndSecurityElementContext$2(SchemaTransformer.java:319)
	at com.evolveum.midpoint.model.impl.lens.LensFocusContext.forEachDelta(LensFocusContext.java:595)
	at com.evolveum.midpoint.model.impl.controller.SchemaTransformer.applySchemasAndSecurityElementContext(SchemaTransformer.java:318)
	at com.evolveum.midpoint.model.impl.controller.SchemaTransformer.applySchemasAndSecurityFocus(SchemaTransformer.java:274)
	at com.evolveum.midpoint.model.impl.controller.SchemaTransformer.applySchemasAndSecurity(SchemaTransformer.java:253)
	at com.evolveum.midpoint.model.impl.controller.ModelInteractionServiceImpl.previewChanges(ModelInteractionServiceImpl.java:255)
	at com.evolveum.midpoint.model.impl.controller.ModelInteractionServiceImpl.previewChanges(ModelInteractionServiceImpl.java:210)
	at sun.reflect.GeneratedMethodAccessor2016.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:197)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at com.evolveum.midpoint.util.aspect.MidpointInterceptor.wrapSubsystem(MidpointInterceptor.java:137)
	at com.evolveum.midpoint.util.aspect.MidpointInterceptor.invoke(MidpointInterceptor.java:53)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
	at com.sun.proxy.$Proxy221.previewChanges(Unknown Source)
	at sun.reflect.GeneratedMethodAccessor2016.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.wicket.proxy.LazyInitProxyFactory$JdkHandler.invoke(LazyInitProxyFactory.java:508)
	at com.sun.proxy.$Proxy298.previewChanges(Unknown Source)
	at com.evolveum.midpoint.web.page.admin.PageAdminFocus.showAllAssignmentsPerformed(PageAdminFocus.java:802)
	at com.evolveum.midpoint.web.component.assignment.AbstractRoleAssignmentPanel.showAllAssignments(AbstractRoleAssignmentPanel.java:143)
	at com.evolveum.midpoint.web.component.assignment.AbstractRoleAssignmentPanel$1.onClick(AbstractRoleAssignmentPanel.java:123)
	at org.apache.wicket.ajax.markup.html.AjaxLink$1.onEvent(AjaxLink.java:85)
	at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:155)
	at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:601)
	at sun.reflect.GeneratedMethodAccessor1261.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:258)
	at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:241)
	at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:248)
	at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:234)
	at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:895)
	at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)
	at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:265)
	at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:222)
	at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:293)
	at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:261)
	at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:203)
	at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:284)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.evolveum.midpoint.web.util.MidPointProfilingServletFilter.doFilter(MidPointProfilingServletFilter.java:87)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:155)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter.doFilter(AbstractPreAuthenticatedProcessingFilter.java:121)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:130)
	at org.springframework.boot.web.servlet.support.ErrorPageFilter.access$000(ErrorPageFilter.java:66)
	at org.springframework.boot.web.servlet.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:105)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:123)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:482)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:810)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1623)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

[editovat] org.apache.cxf.binding.soap.SoapFault: Couldn't convert query.

Pozorováno ve verzi: 3.9.1

Výjimka podobně univerzální jako ta předchozí - generic ConnectorException nebo chyba v korelacích při komunikaci s midPointem skrz web services.

[editovat] A different object with the same identifier value was already associated with the session

...com.evolveum.midpoint.repo.sql.data.common.any.ROExtString#ROExtStringId

Pozorováno ve verzi: 4.0.2

Nabořené repozitory. Neodpovídá m_object.fullobject s hodnotami vytaženými do databáze (např. m_object_ext_string).

Oprava: reindex task (trvá dlouho ==> stačí pro daný typ objektu a paralelizovat).

[editovat] Chyby

[editovat] ORA-12899: value too large for column XXX."M_AUDIT_EVENT"."TARGETOID"

Překročena maximální povolená délka OID, kterážto je 36 znaků.

[editovat] Prism context is not set in PrismTestUtil. Maybe a missing call to resetPrismContext(..) in test initialization?

Jde o nabořené shadow, stává se to při některých druzích výpadků resourců ve verzi midPoint 3.8. Chyba je pak při jakékoliv práci se shadows (např. get), tj. i při updatu identity.

Oprava: jedině smazáním shadow přes repo ninju, kde se nedělají kontroly (nahradit $OID za skutečné oid):

ninja.sh delete --oid $OID

Hromadná oprava (na čerstvých dumpech získaných přes snapshot.sh):

# kontrola stáří dumpu
ls -la /var/opt/midpoint/audit/shadows.xml

# jen vylistování:
# fix-shadow-object-change.py

# oprava
./fix-shadow-object-change.sh

[editovat] Force updaty

[editovat] Atributy

Jednotlivé atributy se přepočítají krz force+reconcile na identitě.

Ale ne vždy! Propagace se provádí jen podle detekovaných změn. Pokud se jedná pouze o výstupní systém (CRO-OUT, MAGION-OUT), může se hodit tam account úplně smazat a nově nahrát.

[editovat] Členství v organizacích

Pozor, tady je třeba velmi často jít přes role (PPV, STUDIUM).

[editovat] Sequence

Objekt typu sequence generuje ID (např. CroId Sequence pro CRO ID).

Položka count musí být větší než největší přidělené ID! A žádná unusedValues nesmí být přidělená! Pokud to tak není, bude docházet ke konfliktům a k opakovaným pokusům o použití té samé hodnoty (reclamation feature).

Mezery v řadě je možno řešit nastavením unusedValues.

Další featury: maxCounter, allowRewind - po přesažení maxima začne od nuly

[editovat] Autorizace

Ladění:

Každé autorizaci dát <name></name> a pak zapnout logování:

com.evolveum.midpoint.security: TRACE

[editovat] Úkoly

[editovat] Práce s RČ

Aktuálně funguje: počáteční "objevení" na základě RČ a propojení, a pak se aktualizuje.

Hodilo by se:

  • kontrola na základě data narození a jména (případně nějaká heurstika na podobnost jmen?) + ruční reakce/schválení
  • např. karanténí organizace je možná (ale ne nuná): template-people-with-rc-check.xml v našem gitu

[editovat] midPoint API + GUI

Určitě bude potřeba nějaké rozhraní pro uživatele (registrace kont, projekty, self-management).

  • umí GUI přímo midPoint? 3.4 slibuje "Custom GUI forms" na wicketech
  • k dispozici Web Services (vč. košatých typů)
  • k dispozici REST+XML
  • (šlo by mít i nějakou propojovací tabulku, ale dokumentace midPoint slibuje víc)
  • hodila by se delegovaá autentizace

Potřeba:

[editovat] Audit

Rádi bychom audit vybraných operací:

  • vznik/zánik/změna osoby v autorizovaných agendách
  • import CROID z CRO, přidělení CRO ID
  • registrace konta (import loginu)
  • aktivace/deaktivace identity
  • důležité atributy (klíče, ...)

Dokumentace:

midPoint API pro logger:

  • různé události: ADD, MODIFY, DELETE, RECONCILIATION, ...
  • delta pro každou změnu (a pro každý měněný resource)
  • různé typy objektů (user, role)

Stav:

  • PROOF-OF-CONCEPT
  • repozitář midpoint-overlay, branch audit
  • nakonec jiné řešení - dump repozitáře a sledování rozdílů

[editovat] Grouper GUI

  • prozkoumat možnost propojení s mailinglisty (správci mailinglistů)
    • víc "typů" skupin
    • jednotné GUI (=náhrada mailmana)?
  • portálová aplikace (koncepčnější a pracnější) vs nativní GUI midPointu (škoda nevyužít, ale nejde čistě zandat o portálu)

[editovat] Import

(náhodné poznámky)

  • nejprve promazat tabulky v CRO-OUT a/nebo provézt rekonciliace CRO-OUT
TRUNCATE TABLE IDM_MRTVOLY;
TRUNCATE TABLE IDM_OSOBY;
TRUNCATE TABLE IDM_POZICE;
  • po importu zkontrolovat identity v CRO, co nejsou v midPointu (kvuli duplicitám CRO_ID!)
  • TODO: historie CRO_ID...

[editovat] Krátkodobé úkoly

[editovat] Rozšíření pohledů MAGION

  • RODNE_PRIJMENI
  • STAT_IDNO_OBCA_NAME: jmenná hodnota státního občanství
  • STAT_IDNO_OBCANSTVI: číselníková hodnota

[editovat] Archivní CRO ID

Do midPointu nahrát i "stub" identity s informacemi:

  • CRO_ID
  • poslední RČ

U nás asi připravit pohled. Pak buď UNIONovat v existujícím MP resourcu CRO nebo umět jednorázový import.

[editovat] Reporty

  • zauvažovat o reportování změn RČ v Magionu [RT #274023]
  • další věci: viz "Co hlídat" v dokumentaci jednotlivých resourců

[editovat] Autentizace

  • náhrada Webauth za Shibboleth
  • delegace do REST API - akce pouštěné uživateli pomocí GUI mimo midPoint

Info k midPiout 4.1: https://wiki.evolveum.com/display/midPoint/Flexible+Authentication+Configuration .

[editovat] Revize

  • revize rolí a dalších objektů v midPoint s ohledem na nové funkce od 3.9+ a 4+ (archetype, nové best practices, kontrola postupných inkrementálních změn...)
  • zřejmě chyby kolem managerů skupin - je-li managerem role
  • https://wiki.evolveum.com/display/midPoint/Linked+objects (4.2+) - např. závislost PPV/uživatel u HR, studium/student u IS/STAG
  • využít midPrivacy (budoucnost) - náhrada výpočtu kombinací atributů z Magion/Stag za profily?

[editovat] Výkon

Optimalizace. Např. vzorek z výkonu recompute:

Containing objectInvocations countAvg timeMinMaxTotal time
ZCU: Posix Group12337136104867515216562
USER: Template300065510410523724207
STAG-Teachers1835283039328669999

==> zřejmě nějak omezit výpočty skupin? Viz také revize.

[editovat] Grouper -> midPoint

Revize a konzultace kolem přechodu z Grouper na midPoint.

  1. Magion - nemizí PM
  2. Magion - chybí členové v dohodářích
  3. Magion + Stag - máme všude správně hierarchie?
  4. manažeři vs členství - vyoadá to, že se managerství skupiny indukuje na uživatele

[editovat] Úkoly - hotovo

  • grupová aritmetika: přes inducement/assignement, asociace+shortcut

[editovat] Vývoj

[editovat] Infrastruktura

Git repozitáře + continuous integration:

Maven repozitáře:

[editovat] Testovací prostředí

Malé lokální prostředí - emulace a testovací data v lokálních databázích, vlastní Stag WS, instalační postupy, ...

[editovat] Testsuite

Automatizované testy: midPoint + testovací prostředí

https://gitlab.meta.zcu.cz/midpoint/testsuite

[editovat] Eclipse GUI

Eclipse + midPoint plugin.

[editovat] Best practices

[editovat] Import do git repozitáře

  1. Před importem objektu do repozitáře dobré XML promazat. U konektorů generované schema a native cap.
  2. U konektorů: parametry resourcu přesunout do properties
  3. U konektorů: lze využít i "Smart References", např.:
    <resource>
       ...
       <connectorRef type="ConnectorType">
         <filter>
           <q:equal>
             <q:path>c:connectorType</q:path>
             <q:value>org.identityconnectors.ldap.LdapConnector</q:value>
           </q:equal>
         </filter>
       </connectorRef>
       ...
     </resource>

[editovat] Tolerance atributu - tag tolerant

Default je true (tedy non-intrusive). Ale u single-valued hodnot doporučeno použít vždy <tolerant>false</tolerant> (pouze s outbound mapping!), protože tolerant true by rušenou hodnotu nesmazala.

Bacha: nenechat se zmást existujícím inbound mapping. Mazání hodnoty s tolerant=false se provede vždy, pokud chybí outbound mapping.

Novinka v midPoint 4.x:

  • v inbound u multihodnot vždy používat <set><predefined>all</predefined></set>

[editovat] FATAL ERROR z konektorů

Jít po "FATAL ERROR" z konektorů.

Obecná vyjímka ConnectorException způsobuje FATAL ERROR na celé identitě. V kódu konektorů je dobré používat podrobnější rozlišení podle https://wiki.evolveum.com/display/midPoint/Connector+Development+Guide#ConnectorDevelopmentGuide-Errorhandling , kdy pak midPoint "nepanikaří" a reaguje správně podle dané situace.

[editovat] Normalizační politika

Výchozí politika midPointu je dost nepoužitelná. Nastavit alespoň méně agresivní Ascii7PolyStringNormalizer.

V SystemConfiguration:

<internals>
        <polyStringNormalizer>
                <t:className>Ascii7PolyStringNormalizer</t:className>
        </polyStringNormalizer>
</internals>

Po změně je potřeba přeindexovat repozitář. Bacha, admin pouštící reindex task nesmí mít žádné atributy typu PolyString, jejichž normalizovaná hodnota by byla ovlivněna změnou normalizační politiky (např. titul obsahující tečku, apod.).

[editovat] Connector connection pool

Viz connector-framework: ObjectPoolConfiguration.java

[editovat] Parametry

maxObjects = 10:

Max objects (idle+active).

maxIdle = 10:

Max idle objects.

maxWait = 150 * 1000:

Max time to wait if the pool is waiting for a free object to become available before failing. Zero means don't wait.

minEvictableIdleTimeMillis = 120 * 1000:

Minimum time to wait before evicting an idle object. Zero means don't wait.

minIdle = 1:

Minimum number of idle objects.

[editovat] Poznámky

Musí platit maxObjects >= maxIdle.

V konektoru je dobré mít spolehlivý test checkAlive().

Pokud checkAlive() není a víme, že je potřeba omezit čas idle spojení (různé timeouty, apod.), je možno nastavit minIdle=0 (tj. žádné trvale otevřené spojení) a minEvictableIdleTimeMillis na čas menší než timeout.

[editovat] Odstranění resourcu

Při odstraňování resourcu je dobré nejprve odstranit většinu závislostí:

  1. zkontrolovat customizace (XML objekty)
  2. modifikovat a pustit tasky Purge Org linkRefs, Purge User linkRefs, ...
  3. v Repository objects odstranit odpovídající shadow objekty

Odkazy na resource v midPointu zůstávají i jinde (audity - odrotuje se časem pryč, historie operací u objektů, ...).

[editovat] Release konektoru

Best-practice - hodí se znát verze aktuálně používaných konektorů a SW nebo při vystavování konektorů všem.

Releasujeme midpont-overlay, midpoint-utils, connector-parent a většinu konektorů. Využívá se maven-release-plugin.

Postup:

1) housekeeing (rok copyrightu v licenci, bundle.version, verze connector-parent, verze závislostí v .gitlab-ci.xml, apod.)

  • tip: find . -type f -exec bash -c 'grep -q "Copyright.*CESNET" {} && sed -i "0,/2020/s//2021/" {}' \;

2) kontrola + testy lokálně

3) vlastní release - zeptá se na verzi (major, minor, patch)

   mvn release:clean release:prepare release:perform
   git log -p
   git push origin HEAD --tags

4) gitLab CI

"keep" na buildu.

5) upload na AFS, adresář /afs/zcu.cz/project/software/register/midpoint/icf-connectors

6) midPoint

Při změně bundle.version: a) promazat původní verzi connector objektu z repozitáře, b) ./autodeployment.sh, c) znovunaimportovat resource.

[editovat] Přidání resourcu

Analýza:

  • jaké identity, primární klíč, workflow (enable, deprovisioning), atributy

Postup - tipy:

  • activation/existence: nutno použít při použití skupin (např. v nějakých skupinách podle IS/STAG, ale nemá orion konto, ...)
  • ObjectTemplate v Sychronization object: include User-Template, případně další (např. pokud sync ovlivňuje globální stav, ...)

Jedná se o zdroj identit? (Magion, IS/STAG, externí identity):

  1. pomocné interní atributy v midpoint-overlay (potřebujeme vědět, co je zdrojem, při výpočtu atributů v IdM - jméno, příjmení, midPoint name, stav/ektivita, ...)
  2. pokud jde o zapisovací resource (importují se pouze externisti):
    • výhybka pro $projection/attributes/ri:*
    • rozšířit ZCU-Utils.xml/getAttributeValue() - zahrnutí do výpočtů
  3. rozšířit základní atributy v User-Template (name, givenName, familyName)

[editovat] Aktuální stav

[editovat] Resourcy

Atributy evidovány tady:

https://docs.google.com/spreadsheets/d/1BDuMNR9ztIugXJ4-Spqzo6hLhHBTPg1hMhk3ZFMgwA8

[editovat] Kerberos

Existuje nativní connector pro Kerberos:

Napsali jsme si nativní MIT kerneros connector:

TODO: používat OP_ALLOW_PARTIAL_ATTRIBUTE_VALUES podle http://connid.tirasa.net/apidocs/1.4/org/identityconnectors/framework/common/objects/OperationOptions.html#OP_ALLOW_PARTIAL_ATTRIBUTE_VALUES

[editovat] Magion

LPS:IdM/midPoint/Magion

[editovat] Stag číselníky

Pracoviště a číselníky.

LPS:IdM/midPoint/Stag#Stag číselníky

Co hlídat:

  • stub pracoviště
  • pracoviště bez rodiče

[editovat] Stag učitelé

LPS:IdM/midPoint/Stag#Stag učitelé

  • UCIT_IDNO - stejný identifikátor pro externisty i zaměstnance
  • STAT_IDNO_OBCANSTVI - CRO čerpá z V_PE_ZCU_ZAM.PRISLUSNOST, "???" nahrazovat za "CZ"; ale nahrazovat podle Stag číselníku :-(

[editovat] Stag studenti

LPS:IdM/midPoint/Stag#Stag studenti

  • studia: role vázaná na osobu
  • předměty: role vázaná na roli studia

Co hlídat:

  • STAG_STAV_STUDENTA: N=bez studijních rolí, S=má studijní role

[editovat] Grouper

LPS:IdM/midPoint/Grouper

  • skupiny: mng stem z grouperu (vyjma mng:sprava) + členství
  • administrace: mng:sprava - bez členství (jen na experimenty)

[editovat] CRO-OUT

LPS:IdM/midPoint/CRO-OUT

[editovat] Sun IdM

LPS:IdM/midPoint/SunIdM

[editovat] Role

Typy rolí:

  • login-role
  • auth-role - role pro autorizace (monitoring)
  • pm - pracovní místo z Magionu ("funkce na osobě/úvazku")
  • system (Approver, End User, Reviewer, Superuser)
  • (null) (Delegator)

[editovat] Rekonciliace

Aktuální časy viz object/tasks/*Recon.xml z repozitáře xml-objects.

čas task
0 0 1 * * ? HR: Org.Str. Recon
0 0 2 * * ? HR: PM-Recon
0 0 3 * * ? STAG: Pracoviste-Recon
0 0 3 * * ? CRO-OUT: User-Recon
0 0 4 * * ? CRO-OUT: PPV-Recon
0 0 4 * * ? HR: PPV-Recon
0 20 4 * * ? CRO-OUT: Studium-Recon
0 40 4 * * ? CRO-OUT: Doktorand-Recon
0 40 4 * * * ? HR: User-Recon
0 30 5 * * ? STAG: Studiums-Recon
0 0 6 * * ? SunIdm: Users-Recon
0 30 6 * * ? STAG: Students-Recon
0 0 7 * * ? STAG: Predmety-Recon
0 0 8 ? * SAT MAGION-OUT: Person-Recon
0 15 8 * * ? STAG: Ucitel-Recon
0 30 8 ? * SAT MAGION-OUT: User-Recon
0 0 22 * * ? HR: Global Staff Recon
0 5 22 * * ? HR: Global DPP-DPČ Recon
0 10 22 * * ? STAG: Global Doktorand Recon
0 15 22 * * ? STAG: Global Subject Recon
0 20 22 * * ? HR: Global Manager Dpt Recon
0 20 22 * * ? STAG: Global Student Recon
0 25 22 * * ? HR: Global Secretariat Recon
0 25 22 * * ? STAG: Global Typ Studia Recon
0 30 22 * * ? HR: Global Secretary Dpt Recon
0 30 22 * * ? STAG: Global Forma Studia Recon
0 15 23 ** ? Grouper: Group-Recon
0 20 23 ** ? Grouper: Memberships-Recon
0 30 23 ** ? MAGION-OUT: Access-Recon
0 40 23 ** ? Souhlas: User-Recon

[editovat] Upstream

Problémy:

  • listování uživatelů: nepoužitelně dlouho trvá, error 500 - možná kvuli končící podpoře pro Oracle
  • nelze slibovat spolehlivost v rychlosti (liveSync občas selže), viz MID-4930

Bugs:

Features:

  • https://jira.evolveum.com/browse/MID-3934 Synchronization with Kind/Intent settings and multiple intents
  • https://jira.evolveum.com/browse/MID-1693 Add an option to update (midPoint user) attribute value when account is deleted
  • pouštění tasků přes SOAP WS - SOAP WS označen za deprecated
  • tagované atributy u LDAP, nebo možnost lokálního rozšiřování resource schematu ==> vlastní fork konektoru https://ipmil.civ.zcu.cz/midpoint/connector-ldap
  • hikari zabilo výkon - hodila by se možnost použití c3p0
  • tomcat bundlovaný v midpoint.war - externí tomcat funguje a provozujem tak, ale to není podporováno
  • málo stabilních releasů - stabilní větve jsou
  • odklon vývojářů on Oracle - v budoucnu bude podporován pouze postgresql

[editovat] TODO

(k implementaci nebo otestování)

Uživatelské jméno se smazalo, i když pracovní poměr měl další den pokračování. Předávám ještě požadavek dál s návrhem, zda v podobných případech, kdy orion konto nekončí, aby uživatelské jméno ve Stagu zůstalo.

  • pohledy do CRO: vylepšit filtrování duplicit mezi aktivními a neaktivními identitami
  • ověřit možnost registrace 20 dní před aktivací v Magionu (aktuálně člověk nateče, ale jako naktivní)
  • primárná pozice při úplném zmizení PPV/studium role (na změnu asi reaguje OK, ale při selhaném updatu je midPoint rozhozen)

[editovat] Use-casy

... konkrétní současné problémy z produkce.

[RT #274023]

  • problém: při změně RČ v Magionu se změní "globální" RČ v CRO a tím pádem zmizí propojení v tabulce učitelů ve Stagu
  • midPoint: link je přes jiný identifikátor s učiteli (zatím croId, ale asi bychom chtěli ucitidni), RČ jen jako korelace

[[1]] ISKaM

  • přenášet i národnost

[editovat] Postupy

[editovat] Seznam emailů zaměstnanců

Např. přes skripty:

./query-user.py --csv=extension/ext:HR_OS_CIS,emailAddress extension/ext:HR_ENABLED=true

[editovat] Přejmenování konta

  1. Sun IdM: CRO Unlink User
  2. midPoint:
    • remove login
    • change status na "N1" (jak zcuStatus, tak SUNIDM_WFSTATUS, jinak se to pak nepřeklopí správně pří registrace konta)
    • reset Unix ID
    • nastavení registračního hesla
    • rename to CRO ID
    • unlink Kerberos (aby nezmizelo staré heslo)
    • unlink Email (aby nebyl pokus o smazání schránky - i když neblokované jsou chráněné)
    • unlink Office365 (aby neskončilo v koši - špatně se to z koše vyndavá)
  3. Sun IdM: čekat na dotečení přes activeSync CRO
  4. registrace konta
  5. ruční práce - návazné systémy používající na login
    • Magion [sis]: detekuje a upozorňuje Sun IdM (někteří zaměstnanci) zkontrolovat v midPointu
    • Courseware [sis]: (zaměstanci nebo doktorandi, co mají nějaký předmětm)
    • vizitka [dané pracoviště]: (zaměstnanci)
    • ...a další
  6. midPoint - import starého konta (nový LDAP a shibboleth, ...)
    read oldName newName givenName sn croId unixId mx
    
    cat >cloned.csv <<EOF
    name,extension/ext:login,extension/ext:zcuStatus,subtype,givenName,familyName,employeeNumber,extension/ext:unixId,extension/ext:zcuMX,extension/ext:validToHost
    $oldName,$oldName,A2,HOST,$givenName,$sn,$croId,$unixId,$mx,`date --date='+14 days' --iso=seconds`
    EOF
    ./create.py --csv cloned.csv -a types-org-str-renamed:org
    ./merge.py $oldName $newName -s now -d 'Přejmenování loginu' -i https://rt.zcu.cz/rt/Ticket/Display.html?id=...
  7. import z Office365 (nějaký problém s discovery v midPointu)
  8. dát vědět do ext-apps: potřeba ruční zásah v Office365 (i když kritické je to možná až před fyzickým mazáním)

Krok 2 je nově po náhradě původního CRO za emulované z midPointu - není tak těsná iterakce Sun IdM s emulovaným CRO.

[editovat] Propojení konta a osoby

Složitější - někdy přepojit pouze Stag/Magion, ...

TODO2: nezapomenout na PPV a studium role (při přepojení osoby/změně CRO ID)

[editovat] Prohození Stagu

  • unlink Stag-Students
  • prohodit Stag: ID osoby
  • merge (aby se nekorelovalo s neaktivní identitou)
  • import

[editovat] Křížový update JIS

  • TODO: není vyřešen merge
  • TODO2: není vyřešena situace, kdy jsou prohozené CRO ID a RČ (oba údaje musí být unikátní, ...)

=> ruční update přes fakk RČ

[editovat] Přepojení Magionu

  • na deaktivované identitě smazat HR: osobní číslo a uložit k aktivované (aby se správně přepojilo PPV)
  • také opravit PPV (nutno odlinkovat Magion a smazat CRO a pak import)

[editovat] Oprava blokace

Někeré selhané updaty při blokaci nelze vyřešit pomocí Recompute - reakce jsou často na změnu.

Teoreticky lze provézt opravu pouze ručním překmitem stavových atributů "HR: Aktivní" a/nebo "Stag: stav studia". Ale při přepínání identity stavu do A1 se posílají notifikace.

Postup opravy:

  1. kontrola, zda má být identita blokována (není Magion, není Stag nebo stav studia N) + kontrola/vyřešení původních příčin selhání (známý bug kolem DB zámků, duplicita shadow, ...)
  2. rekonciliace rolí (případně lze updatovat jednotlivé role)
    • PPV (z Magionu)
    • STUDIUM (ze Stagu)
  3. ruční update identity:
    • atributy:
      • smazat Typ vztahu (řízení některých výpočtů)
      • smazat/zkontrolovat HR: PPV, Stag: Studium (řízení rolí - pozic)
      • nastavit/zkontrolovat HR: Aktivní, HR: Aktuálně aktivní na false (řízení mnoha výpočtů)
      • nastavit/zkontrolovat HR: Datum výstupu (řízení expirace ve workflow, ale hlídá se v reportech)
      • nastavit/zkontrolovat Stag: stav studia, 'Stag: aktuální stav studia' na N (řízení mnoha výpočtů)
      • nastavit/zkontrolovat Stag: Datum výstupu (řízení expirace ve workflow, ale hlídá se v reportech)
      • smazat/zkontrolovat Stag: souhrn* (jen kosmetika, ale mátlo by to)
      • smazat Kolej (pokud nejde o hosta nebo ISKaM identitu)
    • assignments: zrušit přiřazení resourců (CRO OUT, JIS Osoby, Magion OUT*, Teachers, ...), rolí (ZCU People*, ZCU User*; ale nechat ZCU User a ZCU Active User), organizací (Aktivní)
    • activationStatus: disable

[editovat] Přepojení identity na jiný účet na resourcu

...tj. změna account name.

  1. Resources ->> List resources
  2. na resourcu smazat účet
  3. přeuložit identitu - správný účet se připojí/založí v rámci discovery

Poznámka: Nejde smazat a popřepojovat resource přímo na identitě.

[editovat] Audity

Každé 4 hodiny se pouští získávání všech uživatelů, rolí a shadow, ukládá se ve formě CSV souborů.

Umístění: /var/opt/midpoint/audit/<ROK>.

[editovat] Kontroly

V rámci získávání auditů se pouští i kontroly dat (interní konzistence v midPointu, porovnání s JIS resource, ...).

Výsledky: /var/opt/midpoint/audit/snapshot.log (jen interní konzisence) a /var/opt/midpoint/audit/report.log (podrobnější)

Příklady dalších dodatečných kontrol:

./query-user.py activation/administrativeStatus=enabled subtype=NEAKTIVNI extension/ext:STAG_STAV_STUDIA=N -p max_size=100 --csv name,employeeNumber,zcuStatus,subtype,extension/ext:rodneCislo
./query-user.py activation/administrativeStatus=enabled subtype=NEAKTIVNI extension/ext:HR_ENABLED=false -p max_size=100 --csv name,employeeNumber,zcuStatus,subtype,extension/ext:rodneCislo

[editovat] Změna primárního emailu

Řízeno midPointem, změna přenášena do Sun IdM. (2020-01-18, od záři 2020)

Změna v midPointu administrátorem (nahradit $LOGIN na login a $DOMAIN za doménu bez ".zcu.cz"):

./modify-user-by-name.py $LOGIN extension/ext:IDM_DEFAULT_EMAIL_DOMAIN_SELECTED=false extension/ext:IDM_CUSTOM_EMAIL_DOMAIN=$DOMAIN

[editovat] Duplicita identit

Potřeba dát vědět na UIA (nejrůznější detaily v IS/STAG: přihlášky, ... a v Magionu, omylem zadané slovenské RČ jako české, apod.). Ve finále potřeba také merge v ISKaMu.

Většinou vede na kontrolu na personální (Magion) nebo studijní oddělení (IS/STAG). Ve Stagu může být pak potřeba merge od databázistů, podle aktuálního napojení na JIS/Orion pak dobré preferovat jako hlavní tu správnou identitu ve Stagu. (tohle vše řeší UIA, lze dodat to doporučení pro Stag)

Postup:

  1. RT do sis kvůli úpravám v Magion / IS/STAG
    Příklad získání dat (pro každou identitu): ./details.py -f id name=NAME
  2. opravit v IdM (zkontrolovat, správně propojit, updatovat, ...)
  3. opravit v Sun IdM - propojení Aleph nebo pročištšní v Alephu
  4. uložit informaci do IdM (využívá se v korelačních pravidlech, ale teoreticky by šlo i někam exportovat):
    ./merge.py NAME_FROM NAME_TO -i RT_URL -d POPIS -s now

    Poznámka: tool očekává v argumenteh názvy identit (tj. login, a pokud není konto, tak CRO ID)
    Poznámka2: výsledek je, že mergovaná identita obsahuje atribut merge ukazující na originál.
    Poznámka3: Script nedělá vše, např. promazání/modifikace "HR: PPV" a "Stag: studium".

[editovat] Stínové identity - klonování

Použití:

  • zbytek po přejmenování (Orion)
  • fyzické mazání (Orion)

Stejný mechanizmus jako u duplicit.

Postup (TODO: komplikovaný, doladit):

  1. blokace: např. stav NB2 nebo B2
    (smazat také shadow čekající na smazání v ISKaMu)
  2. promazání "HR: PPV" a "Stag: studium"
  3. TODO: vyrobení nové identity
  4. ./merge.py NAME_OLD NAME_NEW -d "fyzické mazání ROK" -s now
  5. pro každý zdrojový systém: rekonciliace

[editovat] Import hostovských karet

Jde o hostovské karty importované do ISKaMu. Importuje se z CSV souboru ve formátu: RC;JIS_CHIP;JIS_NO;CRO_ID

  1. zkontrolovat CRO_ID (namátkově, že první je volné)
  2. kouknout na následující pořadové číslo
  3. vybrat si typ karty:
    • CS: 7777777100 ... 7777779000
    • E: ostatní
  4. kontrola importu - pořadí položek, apod., např. (upravit parametry):
    ./create-jis-host.py --csv karty_cizi_student_20.csv --seq 1400 --type CS --given-name Cizí --family-name Student --dry-run
    ./create-jis-host.py --csv Witte_karty5b.csv --seq 86 --type E --given-name Witte  --family-name Automotive --dry-run
  5. puštšní importu (odstanit --dry-run)

[editovat] Katedry a pracoviště

TODO: zkonzolidovat s hlavním postupem na LPS:IdM/Katedry a pracoviště

[editovat] Poštovní doména

Počítá se podle "pozic" osoby a hierarchicky podle pracovišť:

  1. midPoint: na základě organizačních stromů z "HR" a "IS/STAG".
  2. Sun IdM: na základě tabulky *IDM_PRACOVISTE@GINA*

Postup změny poštovní domény:

  1. nastavit položku *c:mailDomain* na organizačních jednotkách v midPointu
  2. nastavit položku *DOMENA* v tabulce *IDM_PRACOVISTE@GINA*
  3. recompute postižených uživatelů

[editovat] Fakulta

Oproti katedrám a nefaktulnícm pracovištím kroky navíc - založení skupiny a dalších věcí.

GID=... # <1000
fak=... # zkratka fakulty malými
FAK=${fak^^} # zkratka fakulty velkými

1) zaměstnanci "$fak" (zkontrolovat, že to našlo )

./group-department.py ${fak}

Zkontrolovat:

  • "HR: ${FAK} (${depno})"
  • "GLOBAL: Doktorandi ${FAK} (${depno})"

2) studenti "students-$fak"

./group-department.py -g $GID -s "Studenti $FAK" students-${fak}
#./query-role.py extension/ext:GROUP_ZKRATKA=${FAK} subtype=stag-global-group-student | head -n 10
##==> $OID
#read OID
#./modify-role.py --oid $OID -a role-group-students-${fak}:role
./modify-role.py -q "name startsWith GLOBAL: Studenti $FAK (" -a role-group-students-${fak}:role
./modify-role.py -q subtype=stag-global-group-doktorand extension/ext:GROUP_ZKRATKA=${FAK} -a role-group-students-${fak}:role

3) shibboleth entitlement (viz LPS:IdM/midPoint/LDAP#SAML)

./modify-role-by-name.py "GROUP: $fak" -a role-login-ldap-edu-faculties:role
./modify-role-by-name.py "GROUP: students-$fak" -a role-login-ldap-edu-faculties:role
# zvážit, zda jde o technickou fakultu
#./modify-role-by-name.py "GROUP: $fak" -a role-login-ldap-edu-technical:role
  1. ./modify-role-by-name.py "GROUP: students-$fak" -a role-login-ldap-edu-technical:role

4) funkční skupiny

# tajemnici-FAK

./query-role.py "name startsWith GROUPER: mng:tajemnici-$fak"
MNG_TAJEMNICI_FAK_OID=...
TAJEMNICI_FAK_GID=...

./group.py -g $TAJEMNICI_FAK_GID tajemnici-$fak -s "Tajemníci $FAK"
./modify-role.py --query "name startsWith GLOBAL: Tajemník $FAK" -a role-group-tajemnici-$fak:role
./modify-role.py --query "name startsWith GLOBAL: Tajemník $FAK" -a $MNG_TAJEMNICI_FAK_OID:role

[editovat] Hostovská konta

Zakládají se v midPointu. Spolu s ostatními konty se pak ještě přenáší do Sun IdM.

Poznámka: hostovská role řízena položkou hostValidTo. Pozor na její rušení.

TODO: volitelně může mít i CRO ID (employeeNumber). Aktuálně se generuje pouze uživatelům aktivních v ZČU agendách.

[editovat] Založení

Import (může být i z GUI):

read login givenName sn domain

cat > hosts.csv <<EOF
extension/ext:login,subtype,givenName,familyName,extension/ext:zcuStatus,extension/ext:validToHost,extension/ext:IDM_DEFAULT_EMAIL_DOMAIN
$login,HOST,$givenName,$sn,A2,`date --date='+1 year' --iso=seconds`,$domain
EOF
./create.py --csv ./hosts.csv -g GARANT_LOGIN

[editovat] Blokace

Update položek:

  • zcuStatus: na B1 (pouze pokud nemá být aktivní z jiných důvodů, pak má zůstat A1)
  • hostValidTo: na dnes (nemazat!)
  • validTo: na dnes (tady jde jen o správnou informace o blokaci např. kvuli fyzickému mazání)
  • (garant): možno smazat, pokud bylo konto zároveň napojeno na univerzitní agendy a garant se již ke kontu nehlásí

[editovat] Přidělení CRO ID

Problematické z důvodu, že se nesmí nikdy recyklovat u stejného člověka. Tj. je nutno zamezit problémům s duplicitami.

Podmínky pro přidělení (alespoň jedna):

  • konto nenapojené na člověka ("nelidské konto" - servisní, firma, nikdy se nebude propojovat s člověkem...)
  • hostovské konto s ověřeným RČ (ideálně bývalý student/zaměstnanec)

Postup pro servisní konto:

  1. vybrat volné číslo z rozsahu 666000 a výš
  2. kontrola, že CRO ID není použité (v položce employeeNumber)
  3. editace položek: employeeNumber (CRO ID)

Postup pro hostovské konto:

  1. globálně vypnout tasky
  2. zkontrolovat, že neběží žádný task typu liveSync
  3. Repository objects -> Sequence, editace CroId Sequence zvýšit counter o 1 ==> půvoní counter je CRO ID
  4. kontrola, že CRO ID není použité (v položce employeeNumber)
  5. editace položek: employeeNumber (CRO ID), případně rodneCislo
  6. globálně znovupuštění tasků

[editovat] Převedení na hostovské

Musí o to žádat/souhlasit garant (bezpečnost) i vlastník konta (ochrana soukromí).

  1. nastavení garanta a prodloužení:
    ./modify-user.py --query name=$LOGIN -g $GARANT_LOGIN -- extension/ext:validToHost=`date -d '1 year' '+%Y-%m-%dT00:00:00+01:00'` extension/ext:zcuStatus=A2
  2. (pokud požadováno) role učitel:./modify-user.py --query name=$LOGIN -a role-idm-teachers:role:ext:managed - lze pouze s předem zadanými externisty v IS/STAG nebo bývalými zaměstnanci/doktorandy; doplní mj. login do tabulky ORION_UCITELE
  3. (pokud požadováno) gapps: self-management skupina v midPointu

[editovat] Registrace

[editovat] Jak to funguje

  1. Prvotní natečení identity z agend ZČU:
    1. midPoint: přiteče identita - pro aktivní (IS/STAG, Magion) počáteční stav N0 (jinak NB a nic dalšího se nedělá)
    2. midPoint: task Get Pwd From JIS Task (N0-N1) nebo přeuložení - nastaví registrační heslo a přepne stav N0 -> N1 a pošle do CRO (pro Sun IdM a další DB pohledy)
    3. Sun IdM: activeSync CRO: nacucne si identitu bez loginu a pošle do všech odpovídajících resourců spravovaných ještě postaru (Aleph, DB, ...)
    ==> máme identitu ve stavu N1 a s registračním heslem
  2. Registrace konta:
    1. uživatel: registrace na [2] - v midPointu to přepne stav na A0, nastaví login a heslo lokálně v midPointu, v DB nastaví souhlasy
    2. midPoint: task Post-Registration Task (A0-A1): přepnutí identity do A1 a nastavení všech spravovaných resourců - mj. Kerberos (heslo), Orion (Sun IdM), LDAP (shibboleth a další), Email, ...
    3. Sun IdM: activeSync midPoint: přiteče identita, zavolá se interní registrační proces, propagace do všech zbylých resourců spravovaných ještě postaru (rename na login v DB, AFS, starý LDAP, ...)
    4. další procesy: Grouper trychtýř (perioda 1 hodina), SMP (perioda 1 hodina)
    ==> celý proces vč. wifi: cca 2,5 hodiny

[editovat] Co kontrolovat

  • procesy v midPointu (icinga)
  • jestli se uživatel založil v Kerberu (první fáze registrace v midPointu)
  • stav registrace v midPoinut
  • stav synchronizace midPoint -> Sun IdM (viz dále)

Nedoběhlé registrace v midPoint:

./query-user.py 'extension/ext:login?' extension/ext:zcuStatus=N1 --csv name,employeeNumber,extension/ext:zcuStatus

Nedoběhlé registrace v Sun IdM:

  • find users -> "user has midPoint resource", "user in Top:ZCU:People"
  • naládovat do Server tasks -> Run task -> ZCU Netscape, vybrat POST_REGISTRATION

Nebo důkladnější kontrola v DB:

SELECT o.* FROM idm_orion o, sun_idm.idm_users u WHERE o.login=u.login(+) AND (u.login IS NULL OR u.wfstatus='N1');

[editovat] Statistiky

Studenti na fakultě:

SELECT DISTINCT login || '@' || domena || '.zcu.cz' AS email FROM idm_orion o, (SELECT cro_id FROM idm_pozice WHERE typ_osoby IN ('STUDENT', 'DOKTORAND') AND (stredisko LIKE '2342%' OR stredisko LIKE '42%')) p WHERE o.cro_id(+)=p.cro_id AND o.stav='A1';

Pivo s rektorem:

-- TODO: mainDepartmentNumber
SELECT o.cro_id, regexp_replace(jmeno, ',', '?') AS jmeno, prijmeni, jis_cislo_karty, jis_cislo_na_karte, p.typ_osoby, MAX(p.stredisko) AS stredisko FROM idm_osoby o, idm_pozice p WHERE o.cro_id=p.cro_id AND jis_cislo_karty IS NOT NULL AND jis_cislo_na_karte IS NOT NULL GROUP BY (o.cro_id, jmeno, prijmeni, jis_cislo_karty, jis_cislo_na_karte, p.typ_osoby) ORDER BY stredisko, o.cro_id;

[editovat] Rezervace loginů

[editovat] Fronta v RT

n=NAZEV_FRONTY

python2 ./create-user.py name=$n familyName=$n emailAddress=$n@service.zcu.cz description='fronta v RT' subtype=SYSTEM -a types-org-str-rt:org

[editovat] Self-management skupina

  • self-management skupina
id=googleplus
./create-role.py subtype=self-role "name=SELF: $id" displayName="$id" description="Skupina pro přiřazení učitelské licence na gapps"  requestable=false
OID=$(./query-role.py subtype=self-role displayName="$id")
./modify-role.py --oid $OID extension/ext:requestableGroups+=staff
./modify-role.py --oid $OID extension/ext:requestableGroups+=doktorand
  • export do LDAP
# vyrobení skupiny
./group.py $id
# přičítání self-management skupiny
./modify-role.py --oid $OID -a role-group-$id:role
  • po kontrole a počátečním nastavení členů povolit pro GUI
./modify-role.py --oid $OID requestable=true

Pro kritické věci zvážení doplnění dodatačného čisticího kódu do role "SELF: $id".

Osobní nástroje
Jmenné prostory

Varianty
Zobrazení
Akce
Kdo jsem
Navigace
Často hledaná témata
Nástroje