This howto describes how to install MediaTomb, a free/opensource UPnP Media Server on OpenSolaris/OpenIndiana.

Basic installation

root@test:~# pkg install developer/build/gnu-make system/library/math/header-math wget gcc-43 expat
               Packages to install:    14
           Create boot environment:    No
DOWNLOAD                                  PKGS       FILES    XFER (MB)
Completed                                14/14     912/912    58.1/58.1

PHASE                                        ACTIONS
Install Phase                              1367/1367

PHASE                                          ITEMS
Package State Update Phase                     14/14
Image State Update Phase                         2/2

root@test:~# PATH=$PATH:/usr/gcc/4.3/bin

Install SpiderMonkey

You can find the required steps to install the SpiderMonkey JS Library in this previous post: SpiderMonkey on OpenSolaris

Install libmagic

Next we have to install libmagic which is used to detect file-types. You can find the current version on this ftp server:
ftp.astron.com

root@test:~# cd /tmp
root@test:/tmp# wget ftp://ftp.astron.com/pub/file/file-5.11.tar.gz
--2012-04-12 04:42:21--  ftp://ftp.astron.com/pub/file/file-5.11.tar.gz
           => `file-5.11.tar.gz'
Resolving ftp.astron.com (ftp.astron.com)... 208.77.212.98, 38.117.134.204
Connecting to ftp.astron.com (ftp.astron.com)|208.77.212.98|:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done.    ==> PWD ... done.
==> TYPE I ... done.  ==> CWD (1) /pub/file ... done.
==> SIZE file-5.11.tar.gz ... 610019
==> PASV ... done.    ==> RETR file-5.11.tar.gz ... done.
Length: 610019 (596K) (unauthoritative)

100%[================================================>] 610,019      552K/s   in 1.1s

2012-04-12 04:42:26 (552 KB/s) - `file-5.11.tar.gz' saved [610019]

root@test:/tmp# tar xf file-5.11.tar.gz
root@test:/tmp# cd file-5.11
root@test:/tmp/file-5.11# ./configure --prefix=/opt/local
checking for a BSD-compatible install... ./install-sh -c
checking whether build environment is sane... yes
...

root@test:/tmp/file-5.11# gmake
gmake  all-recursive
gmake[1]: Entering directory `/tmp/file-5.11'
Making all in src
gmake[2]: Entering directory `/tmp/file-5.11/src'
...

root@test:/tmp/file-5.11# gmake install
Making install in src
gmake[1]: Entering directory `/tmp/file-5.11/src'
gmake[2]: Entering directory `/tmp/file-5.11/src'
...

Install taglib

Taglib is a library for reading meta-data of audio files (e.g. ID3-Tags).

root@test:/tmp/file-5.11# cd /tmp
root@test:/tmp# wget http://developer.kde.org/~wheeler/files/src/taglib-1.5.tar.gz
--2012-04-12 04:44:46--  http://developer.kde.org/~wheeler/files/src/taglib-1.5.tar.gz
Resolving developer.kde.org (developer.kde.org)... 212.110.188.12, 2001:41c8:1:6043::12
Connecting to developer.kde.org (developer.kde.org)|212.110.188.12|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1394506 (1.3M) [application/x-gzip]
Saving to: `taglib-1.5.tar.gz'

100%[================================================>] 1,394,506   1.27M/s   in 1.0s

2012-04-12 04:44:47 (1.27 MB/s) - `taglib-1.5.tar.gz' saved [1394506/1394506]

root@test:/tmp# tar xf taglib-1.5.tar.gz
root@test:/tmp# cd taglib-1.5

root@test:/tmp/taglib-1.5# ./configure --prefix=/opt/local
checking build system type... i386-pc-solaris2.11
checking host system type... i386-pc-solaris2.11
...

root@test:/tmp/taglib-1.5# gmake
gmake  all-recursive
gmake[1]: Entering directory `/tmp/taglib-1.5'
Making all in taglib
gmake[2]: Entering directory `/tmp/taglib-1.5/taglib'
...

