use 5.006; use ExtUtils::MakeMaker qw(prompt WriteMakefile); use Config; use strict; use lib './plib' ; use Makeutils ; #use Data::Dumper ; my $clib = "./clib" ; # Set up info for this module my $modinfo_href = init('Linux-DVB-DVBT-Apps-QuartzPVR') ; # See if newer version is available check_new_version() ; ## Options get_makeopts() ; ## Programs to install add_install_progs("scripts/", [ qw/dvbt-chans-sql dvbt-epg-sql dvbt-iplay dvbt-multirecord dvbt-record-mgr dvbt-qpvr-scan/ ]); ## get distribution my $dist = distribution_info() ; ## get webserver info my ($webuser, $webgroup, $webroot) = webserver_info($dist) ; print "Dist=$dist, web=$webuser:$webgroup root=$webroot\n" if $makeutils::DEBUG ; my %settings = ( 'WEB_USER' => $webuser, 'WEB_GROUP' => $webgroup, 'WEB_ROOT' => $webroot, ) ; ## read in existing install script settings my $install_script = "install/quartzpvr-install.pl" ; read_install_script($install_script, \%settings) ; ## get settings from user get_settings(\%settings) ; #print "Dist=$dist, web=$webuser:$webgroup root=$webroot\n" ; #print Data::Dumper->Dump(["Settings", \%settings]) ; ## Update install update_install_script("install/tpl/quartzpvr-install.pl", $install_script, \%settings) ; ## Do any cleanup process_makeopts() ; # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. WriteMakefile( NAME => $modinfo_href->{'mod'}, VERSION_FROM => "lib/$modinfo_href->{'modpath'}.pm", # finds $VERSION PREREQ_PM => { 'File::Basename' => 0, 'File::Path' => 0, 'File::Spec' => 0, 'POSIX' => 0, 'Test::Pod::Coverage' => 1.08, 'Pod::Coverage' => 0.18, 'Test::Pod' => 1.22, 'Data::Dumper' => 0, 'Linux::DVB::DVBT' => 2.11, 'Linux::DVB::DVBT::TS' => 0, 'Linux::DVB::DVBT::Advert' => 0, 'App::Framework' => 0, 'Config::Crontab' => 0, 'Date::Manip' => 0, 'MP3::Tag' => 0, 'DBI' => 0, 'DBD::mysql' => 0, 'Net::Server::Fork' => 0, }, # e.g., Module::Name => 1.1 ($] >= 5.005 ? ## Add these new keywords supported since 5.005 (ABSTRACT_FROM => "lib/$modinfo_href->{'modpath'}.pm", # retrieve abstract from module AUTHOR => 'Steve Price ') : ()), LIBS => [], # e.g., '-lm' INC => $modinfo_href->{'includes'}, EXE_FILES => $modinfo_href->{'programs'}, ); exit 0 ; #----------------------------------------------------------------------------------------------------------------------- sub MY::force { " # Phony target to force checking subdirectories. FORCE : \$(NOECHO) \$(NOOP) ## Call to QuartzPVR installation script pure_perl_install :: $^X $install_script -perl_lib \$(DESTINSTALLPRIVLIB) -perl_scripts \$(DESTINSTALLSCRIPT) -pm_version \$(VERSION) pure_site_install :: $^X $install_script -perl_lib \$(DESTINSTALLSITELIB) -perl_scripts \$(DESTINSTALLSITESCRIPT) -pm_version \$(VERSION) pure_vendor_install :: $^X $install_script -perl_lib \$(DESTINSTALLVENDORLIB) -perl_scripts \$(DESTINSTALLVENDORSCRIPT) -pm_version \$(VERSION) " ; } #----------------------------------------------------------------------------------------------------------------------- sub MY::makemakerdflt { my $makemakerdflt = get_makemakerdflt() ; return $makemakerdflt ; } #----------------------------------------------------------------------------------------------------------------------- sub MY::postamble { ' ## Optional doxygen documentation doxygen: FORCE cd doxygen && doxygen ## Author target: preview CPAN documentation cpandoc: FORCE $(MAKEPATH) pod/batch perl -MPod::Simple::HTMLBatch -e Pod::Simple::HTMLBatch::go . pod/batch $(ABSPERLRUN) -MExtUtils::Command -e "cp" -- pod/html_files/style.css pod/batch/_black_with_blue_on_white.css phpdoc: FORCE perl -MPod::Simple::HTMLBatch -e Pod::Simple::HTMLBatch::go php/doc/src php/doc/pod MANIFEST: FORCE $(ABSPERLRUN) -MExtUtils::Command -e "mv" -- MANIFEST MANIFEST.bak $(ECHO) "MANIFEST" >>MANIFEST $(ECHO) "README" >>MANIFEST $(ECHO) "COPYING" >>MANIFEST $(ECHO) "Changes" >>MANIFEST $(ECHO) "Makefile.PL" >>MANIFEST $(ECHO) "" >>MANIFEST $(ECHO) "plib/Makeutils.pm" >>MANIFEST $(ECHO) "" >>MANIFEST $(ECHO) "index.php" >>MANIFEST $(ECHO) "" >>MANIFEST $(ECHO) "tpl/grid.tpl" >>MANIFEST $(ECHO) "" >>MANIFEST $(ECHO) "## JS" >>MANIFEST find js -type f -name "*.js" | grep -v .svn >>MANIFEST find js -type f -name "*.txt" | grep -v .svn >>MANIFEST $(ECHO) "" >>MANIFEST $(ECHO) "## Tests" >>MANIFEST find t -type f -name "*.t" | grep -v .svn >>MANIFEST $(ECHO) "" >>MANIFEST $(ECHO) "## CSS" >>MANIFEST find css -type f -name "*.css" | grep -v .svn >>MANIFEST find css -type f -name "*.png" | grep -v src | grep -v .svn >>MANIFEST find css -type f -name "*.gif" | grep -v src | grep -v .svn >>MANIFEST $(ECHO) "" >>MANIFEST $(ECHO) "## PHP" >>MANIFEST find php -type f -name "*.inc" | grep -v .svn >>MANIFEST find php -type f -name "*.php" | grep -v .svn >>MANIFEST $(ECHO) "" >>MANIFEST $(ECHO) "## Install" >>MANIFEST find install -type f | grep -v install/quartzpvr-install | grep -v .svn >>MANIFEST $(ECHO) "" >>MANIFEST $(ECHO) "## lib" >>MANIFEST find lib -type f -name "*.pm" | grep -v .svn >>MANIFEST $(ECHO) "" >>MANIFEST $(ECHO) "## Scripts" >>MANIFEST find scripts -type f -name "dvbt-*" | grep -v .svn >>MANIFEST $(ECHO) "" >>MANIFEST $(ECHO) "## Doc" >>MANIFEST find php -type f -name "*.html" | grep -v pod | grep -v .svn >>MANIFEST find php -type f -name "*.png" | grep -v src | grep -v .svn >>MANIFEST $(ECHO) "" >>MANIFEST '; } #---------------------------------------------------------------------- # Work out/guess distribution # sub distribution_info { #print "distribution_info\n" ; my $dist ; my $reldir = '/etc' ; foreach my $rel (glob("$reldir/*-release")) { #print "Dist dir: $rel\n" ; if ($rel =~ m%^$reldir/(\w+)\-release%) { my $this_dist = $1 ; #print " + dist file $this_dist\n" ; if ($this_dist eq 'lsb') { if (open my $fh, "<$rel") { my $info = ''; while (defined($info=<$fh>)) { chomp $info; if ($info =~ m/DISTRIB_ID\s*=\s*(.*)/) { $dist = lc $1 ; #print " + + dist = $dist\n" ; last ; } } } } else { $dist = lc $this_dist ; last ; } } } return $dist ; } #---------------------------------------------------------------------- # Work out webserver user # sub webserver_info { my ($dist) = @_ ; #print "web_info($dist)\n" ; ## user my ($webuser, $webgroup) ; foreach my $server (qw/apache http/) { #print " + server $server\n" ; my @results = `ps -ef | grep -i $server | grep -v grep` ; foreach my $line (@results) { chomp $line ; #print " + + $line\n" ; if ($line =~ /^(\S+)\s+/) { my $user = $1 ; #print " + + + user=$user\n" ; if ($user ne 'root') { ## Check valid user and get group if so # account:password:UID:GID:GECOS:directory:shell my @ufields = getpwnam($user) ; if (@ufields >= 7) { my $gid = $ufields[3] ; # group_name:passwd:GID:user_list my $grp = getgrgid($gid); if ($grp) { ## got user & group $webuser = $user ; $webgroup = $grp ; #print " + + + webuser=$webuser webgroup=$webgroup\n" ; last ; } } } } last if $webuser ; } # each line last if $webuser ; } # each server ## server root my $webroot = "/var/www" ; if ($dist eq 'suse') { $webroot = "/srv/www/htdocs" ; } return ($webuser, $webgroup, $webroot) ; } #---------------------------------------------------------------------- sub _get_settings { my ($settings_href, $settings_def, $get_val) = @_ ; foreach my $aref (@$settings_def) { my ($var, $null_valid, $default, $desc) = @$aref ; # print "Default=$default\n" ; ## Amend defaults with existing settings if ($settings_href->{$var}) { $default = $settings_href->{$var} ; } my $val = "$default" ; my $prefix = "" ; if ($desc =~ s/^\s*Debug:\s*//i) { $prefix = " [DEBUG]" ; } if ($get_val) { do { print "$var:$prefix Please enter the $desc [$val]: " ; my $ans = ; chomp $ans ; if ($ans) { $val = $ans ; } } while (!length($val) && !$null_valid) ; } # ensure settings are set to either user-supplied value or default $settings_href->{$var} = $val ; } } #---------------------------------------------------------------------- sub get_settings { my ($settings_href) = @_ ; ## List of settings that either require user input or may need checking by the user my @settings = ( # var can be null? default description [ "SQL_ROOT_PASSWORD", 0, "e.g. password", "MySQL root user password so I can create the pvr database"], [ "DVBT_FREQFILE", 0, "e.g. /usr/share/dvb/dvb-t/uk-Oxford", "full path to DVB-T tuning frequency file OR a country code (GB)"], [ "MAIL_TO", 1, $ENV{'user'} || 'e.g. root@somewhere', "email account to mail PVR errors to"], [ "WEB_USER", 0, $settings_href->{'WEB_USER'}, "user name of the web server"], [ "WEB_GROUP", 0, $settings_href->{'WEB_GROUP'}, "group name of the web server"], ) ; my $pvr_top = "/var/lib/quartzpvr" ; ## List of settings that can be left to their default values my @extra_settings = ( # var can be null? default description [ "SERVER_PORT", 0, "21328", "TCP port of the new PVR server that I will install"], [ "SQL_USER", 0, "quartzpvr", "username of the MySQL pvr database owner"], [ "SQL_PASSWORD", 0, "qp".$$, "password of the MySQL pvr database owner"], [ "PVR_USER", 0, "quartzpvr", "Linux user name created for recording"], [ "PVR_GROUP", 0, "video", "Linux group name for PVR_USER"], [ "PVR_LOGDIR", 0, "/var/log/quartzpvr", "location of PVR logs"], [ "DATABASE", 0, "quartzpvr", "PVR database name"], [ "VIDEO_DIR", 0, "$pvr_top/video", "Video recording top-level directory"], [ "AUDIO_DIR", 0, "$pvr_top/audio", "Audio recording top-level directory"], [ "VIDEO_TRASH", 0, "$pvr_top/video/.TRASH", "Video temporary files directory"], [ "VIDEO_PATH", 0, "\$video_dir/\$title/\$tva_series/\$YmdHMS-\$name.ts", "Video recording filename specification"], [ "AUDIO_PATH", 0, "\$audio_dir/\$title/\$series/\$YmdHMS-\$name.mp3", "Audio recording filename specification"], [ "PVR_ROOT", 0, "$settings_href->{'WEB_ROOT'}/quartzpvr", "Installation directory. This is where all of the PVR software is installed."], [ "ADAPTERS", 1, "", "Space separated list of the adapter numbers to use (leave blank for default)"], [ "ADSKIP", 0, "1", "Advert removal (1=remove adverts, 0=do not remove adverts)"], [ "DATE_TZ", 0, "Europe/London", "Your timezone (as defined for the PHP Date object)"], [ "PHP_SEARCH", 0, "0", "Allow use of other installed PHP (may cause name clashes)"], [ "PHP_LOG", 1, "", "Debug: Log file to use for PHP application"], [ "SERVER_DEBUG", 0, "1", "Debug: Level of server debug logging"], ) ; $settings_href->{'PERL_BIN'} = $^X ; $settings_href->{'PVR_HOME'} = "/var/lib/$settings_href->{'PVR_USER'}" ; #print Data::Dumper->Dump(["Settings", \%settings]) ; ## get any new settings _get_settings($settings_href, \@settings, 1) ; ## Ask if user wants to amend the extra settings my $get_extra = 0 ; print "\nWould you like to use defaults for the next set of settings [yes]: " ; my $ans = ; if ($ans =~ /no/i) { $get_extra = 1 ; } ## get any default settings _get_settings($settings_href, \@extra_settings, $get_extra) ; ## Get the list of all variables my $vars_list = "" ; foreach my $aref (@settings) { my ($var, $null_valid, $default, $desc) = @$aref ; $vars_list .= "$var " ; } foreach my $aref (@extra_settings) { my ($var, $null_valid, $default, $desc) = @$aref ; $vars_list .= "$var " ; } # list of fixed settings $vars_list .= " " ; foreach my $var (qw/ RECPROG IPLAYPROG PERL_SCRIPTS PERL_LIB PERL_BIN TBL_LISTINGS TBL_RECORD TBL_CHANNELS TBL_RECORDING TBL_RECORDED TBL_SCHEDULE TBL_MULTIREC TBL_IPLAY PVR_HOME /) { $vars_list .= "$var " ; } $settings_href->{'_VARS_LIST_'} = $vars_list ; } #---------------------------------------------------------------------- sub update_install_script { my ($tpl_install_script, $install_script, $settings_href) = @_ ; ## Read in file my @lines ; { local( $/ ) ; open( my $fh, $tpl_install_script ) or die "Error: reading install script file $tpl_install_script : $!" ; my $lines = <$fh> ; close $fh ; @lines = split(/\n/, $lines) ; } ## Amend config data section my $config_line = 0 ; for ($config_line = 0 ; $config_line < @lines; ++$config_line) { # print "$config_line :: $lines[$config_line]\n" ; if ($lines[$config_line] =~ /^\s*__DATA__\s+config/) { # print " >>>> Found config!\n" ; last ; } } $#lines = ++$config_line ; foreach my $var (sort keys %$settings_href) { my $val = $settings_href->{$var} ; # use % instead of $ to ensure App does not attempt to expand variables $val =~ s/\$/%/g ; push @lines, "$var = $val" ; } ## Write file open( my $fh, ">$install_script" ) or die "Error: writing install script file $install_script : $!" ; foreach (@lines) { print $fh "$_\n" ; } close $fh ; ## Protect file chmod 0700, $install_script ; } #---------------------------------------------------------------------- sub read_install_script { my ($install_script, $settings_href) = @_ ; return if (! -f $install_script) ; ## Read in file my @lines ; { local( $/ ) ; open( my $fh, $install_script ) or die "Error: reading install script file $install_script : $!" ; my $lines = <$fh> ; close $fh ; @lines = split(/\n/, $lines) ; } ## Amend config data section my $config_line = 0 ; for ($config_line = 0 ; $config_line < @lines; ++$config_line) { if ($lines[$config_line] =~ /^\s*__DATA__\s+config/) { last ; } } for (++$config_line ; $config_line < @lines; ++$config_line) { if ($lines[$config_line] =~ /^\s*(\w+)\s*=\s*(.*)/) { my ($var, $val) = ($1, $2) ; $val =~ s/\s+$// ; $val =~ s/%/\$/g ; $settings_href->{$var} = $val ; } } }