FileNet Content Navigator: “CIWEB2039 – The AccePlugin plug-in contains errors”

After upgrading IBM Connections 5.0 to  5.0 CR2 and upgrading the FileNet Content Navigator you see the error “CIWEB2039 – The AccePlugin plug-in contains errors” if you try to load the ACCE (Filenet Admin Console). To resolve that, add the following line to the HTTPD.CONF of your web server(s) and restart the web server(s):

SetEnvIf Request_URI ^/acce(.*) no-gzip dont-vary

 

You might also need to clear your browser cache. Afterwards the ACCE should load successfully again.

On demand VPN with iOS and OpenVPN

I can connect to my internal network from outside via an OpenVPN tunnel. However I need to manually start the VPN connection on my iPhone or iPad every time before I want to access one of my internal machines. So I looked for a way to automate that and starting the VPN connection with OpenVPN on my iOS devices on demand.

Here I describe the steps which I have done to obtain that:

I assume that you already have a working VPN connection from your iOS device via OpenVPN and have access to the certificate files you created for that.

First you need to create a certificate file in PKCS12 format which contains both your certificate and your private key. I have created that file with the following OpenSSL command:

[codesyntax lang=”text” lines=”no” blockstate=”expanded”]

openssl pkcs12 -export -inkey your_private_key_file.key -in your_certificate_file.crt -name a_name_for_your_certificate -out your_pkcs12_file.p12

[/codesyntax]

Now we need to create a mobile configuration profile for iOS. As the “Apple Configuration Tool for Windows” no longer exists and the official tool “Apple Configurator” is only available for Mac I used the “OpenVPN iOS Configuration Profile Utility“. You might need to install RubyGems before if you not have it setup already on your machine (I did all these steps on my Raspberry Pi where I had that installed before).

I used the following command to create my profile:

[codesyntax lang=”text” lines=”no”]

ovpnmcgen.rb generate --host my_vpn_host_name --proto udp --port listening_vpn_port --trusted-ssids the_WLAN_SSID_of_my_home_network --security-level medium --cafile my_ca_file_used_for_vpn --p12file the_pkcs12_file_created_before --ovpnconfigfile the_openvpn_config_file.ovpn -o the_name_of_the_generated_output_file.mobileconfig a_user_identifier a_device_identifier

[/codesyntax]

Unfortunately currently the “ovpnmcgen” tool does not support the “DNSDomainMatch” directive which is needed for automatic enabling VPN as soon as you access a host in your internal network.

So you manually need to add the following parameters to the “OnDemandRules” section in your “the_name_of_the_generated_output_file.mobileconfig” file . I have highlighted the lines you need to add:

[codesyntax lang=”xml” lines=”no” highlight_lines=”19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35″]

<key>VPN</key>
 <dict>
 <key>AuthenticationMethod</key>
 <string>Certificate</string>
 <key>OnDemandEnabled</key>
 <integer>1</integer>
 <key>OnDemandRules</key>
 <array>
 <dict>
 <key>Action</key>
 <string>Disconnect</string>
 <key>InterfaceTypeMatch</key>
 <string>WiFi</string>
 <key>SSIDMatch</key>
 <array>
 <string>the_WLAN_SSID_of_my_home_network</string>
 </array>
 </dict>
 <dict>
 <key>Action</key>
 <string>EvaluateConnection</string>
 <key>ActionParameters</key>
 <array>
 <dict>
 <key>Domains</key>
 <array>
 <string>urs.local</string>
 <string>*.urs.local</string>
 </array>
 <key>DomainAction</key>
 <string>ConnectIfNeeded</string>
 </dict>
 </array>
 </dict>
 <dict>
 <key>Action</key>
 <string>Ignore</string>
 <key>InterfaceTypeMatch</key>
 <string>WiFi</string>
 </dict>
 <dict>
 <key>Action</key>
 <string>Disconnect</string>
 <key>InterfaceTypeMatch</key>
 <string>Cellular</string>
 </dict>
 <dict>
 <key>Action</key>
 <string>Ignore</string>
 </dict>
 </array>

