diff options
| author | Andreas Brachold <vdr07@deltab.de> | 2008-11-24 16:39:09 +0000 |
|---|---|---|
| committer | Andreas Brachold <vdr07@deltab.de> | 2008-11-24 16:39:09 +0000 |
| commit | 8c42985fd234e2a993b3f01416941f4b371d1a92 (patch) | |
| tree | 917e47097785386fa27a0c29f6ab8f83a950b872 /lib | |
| parent | ffb81caa20a1dbede72f8a45299af87f8ab049e2 (diff) | |
| download | xxv-8c42985fd234e2a993b3f01416941f4b371d1a92.tar.gz xxv-8c42985fd234e2a993b3f01416941f4b371d1a92.tar.bz2 | |
* Add Data::COW (Copy on write handling for user own config profile)
* USER: Reimplement user own config profiles
* MEDIALIB: Remove fix number of columns, use now floating layout
* SVDRP: Add status message
* xxvd: Change password failed, on none HTML-Consoles
* AUTOTIMER: remove astatus (wrong callback)
* XMLTV: fix import, add multi recorder capability
* REPORT: clean up some routines
* STATUS: remove usage of /bin/wc, use native perl code
* CHANNELS: Fix hang at read channels, if recorder offline
* TELNET: remove 'quit' command do same like 'exit'
* RECORDS: clone database handle for preview image generation
* TIMERS: add more parameter check
* xxvd: disable mysql_enable_utf8
Diffstat (limited to 'lib')
31 files changed, 1031 insertions, 451 deletions
diff --git a/lib/Data/COW.pm b/lib/Data/COW.pm new file mode 100644 index 0000000..55ae9b4 --- /dev/null +++ b/lib/Data/COW.pm @@ -0,0 +1,332 @@ +package Data::COW; + +use 5.006001; +use strict; +no warnings; + +use Exporter; +use Scalar::Util qw<reftype blessed>; +use overload (); # we're not overloading anything, but we'd like to + # check if they're already implementing a value type + +use base 'Exporter'; + +our @EXPORT = qw<make_cow_ref>; + +our $VERSION = '0.02'; + +sub tied_any { + my ($ref) = @_; + if (ref $ref) { + if (reftype($ref) eq 'SCALAR') { + tied $$ref; + } + elsif (reftype($ref) eq 'ARRAY') { + tied @$ref; + } + elsif (reftype($ref) eq 'HASH') { + tied %$ref; + } + } + +} + +sub cow_object { + my ($ref) = @_; + my $tied = tied_any $ref; + $tied && $tied->isa('Data::COW') && $tied; +} + +sub make_cow_ref { + my ($ref, $parent, $key) = @_; + + make_cow_ref_nocheck($ref, $parent, $key); +} + +sub make_temp_cow_ref { + my ($ref, $parent, $key) = @_; + + if (my $obj = cow_object $ref) { + if ($obj->{parent} == $parent) { + $ref; + } + else { + make_cow_ref_nocheck($ref, $parent, $key); + } + } + else { + make_cow_ref_nocheck($ref, $parent, $key); + } +} + +sub make_cow_ref_nocheck { + my ($ref, $parent, $key) = @_; + + if (ref $ref && + # check if they already think they're a value type + !(overload::Overloaded($ref) && overload::Method($ref, '='))) + { + my $ret; + if (reftype($ref) eq 'SCALAR') { + tie my $it => 'Data::COW::Scalar', $ref, $parent, $key; + $ret = \$it; + } + elsif (reftype($ref) eq 'ARRAY') { + tie my @it => 'Data::COW::Array', $ref, $parent, $key; + $ret = \@it; + } + elsif (reftype($ref) eq 'HASH') { + tie my %it => 'Data::COW::Hash', $ref, $parent, $key; + $ret = \%it; + } + else { + # code and glob are not aggregates that we can take control + # of, so punt and just return them like anything else + return $ref; + } + + if (blessed($ref)) { + bless $ret => blessed($ref); + } + + return $ret; + } + else { + return $ref; + } +} + +sub clone_using { + my ($self, $copier) = @_; + + return unless $self->{const}; + my $old = $self->{ref}; + my $new = $copier->($old); + + if (blessed $old) { + bless $new => blessed $old; + } + if ($self->{parent}) { + my $cnew = make_cow_ref $new, $self->{parent}, undef; + tied_any($cnew)->{const} = 0; + $self->{parent}->clone($self->{key} => $cnew); + } + $self->{ref} = $new; + $self->{const} = 0; +} + +package Data::COW::Scalar; + +use Tie::Scalar; +use base 'Tie::Scalar'; +use base 'Data::COW'; + +sub TIESCALAR { + my ($class, $ref, $parent, $key) = @_; + bless { + ref => $ref, + parent => $parent, + key => $key, + const => 1, + } => ref $class || $class; +} + +sub clone { + my ($self, $key, $value) = @_; + + $self->clone_using(sub { my $v = ${$_[0]}; \$v }); + ${$self->{ref}} = $value if defined $key; +} + +sub FETCH { + my ($self) = @_; + Data::COW::make_temp_cow_ref(${$self->{ref}}, $self, 1); +} + +sub STORE { + my ($self, $value) = @_; + $self->clone(1 => $value); + $value; +} + +package Data::COW::Array; + +use Tie::Array; +use base 'Tie::Array'; +use base 'Data::COW'; + +sub TIEARRAY { + my ($class, $ref, $parent, $key) = @_; + bless { + ref => $ref, + parent => $parent, + key => $key, + const => 1, + } => ref $class || $class; +} + +sub clone { + my ($self, $key, $value) = @_; + $self->clone_using(sub { [ @{$_[0]} ] }); + $self->{ref}[$key] = $value if defined $key; +} + +sub FETCH { + my ($self, $key) = @_; + Data::COW::make_temp_cow_ref($self->{ref}[$key], $self, $key); +} + +sub STORE { + my ($self, $key, $value) = @_; + $self->clone($key => $value); + $value; +} + +sub FETCHSIZE { + my ($self) = @_; + scalar @{$self->{ref}}; +} + +sub STORESIZE { + my ($self, $size) = @_; + $self->clone; + $#{$self->{ref}} = $size-1; +} + +sub DELETE { + my ($self, $key) = @_; + $self->clone; + delete $self->{ref}[$key]; +} + +sub EXISTS { + my ($self, $key) = @_; + exists $self->{ref}[$key]; +} + +package Data::COW::Hash; + +use Tie::Hash; +use base 'Tie::Hash'; +use base 'Data::COW'; + +sub TIEHASH { + my ($class, $ref, $parent, $key) = @_; + bless { + ref => $ref, + parent => $parent, + key => $key, + const => 1, + } => ref $class || $class; +} + +sub clone { + my ($self, $key, $value) = @_; + $self->clone_using(sub { + my $ret = { %{$_[0]} }; + $ret; + }); + $self->{ref}{$key} = $value if defined $key; +} + +sub FETCH { + my ($self, $key) = @_; + Data::COW::make_temp_cow_ref($self->{ref}{$key}, $self, $key); +} + +sub STORE { + my ($self, $key, $value) = @_; + $self->clone($key => $value); + $value; +} + +sub EXISTS { + my ($self, $key) = @_; + exists $self->{ref}{$key}; +} + +sub DELETE { + my ($self, $key) = @_; + $self->clone; + delete $self->{ref}{$key}; +} + +sub CLEAR { + my ($self) = @_; + $self->clone_using(sub { {} }); + (); +} + +sub FIRSTKEY { + my ($self) = @_; + my $a = keys %{$self->{ref}}; # reset iterator + each %{$self->{ref}}; +} + +sub NEXTKEY { + my ($self) = @_; + each %{$self->{ref}}; +} + +sub SCALAR { + my ($self) = @_; + scalar %{$self->{ref}}; +} + +1; + +=head1 NAME + +Data::COW - clone deep data structures copy-on-write + +=head1 SYNOPSIS + + use Data::COW; + + my $array = [ 0, 1, 2 ]; + my $copy = make_cow_ref $array; + + push @$array, 3; + # $copy->[3] is 3 + push @$copy, 4; + # $array->[4] is not defined (and doesn't even exist) + # $copy is a real copy now + push @$array, 5; + # $copy is unaffected + +=head1 DESCRIPTION + +Data::COW makes copies of data structures copy-on-write, or "lazily". +So if you have a data structure that takes up ten megs of memory, it +doesn't take ten megs to copy it. Even if you change part of it, +Data::COW only copies the parts that need to be copied in order to +reflect the change. + +Data::COW exports one function: C<make_cow_ref>. This takes a reference +and returns a copy-on-write reference to it. If you don't want this +in your namespace, and you want to use it as C<Data::COW::make_cow_ref>, +use the module like this: + + use Data::COW (); + +Data::COW won't be able to copy filehandles or glob references. But how +do you change those anyway? It's also probably a bad idea to give it +objects that refer to XS internal state without providing a value type +interface. Also, don't use stringified references from this data +structure: they're different each time you access them! + +=head1 SEE ALSO + +L<Clone> + +=head1 AUTHOR + +Luke Palmer <luke@luqui.org> + +=head1 COPYRIGHT + + Copyright (C) 2005 by Luke Palmer + + This library is free software; you can redistribute it and/or modify it under + the same terms as Perl itself, either Perl version 5.8.3 or, at your option, + any later version of Perl 5 you may have available. diff --git a/lib/XXV/MODULES/AUTOTIMER.pm b/lib/XXV/MODULES/AUTOTIMER.pm index 01b89bd..f0da931 100644 --- a/lib/XXV/MODULES/AUTOTIMER.pm +++ b/lib/XXV/MODULES/AUTOTIMER.pm @@ -44,12 +44,6 @@ sub module { }, }, Commands => { - astatus => { - description => gettext('Display status of autotimers.'), - short => 'as', - callback => sub{ $obj->status(@_) }, - DenyClass => 'alist', - }, anew => { description => gettext("Create new autotimer"), short => 'an', @@ -155,7 +149,6 @@ sub module { # ------------------ sub status { my $obj = shift || return error('No object defined!'); - my $console = shift; my $lastReportTime = shift || 0; my %f = ( @@ -329,7 +322,8 @@ sub _init { # ------------------ sub autotimer { my $obj = shift || return error('No object defined!'); - my $console = shift; + my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $autotimerid = shift; my $waiter; @@ -575,7 +569,7 @@ sub _autotimerLookup { sleep 1; - $modT->readData(); + $modT->_readData(); return (\@{$log},$C,$M); } @@ -587,10 +581,11 @@ sub _autotimerLookup { sub autotimerCreate { my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $timerid = shift || 0; my $data = shift || 0; - $obj->autotimerEdit($console, $timerid, $data); + $obj->autotimerEdit($console, $config, $timerid, $data); } # ------------------ @@ -601,6 +596,7 @@ sub autotimerCreate { sub autotimerEdit { my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $timerid = shift || 0; my $data = shift || 0; @@ -1011,7 +1007,7 @@ You can also fine tune your search : $data->{Search}, ( $console->{USER} && $console->{USER}->{Name} ? sprintf(' from user: %s', $console->{USER}->{Name}) : "" ) ); - $obj->autotimer($console, $data->{Id}); + $obj->autotimer($console, $config, $data->{Id}); } return 1; } @@ -1024,6 +1020,7 @@ You can also fine tune your search : sub autotimerDelete { my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $timerid = shift || return $console->err(gettext("No autotimer defined for deletion! Please use adelete 'aid'!")); # If timerid the edittimer my @timers = reverse sort{ $a <=> $b } split(/[^0-9]/, $timerid); @@ -1054,6 +1051,7 @@ sub autotimerDelete { sub autotimerToggle { my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $timerid = shift || return $console->err(gettext("No autotimer defined to toggle! Please use atoggle 'aid'!")); my @timers = reverse sort{ $a <=> $b } split(/[^0-9]/, $timerid); @@ -1122,6 +1120,7 @@ sub autotimerToggle { sub list { my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $text = shift || ''; my $params = shift; @@ -1598,6 +1597,7 @@ sub suggest { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $search = shift; my $params = shift; diff --git a/lib/XXV/MODULES/CHANNELS.pm b/lib/XXV/MODULES/CHANNELS.pm index b8d55de..de518a2 100644 --- a/lib/XXV/MODULES/CHANNELS.pm +++ b/lib/XXV/MODULES/CHANNELS.pm @@ -116,7 +116,6 @@ sub module { sub status { # ------------------ my $self = shift || return error('No object defined!'); - my $console = shift; my $lastReportTime = shift || 0; my $sql = "SELECT SQL_CACHE count(*) from CHANNELS"; @@ -391,7 +390,8 @@ sub _insertGrp { sub readData { # ------------------ my $self = shift || return error('No object defined!'); - my $console = shift; + my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); if($self->_readData($console)) { $console->redirect({url => '?cmd=clist', wait => 1}) @@ -431,7 +431,7 @@ sub _readData { or return error sprintf("Couldn't execute query: %s.",$dsth->errstr); my $msg = [ sprintf(gettext("No channels on '%s' available!"),$self->{svdrp}->hostname($vid)), $error ]; - $console->err($msg); + $console->err($msg) if(defined $console); next; } @@ -593,6 +593,7 @@ sub list { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || ''; my $params = shift; @@ -1023,6 +1024,7 @@ sub newChannel { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $default = shift || 0; @@ -1034,6 +1036,7 @@ sub editChannel { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $cid = shift || 0; # If channelid then edit channel my $data = shift || 0; # Data for defaults @@ -1336,7 +1339,8 @@ sub saveChannel { sub deleteChannel { # ------------------ my $self = shift || return error('No object defined!'); - my $console = shift; + my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $channelid = shift || return con_err($console, gettext("No channel defined for deletion! Please use cdelete 'pos'!")); my $answer = shift || 0; diff --git a/lib/XXV/MODULES/CHRONICLE.pm b/lib/XXV/MODULES/CHRONICLE.pm index 79d8b8e..d3aceed 100644 --- a/lib/XXV/MODULES/CHRONICLE.pm +++ b/lib/XXV/MODULES/CHRONICLE.pm @@ -166,6 +166,7 @@ sub list { # ------------------ my $self = shift; my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $data = shift; my $params = shift; @@ -244,7 +245,8 @@ sub search { # ------------------ my $self = shift; my $console = shift || return error('No console defined!'); - my $text = shift || return $console->err(gettext("No 'string' to search for! Please use chrsearch 'text'.")); + my $config = shift || return error('No config defined!'); + my $text = shift || return $console->err(gettext("No 'string' to search defined! Please use chrsearch 'text'.")); my $params = shift; my $query = buildsearch("title",$text); @@ -326,6 +328,7 @@ sub delete { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $items = shift || return $console->err(gettext("No ID to delete! Please use chrdelete 'id'")); my @ids = reverse sort{ $a <=> $b } split(/[^0-9]/, $items); diff --git a/lib/XXV/MODULES/CONFIG.pm b/lib/XXV/MODULES/CONFIG.pm index 426be49..0f36a8f 100644 --- a/lib/XXV/MODULES/CONFIG.pm +++ b/lib/XXV/MODULES/CONFIG.pm @@ -43,7 +43,7 @@ sub module { description => gettext("Restart all modules."), short => 'rel', callback => sub{ - my ($console, $l) = @_; + my ($console, $config, $l) = @_; $Module::Reload::Debug = CORE::int(($Tools::VERBOSE+.5)/2); # my %Status = %Module::Reload->Stat; my $cnt = Module::Reload->check(); @@ -99,14 +99,15 @@ sub new { } # ------------------ -sub menu { +sub _menu { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift; my $sector = shift || 0; my $ret = {}; - $ret->{title} = gettext("Settings for XXV"); + $ret->{title} = gettext("Global settings"); $ret->{highlight} = $sector; my $mods = main::getModules; @@ -129,10 +130,11 @@ sub edit { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift; my $sector = shift || 0; my $data = shift || 0; - $obj->menu( $console, $sector ) + $obj->_menu( $console, $config, $sector ) if($console->{TYP} eq 'HTML' or ($console->{TYP} ne 'HTML' and not $sector)); return unless $sector; @@ -204,6 +206,7 @@ sub get { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift; + my $config = shift; my $modname = shift || 0; return con_err($console, gettext('Need a name of the module to display the configuration!')) @@ -292,6 +295,7 @@ sub usage { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift; my $modulename = shift || 0; my $hint = shift || ''; my $user = shift || $console->{USER}; diff --git a/lib/XXV/MODULES/EPG.pm b/lib/XXV/MODULES/EPG.pm index 352dfaf..c36b8ae 100644 --- a/lib/XXV/MODULES/EPG.pm +++ b/lib/XXV/MODULES/EPG.pm @@ -38,12 +38,14 @@ sub module { default => '12:00,18:00,20:15,22:00', type => 'string', required => gettext('This is required!'), + level => 'guest' }, timeframe => { description => gettext("How much hours to display in schema"), default => 2, type => 'integer', required => gettext('This is required!'), + level => 'guest' }, }, Commands => { @@ -126,7 +128,6 @@ sub module { sub status { # ------------------ my $self = shift || return error('No object defined!'); - my $console = shift; my $lastReportTime = shift || 0; my $total = 0; @@ -281,6 +282,7 @@ sub startReadEpgData { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift; + my $config = shift; debug sprintf('The read on epg data start now!'); @@ -641,6 +643,7 @@ sub search { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $data = shift; my $params = shift; @@ -791,6 +794,7 @@ sub program { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $cid = shift; unless($cid) { my $c = $self->{dbh}->selectrow_arrayref("SELECT SQL_CACHE hash from CHANNELS order by vid, pos limit 1"); @@ -913,6 +917,7 @@ sub display { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $eventid = shift; unless($eventid) { @@ -1002,6 +1007,7 @@ sub runningNext { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $data = shift; my $param = shift || {}; @@ -1158,7 +1164,7 @@ ORDER BY c.vid, c.pos $console->table($erg, { - periods => $self->{periods}, + periods => $config->{periods}, cgroups => $cgroups, channelgroup => $cgrp, rows => $rows @@ -1171,6 +1177,7 @@ sub runningNow { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $zeit = shift || time; my $param = shift || {}; @@ -1307,7 +1314,7 @@ ORDER BY c.vid, c.pos $console->table($erg, { zeit => $zeit, - periods => $self->{periods}, + periods => $config->{periods}, cgroups => $cgroups, channelgroup => $cgrp, rows => $rows @@ -1320,6 +1327,7 @@ sub NowOnChannel { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift; + my $config = shift; my $channel = shift; my $vid = shift || $self->{svdrp}->primary_hosts(); @@ -1403,6 +1411,7 @@ sub schema { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $zeit = shift || time; my $param = shift || {}; @@ -1417,11 +1426,11 @@ sub schema { $zeit = UnixDate(ParseDate($zeit),"%s") || time; } - $zeit += 86400 if($zeit < time - ($self->{timeframe} * 3600)); + $zeit += 86400 if($zeit < time - ($config->{timeframe} * 3600)); $zeit++; my $zeitvon = $self->toFullHour($zeit); - my $zeitbis = $zeitvon + ($self->{timeframe}*3600); + my $zeitbis = $zeitvon + ($config->{timeframe}*3600); push(@$term, $zeitvon); push(@$term, $zeitbis); @@ -1523,7 +1532,7 @@ WHERE { zeitvon => $zeitvon, zeitbis => $zeitbis, - periods => $self->{periods}, + periods => $config->{periods}, cgroups => $cgroups, channelgroup => $cgrp } @@ -1535,6 +1544,7 @@ sub checkOnTimer { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $eid = shift || return con_err($console, gettext('No event id defined!')); my $sql = qq| @@ -1576,6 +1586,7 @@ sub getDescription { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $eid = shift || 0; my $event = $self->getId($eid,"description"); @@ -1624,6 +1635,7 @@ sub suggest { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $search = shift; my $params = shift; @@ -1682,6 +1694,7 @@ sub image { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $data = shift; return $console->err(gettext("Sorry, get image is'nt supported")) diff --git a/lib/XXV/MODULES/EVENTS.pm b/lib/XXV/MODULES/EVENTS.pm index f3ac7e1..cd6345b 100644 --- a/lib/XXV/MODULES/EVENTS.pm +++ b/lib/XXV/MODULES/EVENTS.pm @@ -341,6 +341,7 @@ sub list { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $data = shift || 1; my %f = ( @@ -388,6 +389,8 @@ sub request { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); + # To this time you can set on # cmd=request&data=rss&ver=2 or # cmd=request&data=mail&__test=1 diff --git a/lib/XXV/MODULES/GRAB.pm b/lib/XXV/MODULES/GRAB.pm index 7bb8226..8895535 100644 --- a/lib/XXV/MODULES/GRAB.pm +++ b/lib/XXV/MODULES/GRAB.pm @@ -234,6 +234,7 @@ sub display { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $data = shift; my $params = shift; diff --git a/lib/XXV/MODULES/HTTPD.pm b/lib/XXV/MODULES/HTTPD.pm index 8887290..b587f20 100644 --- a/lib/XXV/MODULES/HTTPD.pm +++ b/lib/XXV/MODULES/HTTPD.pm @@ -85,6 +85,7 @@ sub module { type => 'list', required => gettext('This is required!'), choices => sub{ return $self->findskins(); }, + level => 'guest' }, StartPage => { description => gettext('Startup screen'), @@ -95,7 +96,8 @@ sub module { my $erg = $self->_get_startpage_as_array(); map { my $x = $_->[1]; $_->[1] = $_->[0]; $_->[0] = $x; } @$erg; return $erg; - } + }, + level => 'guest' }, Debug => { description => gettext('Dump additional debugging information, required only for software development.'), @@ -172,7 +174,7 @@ sub init { LocalAddr => $self->{Interface}, Reuse => 1 ) or return error("Couldn't create socket: $!"); - + binmode $socket, ":encoding(utf8)" if($self->{charset} eq 'UTF-8'); # install an initial watcher Event->io( fd => $socket, @@ -223,8 +225,6 @@ sub communicator { if(exists $self->{LOGOUT}); my $ip = getip($handle); - my $htmlRootDir = sprintf('%s/%s', $self->{paths}->{HTMLDIR}, $self->{HtmlRoot}); - my $htmlDefDir = sprintf('%s/%s', $self->{paths}->{HTMLDIR}, 'default'); my $query = $data->{Query}; if($data->{Method} eq 'POST' && $data->{Post}) { @@ -238,6 +238,7 @@ sub communicator { my $cgi = CGI->new( $query ); my $console; + my $htmlRootDir; if(my $outputtype = $cgi->param('ajax')) { # Is a Ajax Request $console = XXV::OUTPUT::Ajax->new( @@ -253,31 +254,33 @@ sub communicator { $console = XXV::OUTPUT::Html->new( -handle => $handle, -dbh => $self->{dbh}, - -htmdir => $htmlRootDir, - -htmdef => $htmlDefDir, + -htmdir => $self->{paths}->{HTMLDIR}, -cgi => $cgi, -mime => $mime, -browser=> $data, -paths => $self->{paths}, - -start => $self->{StartPage}, -debug => ($self->{Debug} eq 'y' ? 1 : 0), -charset=> $self->{charset}, ); + $htmlRootDir = $console->setSkin($self->{HtmlRoot}); # Set default skin } my $userMod = main::getModule('USER'); - if(ref $userMod and $userMod->{active} eq 'y') { - $console->{USER} = $userMod->check($handle, $data->{username}, $data->{password}); - $console->login(gettext('You are not authorized to use this system!')) - unless(exists $console->{USER}->{Level}); - } - - if(ref $userMod and - ($userMod->{active} ne 'y' - or exists $console->{USER}->{Level})) { - + unless(ref $userMod) { + $self->ModulNotLoaded($console,'USER'); + } else { + $console->{USER} = $userMod->check($handle, $data->{username}, $data->{password}); + unless(exists $console->{USER}->{Level}) { + $console->login(gettext('You are not authorized to use this system!')); + } else { $console->setCall('nothing'); - if(not $data->{Query} and + my $config = $console->{USER}->{config}->{'HTTPD'}; + + $htmlRootDir = $console->setSkin($config->{HtmlRoot}) + if($htmlRootDir); # Set user skin on HTML console + + if($htmlRootDir and + not $data->{Query} and ($data->{Request} eq '/' or -d sprintf('%s/%s', $htmlRootDir,$data->{Request}))) { my $request = $htmlRootDir; $request .= '/'; @@ -288,7 +291,7 @@ sub communicator { $request =~ s/\/+/\//g; # Send the first page (index.html) if(-r sprintf('%sindex.tmpl', $request)) { - $console->index; + $console->index($config->{StartPage}); } else { $console->datei(sprintf('%sindex.html', $request)); } @@ -299,7 +302,7 @@ sub communicator { $request =~ s/\/\.\.//g; $request =~ s/\/+/\//g; if($request =~ /tempimages\//) { - my $tmp = $userMod->userTmp; + my $tmp = $userMod->userTmp($console->{USER}->{Name}); $request =~ s/.*tempimages\//$tmp\//; $console->datei($request, $typ); } else { @@ -308,9 +311,7 @@ sub communicator { } else { $self->handleInput($console, $cgi); } - - } else { - $self->ModulNotLoaded($console,'USER'); + } } $console->footer() if($console->{inclFooter}); $console->printout(); @@ -461,7 +462,7 @@ sub handleInput { # Test the command on exists, permissions and so on my $u = main::getModule('USER'); if($u) { - my ($cmdobj, $cmdname, $shorterr, $err) = $u->checkCommand($console, $ucmd); + my ($cmdobj, $cmdname, $cmdModule, $shorterr, $err) = $u->checkCommand($console, $ucmd); $console->setCall($cmdname); if($cmdobj and not $shorterr) { @@ -469,11 +470,11 @@ sub handleInput { $console->{nocache} = 1 if($cmdobj->{binary} eq 'nocache'); } - $cmdobj->{callback}($console, $udata, $result ); + $cmdobj->{callback}($console, $console->{USER}->{config}->{$cmdModule}, $udata, $result ); } elsif($shorterr eq 'noperm' or $shorterr eq 'noactive') { $console->status403($err); } else { - $self->usage($console, undef, $err); + $self->_usage($console, undef, $err); } } else { $self->ModulNotLoaded($console,'USER'); @@ -481,7 +482,7 @@ sub handleInput { } # ------------------ -sub usage { +sub _usage { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); @@ -490,7 +491,7 @@ sub usage { my $m = main::getModule('CONFIG'); if ($m){ - return $m->usage($console,$modulename,$hint); + return $m->usage($console,undef, $modulename,$hint); } else { $self->ModulNotLoaded($console,'CONFIG'); } @@ -501,7 +502,6 @@ sub usage { sub status { # ------------------ my $self = shift || return error('No object defined!'); - my $console = shift || return; my $lastReportTime = shift || 0; return { @@ -555,10 +555,11 @@ sub findskins # ------ unzip ------------ sub unzip { my $self = shift || return error('No object defined!'); + my $console = shift || return error('No console defined!'); my $file = shift || return error('No file defined!'); my $gz = gzopen($file, "rb") - or return $self->msg(undef, sprintf(gettext("Could not open file '%s'! : %s"), $file, &gzerror )); + or return $console->msg(undef, sprintf(gettext("Could not open file '%s'! : %s"), $file, &gzerror )); my $text; while($gz->gzread(my $buffer) > 0) { @@ -567,10 +568,9 @@ sub unzip { $gz->gzclose(); my $u = main::getModule('USER'); - if($u) { - my $tmpfile = sprintf('%s/gz_%d.tmp', $u->userTmp, time); - return save_file($tmpfile, $text); - } + return $self->ModulNotLoaded($console,'USER') unless(ref $u); + my $tmpfile = sprintf('%s/gz_%d.tmp', $u->userTmp($console->{USER}->{Name}), time); + return save_file($tmpfile, $text); } @@ -584,6 +584,7 @@ sub checkvalue { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $data = shift || return error('No data defined!'); my @query = split(':',$data); diff --git a/lib/XXV/MODULES/KEYWORDS.pm b/lib/XXV/MODULES/KEYWORDS.pm index 27c16c8..fb51765 100644 --- a/lib/XXV/MODULES/KEYWORDS.pm +++ b/lib/XXV/MODULES/KEYWORDS.pm @@ -200,6 +200,7 @@ sub suggest { my $self = shift || return error('No object defined!'); my $type = shift || return error('No type defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $search = shift; my $params = shift; @@ -280,6 +281,7 @@ sub timer_keywords { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $text = shift; my $params = shift; @@ -302,6 +304,7 @@ sub recording_keywords { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $text = shift; my $params = shift; diff --git a/lib/XXV/MODULES/LOGREAD.pm b/lib/XXV/MODULES/LOGREAD.pm index a8862e5..214b202 100644 --- a/lib/XXV/MODULES/LOGREAD.pm +++ b/lib/XXV/MODULES/LOGREAD.pm @@ -101,6 +101,7 @@ sub logger { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $logname = shift || 'standard'; my $params = shift || {}; diff --git a/lib/XXV/MODULES/MEDIALIB.pm b/lib/XXV/MODULES/MEDIALIB.pm index da41794..d219352 100644 --- a/lib/XXV/MODULES/MEDIALIB.pm +++ b/lib/XXV/MODULES/MEDIALIB.pm @@ -43,18 +43,6 @@ sub module { type => 'dir', required => gettext("This is required!"), }, - listcols => { - description => gettext('Number of columns in listview'), - default => 4, - type => 'integer', - required => gettext('This is required!'), - }, - actorcols => { - description => gettext('Number of columns of actors in detailview'), - default => 6, - type => 'integer', - required => gettext('This is required!'), - }, deflanguage => { description => gettext('Default media language'), default => 'german', @@ -294,7 +282,6 @@ sub _init { # ------------------ sub status { my $obj = shift || return error('No object defined!'); - my $console = shift; my $sql = qq| SELECT SQL_CACHE @@ -315,10 +302,10 @@ sub researchMedia { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $params = shift || {}; - if(ref $params eq 'HASH') { my $medias; @@ -344,10 +331,11 @@ sub createMedia { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $params = shift || 0; - $obj->editMedia($console, 0, $params); + $obj->editMedia($console, $config, 0, $params); } # ------------------ @@ -355,6 +343,7 @@ sub copyMedia { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $params = shift || 0; @@ -373,7 +362,7 @@ WHERE delete $erg->{id}; $erg->{range} = $params->{range} if($params && $params->{range}); - $obj->editMedia($console, 0, $erg); + $obj->editMedia($console, $config, 0, $erg); } # ------------------ @@ -381,6 +370,7 @@ sub importMedia { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $params = shift || {}; @@ -437,8 +427,8 @@ sub importMedia { } } - $params->{mediatype} = $obj->{defmediatype} unless defined $params->{mediatype} && $params->{mediatype} != 0; - $params->{language} = $obj->{deflanguage} unless defined $params->{language} && $params->{language} ne ''; + $params->{mediatype} = $config->{defmediatype} unless defined $params->{mediatype} && $params->{mediatype} != 0; + $params->{language} = $config->{deflanguage} unless defined $params->{language} && $params->{language} ne ''; $console->table({}, { @@ -456,6 +446,7 @@ sub searchMedia { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $params = shift || {}; @@ -520,7 +511,7 @@ ORDER BY title $setcount = defined $erg ? scalar @$erg : 0; map { $_->[1] =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg; - } @$erg if $obj->{usecache} eq "y"; + } @$erg if $config->{usecache} eq "y"; } $console->table($erg, @@ -529,10 +520,9 @@ ORDER BY title fields => $obj->_getsearchsfields_as_array, allgenres => $obj->_get_videogenres_as_array, setcount => $setcount, - range => defined $params->{range} && $params->{range} ne '' ? $params->{range} : $obj->{defrange}, + range => defined $params->{range} && $params->{range} ne '' ? $params->{range} : $config->{defrange}, ranges => $obj->_get_ranges_as_array, - cols => $obj->{listcols}, - usecache => $obj->{usecache}, + usecache => $config->{usecache}, } ); } @@ -542,6 +532,7 @@ sub editMedia { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $params = shift || {}; @@ -569,8 +560,8 @@ WHERE } } - $params->{mediatype} = $obj->{defmediatype} unless defined $params->{mediatype} && $params->{mediatype} != 0; - $params->{language} = $obj->{deflanguage} unless defined $params->{language} && $params->{language} ne ''; + $params->{mediatype} = $config->{defmediatype} unless defined $params->{mediatype} && $params->{mediatype} != 0; + $params->{language} = $config->{deflanguage} unless defined $params->{language} && $params->{language} ne ''; $console->table({}, { @@ -588,13 +579,14 @@ sub listMedia { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || ""; my $params = shift; my ($r, $range,$where); $r = uc($params->{range}) if ( $params && defined $params->{range} && $params->{range}=~ /^.+?/ ); - $r = uc($obj->{defrange}) + $r = uc($config->{defrange}) if ( ! $r ); if ( $r eq "SEEN" ) { @@ -630,14 +622,13 @@ ORDER BY title # da sonst die Formatierung des Listenansicht nicht mehr passt map { $_->[1] =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg; - } @$erg if $obj->{usecache} eq "y"; + } @$erg if $config->{usecache} eq "y"; my $param = { setcount => $setcount, range => $r, ranges => $obj->_get_ranges_as_array, - cols => $obj->{listcols}, - usecache => $obj->{usecache}, + usecache => $config->{usecache}, }; return $console->table($erg, $param); } @@ -647,6 +638,7 @@ sub displayMedia { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || ""; my $params = shift; @@ -666,7 +658,7 @@ WHERE id = ? my $erg = $sth->fetchall_arrayref(); my $actors = $obj->_get_actors( $erg->[0][12] ); my $actorcount = ref $actors ? scalar @$actors : 0; - $erg->[0][10] =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg if $obj->{usecache} eq "y"; + $erg->[0][10] =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg if $config->{usecache} eq "y"; $erg->[0][18] = '' if $erg->[0][18] eq '0000-00-00 00:00:00'; #\r\n will be replace with <br/> by output from OUTPUT::HTML @@ -679,10 +671,9 @@ WHERE id = ? actorcount => $actorcount, genres_all => $obj->_get_videogenres_as_hash_by_id, genres_sel => $obj->_get_videogenres_byvideoid( $id ), - range => defined $params->{range} && $params->{range} ne '' ? $params->{range} : $obj->{defrange}, + range => defined $params->{range} && $params->{range} ne '' ? $params->{range} : $config->{defrange}, ranges => $obj->_get_ranges_as_array, - actorcols => $obj->{actorcols}, - usecache => $obj->{usecache}, + usecache => $config->{usecache}, }; return $console->table($erg, $param); } @@ -692,6 +683,7 @@ sub saveMedia { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || ""; my $params = shift; @@ -735,6 +727,7 @@ sub deleteMedia { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || ""; my $params = shift; @@ -773,7 +766,6 @@ sub deleteMedia { sub _saveActors { # ------------------ my $obj = shift || return error('No object defined!'); - my $console = shift || return error('No console defined!'); my $input = shift || ''; $input =~ s/\r\n/\n/g; @@ -984,6 +976,7 @@ sub mediacache { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $params = shift || ''; diff --git a/lib/XXV/MODULES/MOVETIMER.pm b/lib/XXV/MODULES/MOVETIMER.pm index d2b050a..853ddb9 100644 --- a/lib/XXV/MODULES/MOVETIMER.pm +++ b/lib/XXV/MODULES/MOVETIMER.pm @@ -168,7 +168,8 @@ sub _init { sub movetimermanual { # ------------------ my $self = shift || return error('No object defined!'); - my $console = shift; + my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift; return 0 unless($self->_movetimer($console,$id)); @@ -362,10 +363,11 @@ sub modifyTimer { sub movetimercreate { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $data = shift || 0; - $self->movetimeredit($console, $id, $data); + $self->movetimeredit($console, $config, $id, $data); } # ------------------ @@ -376,6 +378,7 @@ sub movetimercreate { sub movetimeredit { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $data = shift || 0; @@ -537,6 +540,7 @@ sub _insert { sub movetimerdelete { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || return $console->err(gettext("Missing ID to select rules for deletion! Please use movetimerdelete 'id'")); my @rules = reverse sort{ $a <=> $b } split(/[^0-9]/, $id); @@ -566,6 +570,7 @@ sub movetimerdelete { sub movetimerlist { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my %f = ( 'id' => gettext('Service'), diff --git a/lib/XXV/MODULES/MUSIC.pm b/lib/XXV/MODULES/MUSIC.pm index e32f60f..479bcab 100644 --- a/lib/XXV/MODULES/MUSIC.pm +++ b/lib/XXV/MODULES/MUSIC.pm @@ -336,6 +336,7 @@ sub refresh { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift; + my $config = shift; my $dbh = ($obj->{mdbh} ? $obj->{mdbh} : $obj->{dbh}); @@ -454,6 +455,7 @@ sub play { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $data = shift || return error('No data defined!'); debug sprintf('Call play%s', @@ -468,6 +470,7 @@ sub playlist { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $data = shift || return error('No data defined!'); my $dbh = ($obj->{mdbh} ? $obj->{mdbh} : $obj->{dbh}); @@ -521,6 +524,7 @@ sub search { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $text = shift; unless($text) { @@ -536,6 +540,7 @@ sub list { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $param = shift; my $dbh = ($obj->{mdbh} ? $obj->{mdbh} : $obj->{dbh}); @@ -905,7 +910,6 @@ sub GenreArray { sub status { # ------------------ my $obj = shift || return error('No object defined!'); - my $console = shift; my $lastReportTime = shift || 0; return @@ -962,6 +966,7 @@ sub getcovers { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift; + my $config = shift; my $force = shift; my $dbh = ($obj->{mdbh} ? $obj->{mdbh} : $obj->{dbh}); @@ -1097,7 +1102,7 @@ sub getcovers { } # Start Robots - $rob->start( 'coverimage', $console, sub{ $waiter->end if(ref $waiter and $current); } ); + $rob->start( 'coverimage', sub{ $waiter->end if(ref $waiter and $current); } ); return $erg; } @@ -1290,6 +1295,7 @@ sub coverimage { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $data = shift || return error('No data defined!'); my $dbh = ($obj->{mdbh} ? $obj->{mdbh} : $obj->{dbh}); @@ -1360,6 +1366,7 @@ sub getfile { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $data = shift || return error('No data defined!'); my $dbh = ($obj->{mdbh} ? $obj->{mdbh} : $obj->{dbh}); @@ -1398,6 +1405,7 @@ sub suggest { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $search = shift; my $params = shift; diff --git a/lib/XXV/MODULES/RECORDS.pm b/lib/XXV/MODULES/RECORDS.pm index b0b8bf8..325c60f 100644 --- a/lib/XXV/MODULES/RECORDS.pm +++ b/lib/XXV/MODULES/RECORDS.pm @@ -486,7 +486,7 @@ sub scandirectory { wanted => sub{ if(-r $File::Find::name) { if($File::Find::name =~ /\.$typ\/\d{3}.vdr$/sig) { # Lookup for *.rec/001.vdr - my $filename = $File::Find::name;#$enc->decode($File::Find::name); + my $filename = $File::Find::name; my $path = dirname($filename); my $md5 = md5_hex($path); @@ -508,6 +508,7 @@ sub scandirectory { my $title = dirname($path); $title =~ s/^$self->{videodir}//g; $title =~ s/^\///g; +# $rec->{title} = $enc->decode($self->converttitle($title)); $rec->{title} = $self->converttitle($title); # add file @@ -537,6 +538,7 @@ sub readData { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift; + my $config = shift; my $waiter = shift; # Read manual or Once at day, make full scan my $forceUpdate = shift; @@ -656,7 +658,7 @@ sub readData { my $job = $self->videoPreview( $db_data->{$h}, 1); if($job) { push(@{$self->{JOBS}}, $job); - $self->_updatePreview($job->{RecordMD5}, $db_data->{$h}->{preview}); + $self->_updatePreview($self->{dbh}, $job->{RecordMD5}, $db_data->{$h}->{preview}); } } $self->_updateEvent($db_data->{$h}); @@ -750,7 +752,8 @@ sub readData { defined(my $child = fork()) or return con_err($console, sprintf("Couldn't fork : %s",$!)); if($child == 0) { $self->{dbh}->{InactiveDestroy} = 1; - + my $dbh = $self->{dbh}->clone(); + error(sprintf("Couldn't clone database handle : %s",$!)) unless($dbh); while(scalar @jobs > 0) { my $job = shift (@jobs); @@ -764,8 +767,9 @@ sub readData { push(@{$preview},$frame); last if(scalar @{$preview} >= $self->{previewcount}); } - $self->_updatePreview($job->{RecordMD5},$preview); + $self->_updatePreview($dbh, $job->{RecordMD5},$preview) if($dbh); } + undef $dbh; exit 0; } } @@ -834,6 +838,7 @@ sub refresh { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift; + my $config = shift; my $waiter; if(ref $console && $console->typ eq 'HTML') { @@ -842,7 +847,7 @@ sub refresh { con_msg($console,gettext("Get information on recordings ...")); } - if($self->readData($console,$waiter,'force')) { + if($self->readData($console,$config, $waiter,'force')) { $console->redirect({url => '?cmd=rlist', wait => 1}) if(ref $console and $console->typ eq 'HTML'); @@ -913,10 +918,11 @@ sub _updateState { sub _updatePreview { # ------------------ my $self = shift || return error('No object defined!'); + my $dbh = shift || return error ('No dbh defined!'); my $RecordMD5 = shift || return error ('No data defined!'); my $preview = shift || return error ('No data to replace!'); my $images = join(',',@{$preview}); - my $sth = $self->{dbh}->prepare('UPDATE RECORDS SET preview=?, addtime=NOW() where RecordMD5=?'); + my $sth = $dbh->prepare('UPDATE RECORDS SET preview=?, addtime=NOW() where RecordMD5=?'); return $sth->execute($images,$RecordMD5); } # ------------------ @@ -1477,6 +1483,7 @@ sub display { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $recordid = shift; unless($recordid) { @@ -1546,6 +1553,7 @@ sub play { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $recordid = shift || return con_err($console,gettext("No recording defined for playback! Please use rplay 'rid'.")); my $params = shift; @@ -1574,7 +1582,7 @@ sub play { my $cmd = sprintf('PLAY %d %s', $rec->{RecordID}, $start); - if($self->{svdrp}->scommand($console, $cmd)) { + if($self->{svdrp}->scommand($console, $config, $cmd)) { $console->redirect({url => sprintf('?cmd=rdisplay&data=%s',$rec->{RecordMD5}), wait => 1}) if(ref $console and $console->typ eq 'HTML'); @@ -1589,6 +1597,7 @@ sub cut { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $recordid = shift || return con_err($console,gettext("No recording defined for playback! Please use rplay 'rid'.")); my $sql = qq|SELECT SQL_CACHE RecordID,RecordMD5 FROM RECORDS WHERE RecordMD5 = ?|; @@ -1615,6 +1624,7 @@ sub list { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $text = shift || ""; my $params = shift; @@ -1757,18 +1767,20 @@ sub search { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); - my $text = shift || return $self->list($console); + my $config = shift || return error('No config defined!'); + my $text = shift || return $self->list($console,$config); my $params = shift; my $query = buildsearch("e.title,e.subtitle,e.description",$text); - return $self->_search($console,$query->{query},$query->{term},$params); + return $self->_search($console,$config,$query->{query},$query->{term},$params); } # ------------------ sub _search { # ------------------ my $self = shift || return error('No object defined!'); - my $console = shift; + my $console = shift; + my $config = shift; my $search = shift; my $term = shift; my $params = shift; @@ -1892,6 +1904,7 @@ sub delete { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $record = shift || return con_err($console,gettext("No recording defined for deletion! Please use rdelete 'id'.")); my $answer = shift || 0; @@ -2026,6 +2039,7 @@ sub redit { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $recordid = shift || return con_err($console,gettext("No recording defined for editing!")); my $data = shift || 0; @@ -2305,6 +2319,7 @@ sub conv { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $data = shift || 0; $self->_loadreccmds; @@ -2361,7 +2376,6 @@ sub conv { sub status { # ------------------ my $self = shift || return error('No object defined!'); - my $console = shift; my $lastReportTime = shift; my $sql = qq| @@ -2589,6 +2603,7 @@ sub suggest { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $search = shift; my $params = shift; @@ -2633,6 +2648,7 @@ sub recover { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $recordid = shift || 0; my $data = shift || 0; @@ -2772,6 +2788,7 @@ sub image { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $data = shift; return $console->err(gettext("Sorry, get image is'nt supported")) diff --git a/lib/XXV/MODULES/REMOTE.pm b/lib/XXV/MODULES/REMOTE.pm index a3ff243..caf09f9 100644 --- a/lib/XXV/MODULES/REMOTE.pm +++ b/lib/XXV/MODULES/REMOTE.pm @@ -32,6 +32,7 @@ sub module { default => 'y', type => 'confirm', required => gettext('This is required!'), + level => 'guest' }, commands => { description => sprintf(gettext("Path of file '%s'"),'commands.conf'), @@ -161,6 +162,7 @@ sub list { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $cmds = $self->parse(); my @list = (['__Id', 'Name', 'Cmd']); @@ -176,6 +178,7 @@ sub command { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $command = shift || return error('No command defined!'); my $cmds = $self->parse(); @@ -207,6 +210,7 @@ sub remote { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $command = shift; my $params = shift; @@ -264,6 +268,7 @@ sub switch { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift; + my $config = shift; my $cid = shift || ''; my $params = shift; diff --git a/lib/XXV/MODULES/REPORT.pm b/lib/XXV/MODULES/REPORT.pm index 1b42657..2fe2695 100644 --- a/lib/XXV/MODULES/REPORT.pm +++ b/lib/XXV/MODULES/REPORT.pm @@ -113,7 +113,8 @@ sub init { sub report { # ------------------ my $self = shift || return error('No object defined!'); - my $console = shift; + my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $modulename = shift || ''; my $mods = main::getModules(); @@ -126,7 +127,7 @@ sub report { next if($modulename and uc($modulename) ne $modCfg->{Name}); next if(exists $mods->{$modName}->{active} and $cfg->{$modCfg->{Name}}->{active} eq 'n'); if(exists $modCfg->{Status} and ref $modCfg->{Status} eq 'CODE') { - $result->{$modCfg->{Name}} = $modCfg->{Status}($console, $self->{LastReportTime}); + $result->{$modCfg->{Name}} = $modCfg->{Status}($self->{LastReportTime}); } } diff --git a/lib/XXV/MODULES/ROBOT.pm b/lib/XXV/MODULES/ROBOT.pm index d6bab6b..6b732da 100644 --- a/lib/XXV/MODULES/ROBOT.pm +++ b/lib/XXV/MODULES/ROBOT.pm @@ -20,6 +20,7 @@ sub module { Date => (split(/ /, '$Date$'))[1], Author => 'xpix', LastAuthor => (split(/ /, '$Author$'))[1], + Status => sub{ $obj->status(@_) }, Preferences => { active => { description => gettext('Activate this service'), @@ -28,13 +29,6 @@ sub module { required => gettext('This is required!'), }, }, - Commands => { - robot => { - description => gettext("Start a robots 'rname'"), - short => 'ro', - callback => sub{ $obj->start(@_) }, - }, - }, }; return $args; } @@ -111,8 +105,7 @@ sub start { # ------------------ my $obj = shift || return error('No object defined!'); my $rname = shift || return error('No robot name defined!'); - my $console = shift; - my $endcb = shift; + my $endcb = shift; lg sprintf('Start Robots ....'); @@ -169,16 +162,14 @@ sub result { sub status { # ------------------ my $obj = shift || return error('No object defined!'); - my $console = shift; - my $rname = shift; + my $lastReportTime = shift || 0; - return 1 unless(ref $console); + return + if($obj->{active} eq 'n'); - if($rname) { - $console->table($obj->{result}->{$rname}); - } else { - $console->table($obj->{result}); - } + return { + message => $obj->{result} + }; } diff --git a/lib/XXV/MODULES/SHARE.pm b/lib/XXV/MODULES/SHARE.pm index c4bb6d4..50abc4d 100644 --- a/lib/XXV/MODULES/SHARE.pm +++ b/lib/XXV/MODULES/SHARE.pm @@ -345,6 +345,7 @@ sub TopTen { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $anzahl = shift || 10; my %f = ( diff --git a/lib/XXV/MODULES/STATUS.pm b/lib/XXV/MODULES/STATUS.pm index a2875f0..2895f1c 100644 --- a/lib/XXV/MODULES/STATUS.pm +++ b/lib/XXV/MODULES/STATUS.pm @@ -36,12 +36,6 @@ sub module { type => "file", required => gettext('This is required!'), }, - wcBinary => { - description => sprintf(gettext("Path of command '%s'"),'wc'), - default => "/usr/bin/wc", - required => gettext('This is required!'), - type => "file", - }, dfBinary => { description => sprintf(gettext("Path of command '%s'"),'df'), default => "/bin/df", @@ -75,21 +69,23 @@ sub module { description => gettext('Display all relevant informations about this system'), short => 'sa', callback => sub{ - my $console = shift; + my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); + $console->setCall('vitals'); - $obj->vitals($console); + $obj->vitals($console,$config); $console->setCall('filesys'); - $obj->filesys($console); + $obj->filesys($console,$config); $console->setCall('memory'); - $obj->memory($console); + $obj->memory($console,$config); $console->setCall('network'); - $obj->network($console); + $obj->network($console,$config); $console->setCall('hardware'); - $obj->hardware($console); + $obj->hardware($console,$config); }, }, vitals => { @@ -201,6 +197,7 @@ sub vitals { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $output = { name => $obj->name(), @@ -227,6 +224,7 @@ sub network { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $interfaces = $obj->netDevs(); my $param = { @@ -244,6 +242,7 @@ sub hardware { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my ($number, $model, $speed, $cache, $bogomips) = $obj->CPU(); my $pci = $obj->pci(); @@ -271,6 +270,7 @@ sub memory { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $ret = $obj->meminfo(undef,$console->typ eq 'HTML'); my $param = { @@ -288,6 +288,7 @@ sub filesys { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $ret = $obj->mounts(undef,$obj->{graphic} eq 'y' && $console->typ eq 'HTML'); my $param = { @@ -549,10 +550,10 @@ sub util { sub users { my $obj = shift || return error('No object defined!'); - my $result = `$obj->{whoBinary} | $obj->{wcBinary} -l` - or return error "Couldn't execute $obj->{whoBinary} or $obj->{wcBinary}\n"; - $result =~ s/\n//g; - return $result; + my $result = `$obj->{whoBinary}` + or return error "Couldn't execute $obj->{whoBinary}\n"; + my $lines = ($result =~ tr/\n//); + return $lines; } diff --git a/lib/XXV/MODULES/STREAM.pm b/lib/XXV/MODULES/STREAM.pm index e693bf3..d6e3407 100644 --- a/lib/XXV/MODULES/STREAM.pm +++ b/lib/XXV/MODULES/STREAM.pm @@ -189,6 +189,7 @@ sub livestream { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $cid = shift || return con_err($console,gettext("No channel defined for streaming!")); my $params = shift; @@ -268,6 +269,7 @@ sub playrecord { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $recid = shift || return $console->err(gettext("No recording defined for streaming!")); my $params = shift; diff --git a/lib/XXV/MODULES/SVDRP.pm b/lib/XXV/MODULES/SVDRP.pm index fc9a10a..716b834 100644 --- a/lib/XXV/MODULES/SVDRP.pm +++ b/lib/XXV/MODULES/SVDRP.pm @@ -21,6 +21,7 @@ sub module { Date => (split(/ /, '$Date$'))[1], Author => 'xpix', LastAuthor => (split(/ /, '$Author$'))[1], + Status => sub{ $self->status(@_) }, Preferences => { timeout => { description => gettext('Connection timeout defines after how many seconds an unrequited connection is terminated.'), @@ -57,7 +58,7 @@ sub module { sstatus => { description => gettext('Status from video disk recorder.'), short => 'ss', - callback => sub{ $self->status(@_) }, + callback => sub{ $self->state(@_) }, Level => 'user', DenyClass => 'remote', }, @@ -179,15 +180,17 @@ sub _insert { sub create { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $data = shift || 0; - $self->edit($console, $id, $data); + $self->edit($console, $config, $id, $data); } sub edit { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $data = shift || 0; @@ -272,6 +275,8 @@ sub edit { sub delete { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); + my $id = shift || return $console->err(gettext("No definition of video disk recorder for deletion! Please use sdelete 'id'.")); my $sth = $self->{dbh}->prepare('delete from RECORDER where id = ?'); @@ -309,6 +314,7 @@ sub list { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my %f = ( 'id' => gettext('Service'), @@ -445,6 +451,15 @@ sub enum_onlinehosts { return $hosts; } +sub enum_hosts { + my $self = shift || return error('No object defined!'); + + my $sth = $self->{dbh}->prepare("SELECT SQL_CACHE host,id FROM RECORDER"); + $sth->execute() + or return error sprintf("Couldn't execute query: %s.",$sth->errstr); + return $sth->fetchall_arrayref(); +} + # ------------------ sub IDfromHostname { # ------------------ @@ -538,16 +553,15 @@ sub command { my $data; my $line; - my @commands; - push(@commands, (ref $cmd eq 'ARRAY' ? @$cmd : $cmd)); + my $commands; + push(@$commands, (ref $cmd eq 'ARRAY' ? @$cmd : $cmd)); - unless(scalar @commands > 0) { + unless(scalar @$commands > 0) { $error = 'No commands defined!'; error ($error); return (undef, $error); } - push(@commands, "quit"); - + push(@$commands, "quit"); # Open connection my $so = IO::Socket::INET->new(PeerAddr => $vdr->{host}, PeerPort => $vdr->{port} , Proto => 'tcp' ); @@ -597,8 +611,9 @@ sub command { #my $enc = find_encoding($encoding); # send commando queue - foreach my $command (@commands) { - $command =~ s/\r?\n//; + foreach my $command (@$commands) { + $command =~ s/\r//g; + $command =~ s/\n$//; #if($encoding ne $self->{charset}) { # $command = $enc->encode($command); #} @@ -648,7 +663,7 @@ sub command { $self->{Cache}->{$vdrid}->{online} = 'yes'; - foreach my $command (@commands) { + foreach my $command (@$commands) { my @lines = (split(/[\r\n]/, $command)); event(sprintf('Call command "%s" on %s %s.', $lines[0], $vdr->{host}, $error ? " failed" : "successful")) if($command ne "quit"); @@ -657,10 +672,11 @@ sub command { } # ------------------ -sub status { +sub state { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return; + my $config = shift || return error('No config defined!'); my $vdrid = shift; my ($erg,$error) = $self->command('stat disk', $vdrid); @@ -676,6 +692,7 @@ sub scommand { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $text = shift || return $console->err(gettext("No command defined! Please use scommand 'cmd'.")); my $vdrid = shift; @@ -691,4 +708,50 @@ sub scommand { return 0; } +# ------------------ +sub status { +# ------------------ + my $self = shift || return error('No object defined!'); + my $lastReportTime = shift; + + my %f = ( + 'host' => gettext('Recorder'), + 'state' => gettext('State') + ); + + my $sql = qq| +SELECT SQL_CACHE + id as __id, + host as \'$f{host}\', + active as \'$f{state}\' +from RECORDER WHERE active = 'y'|; + + my $sth = $self->{dbh}->prepare($sql); + $sth->execute() + or return error sprintf("Couldn't execute query: %s.",$sth->errstr); + my $fields = $sth->{'NAME'}; + my $erg = $sth->fetchall_arrayref(); + + map { + if(defined $self->{Cache}->{$_->[0]} + && defined $self->{Cache}->{$_->[0]}->{online}) { + if($self->{Cache}->{$_->[0]}->{online} eq 'yes') { + $_->[2] = gettext("Online"); + } else { + $_->[2] = gettext("Offline"); + } + } else { + $_->[2] = gettext("Unknown"); + } + } @$erg; + + unshift(@$erg, $fields); + return { + message => sprintf(gettext('%d active recorder'), + (scalar @$erg -1)), + table => $erg, + }; +} + + 1; diff --git a/lib/XXV/MODULES/TELNET.pm b/lib/XXV/MODULES/TELNET.pm index a1829e8..c7f93a7 100644 --- a/lib/XXV/MODULES/TELNET.pm +++ b/lib/XXV/MODULES/TELNET.pm @@ -48,21 +48,11 @@ sub module { }, }, Commands => { - quit => { - description => gettext("This will exit the telnet session"), - short => 'q', - callback => sub{ - my ($w, $c, $l) = @_; - lg "Telnet session closed.\n"; - $c->message(gettext("Session closed.")); - $obj->{LOGOUT} = 1; - }, - }, bye => { description => gettext("This will exit the xxv system."), short => 'x', callback => sub{ - my ($w, $c, $l) = @_; + my ($console, $config) = @_; my $answer; my $questions = [ 'really' => { @@ -70,10 +60,8 @@ sub module { msg => gettext("Are you sure to exit the xxv system?"), def => 'n'} ]; - $answer = $c->question(gettext("This will exit the xxv system."),$questions,$answer); + $answer = $console->question(gettext("This will exit the xxv system."),$questions,$answer); if($answer->{really} eq 'y') { - $w->w->fd->close; - $w->w->cancel; lg "Closed session and exit.\n"; main::quit; } diff --git a/lib/XXV/MODULES/TIMERS.pm b/lib/XXV/MODULES/TIMERS.pm index 9de2d81..ed4e337 100644 --- a/lib/XXV/MODULES/TIMERS.pm +++ b/lib/XXV/MODULES/TIMERS.pm @@ -27,31 +27,74 @@ sub module { default => 30 * 60, type => 'integer', required => gettext("This is required!"), + check => sub{ + my $value = shift || 0; + if($value =~ /^\d+$/sig and $value > 60) { + return int($value); + } else { + return undef, gettext('Value incorrect!'); + } + }, }, prevminutes => { description => gettext('Buffer time in minutes before the scheduled start of a recording'), default => 5, type => 'integer', + check => sub{ + my $value = shift || 0; + if($value =~ /^\d+$/sig and $value >= 0 and $value <= 1440) { + return int($value); + } else { + return undef, gettext('Value incorrect!'); + } + }, + level => 'guest' }, afterminutes => { description => gettext('Buffer time in minutes past the scheduled end of a recording'), default => 5, type => 'integer', + check => sub{ + my $value = shift || 0; + if($value =~ /^\d+$/sig and $value >= 0 and $value <= 1440) { + return int($value); + } else { + return undef, gettext('Value incorrect!'); + } + }, + level => 'guest' }, Priority => { description => gettext('Priority of a timer for recordings when creating a new timer'), default => 50, type => 'integer', + check => sub{ + my $value = shift || 0; + if($value =~ /^\d+$/sig and $value >= 0 and $value < 100) { + return int($value); + } else { + return undef, gettext('Value incorrect!'); + } + }, }, Lifetime => { description => gettext('The guaranteed lifetime (in days) of a recording created by this timer'), default => 50, type => 'integer', + check => sub{ + my $value = shift || 0; + if($value =~ /^\d+$/sig and $value >= 0 and $value < 100) { + return int($value); + } else { + return undef, gettext('Value incorrect!'); + } + }, }, usevpstime => { description => gettext('Use Programme Delivery Control (PDC) to control start time'), default => 'n', type => 'confirm', + level => 'guest' }, adjust => { description => gettext('Change timers if EPG entries change'), @@ -219,7 +262,6 @@ sub module { sub status { # ------------------ my $self = shift || return error('No object defined!'); - my $console = shift; my $lastReportTime = shift || 0; my $total = 0; @@ -427,13 +469,14 @@ sub _saveTimer { sub _newTimerdefaults { my $self = shift || return error('No object defined!'); - my $timer = shift; + my $config = shift || return error('No config defined!'); + my $timer = shift; $timer->{active} = 'y'; - $timer->{priority} = $self->{Priority}; - $timer->{lifetime} = $self->{Lifetime}; + $timer->{priority} = $config->{Priority}; + $timer->{lifetime} = $config->{Lifetime}; - if($timer->{vpsstart} && $self->{usevpstime} eq 'y' && $timer->{vpsstart} > time ) { + if($timer->{vpsstart} && $config->{usevpstime} eq 'y' && $timer->{vpsstart} > time ) { $timer->{vps} = 'y'; $timer->{day} = $timer->{vpsday}; $timer->{start} = $timer->{vpsstart}; @@ -447,6 +490,7 @@ sub newTimer { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $epgid = shift || 0; my $epg = shift || 0; @@ -472,7 +516,7 @@ WHERE|; my $data; my $sth = $self->{dbh}->prepare($sql); - if(!$sth->execute($self->{prevminutes} * 60, $self->{prevminutes} * 60, $self->{afterminutes} * 60, @events) + if(!$sth->execute($config->{prevminutes} * 60, $config->{prevminutes} * 60, $config->{afterminutes} * 60, @events) || !($data = $sth->fetchall_hashref('eventid')) || (scalar keys %{$data} < 1)) { return $console->err(sprintf(gettext("Event '%s' does not exist in the database!"),join(',',@events))); @@ -481,9 +525,9 @@ WHERE|; my $count = 1; foreach my $eventid (keys %{$data}) { $epg = $data->{$eventid}; - $self->_newTimerdefaults($epg); + $self->_newTimerdefaults($config, $epg); $epg->{action} = 'save' if(scalar keys %{$data} > 1 || $fast ); - $self->_editTimer($console, 0, $epg) if($count < scalar keys %{$data}); + $self->_editTimer($console, $config, 0, $epg) if($count < scalar keys %{$data}); $count += 1; } } @@ -496,9 +540,9 @@ WHERE|; start => my_strftime("%H%M",$t), stop => my_strftime("%H%M",$t + 3600) }; - $self->_newTimerdefaults($epg); + $self->_newTimerdefaults($config, $epg); } - $self->editTimer($console, 0, $epg); + $self->editTimer($console, $config, 0, $epg); } # ------------------ @@ -506,6 +550,7 @@ sub _editTimer { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $timerid = shift || 0; # If timerid the edittimer my $data = shift || 0; # Data for defaults @@ -762,10 +807,11 @@ sub editTimer { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $timerid = shift; # id of present timer, then edit this timer my $data = shift; # Data for defaults - if($self->_editTimer($console,$timerid,$data) + if($self->_editTimer($console,$config,$timerid,$data) && $self->{svdrp}->queue_count()) { my ($erg,$error) = $self->{svdrp}->queue_flush(); # Aufrufen der Kommandos @@ -799,6 +845,7 @@ sub deleteTimer { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $timerid = shift || return $console->err(gettext("No timer defined for deletion! Please use tdelete 'tid'.")); # If timerid the edittimer my $answer = shift || 0; @@ -884,6 +931,7 @@ sub toggleTimer { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $timerid = shift || return $console->err(gettext("No timer defined to toggle! Please use ttoggle 'id'.")); # If timerid the edittimer my @timers = split(/[^0-9a-f]/, $timerid); @@ -1122,7 +1170,8 @@ sub _readData { sub readData { # ------------------ my $self = shift || return error('No object defined!'); - my $console = shift; + my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); if($self->_readData($console)) { $console->redirect({url => '?cmd=tlist', wait => 1}) @@ -1157,6 +1206,7 @@ sub list { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift; my $params = shift; @@ -1168,7 +1218,7 @@ sub list { foreach(@timers) { push(@{$term},$_); } } - return $self->_list($console,$search,$term,$params); + return $self->_list($console,$config,$search,$term,$params); } # ------------------ @@ -1176,6 +1226,7 @@ sub search { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $text = shift || return $self->list($console); my $params = shift; @@ -1185,7 +1236,7 @@ sub search { $search = sprintf('AND ( %s )', $query->{query}); foreach(@{$query->{term}}) { push(@{$term},$_); } - return $self->_list($console,$search,$term,$params); + return $self->_list($console,$config,$search,$term,$params); } # ------------------ @@ -1193,6 +1244,7 @@ sub _list { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift; + my $config = shift; my $search = shift || ''; my $term = shift; my $params = shift; @@ -1966,6 +2018,7 @@ sub suggest { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $search = shift; my $params = shift; diff --git a/lib/XXV/MODULES/USER.pm b/lib/XXV/MODULES/USER.pm index e4a355e..7864e6e 100644 --- a/lib/XXV/MODULES/USER.pm +++ b/lib/XXV/MODULES/USER.pm @@ -10,12 +10,13 @@ use File::Path; # ------------------ sub module { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $args = { Name => 'USER', Prereq => { 'Net::IP::Match::Regexp qw( create_iprange_regexp match_ip )' => 'Efficiently match IPv4 addresses against IPv4 ranges via regexp ', + 'Data::COW' => 'clone deep data structures copy-on-write' }, Description => gettext("This module manages the User administration. @@ -71,31 +72,31 @@ or the same parameter is set for each function."), unew => { description => gettext('Create new user account'), short => 'un', - callback => sub{ $obj->create(@_) }, + callback => sub{ $self->create(@_) }, Level => 'admin', }, udelete => { description => gettext("Delete user account 'uid'"), short => 'ud', - callback => sub{ $obj->delete(@_) }, + callback => sub{ $self->delete(@_) }, Level => 'admin', }, uedit => { description => gettext("Edit user account 'uid'"), short => 'ue', - callback => sub{ $obj->edit(@_) }, + callback => sub{ $self->edit(@_) }, Level => 'admin', }, uprefs => { description => gettext("Change preferences"), short => 'up', - callback => sub{ $obj->userprefs(@_) }, + callback => sub{ $self->userprefs(@_) }, Level => 'user', }, ulist => { description => gettext("List the accounts of users"), short => 'ul', - callback => sub{ $obj->list(@_) }, + callback => sub{ $self->list(@_) }, Level => 'admin', }, logout => { @@ -103,8 +104,9 @@ or the same parameter is set for each function."), short => 'exit', callback => sub{ my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); - if($obj->{active} eq 'y') { + if($self->{active} eq 'y') { $console->message(gettext("Session closed.")); $console->redirect({url => '?', parent => 'top', wait => 2}) if($console->typ eq 'HTML'); @@ -127,14 +129,12 @@ or the same parameter is set for each function."), after => 1, prio => 6, # -1 very hard ... 6 very low cb => sub{ - $obj->logout; - delete $console->{USER} if($console->{USER}); + $self->_logout($console,$config); $ConsoleMod->{LOGOUT} = 1 if($ConsoleMod); }, ); } else { - $obj->logout; - delete $console->{USER} if($console->{USER}); + $self->_logout($console,$config); $ConsoleMod->{LOGOUT} = 1 if($ConsoleMod); } } @@ -190,28 +190,28 @@ sub new { # ------------------ sub _init { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); - unless($obj->{dbh}) { + unless($self->{dbh}) { panic("Session to database is'nt connected"); return 0; } my $version = main::getDBVersion(); # don't remove old table, if updated rows => warn only - if(!tableUpdated($obj->{dbh},'USER',$version,0)) { + if(!tableUpdated($self->{dbh},'USER',$version,0)) { return 0; } # Look for table or create this table - my $erg = $obj->{dbh}->do(qq| + my $erg = $self->{dbh}->do(qq| CREATE TABLE IF NOT EXISTS USER ( Id int(11) unsigned auto_increment NOT NULL, Name varchar(100) NOT NULL default '', Password varchar(100) NOT NULL, Level set('admin', 'user', 'guest' ) NOT NULL, - Prefs varchar(100) default '', - UserPrefs varchar(100) default '', + Prefs text default '', + UserPrefs text default '', Deny set('tlist', 'alist', 'rlist', 'mlist', 'tedit', 'aedit', 'redit', 'remote', 'stream', 'cedit', 'media'), MaxLifeTime tinyint(2) default '0', MaxPriority tinyint(2) default '0', @@ -220,8 +220,8 @@ sub _init { |); # The Table is empty? Make a default User ... - unless($obj->{dbh}->selectrow_arrayref('SELECT SQL_CACHE count(*) from USER')->[0]) { - $obj->_insert({ + unless($self->{dbh}->selectrow_arrayref('SELECT SQL_CACHE count(*) from USER')->[0]) { + $self->_insert({ Name => 'xxv', Password => 'xxv', Level => 'admin', @@ -233,29 +233,40 @@ sub _init { # ------------------ # Name: create # Descr: Save a new User in the Usertable. -# Usage: my $ok = $obj->create($console, 0, {name => 'user', ...}); +# Usage: my $ok = $self->create($console, 0, {name => 'user', ...}); # ------------------ sub create { - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $data = shift || 0; - $obj->edit($console, $id, $data); + $self->edit($console, $config, $id, $data); } # ------------------ sub userprefs { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); - my $id = shift || $obj->{USER}->{Id}; + my $config = shift || return error('No config defined!'); + my $id = shift; my $data = shift || 0; + + unless($console->{USER}->{Id}) { + return $console->err(gettext("This account has'nt own preferences!")); + } + + $id = $console->{USER}->{Id} unless($id); + if($id ne $console->{USER}->{Id}) { + return $console->err(gettext("You are not authorized for change external account preferences!")); + } my $user; if($id and not ref $data) { - my $sth = $obj->{dbh}->prepare('SELECT SQL_CACHE * from USER where Id = ?'); + my $sth = $self->{dbh}->prepare('SELECT SQL_CACHE * from USER where Id = ?'); $sth->execute($id) or return $console->err(sprintf(gettext("User account '%s' does not exist in the database!"),$id)); $user = $sth->fetchrow_hashref(); @@ -269,50 +280,106 @@ sub userprefs { 'Password' => { typ => 'password', msg => gettext("Password for this account"), - req => gettext('This is required!'), + #req => gettext('This is required!'), def => '', check => sub{ my $value = shift || return; + + return $value unless(ref $value eq 'ARRAY'); + # If no password given the # take the old password as default - if($console->typ eq 'HTML') { - if($value->[0] and $value->[0] ne $value->[1]) { - return undef, gettext("The fields with the 1st and the 2nd password must match!"); - } else { - return $value->[0]; - } - } - else { - return $value; - } - }, - }, - 'UserPrefs' => { - def => $user->{UserPrefs} || '', - msg => gettext("Personal preferences for this user: ModName::Param=value, "), - typ => 'string', - check => sub{ - my $value = shift || return; - foreach my $pref (split(',', $value)) { - my ($modname, $parameter, $value) = $pref =~ /(\S+)::(\S+)\=(.+)/sg; - if(my $mod = main::getModule($modname)) { - unless(exists $mod->{$parameter}) { - return undef, sprintf(gettext("The parameter '%s' in module '%s' does not exist!"),$parameter, $mod); - } - } + if($value->[0] and $value->[0] ne $value->[1]) { + return undef, gettext("The fields with the 1st and the 2nd password must match!"); + } else { + return $value->[0]; } - return $value; }, }, ]; + my $mods = main::getModules(); + my $defaultconfig = main::getModule('CONFIG')->{config}; + my $values; + @$values = split('\n', $user->{UserPrefs}) if($user->{UserPrefs}); + + foreach my $modName (sort keys %{$mods}) { + my $prefs = $mods->{$modName}->{MOD}->{Preferences}; + + my @m = split('::', $modName); + shift(@m);#'XXV' + shift(@m);#'MODULES' + my $modul = join('::',@m); + + my $cfg = $defaultconfig->{$modul}; + + next if(exists $mods->{$modName}->{active} and $cfg->{active} eq 'n'); + + foreach my $name (sort { lc($a) cmp lc($b) } keys(%{$prefs})) { + my $def; + if($values) { + foreach my $userpref (@$values) { + my ($modname, $parameter, $value) = $userpref =~ /(\S+)::(\S+)\=(.+)/sg; + if($modname eq $modul && $name eq $parameter) { + $def = $value; + last; + } + } + } + $def = $cfg->{$name} + if(!(defined $def) && defined $cfg->{$name} && $cfg->{$name} ne ""); + $def = $prefs->{$name}->{default} unless(defined $def); + + push(@$questions, $modul .'::'. $name, + { + typ => $prefs->{$name}->{type} || 'string', + options => $prefs->{$name}->{options}, + msg => sprintf("%s:\n%s", ucfirst($modul), ($prefs->{$name}->{description} || ucfirst($name) )), + def => $def, + #req => $prefs->{$name}->{required}, + choices => $prefs->{$name}->{choices}, + check => $prefs->{$name}->{check}, + readonly => $prefs->{$name}->{readonly} || 0, + } + ) if($prefs->{$name}->{level} + and $self->getLevel($console->{USER}->{Level}) + >= $self->getLevel($prefs->{$name}->{level})); + } + } # Ask Questions - $data = $console->question(sprintf(gettext('Edit preferences: %s'), $obj->{USER}->{Name}), $questions, $data); - - if(ref $data eq 'HASH') { - $obj->_insert($data); - - $obj->refreshUserSettings($data->{UserPrefs}, $user->{UserPrefs}); + $data = $console->question(sprintf(gettext('Edit preferences: %s'), $console->{USER}->{Name}), $questions, $data); + + if(ref $data eq 'HASH' && $data->{Id} eq $id) { + my $userpref; + foreach my $item (keys(%{$data})) { + next unless($item =~ /::/s); + my $value = delete $data->{$item}; + my ($modname, $parameter) = $item =~ /(\S+)::(\S+)/sg; + my $mod = main::getModule($modname); + unless(exists $mod->{$parameter}) { + error sprintf(("The module '%s' does not exist!"),$mod); + next; + } + unless(exists $mod->{$parameter}) { + error sprintf(("The parameter '%s' in module '%s' does not exist!"),$parameter, $mod); + next; + } + my $prefs = $mod->{MOD}->{Preferences}; + unless($prefs->{$parameter}->{level} + and $self->getLevel($console->{USER}->{Level}) + >= $self->getLevel($prefs->{$parameter}->{level})) { + error sprintf(("You are not authorized for change this parameter '%s' in module '%s'!"),$parameter, $mod); + next; + } + my $cfg = $defaultconfig->{$modname}; + unless($cfg->{$parameter} ne $value) { + next; + } + + push(@$userpref,$modname .'::'. $parameter .'='.$value); + } + $data->{UserPrefs} = $userpref ? join('\n', @$userpref) : undef; + $self->_insert($data); $console->message(gettext('User account saved!')); if($console->typ eq 'HTML') { @@ -327,17 +394,18 @@ sub userprefs { # ------------------ # Name: edit # Descr: Edit an existing User in the Usertable. -# Usage: my $ok = $obj->edit($console, $id, [$data]); +# Usage: my $ok = $self->edit($console, $id, [$data]); # ------------------ sub edit { - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $data = shift || 0; my $user; if($id and not ref $data) { - my $sth = $obj->{dbh}->prepare('SELECT SQL_CACHE * from USER where Id = ?'); + my $sth = $self->{dbh}->prepare('SELECT SQL_CACHE * from USER where Id = ?'); $sth->execute($id) or return $console->err(sprintf(gettext("User account '%s' does not exist in the database!"),$id)); $user = $sth->fetchrow_hashref(); @@ -370,17 +438,15 @@ sub edit { def => '', check => sub{ my $value = shift || return; + + return $value unless(ref $value eq 'ARRAY'); + # If no password given the # take the old password as default - if($console->typ eq 'HTML') { - if($value->[0] and $value->[0] ne $value->[1]) { - return undef, gettext("The fields with the 1st and the 2nd password must match!"); - } else { - return $value->[0]; - } - } - else { - return $value; + if($value->[0] and $value->[0] ne $value->[1]) { + return undef, gettext("The fields with the 1st and the 2nd password must match!"); + } else { + return $value->[0]; } }, }, @@ -428,12 +494,17 @@ sub edit { }, }, 'Prefs' => { - def => $user->{Prefs} || '', + def => sub { + my $value = $user->{Prefs} ? split(/\n/,$user->{Prefs}) : ''; + return (ref $value eq 'ARRAY') ? join(',', @$value) : $value; + }, msg => gettext("Preferences for this User: ModName::Param=value, "), typ => 'string', check => sub{ my $value = shift || return; - foreach my $pref (split(',', $value)) { + my @vals = (ref $value eq 'ARRAY') ? @$value : split(/\s*,\s*/, $value); + + foreach my $pref (@vals) { my ($modname, $parameter, $value) = $pref =~ /(\S+)::(\S+)\=(.+)/sg; if(my $mod = main::getModule($modname)) { unless(exists $mod->{$parameter}) { @@ -441,7 +512,7 @@ sub edit { } } } - return $value; + return join('\n', @vals); }, }, 'MaxLifeTime' => { @@ -475,10 +546,10 @@ sub edit { : gettext('Create new user account')), $questions, $data); if(ref $data eq 'HASH') { - $obj->_insert($data); + $self->_insert($data); debug sprintf('%s account with name "%s" is saved%s', - ($id ? 'New' : 'Changed'), + ($id ? 'Changed' : 'New'), $data->{Name}, ( $console->{USER} && $console->{USER}->{Name} ? sprintf(' from user: %s', $console->{USER}->{Name}) : "" ) ); @@ -493,14 +564,15 @@ sub edit { # ------------------ # Name: delete # Descr: Delete an existing User in the Usertable with Id. -# Usage: my $ok = $obj->delete($console, $id); +# Usage: my $ok = $self->delete($console, $id); # ------------------ sub delete { - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || return $console->err(gettext("No user account defined for deletion! Please use udelete 'uid'.")); - my $sth = $obj->{dbh}->prepare('delete from USER where Id = ?'); + my $sth = $self->{dbh}->prepare('delete from USER where Id = ?'); $sth->execute($id) or return $console->err(sprintf(gettext("User account '%s' does not exist in the database!"),$id)); $console->message(sprintf gettext("User account %s deleted."), $id); @@ -519,8 +591,9 @@ sub delete { # ------------------ sub list { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my %f = ( 'Id' => gettext('Service'), @@ -531,7 +604,7 @@ sub list { ); my $sql = qq| -SELECT SQL_CACHE +SELECT SQL_CACHE Id as \'$f{Id}\', Name as \'$f{Name}\', Level as \'$f{Level}\', @@ -541,7 +614,7 @@ from USER |; - my $sth = $obj->{dbh}->prepare($sql); + my $sth = $self->{dbh}->prepare($sql); $sth->execute() or return error sprintf("Couldn't execute query: %s.",$sth->errstr); my $fields = $sth->{'NAME'}; @@ -553,47 +626,39 @@ from # ------------------ # Name: logout -# Descr: The routine for logout the user, this will clean the user temp files -# and make a rollback to the standard user settings. -# Usage: my $ok = $obj->logout(); +# Descr: The routine for logout the user, this will clean the user temp files. +# Usage: my $ok = $self->logout(); # ------------------ -sub logout { - my $obj = shift || return error('No object defined!'); +sub _logout { + my $self = shift || return error('No object defined!'); + my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); lg sprintf('Logout called%s', - $obj->{USER}->{Name} ? sprintf(" by user %s", $obj->{USER}->{Name}) : "" + $console->{USER}->{Name} ? sprintf(" by user %s", $console->{USER}->{Name}) : "" ); - # get the default user settings - $obj->setUserSettings($obj->{USER}->{UserPrefs}, 'rollback') - if($obj->{USER}->{UserPrefs}); - - # get the default settings - $obj->setUserSettings($obj->{USER}->{Prefs}, 'rollback') - if($obj->{USER}->{Prefs}); - - main::toCleanUp($obj->{USER}->{Name}); - delete $obj->{USER}; + main::toCleanUp($console->{USER}->{Name}); return 1; } # ------------------ sub _checkIp { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $handle = shift || return; my $ip = getip($handle); - if($obj->{withAuth}) { - my $regexp = create_iprange_regexp(split(/\s*,\s*/, $obj->{withAuth})); + if($self->{withAuth}) { + my $regexp = create_iprange_regexp(split(/\s*,\s*/, $self->{withAuth})); if (match_ip($ip, $regexp)) { return 0; } } - if($obj->{noAuth}) { - my $regexp = create_iprange_regexp(split(/\s*,\s*/, $obj->{noAuth})); + if($self->{noAuth}) { + my $regexp = create_iprange_regexp(split(/\s*,\s*/, $self->{noAuth})); if (match_ip($ip, $regexp)) { return 1; } @@ -606,88 +671,63 @@ sub _checkIp { # Descr: The loginroutine to check the User Name, Password # or the ClientIPAdress. # This will return a Userhash with the DB-Entrys. -# Usage: my $userHash = $obj->check($handle); +# Usage: my $userHash = $self->check($handle); # ------------------ sub check { - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $handle = shift || return; - if($obj->_checkIp($handle)) { - $obj->{USER}->{Name} = undef; - $obj->{USER}->{Level} = 'admin'; + my $user; + if($self->{active} ne 'y' + or $self->_checkIp($handle)) { + $user->{Name} = 'su'; # we are Superuser + $user->{Level} = 'admin'; + #$user->{MaxLifeTime} = 0; #0 - disabled + #$user->{MaxPriority} = 0; #0 - disabled + $user->{config} = main::getModule('CONFIG')->{config}; } else { my $name = shift || return; my $password = shift || return; - - my $oldprefs = $obj->{USER}->{UserPrefs}; - - my $newUser = 0; - if((!$obj->{USER}) or (!scalar keys %{$obj->{USER}}) or $name ne $obj->{USER}->{Name}) { - lg sprintf('User %s try to login!', $name ); - $newUser = $name; - $obj->logout() - if($obj->{USER} and (scalar keys %{$obj->{USER}})); - } - # check User - my $sth = $obj->{dbh}->prepare('SELECT SQL_CACHE * from USER where Name = ? and Password = md5( ? )'); + my $sth = $self->{dbh}->prepare('SELECT SQL_CACHE * from USER where Name = ? and Password = md5( ? )'); $sth->execute($name, $password) or return error sprintf("Couldn't execute query: %s.",$sth->errstr); - $obj->{USER} = $sth->fetchrow_hashref(); + $user = $sth->fetchrow_hashref(); + + return undef + unless($user); + + $user->{config} = make_cow_ref(main::getModule('CONFIG')->{config}); # Set the user settings from user - $obj->refreshUserSettings($obj->{USER}->{UserPrefs}, $oldprefs); + $self->applySettings($user->{UserPrefs}, $user->{config}) + if($user->{UserPrefs}); # Set the user settings from admin - $obj->setUserSettings($obj->{USER}->{Prefs}, 'set') - if($obj->{USER}->{Prefs} and $newUser); + $self->applySettings($user->{Prefs}, $user->{config}) + if($user->{Prefs}); } - if(my $level = $obj->getLevel($obj->{USER}->{Level})) { - $obj->{USER}->{value} = $level if($level); + if(my $level = $self->getLevel($user->{Level})) { + $user->{value} = $level if($level); } - return $obj->{USER}; -} - -# ------------------ -sub refreshUserSettings { -# ------------------ - my $obj = shift || return error('No object defined!'); - my $newprefs = shift || ''; - my $oldprefs = shift || ''; - - return 1 if($newprefs eq $oldprefs); - - $obj->setUserSettings($oldprefs, 'rollback') - if($oldprefs); - - $obj->setUserSettings($newprefs, 'set') - if($newprefs); - - my $mod = main::getModule('CONFIG'); - $mod->reconfigure(); - + return $user; } - # ------------------ -sub setUserSettings { +sub applySettings { # ------------------ - my $obj = shift || return error('No object defined!'); - my $prefs = shift || return error ('No Settings??'); - my $mode = shift || 'set'; + my $self = shift || return error('No object defined!'); + my $newprefs = shift || return error ('No settings defined!'); + my $config = shift || return error ('No config defined!'); - foreach my $pref (split(',', $prefs)) { + foreach my $pref (split('\n', $newprefs)) { my ($modname, $parameter, $value) = $pref =~ /(\S+)::(\S+)\=(.*)/sg; if($modname and my $mod = main::getModule($modname) and my $cfg = main::getModule('CONFIG')->{config}) { if(exists $mod->{$parameter}) { - if($mode eq 'set') { - $cfg->{$modname}->{$parameter} = $value; - } else { - $cfg->{$modname}->{$parameter} = $mod->{$parameter}; - } + $config->{$modname}->{$parameter} = $value; } else { error("The Parameter '$parameter' in Module '$mod' is doesn't exist!"); } @@ -698,16 +738,16 @@ sub setUserSettings { # ------------------ sub allowCommand { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $modCfg = shift || return error('No modul defined!'); my $cmdName = shift || return error('No command name defined!'); my $user = shift || return error('No user defined!'); my $DontdumpViolation = shift || ''; if( - (exists $modCfg->{Level} and $user->{value} < $obj->getLevel($modCfg->{Level})) + (exists $modCfg->{Level} and $user->{value} < $self->getLevel($modCfg->{Level})) or - (exists $modCfg->{Commands}->{$cmdName}->{Level} and $user->{value} < $obj->getLevel($modCfg->{Commands}->{$cmdName}->{Level})) + (exists $modCfg->{Commands}->{$cmdName}->{Level} and $user->{value} < $self->getLevel($modCfg->{Commands}->{$cmdName}->{Level})) or ($user->{Deny} and exists $modCfg->{Commands}->{$cmdName}->{DenyClass} and $user->{Deny} =~ /$modCfg->{Commands}->{$cmdName}->{DenyClass}/) ) { @@ -728,7 +768,7 @@ sub allowCommand { # 'noperm' = Permission denied for the called User # 'noexists' = Command does not exist! # $error is the full Errortext to diaply im Userinterface. -# Usage: my ($cmdobj, $cmdname, $shorterr, $error) = $obj->checkCommand($console, $command); +# Usage: my ($cmdobj, $cmdname, $shorterr, $error) = $self->checkCommand($console, $command); # Test: sub t_checkCommand { my ($cmdobj, $cmdname, $shorterr, $error, $t) @@ -741,7 +781,7 @@ sub t_checkCommand { } # ------------------ sub checkCommand { - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); my $ucmd = shift || return error('No command defined!'); my $DontdumpViolation = shift || ''; @@ -751,12 +791,12 @@ sub checkCommand { my $shorterr = 0; my $cmdobj = 0; my $cmdname = 0; - my $cfg = main::getModule('CONFIG')->{config}; + my $cmdModule; my $ok = 0; # Checks the Commands Syntax (double shortcmds?) - $obj->checkCmdSyntax() - unless(defined $obj->{Check}); + $self->checkCmdSyntax() + unless(defined $self->{Check}); foreach my $modName (keys %{$mods}) { my $modCfg = $mods->{$modName}->{MOD}; @@ -765,16 +805,17 @@ sub checkCommand { $ok++; $cmdobj = $modCfg->{Commands}->{$cmdName}; $cmdname = $cmdName; + $cmdModule = $modCfg->{Name}; # Check on active Modul - if(exists $mods->{$modName}->{active} and $cfg->{$modCfg->{Name}}->{active} eq 'n') { + if(exists $mods->{$modName}->{active} and $console->{USER}->{config}->{$modCfg->{Name}}->{active} eq 'n') { $err = sprintf(gettext("Sorry, but the module %s is inactive! Enable it with %s:Preferences:active = y"), - $modCfg->{Name}, $modCfg->{Name}); + $cmdModule, $cmdModule); $shorterr = 'noactive'; } - if($obj->{active} eq 'y') { + if($self->{active} eq 'y') { # Check Userlevel and Permissions - unless($obj->allowCommand($modCfg, $cmdName, $console->{USER},$DontdumpViolation)) { + unless($self->allowCommand($modCfg, $cmdName, $console->{USER},$DontdumpViolation)) { $err = gettext('You are not authorized for this function!'); $shorterr = 'noperm'; } @@ -788,23 +829,23 @@ sub checkCommand { } if($shorterr) { - return (undef, 'nothing', $shorterr, $err) + return (undef, 'nothing', undef, $shorterr, $err) } else { - return ($cmdobj, $cmdname, undef, undef) + return ($cmdobj, $cmdname, $cmdModule, undef, undef) } } # ------------------ # Name: checkCmdSyntax # Descr: Check the Syntax of Commands and for double Names in different Modules -# Usage: my $ok = $obj->checkCmdSyntax(tlist); +# Usage: my $ok = $self->checkCmdSyntax(tlist); # Test: sub t_checkCmdSyntax { return $_[0]->checkCmdSyntax('tlist'); } # ------------------ sub checkCmdSyntax { - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $mods = main::getModules(); my $shorts = {}; @@ -820,34 +861,34 @@ sub checkCmdSyntax { } } } - $obj->{Check} = 1; + $self->{Check} = 1; 1; } # ------------------ # Name: getLevel # Descr: Translate the Levelname to an numeric level -# Usage: my $score = $obj->getLevel(levelname); +# Usage: my $score = $self->getLevel(levelname); # Test: sub t_getLevel { return $_[0]->getLevel('user') == 5; } # ------------------ sub getLevel { - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $name = shift || return; # Level Table - $obj->{LEV} = { + $self->{LEV} = { admin => 10, user => 5, guest => 1, - } unless(exists $obj->{LEV}); + } unless(exists $self->{LEV}); - if($obj->{LEV}->{$name}) { - return $obj->{LEV}->{$name}; + if($self->{LEV}->{$name}) { + return $self->{LEV}->{$name}; } else { - return error("This Levelname '$name' does not exist"); + return error("Name of level '$name' does not exist!"); } } @@ -855,7 +896,7 @@ sub getLevel { # ------------------ sub _insert { # ------------------ - my $obj = shift || return error('No object defined!'); + my $self = shift || return error('No object defined!'); my $data = shift || return; if(ref $data eq 'HASH') { @@ -894,10 +935,10 @@ sub _insert { join(', ', @$kenn), ); } - my $sth = $obj->{dbh}->prepare( $sql ); + my $sth = $self->{dbh}->prepare( $sql ); $sth->execute( @$vals ); } else { - my $sth = $obj->{dbh}->prepare('REPLACE INTO USER VALUES (?,?,?,?)'); + my $sth = $self->{dbh}->prepare('REPLACE INTO USER VALUES (?,?,?,?)'); $sth->execute( @$data ); } } @@ -905,14 +946,14 @@ sub _insert { # ------------------ # Name: userTmp # Descr: Return a temp directory only for logged user and delete this by exit xxv. -# Usage: my $tmpdir = $obj->userTmp([username]); +# Usage: my $tmpdir = $self->userTmp([username]); # ------------------ sub userTmp { - my $obj = shift || return error('No object defined!'); - my $user = ($obj->{active} eq 'y' ? ( shift || ($obj->{USER}->{Name}?$obj->{USER}->{Name}:"nobody") ) : "nobody" ); + my $self = shift || return error('No object defined!'); + my $user = shift || return error('No username defined!'); # /var/cache/xxv/temp/xpix/$PID - my $dir = sprintf('%s/%s/%d', $obj->{tempimages} , $user, $$); + my $dir = sprintf('%s/%s/%d', $self->{tempimages} , $user, $$); unless(-d $dir) { mkpath($dir) or error "Couldn't mkpath $dir : $!"; diff --git a/lib/XXV/MODULES/VTX.pm b/lib/XXV/MODULES/VTX.pm index 18deaa6..67a5c85 100644 --- a/lib/XXV/MODULES/VTX.pm +++ b/lib/XXV/MODULES/VTX.pm @@ -109,6 +109,7 @@ sub new { sub findfirst { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $basedir = $self->{dir}; unless($basedir and -d $basedir) { @@ -141,6 +142,7 @@ sub findfirst { sub channel { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $channel = shift; my $basedir = $self->{dir}; @@ -152,7 +154,7 @@ sub channel { } unless($channel) { - return $self->findfirst ($console); + return $self->findfirst ($console, $config); } my $mod = main::getModule ('CHANNELS'); @@ -252,8 +254,9 @@ sub channel { sub page { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $page = shift || ""; - my $channel = $self->{CHANNEL} || return $self->findfirst ($console); + my $channel = $self->{CHANNEL} || return $self->findfirst ($console, $config); my $basedir = $self->{dir} || return error('No base directory defined!'); my $chandir = $self->{CHANNELDIR} || return error('No channel defined!'); my $cache = $self->{cache} || 'packed'; @@ -1371,7 +1374,7 @@ sub HighLight { my $ub = "</font>"; foreach my $line (split('\n',$result)) { - $line =~ s/$search/$ua$search$ub/g; + $line =~ s/$search/$ua$1$ub/ig; $lines .= $line; } return $lines; @@ -1382,6 +1385,7 @@ sub HighLight { sub search { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $search = shift; my $channel = $self->{CHANNEL}; @@ -1447,6 +1451,7 @@ sub image { # ------------------ my $obj = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $data = shift; return $console->err(gettext("Sorry, get image is'nt supported")) diff --git a/lib/XXV/MODULES/XMLTV.pm b/lib/XXV/MODULES/XMLTV.pm index b53d31a..aa6bf35 100644 --- a/lib/XXV/MODULES/XMLTV.pm +++ b/lib/XXV/MODULES/XMLTV.pm @@ -16,7 +16,7 @@ sub module { Prereq => { 'Template' => 'Front-end module to the Template Toolkit ', 'Date::Manip' => 'date manipulation routines', - 'Time::Local' => 'efficiently compute time from local and GMT time ', + 'Time::Local' => 'efficiently compute time from local and GMT time', 'XML::Simple' => 'Easy API to maintain XML (esp config files)' }, Description => gettext('This module import epg data from xmltv sources.'), @@ -180,7 +180,7 @@ sub _init { return 0 if($self->{active} ne 'y'); lg 'Start callback to import xmltv epg data!'; - $self->_XMLTV($console,$waiter); + $self->_XMLTV($console,undef,$waiter); } ); return 1; @@ -194,6 +194,7 @@ sub manual { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift; + my $config = shift; my $id = shift; my $waiter; @@ -201,7 +202,7 @@ sub manual { $waiter = $console->wait(gettext("Import epg data from xmltv sources ..."),0,1000,'no'); } - my ($msg, $error) = $self->_XMLTV($console,$waiter,$id); + my ($msg, $error) = $self->_XMLTV($console,$config,$waiter,$id,'force'); $waiter->end() if(ref $waiter); $console->start() if(ref $waiter); @@ -220,12 +221,15 @@ sub _XMLTV { # ------------------ my $self = shift || return error('No object defined!'); my $console = shift; + my $config = shift; my $waiter = shift; my $id = shift; + my $force = shift; - my $sth = $self->{dbh}->prepare(q| + my $sql = qq| select x.id, + x.vid, x.active, x.xmltvname, x.channel, @@ -234,12 +238,18 @@ sub _XMLTV { x.source, UNIX_TIMESTAMP(x.updated) as updated, c.Name - from XMLTV as x, CHANNELS as c + from XMLTV as x, CHANNELS as c, RECORDER as r where - active != 'n' - AND x.channel = c.Id - |); - if(!$sth->execute()) { + x.active != 'n' + and x.channel = c.Id + and x.vid = r.id + and r.active != 'n' + |; + $sql .= qq| and x.id = ?| if($id); + $sql .= qq| ORDER BY x.vid|; + + my $sth = $self->{dbh}->prepare($sql); + unless($id ? $sth->execute($id) : $sth->execute()) { error sprintf("Couldn't execute query: %s.",$sth->errstr); return (undef, undef) } @@ -247,12 +257,13 @@ sub _XMLTV { return (undef, undef) unless($rules); # Adjust waiter max value now. - $waiter->max(scalar keys %$rules) + $waiter->max((scalar keys %$rules)+1) if(ref $console && ref $waiter); my $now = time(); my $l = 0; - my $output; + my $output = ""; + my $vid; foreach my $id (sort keys %$rules) { my $rule = $rules->{$id}; @@ -260,12 +271,14 @@ sub _XMLTV { $waiter->next(++$l, undef, sprintf(gettext("Import epg data for channel '%s'"), $rule->{Name})) if(ref $waiter); - if($rule->{updateinterval} eq 'd' && ($rule->{updated} + 86400) > $now ) { - lg sprintf("Skip import xml data by update interval : %s (%s) id %d",$rule->{Name},$rule->{channel},$rule->{id}); - next; - } elsif($rule->{updateinterval} eq 'w' && ($rule->{updated} + (86400 * 7)) > $now ) { - lg sprintf("Skip import xml data by update interval : %s (%s) id %d",$rule->{Name},$rule->{channel},$rule->{id}); - next; + unless($force && $id) { + if($rule->{updateinterval} eq 'd' && ($rule->{updated} + 86400) > $now ) { + lg sprintf("Skip import xml data by update interval : %s (%s) id %d",$rule->{Name},$rule->{channel},$rule->{id}); + next; + } elsif($rule->{updateinterval} eq 'w' && ($rule->{updated} + (86400 * 7)) > $now ) { + lg sprintf("Skip import xml data by update interval : %s (%s) id %d",$rule->{Name},$rule->{channel},$rule->{id}); + next; + } } my $file = sprintf("%s/%s",$self->{paths}->{XMLTV},$rule->{source}); @@ -285,19 +298,28 @@ sub _XMLTV { error sprintf("Can't process xml data at %s (%s) id %d",$rule->{Name},$rule->{channel},$rule->{id}); } } + if($vid && $vid != $rule->{vid}) { + $self->{svdrp}->queue_add("PUTE\n" . $output . ".\n",$rule->{vid}); + $output = ""; + } + $vid = $rule->{vid}; } - if($output and length $output) { + if($vid && $output && length $output) { + $self->{svdrp}->queue_add("PUTE\n" . $output . ".\n",$vid); + } + if($self->{svdrp}->queue_count()) { $waiter->next(undef,undef,gettext('Transmit data.')) if(ref $waiter); - my ($erg,$error) = $self->{svdrp}->command(sprintf("PUTE\n%s\n.\n",$output)); + + my ($erg,$error) = $self->{svdrp}->queue_flush(); unless($error) { debug 'Data import complete'; return ($erg, undef); } else { error sprintf('Data does\'nt imported : %s',$error); - return (undef, $erg); + return (undef, $error); } } else { error sprintf('None data exits to import'); @@ -346,7 +368,7 @@ sub _ProcessXML { # Create output - my $epgdata = ''; + my $epgdata; # Find XML events @@ -364,7 +386,7 @@ sub _ProcessXML { # 'channel' => 'abc', # 'start' => '20080317160000 +0100' # }, - next if($xmltvname and $xml->{channel} ne $xmltvname); + next if($xmltvname && $xml->{channel} ne $xmltvname); my $vdrst = &xmltime2vdr($xml->{start}, $adjust); my $vdret = &xmltime2vdr($xml->{stop}, $adjust); @@ -377,10 +399,8 @@ sub _ProcessXML { $vdrdesc =~ s/\r\n/\|/g; # pipe used from vdr as linebreak $vdrdesc =~ s/\n/\|/g; # pipe used from vdr as linebreak - if($self->{charset} ne 'UTF-8') { - $vdrtitle = encode($self->{charset},$vdrtitle); - $vdrdesc = encode($self->{charset},$vdrdesc); - } + $vdrtitle = encode($self->{charset},$vdrtitle); + $vdrdesc = encode($self->{charset},$vdrdesc); # Send VDR Event $epgdata .= "E $vdrid $vdrst $vdrdur 0\n"; @@ -390,9 +410,11 @@ sub _ProcessXML { } - return unless($epgdata and length $epgdata); + return unless($epgdata && length $epgdata); - return "C $cid $channel_name\n".$epgdata . "c\n"; + return "C $cid $channel_name\n" + . $epgdata + . "c\n"; } # ------------------ @@ -447,10 +469,11 @@ sub _parse_template { sub create { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $data = shift || 0; - $self->edit($console, $id, $data); + $self->edit($console, $config, $id, $data); } # ------------------ @@ -461,13 +484,14 @@ sub create { sub edit { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || 0; my $data = shift || 0; my $modC = main::getModule('CHANNELS'); my $rule; - if($id and not ref $data) { + if($id && not ref $data) { my $sth = $self->{dbh}->prepare("select * from XMLTV where id = ?"); $sth->execute($id) or return $console->err(sprintf(gettext("Rule to import epg data from xmltv sources with ID '%s' does not exist in the database!"),$id)); @@ -476,6 +500,7 @@ sub edit { } elsif (ref $data eq 'HASH') { $rule = $data; } + my $vlist = $self->{svdrp}->enum_hosts(); my $con = $console->typ eq "CONSOLE"; my $questions = [ @@ -500,26 +525,27 @@ sub edit { def => $rule->{xmltvname} || '', typ => 'string' }, + 'vid' => { + typ => scalar @$vlist > 1 ? 'list' : 'hidden', + def => $rule->{vid} || $self->{svdrp}->primary_hosts(), + choices => $vlist, + msg => gettext('Which video disk recorder should record'), + }, 'channel' => { typ => 'list', def => $con ? $modC->ChannelToPos($rule->{channel}) : $rule->{channel}, - choices => $con ? $modC->ChannelArray('Name') : $modC->ChannelWithGroup('Name,Id'), + choices => $con ? $modC->ChannelArray('name') : $modC->ChannelWithGroup('c.name,c.id'), msg => gettext('Assign data to channel?'), req => gettext("This is required!"), check => sub{ - my $value = shift || return; - - if(my $name = $modC->ChannelToName($value)) { - $data->{channel} = $value; - return $value; - } elsif(my $ch = $modC->PosToChannel($value) || $modC->NameToChannel($value) ) { - $data->{channel} = $value; - return $ch; - } elsif( ! $modC->NameToChannel($value)) { - return undef, sprintf(gettext("This channel '%s' does not exist!"),$value); - } else { - return undef, gettext("This is required!"); - } + my $value = shift; + return undef, gettext("This is required!") + unless($value); + + my $ch = $modC->ToCID($value,$data->{vid}); + return undef, sprintf(gettext("Channel '%s' does not exist on video disk recorder %s!"),$value, $self->{svdrp}->hostname($data->{vid})) + unless($ch); + return $ch; }, }, 'template' => { @@ -556,11 +582,11 @@ sub edit { $console->message(gettext('Rule to import epg data from xmltv sources saved!')); debug sprintf('%s rule to import epg data from xmltv sources is saved%s', - ($id ? 'New' : 'Changed'), + ($id ? 'Changed' : 'New'), ( $console->{USER} && $console->{USER}->{Name} ? sprintf(' from user: %s', $console->{USER}->{Name}) : "" ) ); - my ($msg, $error) = $self->_XMLTV($console,undef,$data->{id}); + my ($msg, $error) = $self->_XMLTV($console,$config,undef,$data->{id}); if($error) { $console->err($error); } elsif($msg) { @@ -628,6 +654,7 @@ sub _updateTime { sub remove { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my $id = shift || return $console->err(gettext("Missing ID to select rules for deletion! Please use xmltvremove 'id'")); my @rules = reverse sort{ $a <=> $b } split(/[^0-9]/, $id); @@ -657,6 +684,7 @@ sub remove { sub list { my $self = shift || return error('No object defined!'); my $console = shift || return error('No console defined!'); + my $config = shift || return error('No config defined!'); my %f = ( 'id' => gettext('Service'), @@ -665,23 +693,27 @@ sub list { 'template' => gettext('Parse data as template'), 'interval' => gettext('Interval to parse data'), 'source' => gettext('source to import'), + 'host' => gettext('Video disk recorder') ); my $sql = qq| select - id as \'$f{'id'}\', - active as \'$f{'active'}\', + x.id as \'$f{'id'}\', + IF(x.active!='n' and r.active!='n','y','n') as \'$f{'active'}\', (SELECT Name FROM CHANNELS as c WHERE x.channel = c.Id LIMIT 1) as \'$f{'channel'}\', - template as \'$f{'template'}\', - updateinterval as \'$f{'interval'}\', - source as \'$f{'source'}\' + x.template as \'$f{'template'}\', + x.updateinterval as \'$f{'interval'}\', + x.source as \'$f{'source'}\', + r.host as \'$f{'host'}\' from - XMLTV as x + XMLTV as x, RECORDER as r + where + x.vid = r.id order by - id + x.id |; my $sth = $self->{dbh}->prepare($sql); @@ -708,8 +740,10 @@ sub list { } @$erg; unshift(@$erg, $fields); - - $console->table($erg); + my $hostlist = $self->{svdrp}->list_hosts(); + $console->table($erg, { + recorder => scalar @$hostlist, + }); } # ------------------ diff --git a/lib/XXV/OUTPUT/Console.pm b/lib/XXV/OUTPUT/Console.pm index 9bed898..3f83797 100644 --- a/lib/XXV/OUTPUT/Console.pm +++ b/lib/XXV/OUTPUT/Console.pm @@ -641,7 +641,7 @@ sub pod { my $podfile = sprintf('%s/%s.pod', $obj->{paths}->{PODPATH}, $modname); return $obj->err(sprintf(gettext('Module %s not found!'), $modname)) unless(-r $podfile); - my $tmpdir = main::getModule('USER')->userTmp; + my $tmpdir = main::getModule('USER')->userTmp($obj->{USER}->{Name}); my $outfile = sprintf('%s/%s_%d.pod', $tmpdir, $modname, time); my $parser = Pod::Text->new (sentence => 0, width => 78); @@ -678,7 +678,7 @@ sub txtfile { return $obj->err(sprintf(gettext("Could not open file '%s'! : %s"), $filename, $e)); } } - $txtfile = main::getModule('HTTPD')->unzip($gzfile); + $txtfile = main::getModule('HTTPD')->unzip($obj,$gzfile); } } my $txt = load_file($txtfile); diff --git a/lib/XXV/OUTPUT/Html.pm b/lib/XXV/OUTPUT/Html.pm index ae93f51..95b1906 100644 --- a/lib/XXV/OUTPUT/Html.pm +++ b/lib/XXV/OUTPUT/Html.pm @@ -87,8 +87,7 @@ sub new { $self->{htmdir} = $attr{'-htmdir'} || return error('No htmdir given!'); - $self->{htmdef} = $attr{'-htmdef'} - || return error('No htmdef given!'); + $self->{htmdef} = sprintf('%s/default', $self->{htmdir}); $self->{cgi} = $attr{'-cgi'} || return error('No cgi given!'); @@ -99,9 +98,6 @@ sub new { $self->{browser} = $attr{'-browser'} || return error('No browser given!'); - $self->{start} = $attr{'-start'} - || return error('No start page given!'); - $self->{debug} = $attr{'-debug'} || 0; @@ -141,10 +137,12 @@ sub parseTemplate { sub index { # ------------------ my $self = shift || return error('No object defined!'); + my $start = shift || return error('No start page defined!'); + $self->{nopack} = 1; $self->{call} = 'index'; my $params = {}; - $params->{start} = $self->{start}; + $params->{start} = $start; $self->out( $self->parseTemplateFile("index", {}, $params, $self->{call})); } @@ -167,7 +165,7 @@ sub parseTemplateFile { $self->{tt} = Template->new( START_TAG => '\<\?\%', # Tagstyle END_TAG => '\%\?\>', # Tagstyle - INCLUDE_PATH => [$self->{htmdir},$self->{htmdef}] , # or list ref + INCLUDE_PATH => [$self->{Skin},$self->{htmdef}] , # or list ref INTERPOLATE => 1, # expand "$var" in plain text PRE_CHOMP => 1, # cleanup whitespace EVAL_PERL => 1, # evaluate Perl code blocks @@ -183,9 +181,7 @@ sub parseTemplateFile { # StandardTemplate: ./htmlRoot/widgets/menu.tmpl my $widget_first = sprintf('%s.tmpl', $call); my $widget_second = sprintf('widgets/%s.tmpl', $name); - my $widget = (-e sprintf('%s/%s', $self->{htmdir}, $widget_first) ? $widget_first : $widget_second); - - my $user = ($u->{active} eq 'y' && $self->{USER}->{Name} ? $self->{USER}->{Name} : "nobody" ); + my $widget = (-e sprintf('%s/%s', $self->{Skin}, $widget_first) ? $widget_first : $widget_second); my $output; my $vars = { cgi => $self->{cgi}, @@ -197,7 +193,7 @@ sub parseTemplateFile { pid => $$, debug => 0, # Avoid losing encoding like utf8 verbose => $self->{debug}, - user => $user, + user => $self->{USER}->{Name}, charset => $self->{charset}, # query the current locale locale => main::getGeneralConfig->{Language}, @@ -289,7 +285,7 @@ sub parseTemplateFile { my $filename = shift || return error('No filename defined!'); my $data = shift || return error('No data defined!'); - my $dir = $u->userTmp; + my $dir = $u->userTmp($self->{USER}->{Name}); # absolut Path to file my $file = sprintf('%s/%s', $dir, $filename); @@ -491,7 +487,7 @@ sub status404 { my $file = shift || return error('No file defined!'); my $why = shift || ""; - $file =~ s/$self->{htmdir}\///g; # Don't post html root, avoid spy out + $file =~ s/$self->{Skin}\///g; # Don't post html root, avoid spy out $self->statusmsg(404,sprintf(gettext("Couldn't open file '%s' : %s!"),$file,$why), gettext("Not found")); @@ -939,7 +935,7 @@ sub pod { unless(-r $podfile); my $u = main::getModule('USER'); - my $tmpdir = $u->userTmp; + my $tmpdir = $u->userTmp($self->{USER}->{Name}); my $outfile = sprintf('%s/%s_%d.pod', $tmpdir, $modname, time); pod2html( @@ -980,7 +976,7 @@ sub txtfile { return $self->err(sprintf(gettext("Could not open file '%s'! : %s"), $filename, $e)); } } - $txtfile = main::getModule('HTTPD')->unzip($gzfile); + $txtfile = main::getModule('HTTPD')->unzip($self,$gzfile); } } @@ -992,7 +988,7 @@ sub txtfile { } my $u = main::getModule('USER'); - my $htmlfile = sprintf('%s/temp_txt.html', $u->userTmp); + my $htmlfile = sprintf('%s/temp_txt.html', $u->userTmp($self->{USER}->{Name})); # create TextToHTML object unless(exists $self->{txt2html}) { @@ -1030,6 +1026,17 @@ sub setCall { } # ------------------ +sub setSkin { +# ------------------ + my $self = shift || return error('No object defined!'); + my $name = shift || return error ('No skin defined!'); + + $self->{Skin} = sprintf('%s/%s', $self->{htmdir}, $name); + return $self->{Skin}; +} + + +# ------------------ sub browser { # ------------------ my $self = shift || return error('No object defined!'); diff --git a/lib/XXV/OUTPUT/NEWS/JABBER.pm b/lib/XXV/OUTPUT/NEWS/JABBER.pm index 273775a..440e5d5 100644 --- a/lib/XXV/OUTPUT/NEWS/JABBER.pm +++ b/lib/XXV/OUTPUT/NEWS/JABBER.pm @@ -128,7 +128,8 @@ Then you must receive a message in your running jabber client. return $value unless(ref $value eq 'ARRAY'); - # If no password given the take the old password as default + # If no password given the + # take the old password as default if($value->[0] and $value->[0] ne $value->[1]) { return undef, gettext("The fields with the 1st and the 2nd password must match!"); } else { diff --git a/lib/XXV/OUTPUT/Wml.pm b/lib/XXV/OUTPUT/Wml.pm index 196cee9..d2852d4 100644 --- a/lib/XXV/OUTPUT/Wml.pm +++ b/lib/XXV/OUTPUT/Wml.pm @@ -127,7 +127,6 @@ sub parseTemplate { my $widget_first = sprintf('%s.tmpl', (exists $self->{call}) ? $self->{call} : 'nothing'); my $widget_second = sprintf('widgets/%s.tmpl', $name); my $widget = (-e sprintf('%s/%s', $self->{wmldir}, $widget_first) ? $widget_first : $widget_second); - my $user = ($u->{active} eq 'y' && $self->{USER}->{Name} ? $self->{USER}->{Name} : "nobody" ); my $output; my $vars = { cgi => $self->{cgi}, @@ -138,7 +137,7 @@ sub parseTemplate { param => $params, pid => $$, debug => 1, - user => $user, + user => $self->{USER}->{Name}, charset => $self->{charset}, allow => sub{ my($cmdobj, $cmdname, $se, $err) = $u->checkCommand($self, $_[0],"1"); @@ -160,7 +159,7 @@ sub parseTemplate { my $filename = shift || return error('No Filename to write'); my $data = shift || return error('Nothing data to write'); - my $dir = $u->userTmp; + my $dir = $u->userTmp($self->{USER}->{Name}); # absolut Path to file my $file = sprintf('%s/%s', $dir, $filename); @@ -375,7 +374,7 @@ sub pod { $modname = ucfirst($modname) if($modname eq 'GENERAL'); my $podfile = sprintf('%s/%s.pod', $self->{paths}->{PODPATH}, $modname); - my $tmpdir = main::getModule('USER')->userTmp; + my $tmpdir = main::getModule('USER')->userTmp($self->{USER}->{Name}); my $outfile = sprintf('%s/%s_%d.pod', $tmpdir, $modname, time); pod2html( |
