summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndreas Brachold <vdr07@deltab.de>2008-11-24 16:39:09 +0000
committerAndreas Brachold <vdr07@deltab.de>2008-11-24 16:39:09 +0000
commit8c42985fd234e2a993b3f01416941f4b371d1a92 (patch)
tree917e47097785386fa27a0c29f6ab8f83a950b872 /lib
parentffb81caa20a1dbede72f8a45299af87f8ab049e2 (diff)
downloadxxv-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')
-rw-r--r--lib/Data/COW.pm332
-rw-r--r--lib/XXV/MODULES/AUTOTIMER.pm22
-rw-r--r--lib/XXV/MODULES/CHANNELS.pm12
-rw-r--r--lib/XXV/MODULES/CHRONICLE.pm5
-rw-r--r--lib/XXV/MODULES/CONFIG.pm12
-rw-r--r--lib/XXV/MODULES/EPG.pm25
-rw-r--r--lib/XXV/MODULES/EVENTS.pm3
-rw-r--r--lib/XXV/MODULES/GRAB.pm1
-rw-r--r--lib/XXV/MODULES/HTTPD.pm69
-rw-r--r--lib/XXV/MODULES/KEYWORDS.pm3
-rw-r--r--lib/XXV/MODULES/LOGREAD.pm1
-rw-r--r--lib/XXV/MODULES/MEDIALIB.pm59
-rw-r--r--lib/XXV/MODULES/MOVETIMER.pm9
-rw-r--r--lib/XXV/MODULES/MUSIC.pm12
-rw-r--r--lib/XXV/MODULES/RECORDS.pm39
-rw-r--r--lib/XXV/MODULES/REMOTE.pm5
-rw-r--r--lib/XXV/MODULES/REPORT.pm5
-rw-r--r--lib/XXV/MODULES/ROBOT.pm25
-rw-r--r--lib/XXV/MODULES/SHARE.pm1
-rw-r--r--lib/XXV/MODULES/STATUS.pm33
-rw-r--r--lib/XXV/MODULES/STREAM.pm2
-rw-r--r--lib/XXV/MODULES/SVDRP.pm85
-rw-r--r--lib/XXV/MODULES/TELNET.pm16
-rw-r--r--lib/XXV/MODULES/TIMERS.pm81
-rw-r--r--lib/XXV/MODULES/USER.pm417
-rw-r--r--lib/XXV/MODULES/VTX.pm11
-rw-r--r--lib/XXV/MODULES/XMLTV.pm144
-rw-r--r--lib/XXV/OUTPUT/Console.pm4
-rw-r--r--lib/XXV/OUTPUT/Html.pm39
-rw-r--r--lib/XXV/OUTPUT/NEWS/JABBER.pm3
-rw-r--r--lib/XXV/OUTPUT/Wml.pm7
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(