root@test:/tmp/taglib-1.5# gmake install
Making install in taglib
gmake[1]: Entering directory `/tmp/taglib-1.5/taglib'
...

Install MediaTomb

Now that we have all required dependencies running, we can install MediaTomb.

root@test:/tmp/taglib-1.5# cd /tmp
root@test:/tmp# wget http://downloads.sourceforge.net/mediatomb/mediatomb-0.12.1.tar.gz
--2012-04-12 04:47:02--  http://downloads.sourceforge.net/mediatomb/mediatomb-0.12.1.tar.gz
Resolving downloads.sourceforge.net (downloads.sourceforge.net)... 216.34.181.59
...
Length: 1240612 (1.2M) [application/x-gzip]
Saving to: `mediatomb-0.12.1.tar.gz'

100%[================================================>] 1,240,612    907K/s   in 1.3s

2012-04-12 04:47:04 (907 KB/s) - `mediatomb-0.12.1.tar.gz' saved [1240612/1240612]

root@test:/tmp# tar xf mediatomb-0.12.1.tar.gz
root@test:/tmp# cd mediatomb-0.12.1

root@test:/tmp/mediatomb-0.12.1# ./configure --prefix=/opt/local \
--with-js-h=/opt/local/include \
--with-js-libs=/opt/local/lib \
--enable-libmagic \
--with-libmagic-h=/opt/local/include \
--with-libmagic-libs=/opt/local/lib \
--with-taglib-cfg=/opt/local/bin/taglib-config
checking for a BSD-compatible install... configure_aux/install-sh -c
checking whether build environment is sane... yes
...

If everything is fine, you should see the following summary:

CONFIGURATION SUMMARY ----

sqlite3               : yes
mysql                 : missing
libjs                 : yes
libmagic              : yes
inotify               : missing
libexif               : missing
id3lib                : disabled
taglib                : yes
libmp4v2              : missing
ffmpeg                : missing
ffmpegthumbnailer     : missing
lastfmlib             : missing
external transcoding  : yes
curl                  : yes
YouTube               : yes
libextractor          : disabled
db-autocreate         : yes

Next step is to compile MediaTomb.

root@test:/tmp/mediatomb-0.12.1# make
make  all-recursive
Making all in tombupnp
...

root@test:/tmp/mediatomb-0.12.1# make install
Making install in tombupnp
Making install in build

First test

Now mediatomb is installed and ready for a first test. This will create all required files and folders for us.

root@test:/tmp/mediatomb-0.12.1# LD_LIBRARY_PATH=/opt/local/lib \
LD_PRELOAD=/usr/lib/0@0.so.1 \
/opt/local/bin/mediatomb \
--ip YOUR_IP --port YOUR_PORT \
-m /etc -f mediatomb \
--logfile=/var/log/mediatomb.log

MediaTomb UPnP Server version 0.12.1 - http://mediatomb.cc/

===============================================================================
Copyright 2005-2010 Gena Batsyan, Sergey Bostandzhyan, Leonhard Wimmer.
MediaTomb is free software, covered by the GNU General Public License version 2

You shouldn’t see any errors here. Now stop mediatomb by pressing CTRL+C.

Create User for Mediatomb

We don’t want to run MediaTomb as root and have to create a user for it (called media).

root@test:/tmp/mediatomb-0.12.1# cd ~
root@test:~# mkdir -p /export/home
root@test:~# useradd -d /export/home/media -s /usr/bin/false -m media
root@test:~# groupadd media
root@test:~# usermod -g media media
root@test:~# chown media:media /var/log/mediatomb.log
root@test:~# chown -R media:media /etc/mediatomb

MediaTomb as Solaris Service

The final step is to integrate MediaTomb into Solaris’ Service Management Facility (smf). This requires a XML config file which describes the MediaTomb-service. Furthermore we use a file for config and a start-script.
Both files can be found here:
They are based on the work of Jason Friedland (see his blog) with some adaptations.

/etc/mediatomb.conf
/lib/svc/method/svc-mediatomb
mediatomb-smf.xml

root@test:~# wget http://www.dev-eth0.de/wp-content/uploads/2012/04/mediatomb.conf -O /etc/mediatomb.conf
--2012-04-12 05:12:34--  http://www.dev-eth0.de/wp-content/uploads/2012/04/mediatomb.conf
Resolving www.dev-eth0.de (www.dev-eth0.de)... 87.238.193.118
Connecting to www.dev-eth0.de (www.dev-eth0.de)|87.238.193.118|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 199 1
Saving to: `/etc/mediatomb.conf'

