#!/usr/bin/perl

# Copyright (C) 2007-2015 X2Go Project - http://wiki.x2go.org
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the
# Free Software Foundation, Inc.,
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
#
# Copyright (C) 2007-2015 Oleksandr Shneyder <oleksandr.shneyder@obviously-nice.de>
# Copyright (C) 2007-2015 Heinz-Markus Graesing <heinz-m.graesing@obviously-nice.de>

use strict;
use Sys::Hostname;
use Sys::Syslog qw( :standard :macros );

use lib `x2gopath lib`;
use x2gologlevel;

openlog($0,'cons,pid','user');
setlogmask( LOG_UPTO(x2gologlevel()) );


if ( @ARGV ) {
	syslog('info', "x2golistdesktops has been called with options: @ARGV");
} else {
	syslog('info', "x2golistdesktops has been called without options");
}

if ((hostname eq '(none)') || (hostname eq 'localhost')) {
	die "Hostname of X2Go Server not set-up correctly, check /etc/hostname. Exiting..."
}

my $serv=shift;
if( ! $serv)
{
	$serv=hostname;
}

my $rsess=`timeout 1s x2golistsessions x2goserver |grep _stR`;
my @rsess=split("\n","$rsess");
my @rdisplays;
for (my $i=0;$i<@rsess;$i++)
{
	my @sinfo=split("\\|",@rsess[$i]);
	@rdisplays[$i]=@sinfo[2];
}

my $rdisp=join("I",@rdisplays);
$rdisp="I${rdisp}I";

my $uname=$ENV{'USER'};

# on Debian the ss command is in /usr/bin, on Fedora, it is in /usr/sbin...
# -> so we need to tweak the PATH env var a little here...
my $old_PATH=$ENV{'PATH'};
$ENV{'PATH'}="$ENV{'PATH'}:/usr/sbin:/sbin";
my $lines=`ss -lxu`;
$ENV{'PATH'}=$old_PATH;
undef $old_PATH;

my @lines=split("\n", "$lines");

my @outp = grep ( /(@| )\/tmp\/.X11-unix\/X.*/, @lines);
my @displays;
for(my $i=0;$i<@outp;$i++)
{
	my $display=@outp[$i];
	$display=~s|.*/tmp/.X11-unix/X([0-9]*).*|:$1|;
	my $checkdisp=$display;
	$checkdisp=~s/:/I/;
	$checkdisp="${checkdisp}I";
	if (!( $rdisp =~ m/$checkdisp/ ))
	{
		if ( grep { $_ eq "$uname\@$display" } @displays ) {
		} else {
			my $inf=`timeout 1s xwininfo -root -display $display`;
			if ( $inf=~ m/geometry/)
			{
				push (@displays, "$uname\@$display");
			}
		}
	}
}

my $outp=`ls -1 /tmp/ | grep x2godesktopsharing_\@*\@:*`;
@outp=split("\n","$outp");

for(my $i=0;$i<@outp;$i++)
{
	my @ln=split("\@",@outp[$i]);
	if (( -r "/tmp/@outp[$i]" ) and ( -w "/tmp/@outp[$i]" )) {
		my @ln=split("\@",@outp[$i]);
		if ( @ln[1] ne $uname )
		{
			push (@displays, "@ln[1]\@@ln[2]");
		}
	}
}

if (@displays) {
	for(my $i=0;$i<@displays;$i++) {
		if ( @displays[$i] ) {
			print "@displays[$i]\n";
		}
	}
}
# closing syslog 
closelog;
