line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
# API / Module version 1.X restructuring placeholder |
2
|
|
|
|
|
|
|
# - Aim to ease up Citrix module use by including all the sub-modules here |
3
|
|
|
|
|
|
|
# and allowing merely "use Citrix;" in the application |
4
|
|
|
|
|
|
|
# TODO: |
5
|
|
|
|
|
|
|
# - Provide porting guide ... (???) |
6
|
|
|
|
|
|
|
# - CitrixPortal.pm |
7
|
|
|
|
|
|
|
# DONE |
8
|
|
|
|
|
|
|
# - Deprecated Citrix::Config.pm ? maybe leave for farms |
9
|
|
|
|
|
|
|
# - Farms: uses 'farmid' |
10
|
|
|
|
|
|
|
# Allow loading config from DB |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
package Citrix; |
13
|
2
|
|
|
2
|
|
38077
|
use Citrix::SessionSet; |
|
2
|
|
|
|
|
4
|
|
|
2
|
|
|
|
|
61
|
|
14
|
2
|
|
|
2
|
|
1123
|
use Citrix::SessOp; |
|
2
|
|
|
|
|
6
|
|
|
2
|
|
|
|
|
51
|
|
15
|
2
|
|
|
2
|
|
1157
|
use Citrix::Farm; |
|
2
|
|
|
|
|
5
|
|
|
2
|
|
|
|
|
43
|
|
16
|
|
|
|
|
|
|
#use Citrix::Config; |
17
|
2
|
|
|
2
|
|
544
|
use Citrix::LaunchMesg; |
|
2
|
|
|
|
|
12
|
|
|
2
|
|
|
|
|
1248
|
|
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
our $VERSION = '0.25'; |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
=head1 NAME |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
Module Suite for managing UNIX Citrix Sessions. |
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
=head1 DESCRIPTION |
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
Citrix "top-level" module loads all Citrix::* modules into runtime for simple use. |
28
|
|
|
|
|
|
|
Citrix::* modules have no problems running in mod_perl based web application. |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
=head1 CLASS VARIABLES |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
The following class variables serve as Global Citrix environment settings. |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
=head2 $Citrix::binpath |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
Path to Citrix command line utilities (for ctxconnect,ctxdisconnect,ctxlogoff,ctxreset, |
37
|
|
|
|
|
|
|
ctxquery,ctxquser,ctxshadow ... Default: /opt/CTXSmf/bin) |
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
=head2 $Citrix::admins |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
Hash(ref) containing admin usernames set to (dummy) true value. Set this from external |
42
|
|
|
|
|
|
|
configuration files (Optional, No default value). This is provided as convenience for application |
43
|
|
|
|
|
|
|
to store "admin" role for certain users. |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
=head2 $Citrix::farms |
46
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
Array of hashes for Citrix farms configuration. See L for Farm hash structure. |
48
|
|
|
|
|
|
|
Load these with Citrix::loadconfig() (see METHODS). |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
=head2 $Citrix::touts |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
Timeout(s) for Citrix (over-the-network) Operations. Has separate settings for 'host','user','op'. |
53
|
|
|
|
|
|
|
Set these by your network speed and latency. |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
=cut |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
# Citrix Admins |
59
|
|
|
|
|
|
|
our $admins = {}; |
60
|
|
|
|
|
|
|
# Global handle to farm configurations |
61
|
|
|
|
|
|
|
our $farms; # [] |
62
|
|
|
|
|
|
|
# Domain to use in launch message |
63
|
|
|
|
|
|
|
our $domain = ''; |
64
|
|
|
|
|
|
|
# Citrix Command line binaries path |
65
|
|
|
|
|
|
|
our $binpath = '/opt/CTXSmf/bin'; |
66
|
|
|
|
|
|
|
# TODO: New Granular timeouts for various use-cases |
67
|
|
|
|
|
|
|
our $touts = {'host' => 10, 'user' => 5, 'op' => 5,}; |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
=head1 METHODS |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
=head2 my Citrix::loadconfig($fname); |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
Load Farm Configuration from a file in perl format. The file should "return" an array |
74
|
|
|
|
|
|
|
of (non blessed) Citrix::Farm hashes with keys described in L module |
75
|
|
|
|
|
|
|
(all this as a result of underlying "require()"). |
76
|
|
|
|
|
|
|
Do not terminate this config file with the traditional "1;" true value (the array |
77
|
|
|
|
|
|
|
returned will be the true value). |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
This file is expected to be found in Perl library path (@INC). Usually the application |
80
|
|
|
|
|
|
|
current directory is a safe choice for storing config (as '.' is always in @INC). |
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
Behind the scenes the Farm config is stored in Citrix class to be accessed later by |
83
|
|
|
|
|
|
|
getfarms |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
=head2 my $farms = Citrix::getfarms(); |
86
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
Get Handle to farms (array of hashes). Passing keyword param 'idx' set to true values makes getfarms |
88
|
|
|
|
|
|
|
return a hash(ref) keyed by farm id (instead or array(ref) ). |
89
|
|
|
|
|
|
|
Farm id keys are usually chosen to be short name string (Example 'la' for Los Angeles farm), see Citrix::Farm. |
90
|
|
|
|
|
|
|
Passing keyword param 'sort' set to valid Farm attribute value makes getfarms() return farm set array sorted by |
91
|
|
|
|
|
|
|
atribute ('sort' and 'idx' don't work together). |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
=head2 Citrix::loadconfig_db($dbh) |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
Load Citrix Farms from DB using DBI connection $dbh. |
96
|
|
|
|
|
|
|
Method stores L entries in $Citrix::farms for later access. |
97
|
|
|
|
|
|
|
Use Citrix::getfarms() to access farm info (see L). |
98
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
Useful in bigger environments with world-wide multi-farm Citrix system layout. |
100
|
|
|
|
|
|
|
Notice that Citrix::* modules are not tightly coupled with perl DBI, but to use |
101
|
|
|
|
|
|
|
this method you do need DBI to to establish the connection. |
102
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
=cut |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
# Load Farm Configuration |
107
|
|
|
|
|
|
|
sub loadconfig { |
108
|
0
|
|
|
0
|
1
|
|
my ($fname) = @_; |
109
|
0
|
0
|
0
|
|
|
|
if ($farms && @$farms) {return($farms);} |
|
0
|
|
|
|
|
|
|
110
|
0
|
|
|
|
|
|
eval { |
111
|
0
|
|
|
|
|
|
$farms = require($fname); |
112
|
|
|
|
|
|
|
}; |
113
|
0
|
0
|
|
|
|
|
if ($@) {die("No Farms Cached or config file found: $!\n");} |
|
0
|
|
|
|
|
|
|
114
|
0
|
|
|
|
|
|
return($farms); |
115
|
|
|
|
|
|
|
} |
116
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
sub loadconfig_db { |
118
|
0
|
|
|
0
|
1
|
|
my ($dbh, %opt) = @_; |
119
|
0
|
|
0
|
|
|
|
my $tn = $opt{'tabname'} || $farmtabname; |
120
|
0
|
|
|
|
|
|
my $w = " WHERE active = 1"; |
121
|
0
|
|
|
|
|
|
my $qs = "SELECT * FROM $tn $w "; |
122
|
0
|
|
|
|
|
|
my $arr = $dbh->selectall_arrayref($qs, {Slice => {} }); |
123
|
|
|
|
|
|
|
|
124
|
0
|
|
|
|
|
|
my @farms = map({ |
125
|
0
|
|
|
|
|
|
$_->{'hosts'} = [split(/,\s*/, $_->{'hosts'})]; |
126
|
0
|
|
|
|
|
|
$_->{'apps'} = [split(/,\s*/, $_->{'apps'})]; |
127
|
|
|
|
|
|
|
#DEBUG:print("Entry:\n".Dumper($_)); |
128
|
0
|
|
|
|
|
|
bless($_, 'Citrix::Farm'); |
129
|
|
|
|
|
|
|
} @$arr); |
130
|
0
|
|
|
|
|
|
return(\@farms); |
131
|
|
|
|
|
|
|
} |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
# Get Array of farm configs. |
134
|
|
|
|
|
|
|
# Options |
135
|
|
|
|
|
|
|
# - idx - Set to 1 return hash indexed by Farm id:s |
136
|
|
|
|
|
|
|
# - sort - Sort by attribute |
137
|
|
|
|
|
|
|
sub getfarms { |
138
|
0
|
|
|
0
|
1
|
|
my (%c) = @_; |
139
|
0
|
0
|
|
|
|
|
if (!$farms) {die("No Farms loaded / cached");} |
|
0
|
|
|
|
|
|
|
140
|
0
|
0
|
|
|
|
|
if (ref($farms) ne 'ARRAY') {die("Farms Not in array collection");} |
|
0
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
# ARRAY/HASH |
142
|
0
|
0
|
|
|
|
|
if ($c{'idx'}) {my %fi = map({$_->{'farmid'}, $_;} @$farms);return(\%fi);} |
|
0
|
0
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
143
|
0
|
|
|
|
|
|
elsif (my $sa = $c{'sort'}) {my @s = sort({$a->{$sa} cmp $b->{$sa};} @$farms);return(\@s);} |
|
0
|
|
|
|
|
|
|
144
|
0
|
|
|
|
|
|
return($farms); |
145
|
|
|
|
|
|
|
} |
146
|
|
|
|
|
|
|
1; |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
#Thanks to Ramana Mokkapati and Ken Venner, who are not only avid Perl users but |
149
|
|
|
|
|
|
|
#friends of Open-Source in general and allowed me to contribute this module. |
150
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
__END__ |