100%[================================================>] 199         --.-K/s   in 0s

2012-04-12 05:12:35 (11.4 MB/s) - `/etc/mediatomb.conf' saved [199/199]

root@test:~# wget http://www.dev-eth0.de/wp-content/uploads/2012/04/svc-mediatomb -O /lib/svc/method/svc-mediatomb
--2012-04-12 05:12:59--  http://www.dev-eth0.de/wp-content/uploads/2012/04/svc-mediatomb
Resolving www.dev-eth0.de (www.dev-eth0.de)... 87.238.193.118
Connecting to www.dev-eth0.de (www.dev-eth0.de)|87.238.193.118|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 301 1
Saving to: `/lib/svc/method/svc-mediatomb'

100%[================================================>] 301         --.-K/s   in 0s

2012-04-12 05:12:59 (16.1 MB/s) - `/lib/svc/method/svc-mediatomb' saved [301/301]

root@test:~# wget http://www.dev-eth0.de/wp-content/uploads/2012/04/mediatomb-smf.xml
--2012-04-12 05:13:09--  http://www.dev-eth0.de/wp-content/uploads/2012/04/mediatomb-smf.xml
Resolving www.dev-eth0.de (www.dev-eth0.de)... 87.238.193.118
Connecting to www.dev-eth0.de (www.dev-eth0.de)|87.238.193.118|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1544 (1.5K) [application/xml]
Saving to: `mediatomb-smf.xml'

100%[================================================>] 1,544       --.-K/s   in 0.001s

2012-04-12 05:13:09 (1.10 MB/s) - `mediatomb-smf.xml' saved [1544/1544]

Now modify the /etc/mediatomb.conf file to match your IP and PORT.

root@test:~# chmod 755 /lib/svc/method/svc-mediatomb
root@test:~# svccfg validate mediatomb-smf.xml
root@test:~# svccfg import mediatomb-smf.xml

Now we have installed MediaTomb as a Solaris Service and can start and stop it with the svcadm command and check it’s status with svcs.

Commands:

svcadm enable mediatomb
svcadm disable mediatomb

The following commands will start tor and check if everything is ok and running.

root@test:~# svcadm enable mediatomb
root@test:~# svcs -x mediatomb
svc:/application/mediatomb:default (UPnP Media Server)
 State: online since Thu Apr 12 05:31:12 2012
   See: mediatomb(1)
   See: http://mediatomb.cc
   See: /var/svc/log/application-mediatomb:default.log
Impact: None.

That’s it, you now can access MediaTomb via http://YOUR_IP:YOUR_PORT.

Sometimes, you get a ApkCreationException when you try to build your Android Project. This Exception is produced by a expired Debug Certificate, which is created while the first build with a new installed Android SDK and which expires after 1 year.
To force the Android-SDK to create a new Debug Certificate, you have to delete the old certificate (debug.keystore).
It can be found at the following locations:

Windows XP:
 C:\Documents and Settings\YOURUSER\.android\
Windows 7:
 C:\Users\YOURUSER\.android\
OS X and Linux:
 ~/.android

As the currently available OpenSolaris packages of TOR are outdated, I compiled the sources and documented what to do.

Basic installation

First we need to install some packages which are required to download and compile TOR:

root@test:~#  pkg install wget gcc-43 system/library/math/header-math libevent
               Packages to install:    18
           Create boot environment:    No
DOWNLOAD                                  PKGS       FILES    XFER (MB)
Completed                                18/18   3066/3066    70.7/70.7

PHASE                                        ACTIONS
Install Phase                              4013/4013

PHASE                                          ITEMS
Package State Update Phase                     18/18
Image State Update Phase                         2/2

root@test:~# PATH=$PATH:/usr/gcc/4.3/bin

The next step is to create a user for TOR (we don’t want to run it as root).

root@test:~# mkdir -p /export/home
root@test:~# useradd -d /export/home/tor -s /usr/bin/false -m tor

Then we need to download and unpack the current TOR version from https://www.torproject.org/download/download.html.en.

root@test:~# wget https://www.torproject.org/dist/tor-0.2.2.35.tar.gz
--2012-02-06 00:46:36--  https://www.torproject.org/dist/tor-0.2.2.35.tar.gz
Resolving www.torproject.org (www.torproject.org)... 86.59.30.36, 38.229.72.14, 38.229.72.16
Connecting to www.torproject.org (www.torproject.org)|86.59.30.36|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2787536 (2.7M) [application/x-gzip]
Saving to: `tor-0.2.2.35.tar.gz'

