From 5470786090514ae197be0e6e8a0e1abd39777536 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Fri, 24 Jul 2015 19:24:53 +0200 Subject: inital commit contain rddb form rhwebimport diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..bb907e2 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,3 @@ +2015.07.24 -- Version 0.1.0 + +* initial release diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 0000000..c9f1b5e --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,14 @@ +use ExtUtils::MakeMaker; +use 5.004; + +WriteMakefile( + NAME => 'RHRD', + VERSION_FROM => 'lib/RHRD.pm', + LICENSE => 'gpl_3', + AUTHOR => 'Christian Pointner ', + ABSTRACT => 'Radio Helsinki Rivendell libraries and utils', + PREREQ_PM => { + "Config::IniFiles" => 0, + "DBI" => 0 + }, +); diff --git a/lib/RHRD.pm b/lib/RHRD.pm new file mode 100644 index 0000000..dce995f --- /dev/null +++ b/lib/RHRD.pm @@ -0,0 +1,31 @@ +# RHRD.pm +# +# rhrdlibs +# +# Copyright (C) 2015 Christian Pointner +# +# This file is part of rhrdlibs. +# +# rhrdlibs is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# any later version. +# +# rhrdlibs is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with rhrdlibs. If not, see . +# + +package RHRD; + +use strict; +use vars qw($VERSION); +use 5.004; + +$VERSION = "0.1" + +########################################################################## diff --git a/lib/RHRD/rddb.pm b/lib/RHRD/rddb.pm new file mode 100755 index 0000000..0074833 --- /dev/null +++ b/lib/RHRD/rddb.pm @@ -0,0 +1,185 @@ +# rddb.pm +# +# rhrdlibs +# +# Copyright (C) 2015 Christian Pointner +# +# This file is part of rhrdlibs. +# +# rhrdlibs is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# any later version. +# +# rhrdlibs is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with rhrdlibs. If not, see . +# + +package RHRD::rddb; + +use strict; +use Config::IniFiles; +use DBI; + +sub opendb +{ + my $RD_CONF = "/etc/rd.conf"; # TODO: hardcoded value + my $cfg = Config::IniFiles->new(-file => $RD_CONF) + or return (undef , 'ERROR', "Config File Error: " . join("\n", @Config::IniFiles::errors)); + + my $dbhost = $cfg->val('mySQL', 'Hostname'); + my $dbname = $cfg->val('mySQL', 'Database'); + my $dbuser = $cfg->val('mySQL', 'Loginname'); + my $dbpasswd = $cfg->val('mySQL', 'Password'); + + my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost","$dbuser","$dbpasswd") + or return (undef, 'ERROR', "Database Error: " . $DBI::errstr); + + $dbh->do(qq{SET CHARACTER SET utf8;}) + or return (undef, 'ERROR', "Database Error: " . $dbh->errstr); + + return ($dbh, 'OK', 'success'); +} + +sub closedb +{ + my $dbh = shift; + $dbh->disconnect(); +} + +sub get_token +{ + my ($dbh, $username) = @_; + + my $sql = qq{select PASSWORD from USERS where LOGIN_NAME = ?;}; + my $sth = $dbh->prepare($sql) + or return (undef, 'ERROR', "Database Error: " . $dbh->errstr); + + $sth->execute($username) + or return (undef, 'ERROR', "Database Error: " . $sth->errstr); + + my ($token) = $sth->fetchrow_array; + $sth->finish(); + + unless(defined $token) { + return (undef, 'ERROR', "user '" . $username . "' not known by rivendell") + } + return ($token, 'OK', 'success'); +} + +sub check_token +{ + my ($dbh, $username, $token) = @_; + + my $sql = qq{select PASSWORD from USERS where LOGIN_NAME = ?;}; + my $sth = $dbh->prepare($sql) + or return (undef, 'ERROR', "Database Error: " . $dbh->errstr); + + $sth->execute($username) + or return (undef, 'ERROR', "Database Error: " . $sth->errstr); + + my ($token_result) = $sth->fetchrow_array; + $sth->finish(); + + unless(defined $token_result) { + return (undef, 'ERROR', "user '" . $username . "' not known by rivendell") + } + + if($token_result eq $token) { + return (1, 'OK', 'success'); + } + return (0, 'ERROR', "wrong password"); +} + +sub get_showtitle_and_log +{ + my ($dbh, $showid) = @_; + + my $sql = qq{select TITLE,MACROS from CART where NUMBER = ?;}; + my $sth = $dbh->prepare($sql) + or return (undef, undef, 'ERROR', "Database Error: " . $dbh->errstr); + + $sth->execute($showid) + or return (undef, undef, 'ERROR', "Database Error: " . $sth->errstr); + + my ($title, $macros) = $sth->fetchrow_array; + $sth->finish(); + + unless(defined $title) { + return (undef, undef, 'ERROR', "Show with ID=" . $showid . " not found!") + } + unless(defined $macros) { + return (undef, undef, 'ERROR', "Show with ID=" . $showid . " has no macro!"); + } + + unless($macros =~ /^LL 1 ([^ ]+) 0\!$/) { + return (undef, undef, 'ERROR', "Show with ID=" . $showid . " has invalid macro: '" . $macros . "'"); + } + my $log = $1; + + return ($title, $log, 'OK', 'success'); +} + +sub get_dropboxes +{ + my ($dbh, $username) = @_; + + my $sql = qq{select USER_PERMS.GROUP_NAME,DROPBOXES.TO_CART,DROPBOXES.NORMALIZATION_LEVEL,DROPBOXES.AUTOTRIM_LEVEL,DROPBOXES.SET_USER_DEFINED,GROUPS.DEFAULT_LOW_CART,GROUPS.DEFAULT_HIGH_CART,GROUPS.DESCRIPTION from USER_PERMS, DROPBOXES, GROUPS where USER_PERMS.USER_NAME=? and DROPBOXES.GROUP_NAME=USER_PERMS.GROUP_NAME and DROPBOXES.GROUP_NAME=GROUPS.NAME and DROPBOXES.STATION_NAME=?;}; + + my $sth = $dbh->prepare($sql) + or return (undef, 'ERROR', "Database Error: " . $dbh->errstr); + + $sth->execute($username, 'import-dropbox') # TODO: hardcoded value + or return (undef, 'ERROR', "Database Error: " . $sth->errstr); + + my @allowed_dbs; + while(my ($group, $to_cart, $normlevel, $trimlevel, $params, $lowcart, $highcart, $groupdesc) = $sth->fetchrow_array()) { + my @p = split(';', $params); + + my $entry = {}; + $entry->{'GROUP'} = $group; + $entry->{'GROUPDESC'} = $groupdesc; + $entry->{'GROUPLOWCART'} = int $lowcart; + $entry->{'GROUPHIGHCART'} = int $highcart; + $entry->{'NORMLEVEL'} = int $normlevel; + $entry->{'TRIMLEVEL'} = int $trimlevel; + $entry->{'PARAM'} = $params; + if($p[0] eq "S") { + $entry->{'TYPE'} = 'show'; + $entry->{'SHOWID'} = $to_cart; + + my ($title, $log, $status, $errorstring) = get_showtitle_and_log($dbh, $to_cart); + unless (defined $title && defined $log) { + return (undef, $status, $errorstring); + } + $entry->{'SHOWTITLE'} = $title; + $entry->{'SHOWLOG'} = $log; + + $entry->{'SHOWRHYTHM'} = $p[1]; + $entry->{'SHOWDOW'} = int $p[2]; + $entry->{'SHOWDOW'} = 0 unless $entry->{'SHOWDOW'} < 7; + substr($p[3], 2, 0) = ':'; + $entry->{'SHOWSTARTTIME'} = $p[3]; + $entry->{'SHOWLEN'} = int $p[4]; + } elsif($p[0] eq "J") { + $entry->{'TYPE'} = 'jingle'; + $entry->{'JINGLETITLE'} = $groupdesc; + } elsif($p[0] eq "M") { + $entry->{'TYPE'} = 'musicpool'; + $entry->{'MUSICPOOLTITLE'} = $groupdesc; + } + + push @allowed_dbs, $entry; + } + $sth->finish(); + + return @allowed_dbs; +} + + +return 1; -- cgit v0.10.2