[/codesyntax]

You need to replace “urs.local” with the domain name of your internal network. Accessing a host with this domain name (e.g. “myhost.urs.local”) will then automatically trigger a VPN connection.

Now you do have a configuration file which you can install as a profile in your iOS device. You need to somehow transfer it to your device. You can either mail it to you (might be unsecure as someone can get access to your file …) or transfer it via iTunes or (as I did) place it on your own Owncloud server and open it with Safari on your iOS device.

To install the profile you need first to enter your iOS password and after that the password for your private key you used while creating the PKCS12 file.

As soon as you have installed the profile you are ready to go.

With the configuration described above a VPN connection will be established automatically as soon as you try to access a hostname in your local network (here: “urs.local”). If you come back home with your device and connect to your own Wifi network the VPN will be disconnected again automatically.

Pebble Smartwatch

Meine Junghans Mega Solar-Funkuhr hatte mir nun 16 Jahre treue Dienste geleistet. Leider habe ich sie wohl neulich am Frankfurter Flughafen verloren. Da sie auch keiner im Fundbüro abgegeben hatte, musste ich mich um Ersatz bemühen.

Eigentlich hatte ich mich ja schon auf die Apple-Watch gefreut. Leider wurde ich etwas enttäuscht, als ich die Spezifikationen und die Preise dann gelesen hatte. Ganz ehrlich, für eine Uhr, die relativ bald wieder veraltet ist und die man mit Mühe und Not vermutlich gerade so über den Tag bringt bevor man sie laden muss, 400 EUR und mehr auszugeben, das wollte ich dann doch nicht tun. Dafür ist mir eine Uhr zuwenig Statussymbol und mehr Funktionsgerät.

Daher viel die Wahl dann auf die Pebble 401BLR Brushed Stainless Steel (Farbe: edelstahl). Die Auswahl war ja nicht besonders groß, da die Smartwatch ja mit meinem iPhone zusammenarbeiten sollte und die meisten anderen Smartwatches nur Android unterstützen.

Datei 28.03.15 12 01 33

Den Ausschlag gaben hauptsächlich die folgenden Gründe:

  • Die Uhrzeit kann immer abgelesen werden, und muss nicht erst mit einer Armbewegung eingeschaltet werden (mit einer Armbewegung kann aber ein Hintegrundlicht zugeschaltet werden, um die Uhr auch im Dunkeln abzulesen).
  • Die Akkulaufzeit beträgt bei normalem Gebrauch 5-7 Tage.
  • Die Uhr ist wasserdicht, man kann sie also auch beim Schwimmen tragen.
  • Der Preis liegt derzeit bei knapp 200 EUR (immer noch viel für ein Spielzeug, welches ganz sicher keine 16 Jahre hält wie meine Uhr zuvor…)

Ich habe mir noch das mattschwarze Metallarmband dazugekauft (sonst nützt es wenig wenn die Uhr wasserfest ist ;-)) und ein zweites Ladekabel (leider benötigt die Uhr wieder ein spezielles USB-Kabel, was man auch noch mit sich herumschleppen muss).

Die Uhr hat die Möglichkeit beliebige Watchfaces (Ziffernblätter …) anzuzeigen. Auf My Pebble Faces gibt es jede Menge mehr oder weniger schöne Watchfaces zum kostenlosen Download. Da mir hier aber nichts so wirklich zugesagt hat, habe ich mir mit einem Watchface Generator mein eigenes “Ziffernblatt” generiert, was oben auf dem Bild auch zu sehen ist.

Die Hauptfunktionalität, neben der Anzeige der Uhrzeit, ist für mich, alle Benachrichtigungen meines iPhones (also, Anrufe, Kalenderevents, Mail- SMS-, Facebbook-Notifications etc.) direkt auf meiner Uhr angezeigt zu bekommen. Dann kann das iPhone auch leise gestellt irgendwo in der Tasche bleiben und ich bekomme die wichtigsten Infos trotzdem