100%[==============================================>] 2,787,536   2.20M/s   in 1.2s

2012-02-06 00:46:56 (224 KB/s) - `tor-0.2.2.35.tar.gz' saved [2787536/2787536]

root@test:~# tar xf tor-0.2.2.35.tar.gz
root@test:~# cd tor-0.2.2.35
root@test:~/tor-0.2.2.35#

Now we can configure and build tor.

root@test:~/tor-0.2.2.35# ./configure --prefix=/opt/tor
checking for a BSD-compatible install... ./install-sh -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... ./install-sh -c -d
checking for gawk... no
...

root@test:~/tor-0.2.2.35# make
make  all-recursive
make[1]: Entering directory `/root/tor-0.2.2.35'
Making all in src
make[2]: Entering directory `/root/tor-0.2.2.35/src'
...

root@test:~/tor-0.2.2.35# make install
Making install in src
make[1]: Entering directory `/root/tor-0.2.2.35/src'
Making install in common
make[2]: Entering directory `/root/tor-0.2.2.35/src/common'
make[3]: Entering directory `/root/tor-0.2.2.35/src/common'
...

root@test:~/tor-0.2.2.35# cd /opt/tor/
root@test:/opt/tor#

Configuration

There is a sample configuration available which can be used as a base for further modification.

oot@test233:/opt/tor# cd etc/tor
root@test:/opt/tor/etc/tor# cp torrc.sample torrc

Have a look at the manual for further information.

Finally we have to create the data and log directory which are configured in the config.
e.g.:

Create data-directory
root@test:/opt/tor# mkdir -p /opt/tor/var/tor
root@test:/opt/tor# chown tor /opt/tor/var/tor

Create log-directory
root@test:~# mkdir /var/log/tor
root@test:~# chmod 777 /var/log/tor

TOR as Solaris Service

The final step is to integrate TOR into Solaris’ Service Management Facility (smf). This requires a XML config file which describes the TOR-service.
The required file can be found here:

tor.xml

root@test:/opt/tor# cd /tmp/
root@test:/tmp# wget http://www.dev-eth0.de/wp-content/uploads/2012/02/tor.xml
root@test:/tmp# svccfg import -V tor.xml

Now we have installed TOR as a Solaris Service and can start and stop it with the svcadm command and check it’s status with svcs.

Commands:

svcadm enable tor
svcadm disable tor

The following commands will start tor and check if everything is ok and running.

root@test:/tmp# svcadm enable tor
root@test:~# svcs -x tor
svc:/network/tor:default (Tor Relay Daemon)
 State: online since Mon Feb  6 01:29:18 2012
   See: tor(1M)
   See: /var/svc/log/network-tor:default.log
