163 lines
6.2 KiB
Nix
163 lines
6.2 KiB
Nix
{ stdenv, fetchurl, unzip, jdk, ib-tws, xpra }:
|
|
|
|
stdenv.mkDerivation rec {
|
|
version = "2.14.0";
|
|
pname = "ib-controller";
|
|
|
|
src = fetchurl {
|
|
url = "https://github.com/ib-controller/ib-controller/archive/${version}.tar.gz";
|
|
sha256 = "17a8bcgg9z3b4y38k035hm2lgvhmf8srlz59c7n2q3fdw2i95i68";
|
|
};
|
|
|
|
phases = [ "unpackPhase" "installPhase" ];
|
|
|
|
buildInputs = [ unzip jdk ib-tws ];
|
|
|
|
installPhase = ''
|
|
mkdir -p $out $out/bin $out/etc/ib/controller $out/share/IBController
|
|
cp resources/*.jar $out/share/IBController/.
|
|
cp resources/*.ini $out/etc/ib/controller/.
|
|
classpath=""
|
|
for jar in ${ib-tws}/share/IBJts/*.jar; do
|
|
classpath="$classpath:$jar"
|
|
done
|
|
for jar in $out/share/IBController/*.jar; do
|
|
classpath="$classpath:$jar"
|
|
done
|
|
# strings to use below; separated to avoid nix specific substitutions
|
|
javaOptions={JAVA_OPTIONS:--Xmx1024M}
|
|
ibProfileDir={IB_PROFILE_DIR:-~/IB/}
|
|
cat<<EOF > $out/bin/ib-tws-c
|
|
#!$SHELL
|
|
if [[ \$1 == /* ]] || [[ \$1 == ./* ]]; then
|
|
IB_USER_PROFILE=\`realpath \$1\`
|
|
IB_USER_PROFILE_TITLE=\`basename \$1\`
|
|
else
|
|
if [[ x\$1 != "x" ]] && [[ \$1 != -* ]]; then
|
|
IB_USER_PROFILE=\`realpath \$$ibProfileDir\$1\`
|
|
IB_USER_PROFILE_TITLE=\$1
|
|
else
|
|
echo "ERROR: \"\$1\" is not a valid name of a profile."
|
|
exit 1
|
|
fi
|
|
fi
|
|
shift
|
|
if [ ! -e \$IB_USER_PROFILE ]; then mkdir -p \$IB_USER_PROFILE; fi
|
|
if [ ! -d \$IB_USER_PROFILE ]; then echo "ERROR: \$IB_USER_PROFILE must be a directory!" && echo 1; fi
|
|
if [ ! -e \$IB_USER_PROFILE/jts.ini ]; then cp ${ib-tws}/etc/ib/tws/jts.ini \$IB_USER_PROFILE/. && chmod +w \$IB_USER_PROFILE/jts.ini; fi
|
|
if [ ! -e \$IB_USER_PROFILE/IBController.ini ]; then cp $out/etc/ib/controller/IBController.ini \$IB_USER_PROFILE/. && chmod +w \$IB_USER_PROFILE/IBController.ini; fi
|
|
if [[ \$1 == "-q" ]]; then
|
|
if [ -f \$IB_USER_PROFILE/xpra/run ]; then
|
|
${xpra}/bin/xpra stop \`cat \$IB_USER_PROFILE/xpra/run\` --socket-dir=\$IB_USER_PROFILE/xpra/ &> /dev/null
|
|
fi
|
|
exit 0
|
|
fi
|
|
if [[ \$1 == "-d" ]] && [ ! -f \$IB_USER_PROFILE/xpra/run ]; then
|
|
( sleep infinity ) &
|
|
WAIT_DUMMY_PID=\$!
|
|
( trap "" INT;
|
|
DISPLAYNUM=100
|
|
while [ -f /tmp/.X\$DISPLAYNUM-lock ]; do DISPLAYNUM=\$((\$DISPLAYNUM + 1)); done
|
|
mkdir -p \$IB_USER_PROFILE/xpra
|
|
cd \$IB_USER_PROFILE
|
|
nohup ${xpra}/bin/xpra start :\$DISPLAYNUM \
|
|
--socket-dir=\$IB_USER_PROFILE/xpra/ \
|
|
--start-child="echo -n :\$DISPLAYNUM > \$IB_USER_PROFILE/xpra/run \
|
|
&& kill \$WAIT_DUMMY_PID &> /dev/null \
|
|
&& ${jdk}/bin/java -cp $classpath \$$javaOptions ibcontroller.IBController \$IB_USER_PROFILE/IBController.ini" \
|
|
--exit-with-children \
|
|
--no-pulseaudio \
|
|
--no-mdns \
|
|
--no-notification \
|
|
--no-daemon \
|
|
&> \$IB_USER_PROFILE/xpra/server.log
|
|
rm -f \$IB_USER_PROFILE/xpra/run
|
|
rm -f /tmp/.X\$DISPLAYNUM-lock
|
|
) &
|
|
wait \$WAIT_DUMMY_PID
|
|
exit 0
|
|
fi
|
|
if [ -f \$IB_USER_PROFILE/xpra/run ]; then
|
|
${xpra}/bin/xpra attach \`cat \$IB_USER_PROFILE/xpra/run\` --socket-dir=\$IB_USER_PROFILE/xpra/ \
|
|
--windows \
|
|
--no-speaker \
|
|
--no-microphone \
|
|
--no-tray \
|
|
--title="\$IB_USER_PROFILE_TITLE: @title@" \
|
|
&> \$IB_USER_PROFILE/xpra/client.log
|
|
fi
|
|
EOF
|
|
chmod u+x $out/bin/ib-tws-c
|
|
cat<<EOF > $out/bin/ib-gw-c
|
|
#!$SHELL
|
|
if [[ \$1 == /* ]] || [[ \$1 == ./* ]]; then
|
|
IB_USER_PROFILE=\`realpath \$1\`
|
|
IB_USER_PROFILE_TITLE=\`basename \$1\`
|
|
else
|
|
if [[ x\$1 != "x" ]] && [[ \$1 != -* ]]; then
|
|
IB_USER_PROFILE=\`realpath \$$ibProfileDir\$1\`
|
|
IB_USER_PROFILE_TITLE=\$1
|
|
else
|
|
echo "ERROR: \"\$1\" is not a valid name of a profile."
|
|
exit 1
|
|
fi
|
|
fi
|
|
shift
|
|
if [ ! -e \$IB_USER_PROFILE ]; then mkdir -p \$IB_USER_PROFILE; fi
|
|
if [ ! -d \$IB_USER_PROFILE ]; then echo "ERROR: \$IB_USER_PROFILE must be a directory!" && echo 1; fi
|
|
if [ ! -e \$IB_USER_PROFILE/jts.ini ]; then cp ${ib-tws}/etc/ib/tws/jts.ini \$IB_USER_PROFILE/. && chmod +w \$IB_USER_PROFILE/jts.ini; fi
|
|
if [ ! -e \$IB_USER_PROFILE/IBController.ini ]; then cp $out/etc/ib/controller/IBController.ini \$IB_USER_PROFILE/. && chmod +w \$IB_USER_PROFILE/IBController.ini; fi
|
|
if [[ \$1 == "-q" ]]; then
|
|
if [ -f \$IB_USER_PROFILE/xpra/run ]; then
|
|
${xpra}/bin/xpra stop \`cat \$IB_USER_PROFILE/xpra/run\` --socket-dir=\$IB_USER_PROFILE/xpra/ &> /dev/null
|
|
fi
|
|
exit 0
|
|
fi
|
|
if [[ \$1 == "-d" ]] && [ ! -f \$IB_USER_PROFILE/xpra/run ]; then
|
|
( sleep infinity ) &
|
|
WAIT_DUMMY_PID=\$!
|
|
( trap "" INT;
|
|
DISPLAYNUM=100
|
|
while [ -f /tmp/.X\$DISPLAYNUM-lock ]; do DISPLAYNUM=\$((\$DISPLAYNUM + 1)); done
|
|
mkdir -p \$IB_USER_PROFILE/xpra
|
|
cd \$IB_USER_PROFILE
|
|
nohup ${xpra}/bin/xpra start :\$DISPLAYNUM \
|
|
--socket-dir=\$IB_USER_PROFILE/xpra/ \
|
|
--start-child="echo -n :\$DISPLAYNUM > \$IB_USER_PROFILE/xpra/run \
|
|
&& kill \$WAIT_DUMMY_PID &> /dev/null \
|
|
&& ${jdk}/bin/java -cp $classpath \$$javaOptions ibcontroller.IBGatewayController \$IB_USER_PROFILE/IBController.ini" \
|
|
--exit-with-children \
|
|
--no-pulseaudio \
|
|
--no-mdns \
|
|
--no-notification \
|
|
--no-daemon \
|
|
&> \$IB_USER_PROFILE/xpra/server.log
|
|
rm -f \$IB_USER_PROFILE/xpra/run
|
|
rm -f /tmp/.X\$DISPLAYNUM-lock
|
|
) &
|
|
wait \$WAIT_DUMMY_PID
|
|
exit 0
|
|
fi
|
|
if [ -f \$IB_USER_PROFILE/xpra/run ]; then
|
|
${xpra}/bin/xpra attach \`cat \$IB_USER_PROFILE/xpra/run\` --socket-dir=\$IB_USER_PROFILE/xpra/ \
|
|
--windows \
|
|
--no-speaker \
|
|
--no-microphone \
|
|
--no-tray \
|
|
--title="\$IB_USER_PROFILE_TITLE: @title@" \
|
|
&> \$IB_USER_PROFILE/xpra/client.log
|
|
fi
|
|
EOF
|
|
chmod u+x $out/bin/ib-gw-c
|
|
'';
|
|
|
|
|
|
meta = with stdenv.lib; {
|
|
description = "Automation Controller for the Trader Work Station of Interactive Brokers";
|
|
homepage = "https://github.com/ib-controller/ib-controller";
|
|
license = licenses.gpl3;
|
|
maintainers = [ maintainers.tstrobel ];
|
|
platforms = platforms.linux;
|
|
};
|
|
}
|