Jasper-Reports-Publisher/edit_datasource.cgi

294 lines
7.7 KiB
Perl

#!/usr/bin/perl
require './jru-lib.pl';
require '../webmin/webmin-lib.pl'; #for OS detection
sub jru_add_entry{
open(my $fh, '>>', get_prop_file()) or die "open:$!";
print $fh "\n";
print $fh '[datasource:'.$in{'name'}."]\n";
foreach my $key (@ds_keys){
print $fh $key.'='.$in{$key}."\n";
}
close $fh;
}
sub jru_update_entry{
my $name = $in{'dsname'};
my $prop_file = get_prop_file();
$lref = &read_file_lines($prop_file);
my $ln=0;
my $ds_line = -1;
foreach $line (@$lref){
if($line =~ /^\[datasource:$name\]/){
$ds_line = $ln;
last; #don't add the line twice
}
$ln=$ln+1;
}
if($ds_line > 0){
@{$lref}[$ds_line] = '[datasource:'.$in{'name'}."]";
$ln = $ds_line;
foreach my $key (@ds_keys){
$ln=$ln+1;
my $line = @{$lref}[$ln];
if($line =~ /^$key=/){
@{$lref}[$ln] = $key.'='.$in{$key};
}
}
}
&flush_file_lines($prop_file);
}
sub jru_rm_entry{
my $name = $in{'datasource'};
my $prop_file = get_prop_file();
$lref = &read_file_lines($prop_file);
my $ln=0;
my $ds_line = -1;
foreach $line (@$lref){
if($line =~ /^\[datasource:$name\]/){
$ds_line = $ln;
last; #don't add the line twice
}
$ln=$ln+1;
}
if($ds_line > 0){
@{$lref}[$ds_line] = '#'.@{$lref}[$ds_line];
$ln = $ds_line;
foreach my $key (@ds_keys){
$ln=$ln+1;
my $line = @{$lref}[$ln];
if($line =~ /^$key=/){
@{$lref}[$ln] = '#'.$line;
}
}
}
&flush_file_lines($prop_file);
}
sub jru_rm_resource_ctx{
my $name = $_[0];
my $ctxxml = get_catalina_home().'/conf/context.xml';
$lref = &read_file_lines($ctxxml);
my $ln=0;
my $sln = -1, $eln = -1;
my $pat = '<Resource name="jdbc/'.$name.'" auth="Container" type="javax.sql.DataSource';
foreach my $line (@$lref){
if(($sln == -1) && (index($line, $pat) >= 0)){
$sln = $ln;
}elsif(($sln >= 0) and ($line =~ /\/>$/)){
$eln = $ln;
last;
}
$ln=$ln+1;
}
if($sln > 0 and $eln > 0){
# remove the section
for (my $i = $sln; $i <= $eln; $i++) {
delete @{$lref}[$i];
}
}
&flush_file_lines($ctxxml);
}
sub jru_rm_resource_web{
my $name = $_[0];
my $webxml = get_catalina_home().'/webapps/JasperReportsIntegration/WEB-INF/web.xml';
$lref = &read_file_lines($webxml);
my $ln=0;
my $sln = -1, $eln = -1;
my $pat = '<res-ref-name>'.$name.'</res-ref-name>';
foreach $line (@$lref){
if(($sln == -1) && (index($line, $pat) >= 0)){
$sln = $ln;
}elsif(($sln >=0) and ($line =~ /<\/resource-ref>$/)){
$eln = $ln;
last;
}
$ln=$ln+1;
}
if($sln > 0 and $eln > 0){
# remove the section
for (my $i = $sln - 2; $i <= $eln; $i++) {
delete @{$lref}[$i];
}
}
&flush_file_lines($webxml);
}
&ReadParse();
&ui_print_header(undef, $text{'jru_title'}, "", "sources", 0, 0);
#Make options for type field
my @jru_types = ('jdbc', 'jndi');
@opt_jru_types = map { [$_, $_]} sort @jru_types;
%datasources = get_jru_datasources();
@opt_datasources = map { [$_, $_]} sort keys %datasources;
if($in{'post_flag'} == 3){ #update
my %ds = %{$datasources{$in{'dsname'}}};
if(!%ds){
print("<b>datasource:".$in{'dsname'}."</b> doesn't exists!");
&ui_print_footer("", $text{'index_return'});
exit;
}else{
#check if all keys exists
foreach my $key (@ds_keys){
if(!$in{$key}){
print("Datasource $key is empty!");
&ui_print_footer("", $text{'index_return'});
exit;
}
}
jru_update_entry();
if($ds{'type'} == 'jndi'){
jru_rm_resource_ctx($ds{'name'});
jru_rm_resource_web($ds{'name'});
if($ds{'url'} =~ /^jdbc:postgresql/){ jri_add_pg_resource( $in{'name'}, $in{'url'}, $in{'username'}, $in{'password'});
}elsif($ds{'url'} =~ /^jdbc:mysql/){ jri_add_mysql_resource($in{'name'}, $in{'url'}, $in{'username'}, $in{'password'});
}elsif($ds{'url'} =~ /^jdbc:sqlserver/){ jri_add_mssql_resource($in{'name'}, $in{'url'}, $in{'username'}, $in{'password'});
}
}
}
}elsif($in{'post_flag'} == 1){ #add
if($datasources{$in{'name'}}){
print("<b>datasource:".$in{'name'}."</b> already exists!");
&ui_print_footer("", $text{'index_return'});
exit;
}else{
#check if all keys exists
foreach my $key (@ds_keys){
if(!$in{$key}){
print("Datasource $key is empty!");
&ui_print_footer("", $text{'index_return'});
exit;
}
}
jru_add_entry();
if($in{'type'} == 'jndi'){
if($in{'url'} =~ /^jdbc:postgresql/){ jri_add_pg_resource( $in{'name'}, $in{'url'}, $in{'username'}, $in{'password'});
}elsif($in{'url'} =~ /^jdbc:mysql/){ jri_add_mysql_resource($in{'name'}, $in{'url'}, $in{'username'}, $in{'password'});
}elsif($in{'url'} =~ /^jdbc:sqlserver/){ jri_add_mssql_resource($in{'name'}, $in{'url'}, $in{'username'}, $in{'password'});
}
}
}
}elsif($in{'post_flag'} == 2){ #remove
my %ds = %{$datasources{$in{'datasource'}}};
if(!%ds){
print("<b>datasource:".$in{'datasource'}."</b> doesn't exists!");
&ui_print_footer("", $text{'index_return'});
exit;
}
jru_rm_entry();
if($ds{'type'} == 'jndi'){
jru_rm_resource_ctx($ds{'name'});
jru_rm_resource_web($ds{'name'});
}
}
if($in{'post_flag'}){
#re-read the file, after we have added/removed a user
%datasources = get_jru_datasources();
@opt_datasources = map { [$_, $_]} sort keys %datasources;
}
# Show tabs
@tabs = ( [ "add",$text{'jru_tabadd'}, "edit_datasource.cgi?mode=add" ],
[ "remove", $text{'jru_tabremove'}, "edit_datasource.cgi?mode=remove" ],
[ "list", $text{'jru_tablist'}, "edit_datasource.cgi?mode=list" ]
);
print &ui_tabs_start(\@tabs, "mode", $in{'mode'} || "list", 1);
my @cols = ('', '', '', '', '');
if($in{'dsname'}){
my %ds_entries = %{$datasources{$in{'dsname'}}};
@cols = map { $ds_entries{$_} } @ds_keys;
}
#Add tab
print &ui_tabs_start_tab("mode", "add");
print "$text{'jru_desc1'}<p>\n";
print &ui_form_start("edit_datasource.cgi", "post");
if($in{'dsname'}){
print &ui_hidden("post_flag", 3); #update
print &ui_hidden("dsname", $in{'dsname'}); #name of the datasource to be edited
}else{
print &ui_hidden("post_flag", 1); #add
}
print &ui_table_start($text{'jru_add'}, undef, 2);
print &ui_table_row($text{'jru_type'}, &ui_select("type", $cols[0], \@opt_jru_types, 1, 0), 2);
print &ui_table_row($text{'jru_name'}, &ui_textbox("name", $cols[1], 40), 2);
print &ui_table_row($text{'jru_url'}, &ui_textbox("url", $cols[2], 40), 2);
print &ui_table_row($text{'jru_username'}, &ui_textbox("username", $cols[3], 40), 2);
print &ui_table_row($text{'jru_password'}, &ui_textbox("password", $cols[4], 40), 2);
print &ui_table_end();
if($in{'dsname'}){
print &ui_form_end([ [ "but_update", $text{'jru_update'} ] ]);
}else{
print &ui_form_end([ [ "but_add", $text{'jru_addok'} ] ]);
}
print &ui_tabs_end_tab();
#End Add tab
#remove tab
print &ui_tabs_start_tab("mode", "remove");
print "$text{'jru_desc2'}<p>\n";
print &ui_form_start("edit_datasource.cgi", "post");
print &ui_hidden("post_flag", 2);
print &ui_table_start($text{'jru_remove'}, undef, 2);
print &ui_table_row($text{'jru_datasource'}, &ui_select("datasource", undef, \@opt_datasources, 1, 0), 2);
print &ui_table_end();
print &ui_form_end([ [ "", $text{'jru_rmok'} ] ]);
print &ui_tabs_end_tab();
#End remove tab
#list tab
print &ui_tabs_start_tab("mode", "list");
print "$text{'jru_desc3'}<p>\n";
local @tds = ( "width=5" );
print &ui_columns_start([ 'Datasource', 'Type', 'Name', 'URL', 'Username', 'Password' ], 100, 0, \@tds);
foreach my $ds_name (sort keys %datasources){
local %ds_entries = %{$datasources{$ds_name}};
my @cols = ($ds_name);
$cols[0] = '<a href="/jri_publisher/edit_datasource.cgi?mode=add&dsname='.&urlize($ds_name).'">'.$ds_name."</a>";
foreach my $key (@ds_keys){
push(@cols, $ds_entries{$key});
}
print &ui_columns_row(\@cols, \@tds);
}
print &ui_columns_end();
print &ui_tabs_end_tab();
#End list tab
print &ui_tabs_end(1);
&ui_print_footer("", $text{'index_return'});