Impact: None.

Finally you can check the tor logfile which should contain a line similar to

Feb 06 02:00:44.494 [notice] Self-testing indicates your ORPort is reachable from the outside. Excellent. Publishing server descriptor.

Die meisten Entwickler nutzen den Android-Emulator ja wahrscheinlich dafür, selbst entwickelte Programme komfortabel zu testen. Es gibt aber auch noch einen weiteren interessanten Einsatzzweck, den Gaby Becker in einem Blog-Beitrag beschrieben hat.

Es geht hierbei um die Möglichkeit, über den Android Market Apps im Emulator zu installieren und diese dann sowohl lokal zu nutzen oder für Präsentationen zu nutzen.

Gaby Becker: Präsentieren mit dem Emulator

 

OpenSolaris uses Sendmail as default Mail Transfer Agent (MTA) which seems to be designed as a admin-hell. I prefer Postfix with it’s easy to read config files.

As the package repository of OpenSolaris doesn’t provide a current Postfix, this HowTo explains a way to build Postfix from source and install it on your OpenSolaris system.

Basics

First step is to install/get a working GCC (preferred version >4.3). One possibility is to follow my Guide about GCC-4 on OpenSolaris or to use the package repository. In addition you will need gnu-make and wget.

root@test:~# pkg install gcc-43 wget nano developer/build/gnu-make

               Packages to install:    18
           Create boot environment:    No
DOWNLOAD                                  PKGS       FILES    XFER (MB)
Completed                                18/18   3121/3121    71.5/71.5

PHASE                                        ACTIONS
Install Phase                              4183/4183

PHASE                                          ITEMS
Package State Update Phase                     18/18
Image State Update Phase                         2/2

root@test:~# PATH=/usr/bin:/usr/gcc/4.3/bin:$PATH

Preparations

Since the build environment is now set up, you can download the current postfix source release.

root@test:~# wget http://de.postfix.org/ftpmirror/official/postfix-2.8.5.tar.gz

--2011-10-04 22:38:09--  http://de.postfix.org/ftpmirror/official/postfix-2.8.5.tar.gz
Resolving de.postfix.org (de.postfix.org)... 141.42.206.35
Connecting to de.postfix.org (de.postfix.org)|141.42.206.35|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3647010 (3.5M) [application/x-gzip]
Saving to: `postfix-2.8.5.tar.gz'

100%[======================================>] 3,647,010    700K/s   in 5.6s    =

2011-10-04 22:38:15 (632 KB/s) - `postfix-2.8.5.tar.gz' saved [3647010/3647010]

root@test:~# tar xf postfix-2.8.5.tar.gz
root@test:~# cd postfix-2.8.5

One of the postfix scripts has an error and tries to use NIS and NIS+ with OpenSolaris which will result in a build-fail.

To fix it, remove the lines “#define HAS_NIS” and “#define HAS_NISPLUS” (line 403 and 404) from src/util/sys_defs.h or apply this path:

--- src/util/sys_defs.h.bak     Thu Jun 16 00:36:37 2011
+++ src/util/sys_defs.h Tue Oct  4 22:39:49 2011
@@ -400,8 +400,6 @@
 #define HAS_DBM
 #define DEF_DB_TYPE    "dbm"
 #define ALIAS_DB_MAP   "dbm:/etc/mail/aliases"
-#define HAS_NIS
-#define HAS_NISPLUS
 #define USE_SYS_SOCKIO_H               /* Solaris 2.5, changed sys/ioctl.h */
 #define GETTIMEOFDAY(t)        gettimeofday(t)
 #define ROOT_PATH      "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb"

Building

Now you can start building Postfix.