Über den Pebble Appstore kann man sich weitere Apps herunterladen, wobei man maximal 8 Apps und Watchfaces gleichzeitig auf der Uhr installiert haben kann:

X7ekUaJ

Derzeit habe ich Smartwatch Pro (benötigt eine Begleit-App aus dem iTunes-Store) sowie MultiTimer und Morpheuz installiert. Hier bin ich aber noch am Rumspielen, was für mich nützlich ist und was nicht.

Das Wechseln des Armbands ging mit dem mitgelieferten Schraubenzieher sehr einfach. Nur das Kürzen des Armbands war dann ein ziemliches “Gefuddel” 😉

Nach einer knappen Woche bin ich ganz zufrieden mit meiner Wahl. Der bislang größte Nachteil der Uhr: Der Vibrationsalarm ist mir nicht stark genug. Ich wache definitiv davon nicht auf. Was schade ist, denn als Wecker ist die Uhr daher leider nicht zu gebrauchen (wäre schön gewesen, denn damit könnte man sich wecken lassen, ohne den Partner mit aufzuwecken). Vielleicht muss man sich trainieren, um das Vibrieren am Arm auch im Tiefschlaf zu bemerken, aber ich fürchte mal, dass sich das nicht ändern wird.

Ach ja: Dieses Jahr wird der Nachfolger Pebble Time Steel herauskommen. Wer Zeit hat, für den macht es vermutlich Sinn darauf zu warten. Ich wollte jetzt aber gleich eine Uhr haben 🙂

Update 2015-03-28:

Auch Alarms++ finde ich ganz nützlich (ich werde noch mal testen ob ich davon wach werde ;-)). Ausserdem habe ich mir noch World Time als zusätzliches Watchface installiert. Ganz nützlich wenn man mal mehrere Zeitzonen im Blick haben muss.

Über Pebblebits habe ich mir eine Custom Firmware erstellt, in der u.a. die eingebauten Watchfaces (die ich nicht nutze) sowie die eingebaute Alarm-Funktion (die ich durch Alarm++ ersetzt habe) nicht mehr vorhanden sind.

Netgear ReadyNAS Duo V2: SNMP Configuration

I wanted to access SNMP data on my Netgear ReadyNAS Duo V2. However, although I enabled SNMP in the GUI and set the corerct community string and IP address for the allowed hosts, I was unable to connect. I logged in via SSH and checked the file “/etc/snmp/snmpd.conf”.

There was only one line in that file and for me it looked correct (IP 192.168.0.100 was the IP address of the machine from where I wanted to access the device via SNMP):

com2sec readonly 192.168.0.100 public

After some investigation I learned that you might need to configure SNMP via the command “snmpconf -g basic_setup”. After I did that I ended up with a much bigger “/etc/snmp/snmpd.conf” file. In the end the following line was the important one which fixed the connection:

rocommunity public 192.168.0.100

After a restart of the SNMP service with “service snmp restart” I was able to connect to the device and list all supported SNMP IDs:

snmpwalk -v 1 -c public 192.168.0.100

Unfortunately I then saw that this device only supports a very small subset of other Netgear NAS devices and I was unable to read parameters like fan status, temperature, disk status etc.

 

Raspberry Pi: Some first steps to do

As I played around with the Raspberry Pi I saw that the VI editor was not working as it should. You were not able to use the cursor keys and the backspace key correctly. The reason is that normally Linux has installed VIM and not the original VI. So I first updated VI with the following command:

[codesyntax lang=”text”]

sudo apt-get install vim

[/codesyntax]

After that I installed the Midnight Commander as I find it more comfortable than just using the command line:
[codesyntax lang=”text”]

sudo apt-get install mc

[/codesyntax]

As my Pi will be reachable via the Internet  I do not want to have the standard user “pi” enabled. So I created a new user which also does not have sudo rights (in case someone gets access to my user password he still will need to have the root password in order to get root rights). So I used the following commands:
[codesyntax lang=”text”]