root@test:~/postfix-2.8.5# gmake makefiles CCARGS='-DUSE_TLS \
 -lssl -lcrypto -DUSE_SASL_AUTH \
 -DUSE_CYRUS_SASL -I/usr/include/sasl' \
 AUXLIBS="-L/usr/lib -lsasl -lssl -lcrypto"

(echo "# Do not edit -- this file documents how Postfix was built for your machine.";
>makedefs.tmp
set +e; if cmp makedefs.tmp conf/makedefs.out; then rm makedefs.tmp; \
...

root@test:~/postfix-2.8.5# gmake

gmake -f Makefile.in MAKELEVEL= Makefiles
(echo "# Do not edit -- this file documents how Postfix was built for your machine.";
>makedefs.tmp
...

If you didn’t get an error, you can now check if libsasl was linked correctly:

root@test:~/postfix-2.8.5# ldd ./bin/postconf

        libsasl.so.1 =>  /usr/lib/libsasl.so.1
        libssl.so.0.9.8 =>       /lib/libssl.so.0.9.8
        libcrypto.so.0.9.8 =>    /lib/libcrypto.so.0.9.8
        libresolv.so.2 =>        /lib/libresolv.so.2
        libsocket.so.1 =>        /lib/libsocket.so.1
        libnsl.so.1 =>   /lib/libnsl.so.1
        libc.so.1 =>     /lib/libc.so.1
        libmd.so.1 =>    /lib/libmd.so.1
        libmp.so.2 =>    /lib/libmp.so.2
        libm.so.2 =>     /lib/libm.so.2

Create a OpenSolaris Package

There is a cool script available which takes the compiled Postfix sources and builds a OpenSolaris package with all required settings (e.g. users, service-definitions).

You can find the script on Ihsan Dogan’s website: http://ihsan.dogan.ch/postfix/

Directlink: http://ihsan.dogan.ch/postfix/downloads/makePostfixPkg.sh

root@test:~/postfix-2.8.5# wget http://ihsan.dogan.ch/postfix/downloads/makePostfixPkg.sh

--2011-10-04 22:42:35--  http://ihsan.dogan.ch/postfix/downloads/makePostfixPkg.sh
Resolving ihsan.dogan.ch (ihsan.dogan.ch)... 82.220.5.55
Connecting to ihsan.dogan.ch (ihsan.dogan.ch)|82.220.5.55|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 21030 (21K) [application/x-sh]
Saving to: `makePostfixPkg.sh'

100%[======================================>] 21,030      --.-K/s   in 0.1s

2011-10-04 22:42:35 (205 KB/s) - `makePostfixPkg.sh' saved [21030/21030]

root@test:~/postfix-2.8.5# chmod +x makePostfixPkg.sh
root@test:~/postfix-2.8.5# ./makePostfixPkg.sh
...

This will result in a file named CNDpostfix-2.8.5,REV=111005-SunOS5.11-i386.pkg

Install Postfix

If you have a installed Sendmail, you need to remove it before the installation of postfix:

root@test:~/postfix-2.8.5# pkg uninstall sendmail

Now you can use pkgadd to install the package:

root@test:~/postfix-2.8.5# pkgadd -d CNDpostfix-2.8.5\,REV\=111005-SunOS5.11-i386.pkg

The following packages are available:
  1  CNDpostfix     Postfix MTA
                    (i386) 2.8.5r0.4.0,REV=111005

Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]: a

Processing package instance  from

Postfix MTA(i386) 2.8.5r0.4.0,REV=111005
http://www.postfix.org/ packaged by Ihsan Dogan
...

The final step is to configure your Postfix and activate it afterwards.

root@test:~/postfix-2.8.5# svcadm enable svc:/network/postfix:default
root@test:~/postfix-2.8.5# svcs -vx postfix
svc:/network/postfix:default (Postfix SMTP Server)
 State: online since Tue Oct  4 22:46:29 2011
   See: man -M /usr/share/man -s 1 postfix
   See: http://www.postfix.org/documentation.html
   See: /var/svc/log/network-postfix:default.log
Impact: None.