sudo adduser newuser 
sudo passwd root 
logout

[/codesyntax]

Now login again as user “newuser” and then change to root and disable the user “pi”:

[codesyntax lang=”text”]

su
usermod -L pi

[/codesyntax]

Now define an alias for the “ls” command to display files and directories in the long format and wih some color coding. For that edit the files “/home/newuser/.bashrc” and “/root/.bashrc” and add the following lines at the end:
[codesyntax lang=”text”]

alias ls='ls --color=auto'
alias ll='ls -la'

[/codesyntax]

By the way: To use the graphical programs of the Pi, you can start the LXDE-Panel with the command “lxpanel”. You will need a local XServer and XWindows redirection for that (I am using the great tool MobaXterm for that).

“Headless setup” of my Raspberry Pi 2 Model B

Yesterday my first Raspberry Pi 2 Model B arrived (I am glad that I have waited so long because I now could get the newest, faster version :-)).

I bought a package with the Pi, a power adapter and a small case and also a 32 Gb Micro SD card. I also ordered an USB Wifi Adapter (which has not yet arrived).

Here are my steps to get started with a “headless” installation (without a monitor or keyboard attached):

(more…)

“Plugin resource not found” error occurs when using Administration Console for Content Platform Engine (ACCE)

As I had that issue twice already and forgot the solution, I write it down here now 🙂

The issue is, that a search operation in Filenet Admin Console (ACCE) hangs if your browser language is set to a non-english language. Just set English as the default browser language and everything works again.

In SystemOut.log you see a message like that:

[codesyntax lang="text"]
ERROR [WebContainer : 7] - method name: determineBadClassRetry principal name: P8AdminT Global Transaction: false User Transaction: false Exception Info: Class "" not found. com.filenet.api.exception.EngineRuntimeException: FNRCE0002E: E_BAD_CLASSID: Class "" not found.
[/codesyntax]

This issue is already documented in that technote:

http://www-01.ibm.com/support/docview.wss?uid=swg21662794

IBM Connections with external Users: Bug in profiles_functions.js

I had the following problem with external users in Connections 5. The customer used a function for the “displayName” instead of a LDAP property value like “cn” resulting in the following lines in “map_dbrepos_from_source.properties”:

[codesyntax lang=”text”]

displayName={func_decorate_displayName_if_visitor}
displayNameLdapAttr={func_compute_dn}
decorateVisitorDisplayName= - External User
mode={func_map_ext}

[/codesyntax]

The function “func_map_ext” is a self-written function which just returns “external” so that all imported users will be handled as external ones.

While running a sync or populate job to import external users, the TDI job threw the following error message:

[codesyntax lang=”text”]

2015-02-12 18:02:22,244 ERROR [com.ibm.di.log.FileRollerAppender.5b5e0f8c-90a4-4b5f-a19e-0d3c6cc7777a] - CLFRN0104E: Failure during evaluation of mapping function for displayName. Exception is: Error while parsing script of eval() method, text func_map_ext}("displayName");

[/codesyntax]

It took some time to realize that function “func_decorate_displayName_if_visitor” in “profile_functions.js” is buggy.

In this function there was a mixup between the evaluation of the function for the “displayName attribute” and the function specified by the “mode” attribute. To fix that bug you need to change the following lines in “profile_functions.js”:

OLD:

[codesyntax lang=”javascript”]

if ((displayNameLdapAttrVal.length >= 3) && (modeVal.charAt(0) == "{"))
{
    var dispFunctionName = modeVal.substring( 1, displayNameLdapAttrVal.length - 1);

[/codesyntax]

 

NEW:

[codesyntax lang=”javascript”]

if ((displayNameLdapAttrVal.length >= 3) && (displayNameLdapAttrVal.charAt(0) == "{"))
{
   var dispFunctionName = displayNameLdapAttrVal.substring( 1, displayNameLdapAttrVal.length - 1);

[/codesyntax]

If you change these lines then you also can use a function for”displayNameLdapAttr”.