diff options
author | Andreas Mair <amair.sob@googlemail.com> | 2005-04-12 12:32:06 +0200 |
---|---|---|
committer | Andreas Mair <amair.sob@googlemail.com> | 2005-04-12 12:32:06 +0200 |
commit | 022c4f162d7b83cb287b7d16749899d9e7c4242a (patch) | |
tree | ecc7dcf65b3e43713d9ecd36a7982dade2197f8a | |
parent | 0d6ba991052f971564296c537887e030d13ee730 (diff) | |
download | vdradmin-am-0.97-am3.1.tar.gz vdradmin-am-0.97-am3.1.tar.bz2 |
2005-04-12: 0.97-am3.1v0.97-am3.1
- Updated Spanish i18n (Thanks to Ruediger Jung).
- Added VDR Admin man-page (Thanks to Thomas Schmidt).
- Improved detection of another running vdradmind.pl at startup (if vdradmind.pid is found but pid is not a vdradmind.pl vdradmin will start anyway).
- Added IMDb lookup button in prog_detail (Suggested by Marcus).
- Use configured Streamdev port for live streaming.
- Added warning when using EPG_DIRECT.
- Updated INSTALL file.
- Renamed i18n Español to Spanish (Requested by Ruediger Jung).
- Fixed ":" & "|" handling in timer's title and summary (Thanks to Der_Pit for pointing me to that).
- Added "Select all" to timer/autotimer/recordings list.
- Exchanged priority and lifetime textfields in config.html to match order used at other places (Requested by Ruediger Jung).
- Added vdradmin-0.95-0.9pre5-email.diff (Author: blafasel) patch: send email on timers added by AutoTimer (needs sendEmail available here: http://caspian.dotconf.net/menu/Software/SendEmail/).
- Fixed timer add/edit where date got set wrong in case it has been entered as "yyyy-mm-dd".
- Fixed problems when using MOD_GZIP (Thanks Ville Skyttä).
- Fixed Makefile once again (Thanks Zzam for pointing me to this).
- Added patches submitted by stefan.h (Thanks!):
-> New config option EPG_PRUNE. You can set a channel number up to which VDRAdmin will read EPG. Might reduce memory usage and read-in time. Set to "0" to read all channels.
-> Optimizations and bug fixes.
- Added install files for Debian (Thanks to Steffen Oberle for requesting and troubleshooting).
53 files changed, 1151 insertions, 4517 deletions
@@ -6,9 +6,29 @@ VDR-Portal: amair ************************************************************ PLEASE NOTE: -- Streaming doesn't work for me in this release. If you get it working please let me know! +- Streaming recordings is not implemented. If you have some code that works, please let me know! ************************************************************ +2005-04-12: 0.97-am3.1 +- Updated Spanish i18n (Thanks to Ruediger Jung). +- Added VDR Admin man-page (Thanks to Thomas Schmidt). +- Improved detection of another running vdradmind.pl at startup (if vdradmind.pid is found but pid is not a vdradmind.pl vdradmin will start anyway). +- Added IMDb lookup button in prog_detail (Suggested by Marcus). +- Use configured Streamdev port for live streaming. +- Added warning when using EPG_DIRECT. +- Updated INSTALL file. +- Renamed i18n Español to Spanish (Requested by Ruediger Jung). +- Fixed ":" & "|" handling in timer's title and summary (Thanks to Der_Pit for pointing me to that). +- Added "Select all" to timer/autotimer/recordings list. +- Exchanged priority and lifetime textfields in config.html to match order used at other places (Requested by Ruediger Jung). +- Added vdradmin-0.95-0.9pre5-email.diff (Author: blafasel) patch: send email on timers added by AutoTimer (needs sendEmail available here: http://caspian.dotconf.net/menu/Software/SendEmail/). +- Fixed timer add/edit where date got set wrong in case it has been entered as "yyyy-mm-dd". +- Fixed problems when using MOD_GZIP (Thanks Ville Skyttä). +- Fixed Makefile once again (Thanks Zzam for pointing me to this). +- Added patches submitted by stefan.h (Thanks!): + -> New config option EPG_PRUNE. You can set a channel number up to which VDRAdmin will read EPG. Might reduce memory usage and read-in time. Set to "0" to read all channels. + -> Optimizations and bug fixes. +- Added install files for Debian (Thanks to Steffen Oberle for requesting and troubleshooting). 2005-04-04: 0.97-am3.0 - Reworked updating of channels and EPG from VDR. @@ -35,7 +55,7 @@ Included patches submitted by Ville Skyttä: - Fixed forgotten items with "vdradmin-0.96_For_vdr-1.3_StoreAutotimerChannelID_And_EventIdCheckDisable.diff". - Try harder to avoid browser's caching. - Fixed directory handling in auto_timer: - -> if a "%" (variable) is found you are fully responsible for the final recording's title, e.g. you must add %Title% if you want it (other vars: %Title%, %Subtitle%, %Director%, %Date%, %Category%, %Genre%, %Year%, %Country%, %Originaltitle%, %FSK%, %Epsiode% and %Rating%) + -> if a "%" (variable) is found you are fully responsible for the final recording's title, e.g. you must add %Title% if you want it (other vars: %Title%, %Subtitle%, %Director%, %Date%, %Category%, %Genre%, %Year%, %Country%, %Originaltitle%, %FSK%, %Episode% and %Rating%) -> all "/" will be replaced by "~" (before variable substitution) - Automatic programmed timers have their summary hyperlink back. (Reported by sn123py) - Handle "VPS" in timer listing. @@ -1,22 +1,47 @@ - -Installation: +*********************************************************** +*** Installation *** +*********************************************************** Unpack the archive somewhere: - $ tar xvf vdradmin-x.y.tar.gz - $ cd vdradmin-x.y + $ tar xvf vdradmin-VERSION.tar.bz2 + $ cd vdradmin-VERSION + + Now you have to deside wether you want to run vdradmin locally + in this directory or install it into your system. + +a) run locally + First you have to configure vdradmin. This only has to be done once. $ ./vdradmind.pl --config Some questions about the configuration will asked. - Run vdradmin: + Now you're done and you can run vdradmin: $ ./vdradmind.pl - After this, point your browser to the given parameters. +b) install into system + $ make install + + Now you have to configure vdradmin: + $ vdradmind.pl --config + + Some questions about the configuration will asked. + + Now you're done and you can run vdradmin: + $ vdradmind.pl + + If you want vdradmin to run automatically on system boot, you have + to add a startup script to the wanted runlevel. Please consult your + Linux distribution's documentation. Maybe you'll also find some help + in vdradmin's "contrib" directory. + - (e.g. http://localhost:8001) + No matter how you run vdradmin, you now can point your browser to + the given parameters (e.g. http://localhost:8001). -Hide vdradmin behind apache: +*********************************************************** +*** Hide vdradmin behind apache *** +*********************************************************** you will need apache with mod_proxy and these lines in httpd.conf: @@ -25,7 +50,9 @@ Hide vdradmin behind apache: ProxyPass /vdradmin/ http://127.0.0.1:8001/ </IfModule> -Hint from Martin Neuditschko for apache2 (untested): +*********************************************************** +*** Hint from Martin Neuditschko for apache2 (untested) *** +*********************************************************** I have summarized the needed changes for my Apache (Apache2, SuSE 8.2): Following modules have to be activated additionally: @@ -37,7 +64,9 @@ Hint from Martin Neuditschko for apache2 (untested): RewriteRule ^/vdradmin(.*) http://localhost:8001$1 [P,L] </VirtualHost> -See who's calling (you need an ISDN card for this): +*********************************************************** +*** See who's calling (you need an ISDN card for this) *** +*********************************************************** Insert this in your isdn.conf: @@ -3,15 +3,16 @@ LIBDIR=/usr/share/vdradmin ETCDIR=/etc/vdradmin DOCDIR=/usr/share/doc/vdradmin BINDIR=/usr/bin +MANDIR=/usr/share/man/man1/ distclean: - rm -f vdradmind.conf vdradmind.at vdradmind.pid vdradmind.log + rm -f vdradmind.conf vdradmind.at vdradmind.bl vdradmind.pid vdradmind.log install: @if [ ! -d $(DESTDIR)$(BINDIR) ]; then \ mkdir -p $(DESTDIR)$(BINDIR); \ fi - sed -e "s/^my \$SEARCH_FILES_IN_SYSTEM = 0;/my \$SEARCH_FILES_IN_SYSTEM = 1;/" < vdradmind.pl > $(DESTDIR)$(BINDIR)/vdradmind.pl + sed -e "s/^my \$$SEARCH_FILES_IN_SYSTEM = 0;/my \$$SEARCH_FILES_IN_SYSTEM = 1;/" < vdradmind.pl > $(DESTDIR)$(BINDIR)/vdradmind.pl chmod a+x $(DESTDIR)$(BINDIR)/vdradmind.pl @if [ ! -d $(DESTDIR)$(LIBDIR) ]; then \ mkdir -p $(DESTDIR)$(LIBDIR); \ @@ -20,7 +21,11 @@ install: @if [ ! -d $(DESTDIR)$(ETCDIR) ]; then \ mkdir -p $(DESTDIR)$(ETCDIR); \ fi + @if [ ! -d $(MANDIR) ]; then \ + mkdir -p $(MANDIR); \ + fi + cp vdradmind.pl.1 $(MANDIR) @if [ ! -d $(DESTDIR)$(DOCDIR) ]; then \ mkdir -p $(DESTDIR)$(DOCDIR); \ fi - cp -r COPYING HISTORY INSTALL contrib $(DESTDIR)$(DOCDIR) + cp -r COPYING HISTORY* README* INSTALL contrib $(DESTDIR)$(DOCDIR) diff --git a/debian/NEWS b/debian/NEWS new file mode 100644 index 0000000..d3976f3 --- /dev/null +++ b/debian/NEWS @@ -0,0 +1,2 @@ +vdradmin (0.97-am3.0) unstable; urgency=low + diff --git a/debian/README.Debian b/debian/README.Debian new file mode 100644 index 0000000..9119fb4 --- /dev/null +++ b/debian/README.Debian @@ -0,0 +1,23 @@ +vdradmin for Debian +------------------- + +This package provides a working config-file under /var/lib/vdradmin/vdradmind.conf, +this files uses a standard-username and standard-password (linvdr/linvdr), you +should change this before you enable the vdradmin-service in +/etc/default/vdradmin, alternatively you can generate a new config with: + +vdradmin.pl --config + + -- Thomas Schmidt <thomas.schmidt@in.stud.tu-ilmenau.de>, Fri, 6 Aug 2004 22:57:28 +0200 + + +To hide vdradmin behind apache: + + you will need apache with mod_proxy and these lines in httpd.conf: + + <IfModule mod_proxy.c> + ProxyRequests Off + ProxyPass /vdradmin/ http://127.0.0.1:8001/ + </IfModule> + + -- Thomas Schmidt <thomas.schmidt@in.stud.tu-ilmenau.de>, Wed, 1 Oct 2003 21:07:47 +0200 diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..d0cfcb2 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,135 @@ +vdradmin (0.97-am3.1) unstable; urgency=low + +vdradmin (0.97-am3.0) unstable; urgency=low + + * vdr-1.3.23 + +vdradmin (0.96-5.ctvdr.3) unstable; urgency=low + + * Added fix for new date format in vdr > 1.2.6 (thx to Andreas Mair, + Torsten Lang) + + -- Tobias Grimm <tg@e-tobi.net> Sun, 3 Apr 2005 19:11:39 +0200 + +vdradmin (0.96-5.ctvdr.2) unstable; urgency=low + + * Made vdradmind.conf readable by group "vdr" (may be needed by + autotimer plugin) + + -- Tobias Grimm <tg@e-tobi.net> Sun, 3 Apr 2005 13:45:13 +0200 + +vdradmin (0.96-5.ctvdr.1) unstable; urgency=low + + * Tobias Grimm <tg@e-tobi.net> + - Made package more compatible to official Debian version + * Thomas Schmidt <tschmidt@debian.org> + - From now on vdradmin will run under the user vdradmin, + the owner of the cfg-file will be changed in postinst + - Changed path of vdradmind.{conf,at} from /etc/vdradmin/ to + /var/lib/vdradmin to comply with the FHS (existing files + will be moved in postinst) + + -- Tobias Grimm <tg@e-tobi.net> Sun, 27 Mar 2005 14:33:27 +0200 + +vdradmin (0.96-3.ctvdr.1) unstable; urgency=low + + * New upstream release + * changed version numbering to "backports.org"-style to reflect relationship + to official debian package + * Modified streaming patch to allow streaming of recordings with + dot, slash, double underscore and parenthesis in filename + * Converted all patches to shorter format for new dpatch + * Added dist-var patch, that change vdradmin.pl to search for it's + files in system-directories, instead of local, relative paths + (taken from official debian version 0.96-3) + * Added 02_sectmpfiles.dpatch: use File::Temp to create temporary + files, to prevent possible symlink-attacks (Closes: #287601) + (taken from official debian version 0.96-3) + * Set permissions of /etc/vdradmin/vdradmind.conf to 600 on new + installations (users with an existing installation should + ensure that the cfg-file has a permission of 600) + (taken from official debian version 0.96-3) + * using dh_install now + * Added manpage for vdradmin.pl (taken from official debian version 0.96-2) + * Set section to "web" and architecture to "all", set standards version to + 3.6.1 + * Fixed depends (no longer depends on vdr, but suggests it) + * Added watch file + * The vdradmin daemon can now be enabled/disabled in /etc/default/vdradmin + (taken from official debian version 0.96-3) + * Do not install Base64.pm, Template.pm and RescDescent.pm + from upstream anymore, depend on libhtml-template-perl and + libparse-rescdescent-perl (Base64.pm is allready provided by + perl) (taken from official debian version 0.96-2) + * Link /usr/share/vdradmin/template/{English,French}/bilder to + /usr/share/vdradmin/template/Deutsch/bilder, this reduces the + size of the deb by about 50% (taken from official debian version 0.96-2) + * Took over README.Debian from official debian version 0.96-3 + * added debian/compat + + -- Tobias Grimm <tg@e-tobi.net> Thu, 30 Dec 2004 22:20:00 +0100 + +vdradmin (0.95-ct-10) unstable; urgency=low + + * Fix rec streaming patch: slashes in dir names and order + + -- Peter Siering <ps@ctmagazin.de> Fri, 29 Oct 2004 11:00:00 +0100 + +vdradmin (0.95-ct-9) unstable; urgency=low + + * extracted Peter Sierings modifications as 05_streaming.dpatch + + -- Tobias Grimm <tg@e-tobi.net> Sat, 21 Mar 2004 16:00:00 +0100 + +vdradmin (0.95-ct-8) unstable; urgency=low + + * added fix to rec_stream to skip "new"-char at time + + -- Tobias Grimm <tg@e-tobi.net> Wed, 17 Feb 2003 21:30:00 +0100 + +vdradmin (0.95-ct-7) unstable; urgency=low + + * changed additional_images -patch to work within CVS source-dirs too + * added patch to fix problem with vdr's Wareagle Icon Patch + (Thanks to HFlor from vdrportal.de) + + -- Tobias Grimm <tg@e-tobi.net> Sat, 08 Feb 2003 23:50:00 +0100 + +vdradmin (0.95-ct-6) unstable; urgency=low + + * vdradmin is distributed as non-native package from now on + + -- Tobias Grimm <tg@e-tobi.net> Sat, 08 Feb 2003 23:50:00 +0100 + +vdradmin (0.95-ct-5) unstable; urgency=low + + * new upstream release + * includes fix for using through apache + + -- Peter Siering <ps@ctmagazin.de> Tue, 22 Dec 2003 00:30:00 +0100 + +vdradmin (0.94-ct-4) unstable; urgency=low + + * minor streaming fixes, repair init + + -- Peter Siering <ps@ctmagazin.de> Tue, 28 Nov 2003 10:00:00 +0100 + +vdradmin (0.94-ct-3) unstable; urgency=low + + * incorporated (live) streaming functions + + -- Peter Siering <ps@ctmagazin.de> Tue, 25 Nov 2003 12:00:00 +0100 + +vdradmin (0.94-2) unstable; urgency=low + + * fixed vdradmind.pl location in init skript + + -- Peter Siering <ps@ctmagazin.de> Sun, 16 Nov 2003 12:00:00 +0100 + +vdradmin (0.94-1) unstable; urgency=low + + * Initial Release. + * includes daylight saving fix + + -- Peter Siering <ps@ctmagazin.de> Thu, 30 Oct 2003 00:13:40 +0100 + diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +4 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..223ca65 --- /dev/null +++ b/debian/control @@ -0,0 +1,18 @@ +Source: vdradmin +Section: web +Priority: optional +Maintainer: Peter Siering <ps@ctmagazin.de> +Origin: ctvdr +Bugs: mailto:pkg-vdr-dvb-devel@lists.alioth.debian.org +Build-Depends-Indep: debhelper (>= 4.0.0), dpatch (>= 2.0.9) +Standards-Version: 3.6.1 + +Package: vdradmin +Architecture: all +Depends: perl, libcompress-zlib-perl, libhtml-template-perl, libparse-recdescent-perl +Suggests: vdr +Description: VDRadmin is a web frontend to VDR + VDRadmin is a web frontend to Klaus Schmidingers + Video Disk Recorder. Beside that it adds some extras + to VDR like auto timers; that are some kind of + search lists to the electronic program guide (EPG). diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..d005dd8 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,26 @@ +This package was debianized by Thomas Schmidt <thomas.schmidt@in.stud.tu-ilmenau.de> on +Wed, 1 Oct 2003 20:36:52 +0200. +It was modified for VDRAdmin-AM by Andreas Mair <mail@andreas.vdr-developer.org>. + +It was downloaded from http://andreas.vdr-developer.org + +Upstream Author: Thomas Koch <tom@linvdr.org>, Andreas Mair <mail@andreas.vdr-developer.org> + +Copyright: 2001-2004, Thomas Koch <tom@linvdr.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + see /usr/share/common-licenses/GPL-2 + diff --git a/debian/patches/00list b/debian/patches/00list new file mode 100644 index 0000000..7b9e8ba --- /dev/null +++ b/debian/patches/00list @@ -0,0 +1,2 @@ +01_dist-var +03_cfgfiles-fhs.dpatch diff --git a/debian/patches/01_dist-var.dpatch b/debian/patches/01_dist-var.dpatch new file mode 100644 index 0000000..3bf465e --- /dev/null +++ b/debian/patches/01_dist-var.dpatch @@ -0,0 +1,21 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run + +## 01_dist-var.dpatch by Thomas Schmidt <thomas.schmidt@in.stud.tu-ilmenau.de> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Change vdradmin.pl to search for it's files in system-directories, +## DP: instead of local, relative paths + +@DPATCH@ +diff -urNad /home/chelli/vdr/cvs/vdr/vdradmin/vdradmind.pl vdradmin/vdradmind.pl +--- /home/chelli/vdr/cvs/vdr/vdradmin/vdradmind.pl 2004-05-27 16:34:55.000000000 +0200 ++++ vdradmin/vdradmind.pl 2004-05-27 16:35:55.000000000 +0200 +@@ -42,7 +42,7 @@ + #use warnings; + + #my $SEARCH_FILES_IN_SYSTEM = (-d '/usr/share/vdradmin/lib' ? 1 : 0); # for distribution +-my $SEARCH_FILES_IN_SYSTEM = 0; ++my $SEARCH_FILES_IN_SYSTEM = 1; + + sub true () { 1 }; + sub false () { 0 }; diff --git a/debian/patches/03_cfgfiles-fhs.dpatch b/debian/patches/03_cfgfiles-fhs.dpatch new file mode 100644 index 0000000..50bb8e1 --- /dev/null +++ b/debian/patches/03_cfgfiles-fhs.dpatch @@ -0,0 +1,28 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 03_cfgfiles-fhs.dpatch by Thomas Schmidt <thomas.schmidt@in.stud.tu-ilmenau.de> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Change the path to the cfgfile and autotime-file to comply +## DP: with the FHS (vdradmin changes these files at runtime) + +@DPATCH@ +diff -urNad vdradmin-0.96/vdradmind.pl /tmp/dpep.0DtdZt/vdradmin-0.96/vdradmind.pl +--- vdradmin-0.96/vdradmind.pl 2005-01-23 21:41:19.000000000 +0100 ++++ /tmp/dpep.0DtdZt/vdradmin-0.96/vdradmind.pl 2005-01-23 21:42:53.000000000 +0100 +@@ -94,10 +94,10 @@ + } else { + $TEMPLATEDIR = "/usr/share/vdradmin/template"; + $I18NDIR = "/usr/share/vdradmin/i18n"; +- $CONFFILE = "/etc/vdradmin/vdradmind.conf"; ++ $CONFFILE = "/var/lib/vdradmin/vdradmind.conf"; + $LOGFILE = "/var/log/$CONFIG{LOGFILE}"; + $PIDFILE = "/var/run/vdradmind.pid"; +- $AT_FILENAME = "/etc/vdradmin/vdradmind.at"; ++ $AT_FILENAME = "/var/lib/vdradmin/vdradmind.at"; +- $DONE_FILENAME = "/etc/vdradmin/vdradmind.done"; ++ $DONE_FILENAME = "/var/lib/vdradmin/vdradmind.done"; +- $BL_FILENAME = "/etc/vdradmin/vdradmind.bl"; ++ $BL_FILENAME = "/var/lib/vdradmin/vdradmind.bl"; + } + my $DONE = &DONE_Read || {}; + diff --git a/debian/postinst b/debian/postinst new file mode 100644 index 0000000..735d586 --- /dev/null +++ b/debian/postinst @@ -0,0 +1,66 @@ +#!/bin/sh -e +set -e + +TEMPLATE_DIR=/usr/share/vdradmin/template + +# Check if there are still cfgfiles in /etc/vdradmin/ and move them +# to /var/lib/vdradmin +if [ ! -f /var/lib/vdradmin/vdradmind.conf ]; then + if [ -f /etc/vdradmin/vdradmind.conf ]; then + mv /etc/vdradmin/vdradmind.conf /var/lib/vdradmin/ + else + cp /usr/share/doc/vdradmin/examples/vdradmind.conf /var/lib/vdradmin/ + fi +fi + +[ -e /etc/vdradmin/vdradmind.conf ] || ln -s /var/lib/vdradmin/vdradmind.conf \ +/etc/vdradmin/vdradmind.conf + +if [ ! -f /var/lib/vdradmin/vdradmind.at ]; then + [ ! -f /etc/vdradmin/vdradmind.at ] || mv /etc/vdradmin/vdradmind.at /var/lib/vdradmin/ +fi + +# ensure that user and group 'vdradmin' exist +USER=vdradmin +GROUP=vdradmin +if ! getent group | grep -q "^$GROUP:" ; then + echo -n "Adding group $GROUP.." + addgroup --quiet --system $GROUP + echo "..done" +fi +if ! getent passwd | grep -q "^$USER:"; then + echo -n "Adding user $USER.." + adduser --system --home /var/lib/vdradmin --shell /bin/false \ + --gecos "VDRAdmin user" --no-create-home \ + --disabled-login --disabled-password \ + --ingroup $GROUP \ + $USER + echo "...done" +fi + +# ensure vdradmind.at (auto timers) exists +ATFILE=/var/lib/vdradmin/vdradmind.at +[ -e $ATFILE ] || touch $ATFILE + +# ensure that vdradmin's config files have the correct owner +[ ! -d /var/lib/vdradmin ] || chown -R $USER:$GROUP /var/lib/vdradmin/ + +# change the permissions of the cfg-file to 0600 +[ ! -e /var/lib/vdradmin/vdradmind.conf ] || chmod 0600 /var/lib/vdradmin/vdradmind.conf + +# change the owner and group of the logfile to vdradmin +[ ! -e /var/log/vdradmind.log ] || chown $USER:$GROUP /var/log/vdradmind.log + +# make auto timer file "read/writeable" by group vdr and config file readable +# by group "vdr",so that vdr plugins (Autotimeredit plugin) get access +if getent group | grep -q "^vdr:" ; then + if [ -d /var/lib/vdradmin ] ; then + chgrp -R vdr /var/lib/vdradmin + chmod a=,ug=rwx /var/lib/vdradmin + chmod a=,ug=rw $ATFILE + CFGFILE=/var/lib/vdradmin/vdradmind.conf + [ -e $CFGFILE ] && chmod a=,u=rw,g=r $CFGFILE + fi +fi + +##DEBHELPER## diff --git a/debian/postrm b/debian/postrm new file mode 100644 index 0000000..e2e719a --- /dev/null +++ b/debian/postrm @@ -0,0 +1,24 @@ +#!/bin/sh -e +set -e + +case "$1" in + purge) + rm -f /var/lib/vdradmin/vdradmind.conf > /dev/null 2>&1 || true + rm -f /var/lib/vdradmin/vdradmind.at > /dev/null 2>&1 || true + rm -f /var/lib/vdradmin/vdradmind.done > /dev/null 2>&1 || true + rm -f /var/lib/vdradmin/vdradmind.bl > /dev/null 2>&1 || true + rm -f /etc/vdradmin/vdradmind.conf > /dev/null 2>&1 || true + + chown root:root /var/log/vdradmind.log > /dev/null 2>&1 || true + + deluser vdradmin > /dev/null || true + ;; + remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +##DEBHELPER## diff --git a/debian/prerm b/debian/prerm new file mode 100644 index 0000000..87380fc --- /dev/null +++ b/debian/prerm @@ -0,0 +1,6 @@ +#!/bin/sh -e +set -e + +TEMPLATE_DIR=/usr/share/vdradmin/template + +##DEBHELPER## diff --git a/debian/rules b/debian/rules new file mode 100644 index 0000000..2923e6c --- /dev/null +++ b/debian/rules @@ -0,0 +1,52 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# GNU copyright 1997 to 1999 by Joey Hess. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# include dpatch stuff +include /usr/share/dpatch/dpatch.make + +clean: clean-patched unpatch + +clean-patched: + dh_testdir + dh_testroot + dh_clean + +build: patch-stamp + # Nothing to build here + # + # Note: all files are installed using dh_install + +install: + dh_testdir + dh_testroot + dh_clean -k + + dh_installdirs + +# Build architecture-independent files here. +binary-indep: install + dh_testdir + dh_testroot + dh_installchangelogs HISTORY.am + dh_installdocs + dh_installexamples debian/vdradmind.conf + dh_install + dh_installinit + dh_installman + dh_link + dh_compress + dh_fixperms + dh_perl + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep +.PHONY: build clean binary-indep install patch unpatch diff --git a/debian/vdradmin.default b/debian/vdradmin.default new file mode 100644 index 0000000..cbf4813 --- /dev/null +++ b/debian/vdradmin.default @@ -0,0 +1,20 @@ +# Defaults for vdradmin initscript +# sourced by /etc/init.d/vdradmin +# installed at /etc/default/vdradmin by the maintainer scripts + +# +# This is a POSIX shell fragment +# + +# Should vdradmin's init-script be enabled? + +################################################################# +# ATTENTION! YOU SHOULD MODIFY /var/lib/vdradmin/vdradmind.conf # +# before enabling this, because the default config uses a # +# really simple default username/password (linvdr/linvdr) # +################################################################# + +ENABLED="1" + +# Additional options that are passed to the Daemon. +DAEMON_OPTS="" diff --git a/debian/vdradmin.dirs b/debian/vdradmin.dirs new file mode 100644 index 0000000..0e9961e --- /dev/null +++ b/debian/vdradmin.dirs @@ -0,0 +1,2 @@ +var/lib/vdradmin +etc/vdradmin diff --git a/debian/vdradmin.init b/debian/vdradmin.init new file mode 100644 index 0000000..24f7a99 --- /dev/null +++ b/debian/vdradmin.init @@ -0,0 +1,91 @@ +#! /bin/sh +# +# +# Init-script for vdradmin, created by Thomas Schmidt <thomas.schmidt@in.stud.tu-ilmenau.de> +# +# + +# Default Settings: + +# Username vdradmin should run as: +USER=vdradmin + +# Group under which vdradmin should run: +GROUP=vdradmin + + +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +DAEMON=/usr/bin/vdradmind.pl +NAME=vdradmin +DESC="VDR Webadministration interface" + +test -x $DAEMON || exit 0 + +# Include vdradmin defaults if available +if [ -f /etc/default/vdradmin ] ; then + . /etc/default/vdradmin +fi + +test "$ENABLED" != "0" || exit 0 + +set -e + +# Create Temporary Directory +create_temp () +{ + TEMPDIR=`mktemp -d -p /tmp vdradmin-XXXXXX` + + # Check if the group vdr exists and make vdr + # the owner of the temporary directory + if getent group | grep -q "^vdr:" ; then + chown vdr $TEMPDIR + fi + + chgrp vdradmin $TEMPDIR + chmod 2770 $TEMPDIR +} + +# Check if the logfile exists allready, if not, create it and set +# group and owner to $USER:$GROUP +create_logfile () +{ + LOGFILE="/var/log/vdradmind.log" + if [ ! -e $LOGFILE ] ; then + touch $LOGFILE + chown $USER:$GROUP $LOGFILE + fi +} + +case "$1" in + start) + echo -n "Starting $DESC: " + create_temp + create_logfile + TEMPDIR=$TEMPDIR start-stop-daemon --start \ + -c $USER:$GROUP -b -m --pidfile /var/run/vdradmin.pid \ + --exec /usr/bin/vdradmind.pl -- -nf + echo "$NAME." + ;; + stop) + echo -n "Stopping $DESC: " + start-stop-daemon --stop -q -o --pidfile /var/run/vdradmin.pid + echo "$NAME." + ;; + restart|force-reload) + echo -n "Restarting $DESC: " + create_temp + create_logfile + start-stop-daemon --stop -q -o --pidfile /var/run/vdradmin.pid + TEMPDIR=$TEMPDIR start-stop-daemon --start \ + -c $USER:$GROUP -b -m --pidfile /var/run/vdradmin.pid \ + --exec /usr/bin/vdradmind.pl -- -nf + echo "$NAME." + ;; + *) + N=/etc/init.d/$NAME + echo "Usage: $N {start|stop|restart|force-reload}" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/debian/vdradmin.install b/debian/vdradmin.install new file mode 100644 index 0000000..cfb76f1 --- /dev/null +++ b/debian/vdradmin.install @@ -0,0 +1,9 @@ +lib/ usr/share/vdradmin/ + +template/ usr/share/vdradmin/ + +i18n/ usr/share/vdradmin/ + +vdradmind.pl usr/bin/ + +vdradmind.pl.1 usr/share/man/man1/ diff --git a/debian/vdradmind.conf b/debian/vdradmind.conf new file mode 100644 index 0000000..dbac378 --- /dev/null +++ b/debian/vdradmind.conf @@ -0,0 +1,39 @@ +AT_FUNC = 1 +AT_LIFETIME = 99 +AT_PRIORITY = 99 +AT_TIMEOUT = 120 +CACHE_LASTUPDATE = 1112088214 +CACHE_TIMEOUT = 60 +CHANNELS_WANTED_AUTOTIMER = 0 +CHANNELS_WANTED_PRG = 0 +CHANNELS_WANTED_SUMMARY = 0 +EPG_DIRECT = 0 +EPG_FILENAME = /var/cache/vdr/epg.data +GUEST_ACCOUNT = 0 +LANGUAGE = Deutsch +LOCAL_NET = 0.0.0.0/32 +LOGFILE = vdradmind.log +LOGGING = 1 +LOGINPAGE = 1 +LOGLEVEL = 81 +MOD_GZIP = 0 +PASSWORD = linvdr +PASSWORD_GUEST = +RECORDINGS = 2 +SERVERHOST = 0.0.0.0 +SERVERPORT = 8001 +SKIN = copper +ST_FUNC = 1 +ST_STREAMDEV_PORT = 3000 +ST_URL = +TIMES = 18:00, 20:00, 21:00, 22:00 +TM_LIFETIME = 99 +TM_MARGIN_BEGIN = 3 +TM_MARGIN_END = 3 +TM_PRIORITY = 99 +USERNAME = linvdr +USERNAME_GUEST = +VDR_HOST = localhost +VDR_PORT = 2001 +VIDEODIR = /video +ZEITRAHMEN = 1 diff --git a/debian/watch b/debian/watch new file mode 100644 index 0000000..8497e1d --- /dev/null +++ b/debian/watch @@ -0,0 +1,2 @@ +version=2 +http://linvdr.org/download/vdradmin/ vdradmin.*-([\d+\.]+|\d+)\.tar(\.gz|\.bz2) debian uupdate diff --git a/i18n/Deutsch/i18n.pl b/i18n/Deutsch/i18n.pl index dc60f38..5a32ee9 100644 --- a/i18n/Deutsch/i18n.pl +++ b/i18n/Deutsch/i18n.pl @@ -40,45 +40,46 @@ %MESSAGES = ( # common - c_progname => "VDRAdmin", - c_monday => $I18N_Days[1], - c_tuesday => $I18N_Days[2], - c_wednesday => $I18N_Days[3], - c_thursday => $I18N_Days[4], - c_friday => $I18N_Days[5], - c_saturday => $I18N_Days[6], - c_sunday => $I18N_Days[0], - c_help => "Hilfe", - c_yes => "Ja", - c_no => "Nein", - c_minutes => "Minuten", - c_hours_short => "h", - c_sec => "sek", - c_off => "aus", - c_channel => "Sender", - c_time => "Uhrzeit", - c_clock => "Uhr", - c_priority => "Priorität:", - c_lifetime => "Lebenszeit:", - c_buffer_before => "Zeitpuffer Anfang:", - c_buffer_after => "Zeitpuffer Ende:", - c_title => "Titel", - c_subtitle => "Untertitel", - c_description => "Beschreibung", - c_summary => "Zusammenfassung:", - c_save => "Speichern", - c_apply => "Anwenden", - c_cancel => "Abbrechen", - c_once => "einmal", - c_all => "alle", - c_directory => "Ordner:", - c_edit => "Bearbeiten", - c_delete => "Löschen", - c_whatson => "Was läuft:", - c_now => "jetzt", - c_at => "um:", - c_go => "Go!", - c_stream => "Stream", + c_progname => "VDRAdmin", + c_monday => $I18N_Days[1], + c_tuesday => $I18N_Days[2], + c_wednesday => $I18N_Days[3], + c_thursday => $I18N_Days[4], + c_friday => $I18N_Days[5], + c_saturday => $I18N_Days[6], + c_sunday => $I18N_Days[0], + c_help => "Hilfe", + c_yes => "Ja", + c_no => "Nein", + c_minutes => "Minuten", + c_hours_short => "h", + c_sec => "sek", + c_off => "aus", + c_channel => "Sender", + c_time => "Uhrzeit", + c_clock => "Uhr", + c_priority => "Priorität:", + c_lifetime => "Lebenszeit:", + c_buffer_before => "Zeitpuffer Anfang:", + c_buffer_after => "Zeitpuffer Ende:", + c_title => "Titel", + c_subtitle => "Untertitel", + c_description => "Beschreibung", + c_summary => "Zusammenfassung:", + c_save => "Speichern", + c_apply => "Anwenden", + c_cancel => "Abbrechen", + c_once => "einmal", + c_all => "alle", + c_directory => "Ordner:", + c_edit => "Bearbeiten", + c_delete => "Löschen", + c_whatson => "Was läuft:", + c_now => "jetzt", + c_at => "um:", + c_go => "Go!", + c_stream => "Stream", + c_select_allnone => "Alle/keine auswählen", # JavaScript js_del_timer => "Timer löschen?", @@ -138,6 +139,8 @@ co_str_port => "HTTP-Port von Streamdev (auch möglich 3000/ts):", co_str_bandwidth => "Bandbreite des Streams:", co_str_rec_path => "Pfad der Aufnahmen:", + co_str_do_live => "Live Streaming?", + co_str_do_rec => "Aufnahmen streamen?", co_hl_channels => "Selektive Senderauswahl", co_ch_use_summary => "Bei "Programmübersicht"?", co_ch_use_whatsonnow => "Bei "Was läuft jetzt"?", @@ -176,6 +179,7 @@ pd_view => "umschalten", pd_record => "aufnehmen", pd_search => "Wiederholungen", + pd_imdb => "Film in der Internet-Movie-Database (IMDb) suchen", # prog_list2.html pl2_headline => "Was läuft heute?", @@ -272,38 +276,49 @@ <p>Zunächst einmal spielt Groß-Kleinschreibung keine Rolle, die Suchbegriffe \"Akte X\" liefern genau die selben Treffer wie \"akte x\". Mehrere Suchbegriffe werden mit Leerzeichen getrennt, und es müssen stets alle angegebenen Suchbegriffe bei der gleichen Sendung gefunden werden.</p> <p>So finden die Suchbegriffe \"Akte X\" die Sendungen \"Akte X - Die unheimlichen Fälle des FBI\" genauso wie \"Aktenzeichen XY ungelöst\" und \"Extrem Aktiv\", jedoch nicht die Sendung \"Die Akte Jane\" (dort ist kein \"X\" enthalten).</p> <p>Sie sollten möglichst nur Buchstaben und Zahlen als Suchbegriffe verwenden, erfahrungsgemäß fehlen im elektronischen Programmführer (EPG) gerne mal ein Punkt, Klammern oder sonstige Zeichen.</p> -<p>Es ist auch möglich, reguläre Ausdrücke zu verwenden – Experten mögen doch bitte die nötigen Infos dem Quelltext entnehmen (undocumented feature).</p>", +<p>Es ist auch möglich, reguläre Ausdrücke zu verwenden – Experten mögen doch bitte die nötigen Infos dem Quelltext entnehmen (undocumented feature). +</p>", timer_list => "<b>Timer</b> <p>Übersicht über alle Timer im VDR.</p> -<p>Ein Mausklick auf |<img src=\"bilder/poempl_gruen.gif\" alt=\"on\" valign=\"center\"> <i>Ja</i> | oder |<img src=\"bilder/poempl_rot.gif\" alt=\"off\" valign=\"center\"> <i>Nein</i> | in der Spalte <i>Aktiv</i>, schaltet den jeweiligen Timer an oder aus.<br> +<p>Ein Mausklick auf |<img src=\"bilder/poempl_gruen.gif\" alt=\"on\" valign=\"center\"> <i>Ja</i> | oder |<img src=\"bilder/poempl_grau.gif\" alt=\"off\" valign=\"center\"> <i>Nein</i> | in der Spalte <i>Aktiv</i>, schaltet den jeweiligen Timer an oder aus.<br> <img src=\"bilder/poempl_gelb.gif\" alt=\"problem\" valign=\"center\"> zeigt an, daß es eine Überschneidung gibt. Das ist unkritisch, solange es für jeden Timer eine Karte gibt, um die Aufnahme durchzuführen.<br> -Um einen Eintrag zu bearbeiten, klicken Sie auf das Symbol <img src=\"bilder/edit.gif\" alt=\"Stift\" valign=\"center\">, zum Löschen auf <img src=\"bilder/delete.gif\" alt=\"Radiergummi\" valign=\"center\">. Wenn Sie mehrere Auto-Timer-Einträge auf einmal löschen möchten, Aktivieren Sie die Kästchen (<input type=\"checkbox\" checked>) rechts neben den gewünschten Einträgen und klicken Sie abschließend auf <i>Ausgewählte Timer löschen</i> am Ende der Liste.</p>", +Um einen Eintrag zu bearbeiten, klicken Sie auf das Symbol <img src=\"bilder/edit.gif\" alt=\"Stift\" valign=\"center\">, zum Löschen auf <img src=\"bilder/delete.gif\" alt=\"Radiergummi\" valign=\"center\">. Wenn Sie mehrere Auto-Timer-Einträge auf einmal löschen möchten, Aktivieren Sie die Kästchen (<input type=\"checkbox\" checked>) rechts neben den gewünschten Einträgen und klicken Sie abschließend auf <i>Ausgewählte Timer löschen</i> am Ende der Liste. +</p>", conf_list => "<b>Allgemeine Einstellungen:</b> -<p>Hier kann man die Sprache, die Startseite, das Aussehen, sowie die Anzahl der DVB-Karten einstellen. Außerdem die Grundeinstellungen für Timer, AutoTimer, Kanalselektionen und Streaming Parameter</p> +<p>Hier kann man die allgemeinen Einstellungen vornehmen. Außerdem die Grundeinstellungen für Timer, AutoTimer, Kanalselektionen und Streaming Parameter +</p> +<b>Allgemeine Einstellungen:</b> +<p>Hier kann man die Sprache, die Startseite, das Aussehen, sowie die Anzahl der DVB-Karten einstellen. Außerdem die Grundeinstellungen für Timer, AutoTimer, Kanalselektionen und Streaming Parameter +</p> <b>Identifikationen:</b> -<p>Ein Mausklick auf |<input type=\"radio\"> <i>ja</i> | oder |<input type=\"radio\" checked> <i>Nein</i> | aktiviert oder deaktiviert den <i>Gast-Zugang</i>. Die Passwörter sollten für beide Konten geändert werden, wenn eine Verbindung zum Internet besteht</p> +<p>Ein Mausklick auf |<input type=\"radio\"> <i>ja</i> | oder |<input type=\"radio\" checked> <i>Nein</i> | aktiviert oder deaktiviert den <i>Gast-Zugang</i>. Die Passwörter sollten für beide Konten geändert werden, wenn eine Verbindung zum Internet besteht +</p> <b>Zeitleiste:</b> -<p>Hier bekommt man eine Balkenansicht der Sender präsentiert, wobei man den Zeitumfang einstellen kann.<br> -In den Balken sieht man die Titel der jeweiligen Sendung. Der Zeitbalken beginnt in der vollen halben Stunde vor "Jetzt". Ein feiner roter Strich zeigt die aktuelle Zeitposition an.<br>Programmierte Sendungen werden außerdem farblich hervorgehoben.</p> +<p>Hier bekommt man eine Balkenansicht der Sender präsentiert, wobei man den sichtbaren Zeitumfang einstellen kann.<br> +In den Balken sieht man die Titel der jeweiligen Sendung. Der Zeitbalken beginnt in der vollen halben Stunde vor "Jetzt". Ein feiner roter Strich zeigt die aktuelle Zeitposition an.<br>Programmierte Sendungen werden außerdem farblich hervorgehoben. +</p> <b>Einstellungen für AutoTimer:</b> <p>Ein Mausklick auf |<input type=\"radio\"> <i>Ja</i> | oder |<input type=\"radio\" checked> <i>Nein</i> | aktiviert oder deaktiviert die AutoTimer-Funktion. Hier bestimmt man auch wie oft der AutorTimer in den EPG-Daten nach den <i>Suchbegriffen</i> Ausschau halten soll.<br> Die Lebenszeit einer Aufnahme bestimmt man indem ein Wert zwischen 0 und 99 eingeträgt (99 verfällt nie). Der Wert bezieht sich dann auf den Tag, an dem die Aufnahme gemacht wurde. Sind die angegebenen Tage bereits verfallen, wenn beim VDR eine Aufnahme ansteht, so kann im Falle von Speicherknappheit die betreffende Aufnahme vom VDR gelöscht werden. Die am längsten abgelaufene Aufnahme wird zuerst gelöscht. Man bestimmt hier also, mit welcher Lebenszeitangabe der AutoTimer später eine Aufnahme macht.<br> Die Priorität bestimmt, wer im Falle eines Zeitkonfliktes den Vorrang bekommt. Die höhere Priorität kommt dann zur Ausführung. <br> Ein AutoTimer sollte also einen höheren Wert zugewiesen bekommen, als die normalen Aufnahmen. Schließlich sucht der AutoTimer in der Regel nach Sendungen, die einem wichtig sind.</p> <b>Einstellungen für Timer:</b> -<p>Priorität und Lebenszeit haben die gleiche Bedeutung, wie vorher bei den AutoTimern beschrieben, gelten aber eben für die von Hand erstellten Timer.</p> +<p>Priorität und Lebenszeit haben die gleiche Bedeutung, wie vorher bei den AutoTimern beschrieben, gelten aber eben für die von Hand erstellten Timer. +</p> <b>Einstellungen für das Streamdevice:</b> -<p>Neben Port und Bandbreite, muß hier auch das Videoverzeichnis von VDR eingetragen werden.</p> +<p>Neben Port und Bandbreite, muß hier auch das Videoverzeichnis von VDR eingetragen werden. +</p> <b>Die selektive Kanalwahl:</b> <p>Ein Mausklick auf |<input type=\"radio\"> <i>Ja</i> | oder |<input type=\"radio\" checked> <i>Nein</i> | rechts neben den gewünschten Einträgen, aktiviert oder deaktiviert die "selektiven" Kanäle für das jeweilige Hauptfenster.<br> So kann man die genannten Einzelansichten auf die gewählten Kanäle beschränken, was Übersichtlichkeit und Seitenaufbau günstig beeinflußt.<br> -Die Auswahl der Kanäle erfolgt nach Auswahl eines oder mehrerer Kanäle im linken Fenster (STRG-Taste gedrückt halten und alle Kanäle die man hinzufügen will anklicken), durch Übertragung in das rechte Fenster. <br>Mit den Knöpfen sind beide Richtungen möglich.</p> +Die Auswahl der Kanäle erfolgt nach Auswahl eines oder mehrerer Kanäle im linken Fenster (STRG-Taste gedrückt halten und alle Kanäle die man hinzufügen will anklicken), durch Übertragung in das rechte Fenster. <br>Mit den Knöpfen sind beide Richtungen möglich. +</p> ", ENOHELPMSG => "Bisher keine Hilfe vorhanden. Zum Hinzufügen oder Ändern eines Textes bitte an mail\@andreas.vdr-developer.org wenden." diff --git a/i18n/English/i18n.pl b/i18n/English/i18n.pl index aab2723..0b3b852 100644 --- a/i18n/English/i18n.pl +++ b/i18n/English/i18n.pl @@ -40,45 +40,46 @@ %MESSAGES = ( # common - c_progname => "VDRAdmin", - c_monday => $I18N_Days[1], - c_tuesday => $I18N_Days[2], - c_wednesday => $I18N_Days[3], - c_thursday => $I18N_Days[4], - c_friday => $I18N_Days[5], - c_saturday => $I18N_Days[6], - c_sunday => $I18N_Days[0], - c_help => "Help", - c_yes => "Yes", - c_no => "No", - c_minutes => "minutes", - c_hours_short => "h", - c_sec => "sec.", - c_off => "off", - c_channel => "Channel:", - c_time => "Time", - c_clock => "o'clock", - c_priority => "Priority:", - c_lifetime => "Lifetime:", - c_buffer_before => "Time Margin at Start:", - c_buffer_after => "Time Margin at Stop:", - c_title => "Title", - c_subtitle => "Subtitle", - c_description => "Description", - c_summary => "Summary:", - c_save => "Save", - c_apply => "Apply", - c_cancel => "Cancel", - c_once => "oneshot", - c_all => "all", - c_directory => "Directory:", - c_edit => "Edit", - c_delete => "Delete", - c_whatson => "What's on:", - c_now => "now", - c_at => "at:", - c_go => "Go!", - c_stream => "Stream", + c_progname => "VDRAdmin", + c_monday => $I18N_Days[1], + c_tuesday => $I18N_Days[2], + c_wednesday => $I18N_Days[3], + c_thursday => $I18N_Days[4], + c_friday => $I18N_Days[5], + c_saturday => $I18N_Days[6], + c_sunday => $I18N_Days[0], + c_help => "Help", + c_yes => "Yes", + c_no => "No", + c_minutes => "minutes", + c_hours_short => "h", + c_sec => "sec.", + c_off => "off", + c_channel => "Channel:", + c_time => "Time", + c_clock => "o'clock", + c_priority => "Priority:", + c_lifetime => "Lifetime:", + c_buffer_before => "Time Margin at Start:", + c_buffer_after => "Time Margin at Stop:", + c_title => "Title", + c_subtitle => "Subtitle", + c_description => "Description", + c_summary => "Summary:", + c_save => "Save", + c_apply => "Apply", + c_cancel => "Cancel", + c_once => "oneshot", + c_all => "all", + c_directory => "Directory:", + c_edit => "Edit", + c_delete => "Delete", + c_whatson => "What's on:", + c_now => "now", + c_at => "at:", + c_go => "Go!", + c_stream => "Stream", + c_select_all_none => "Select all/none", # JavaScript js_del_timer => "Delete timer?", @@ -138,6 +139,8 @@ co_str_port => "HTTP Port of Streamdev (also possible 3000/ts):", co_str_bandwidth => "Bandwidth of Streams:", co_str_rec_path => "Path to VDR Recordings:", + co_str_do_live => "Live Streaming?", + co_str_do_rec => "Stream recordings?", co_hl_channels => "Channel Selections", co_ch_use_summary => "In "Channels"?", co_ch_use_whatsonnow => "In "What's On Now"?", @@ -176,6 +179,7 @@ pd_view => "view", pd_record => "record", pd_search => "search", + pd_imdb => "Lookup movie in the Internet-Movie-Database (IMDb)", # prog_list2.html pl2_headline => "Playing Today", diff --git a/i18n/French/i18n.pl b/i18n/French/i18n.pl index 4e2de77..fa07f4a 100644 --- a/i18n/French/i18n.pl +++ b/i18n/French/i18n.pl @@ -40,45 +40,46 @@ %MESSAGES = ( # common - c_progname => "VDRAdmin", - c_monday => $I18N_Days[1], - c_tuesday => $I18N_Days[2], - c_wednesday => $I18N_Days[3], - c_thursday => $I18N_Days[4], - c_friday => $I18N_Days[5], - c_saturday => $I18N_Days[6], - c_sunday => $I18N_Days[0], - c_help => "Aide", - c_yes => "Oui", - c_no => "Non", - c_minutes => "minutes", - c_hours_short => "h", - c_sec => "sec.", - c_off => "off", - c_channel => "Chaîne :", - c_time => "horaires", - c_clock => "Heure", - c_priority => "Priorité :", - c_lifetime => "Chronologie :", - c_buffer_before => "Marge avant :", - c_buffer_after => "Marge après :", - c_title => "Titre", - c_subtitle => "Sous-titre", - c_description => "Description", - c_summary => "Sommaire:", - c_save => "Enregistrer", - c_apply => "Appliquer", - c_cancel => "Annuler", - c_once => "une fois", - c_all => "tout", - c_directory => "Chemin :", - c_edit => "Editer", - c_delete => "Supprimer", - c_whatson => "En ce moment :", - c_now => "maintenant", - c_at => "à :", - c_go => "Ok !", - c_stream => "Flux", + c_progname => "VDRAdmin", + c_monday => $I18N_Days[1], + c_tuesday => $I18N_Days[2], + c_wednesday => $I18N_Days[3], + c_thursday => $I18N_Days[4], + c_friday => $I18N_Days[5], + c_saturday => $I18N_Days[6], + c_sunday => $I18N_Days[0], + c_help => "Aide", + c_yes => "Oui", + c_no => "Non", + c_minutes => "minutes", + c_hours_short => "h", + c_sec => "sec.", + c_off => "off", + c_channel => "Chaîne :", + c_time => "horaires", + c_clock => "Heure", + c_priority => "Priorité :", + c_lifetime => "Chronologie :", + c_buffer_before => "Marge avant :", + c_buffer_after => "Marge après :", + c_title => "Titre", + c_subtitle => "Sous-titre", + c_description => "Description", + c_summary => "Sommaire:", + c_save => "Enregistrer", + c_apply => "Appliquer", + c_cancel => "Annuler", + c_once => "une fois", + c_all => "tout", + c_directory => "Chemin :", + c_edit => "Editer", + c_delete => "Supprimer", + c_whatson => "En ce moment :", + c_now => "maintenant", + c_at => "à :", + c_go => "Ok !", + c_stream => "Flux", + c_select_all_none => "Select all/none", #TODO # JavaScript js_del_timer => "Supprimer Programmation ?", @@ -138,6 +139,8 @@ co_str_port => "Port HTTP de Streamdev (aussi possible 3000/ts) :", co_str_bandwidth => "Bande Passante Flux :", co_str_rec_path => "Chemin des Enregistrements VDR :", + co_str_do_live => "Live Streaming?", # TODO + co_str_do_rec => "Stream recordings?", # TODO co_hl_channels => "Sélections Chaînes", co_ch_use_summary => "Dans "Chaînes"?", co_ch_use_whatsonnow => "Dans "En ce Moment"?", @@ -176,6 +179,7 @@ pd_view => "vue", pd_record => "enregistrer", pd_search => "rechercher", + pd_imdb => "Lookup movie in the Internet-Movie-Database (IMDb)", # TODO # prog_list2.html pl2_headline => "Joué Aujourd'hui", diff --git a/i18n/Español/i18n.pl b/i18n/Spanish/i18n.pl index 77872ed..a738516 100644 --- a/i18n/Español/i18n.pl +++ b/i18n/Spanish/i18n.pl @@ -52,12 +52,12 @@ c_yes => "Sí", c_no => "No", c_minutes => "Minutos", - c_hours_short => "h", + c_hours_short => "h.", c_sec => "sec", - c_off => "pagado", + c_off => "apagado", c_channel => "Emisoras", - c_time => "Horario", - c_clock => "hora", + c_time => "Horario", + c_clock => "h.", c_priority => "Prioridad:", c_lifetime => "Durabilidad:", c_buffer_before => "Más tiempo al principio:", @@ -65,20 +65,21 @@ c_title => "Título", c_subtitle => "Subtítulo", c_description => "Descripción", - c_summary => "Resúmen:", + c_summary => "Resumen:", c_save => "Guardar", c_apply => "Aplicar", c_cancel => "Cancelar", c_once => "una vez", - c_all => "todos", + c_all => "todas", c_directory => "Carpeta:", c_edit => "Modificar", c_delete => "Borrar", c_whatson => "Se puede ver:", c_now => "ahora", - c_at => "a la:", + c_at => "a la/s:", c_go => "¡venga!", c_stream => "Flujo", + c_select_all_none => "Selececionar todos/ninguno", # JavaScript js_del_timer => "¿Borrar programación?", @@ -88,10 +89,10 @@ js_del_selected_rec => "¿Borrar en serio las grabaciones elegidas?", # headings for listings - c_list_active => "Activado", + c_list_active => "Activada", c_list_channel => "Emisora", c_list_start => "Comienzo", - c_list_stop => "Parada", + c_list_stop => "Fin", c_list_name => "Título", c_list_date => "Fecha", c_list_time => "Horarios", @@ -102,15 +103,15 @@ an_timer_active => "Autoprogramación activada:", an_search_items => "Palabras claves:", an_search_in => "Buscar en:", - an_search_start => "No comienza antes de la:", - an_search_stop => "La hora mas tarde:", + an_search_start => "Buscar entre la/s:", + an_search_stop => "y la/s:", an_episode => "Serie:", an_done_active => ""Hecho" activado:", # at_timer_list.html al_autotimer => "Autoprogramación", al_new_autotimer => "Nueva autoprogramación", - al_force_update => "Renovar ahora", + al_force_update => "Actualizar ahora", al_del_selected => "Borrar autoprogramaciones elegidas", # config.html @@ -121,23 +122,25 @@ co_g_loginpage => "Página de inicio:", co_g_num_dvb => "Cantidad tarjetas-DVB:", co_g_skin => "Cara:", - co_hl_id => "Identificación", + co_hl_id => "Identificaciones", co_id_user => "Nombre del usuario:", co_id_password => "Contraseña:", co_id_guest_account => "Acceso como invitado:", co_id_guest_user => "Nombre como invitado:", co_id_guest_password => "Contraseña como invitado:", co_hl_timeline => "Tabla de tiempo", - co_tl_hours => "Horas:", + co_tl_hours => "Rango de hora/s:", co_tl_times => "Horarios:", co_hl_autotimer => "Autoprogramaciones", co_at_active => "Activadas:", co_at_timeout => "Actualización cada:", co_hl_timer => "Programaciones", co_hl_streaming => "Flujo", - co_str_port => "HTTP-Port para el flujo (3000/ts también posible):", + co_str_port => "Puerto-HTTP para el flujo (3000/ts también posible):", co_str_bandwidth => "Ancho de banda del flujo:", co_str_rec_path => "Ruta de las grabaciones:", + co_str_do_live => "¿Flujo en vivo?", + co_str_do_rec => "¿Grabar flujo?", co_hl_channels => "Emisoras preferidas", co_ch_use_summary => "Usar en "Datos de la guía electrónica (EPG)"?", co_ch_use_whatsonnow => "Usar en "Estrenos ahora"?", @@ -162,11 +165,11 @@ # vdradmind.pl, noauth.html, error.html err_notfound => "Nada encontrado", err_notfound_long => "¡La URL requerida, no se encontró en el servidor!", - err_notfound_file => "¡La URL "%s" no se encontró en el servidor!", + err_notfound_file => "¡La URL %s no se encontró en el servidor!", err_forbidden => "Prohibido", - err_forbidden_long => "¡Estas sín permiso para ésta funcción!", - err_forbidden_file => "¡Acceso al archivo "%s" negado!", - err_cant_open => "¡No se pudo abrir el archivo "%s"!", + err_forbidden_long => "¡No tienes permiso para ésta funcción!", + err_forbidden_file => "¡Acceso al archivo %s negado!", + err_cant_open => "¡No se pudo abrir el archivo %s!", err_noauth => "Autorización obligatoria", err_cant_verify => "Este servidor no pudo verificar, tú permiso de acceso al documento requerido.<br>Posiblemente por entregar datos incorrectos (Nombre del usuario o contraseña p.e.) o por que tú navegador no soporta la forma de acceso.", err_error => "¡Error!", @@ -176,6 +179,7 @@ pd_view => "cambiar", pd_record => "grabar", pd_search => "repeticiones", + pd_imdb => "Buscar la película en la base de datos en Internet (IMDb)", # prog_list2.html pl2_headline => "¿Qué puedes ver hoy?", @@ -229,7 +233,7 @@ tn_new_timer => "Crear nueva programación", tn_edit_timer => "Modificar programación", tn_timer_active => "Programación activada:", - tn_autotimer_checking => "Vigilante automático de las programaciones", + tn_autotimer_checking => "Autovigilancia de las programaciones", tn_transmission_id => "Identificador de la emisora", tn_day_of_rec => "Día de la grabación:", tn_time_start => "Comienzo:", @@ -239,14 +243,14 @@ # tv.html tv_headline => "Televisión", tv_interval => "Intervalo:", - tv_size => "Tamaño:", + tv_size => "Dimensiones:", tv_grab => "¡Captura la imagen!", tv_g => "C" ); %ERRORMESSAGE = ( - CONNECT_FAILED => "¡No se pudo estabilizar la conexción %s!", - SEND_COMMAND => "Error mandando el comando a %s", + CONNECT_FAILED => "¡No se pudo estabilizar la conexción a %s!", + SEND_COMMAND => "Error mandando el comando a %s ", ); %COMMONMESSAGE = ( @@ -257,47 +261,70 @@ at_timer_list => "<b>Autoprogramación:</b><br> <p>Vista general de todos los registros de Autoprogramación.</p> -<p>Ház clíc en |<img src=\"bilder/poempl_gruen.gif\" alt=\"encendido\" valign=\"center\"> <i>sí</i> | o |<img src=\"bilder/poempl_rot.gif\" alt=\"noencendido\" valign=\"center\"> <i>no</i> | en la columna <i>Activado</i>, para activar o desactivar un registro correspondiente.</p> -<p>Para modificar un registro, ház clíc encima del símbolo <img src=\"bilder/edit.gif\" alt=\"Lapíz\" valign=\"center\">, para borrar encima de la <img src=\"bilder/delete.gif\" alt=\"Goma\" valign=\"center\">.<br> -Si quieres borrar varios registros en uno, marca (<input type=\"checkbox\" checked>) el campo a lado de los registros y ház clíc encima <i>Borrar autoprogramaciones elegidas</i> al final de la lista.</p>", - -#<img src=\"bilder/poempl_rot.gif\" alt=\"problema\" valign=\"center\"> apuntará que haya una programación al mismo tiempo. +<p>Ház clíc encima de |<img src=\"bilder/poempl_gruen.gif\" alt=\"encendido\" valign=\"center\"> <i>sí</i> | o |<img src=\"bilder/poempl_rot.gif\" alt=\"noencendido\" valign=\"center\"> <i>no</i> | en la columna <i>Activada</i>, para activar o desactivar un registro correspondiente.</br> +Para modificar un registro, ház clíc encima del símbolo <img src=\"bilder/edit.gif\" alt=\"Lapíz\" valign=\"center\">, para borrar encima de la <img src=\"bilder/delete.gif\" alt=\"Goma\" valign=\"center\">.<br> +Si quieres borrar varios registros de una vez, marca (<input type=\"checkbox\" checked>) el campo junto a los registros y ház clíc encima de <i>Borrar autoprogramaciones elegidas</i> al final de la lista. +</p>", +###autotimer hinzufuegen-- at_timer_new => "<b>Crear/modificar nueva autoprogramación:</b> -<p>La autoprogramación es una función básica del VDR Admin. Una autoprogramación se refiere a una o más <i>Palabras claves</i>, por cuales va a buscar en los datos de la guía electrónica (EPG) con un rango de tiempo ajustable. Cuando encuentra las palabras elegidas como los parámetros de hora y emisora, programará automáticamente una programación para el estreno encontrado – bastante útil para series (ir)regulares o igual para pelis, que quieres grabar en cualquier caso.<br> -En esta máscara se puede crear una nueva autoprogramación. Una o más palabras son obligatorias, para que puede actuar. Detalles, por palabras útiles y como evitar grabaciones inútiles, se puede encontrar en la ayuda para <i>Palabras claves</i> más abajo.</p> +<p>La autoprogramación es una función básica del VDR Admin. Una autoprogramación se refiere a una o más <i>Palabras claves</i>, cuales usará para analizar los datos de la guía electrónica (EPG) con un rango de tiempo ajustable. Cuando encuentra las palabras elegidas teniendo en cuenta la hora y la emisora, creará automáticamente una programación para el estreno encontrado – bastante útil para series (ir)regulares o igual para estrenos, que quieran grabar con seguridad.<br> +En esta pantalla se puede crear una nueva autoprogramación. Una o más palabras son obligatorias, para que puede actuar. Detalles, por palabras útiles y como evitar grabaciones inútiles, se puede encontrar en la ayuda para <i>Palabras claves</i> más abajo. +</p> <b>Auto programación activo:</b> -<p>Marcando |<input type=\"radio\" checked> <i>sí</i> | activará la autoprogramación, y se va a buscar regularmente en la guía electrónica (EPG) por las <i>Palabras claves</i> y creará una programación, cuando cumple con las <i>Palabras claves</i> como con los parámetros demás.</p> -<p>Con |<input type=\"radio\" checked> <i>no</i> | se desactiva la autoprogramación, sín borrarlo. No afectará a las programaciones ya creadas por esta autoprogramación – posiblemente tienes que borrarlo manualmente en el menu <i>Autoprogramación</i>.<br> -Con |<input type=\"radio\" checked> <i>una vez</i> | la autoprogramación acaba de vigilar despúes de crear una programación. Apartir de entonces serán programaciones normales sin las ventajas de una autoprogramación.</p> +<p>Marcando |<input type=\"radio\" checked> <i>sí</i> | activará la autoprogramación, y se va a buscar regularmente en la guía electrónica (EPG) por las <i>Palabras claves</i> y creará una programación, cuando cumple con las <i>Palabras claves</i> como con los parámetros demás.</br> +Con |<input type=\"radio\" checked> <i>no</i> | se desactiva la autoprogramación, sin borrarla. No afectará a las programaciones ya creadas por esta autoprogramación – a lo mejor tienes que borrarla manualmente en el menu <i>Autoprogramación</i>.<br> +Con |<input type=\"radio\" checked> <i>una vez</i> | la autoprogramación acaba de vigilar despúes de crear una programación. A partir de entonces serán programaciones normales sin las ventajas de una autoprogramación. +</p> <b>Palabras claves:</b> <p>Las palabras claves son importante, para lograr un buen resultado.<br> -No importa MAYÚSCULA o minúscula, las palabras claves \"X-Pasta\" logrará los mismos resultados como \"x-pasta\". Todas palabras claves se separa con espacio y para cumplir el órden, VDR-admin tiene que encontrar todas las palabras claves para un estreno.<br> +No importa MAYÚSCULA o minúscula. Por eso las palabras claves \"X-Pasta\" logrará los mismos resultados como \"x-pasta\". Todas palabras claves se separa con espacio y para cumplir el órden, VDR-admin tiene que encontrar todas las palabras claves para un estreno.<br> Las palabras claves \"Pasta X\" encontrarán \"Pasta - La cocina extraña de mi mujer\" como \"No se sabe hacer extra pasta\" y \"Pasta extrema \", pero no \"La pasta increible\" (no se encuentra una \"X\"!).<br> -Se recomienda usar sólo letras y cifras como palabras claves, por que la guía electrónica (EPG) se límita bastante en el uso de todas caracteres posibles o lo interpreta mál. -<p>También suele ser posible usar expresiones regulares – Expertos puedan extraer info del texto fuente (undocumented feature).</p>", +Se recomienda usar sólo letras y cifras como palabras claves, por que la guía electrónica (EPG) se límita bastante en el uso de todas caracteres posibles o los interpreta mál. +<p>También deberia ser posible usar expresiones regulares – Expertos puedan extraer info del texto fuente (undocumented feature). +</p>", +###Liste der Timer timer_list => "<b>Programación:</b> -<p>Vista general de todos los registros de Programación. -<br>Ház clíc en |<img src=\"bilder/poempl_gruen.gif\" alt=\"encendido\" valign=\"center\"> <i>sí</i> | o |<img src=\"bilder/poempl_rot.gif\" alt=\"noencendido\" valign=\"center\"> <i>no</i> | en la columna <i>Activado</i>, para activar o desactivar un registro correspondiente.<br> -<img src=\"bilder/poempl_gelb.gif\" alt=\"problema\" valign=\"center\"> apuntará que haya problemas.<br> -Para modificar un registro, ház clíc encima del símbolo <img src=\"bilder/edit.gif\" alt=\"Lapíz\" valign=\"center\">, para borrar encima de la <img src=\"bilder/delete.gif\" alt=\"Goma\" valign=\"center\">. Si quieres borrar varios registros en uno, marca (<input type=\"checkbox\" checked>) el campo a lado de los registros y ház clíc encima <i>Borrar programaciones elegidas</i> al final de la lista.</p>", +<p>Vista general de todas las programaciones. +<br>Ház clíc encima de |<img src=\"bilder/poempl_gruen.gif\" alt=\"activado\" valign=\"center\"> <i>sí</i> | o |<img src=\"bilder/poempl_grau.gif\" alt=\"noencendido\" valign=\"center\"> <i>no</i> | en la columna <i>Activado</i>, para activar o desactivar un registro correspondiente.<br> +<img src=\"bilder/poempl_gelb.gif\" alt=\"conflicto\" valign=\"center\"> indica que haya conflictos. Esto no importa, si hay una tarjeta disponible para cada una de las programaciones o estén en la misma frecuencia.<br> +Para modificar un registro, ház clíc encima del símbolo <img src=\"bilder/edit.gif\" alt=\"Lapíz\" valign=\"center\">, para borrar encima de la <img src=\"bilder/delete.gif\" alt=\"Goma\" valign=\"center\">. Si quieres borrar varios registros de una vez, marca (<input type=\"checkbox\" checked>) la casilla a lado de los registros y ház clíc encima <i>Borrar programaciones elegidas</i> al final de la lista.</p>", +###Konfigurationsseite conf_list => -"<b>Propiedades generales:</b> -<p>Aquí se ajusta el idioma, la página principal, la cara o cuantas tarjetas de DVB hay. Además las propiedades de la programación y de la autoprogramación, como las emisoras preferidas y por fín los ajustes del flujo.</p> +"<b>Configuración:</b> +<p>En ésta página se ajusta las propiedades generales, las propiedades de la programación y de la autoprogramación, como las emisoras preferidas y por fin los ajustes del flujo. +</p> +<b>Propiedades generales:</b> +<p>Aquí se ajusta el idioma, la página principal, la cara y cuantas tarjetas de DVB hay. +</p> <b>Identificaciones:</b> -<p>Ház clíc en |<input type=\"radio\"> <i>sí</i> | o |<input type=\"radio\" checked> <i>no</i> | para activar una cuenta de un <i>invitado</i>. Las contraseñas tienes que cambiar por algunas más seguras, si estás conectado al ínternet.</p> +<p>Ház clíc encima de |<input type=\"radio\"> <i>sí</i> | o |<input type=\"radio\" checked> <i>no</i> | para activar una cuenta de un <i>invitado</i>. Las contraseñas tienes que cambiar por algunas más seguras, si estás conectado al ínternet. +</p> <b>Tabla de tiempo:</b> -<p>Ésta página te ofrece una vista de las canales como una tabela, en relacion al tiempo. Las horas introducidas, marcan el rango de las horas que vas a ver. Por defecto empiezara a la última hora cumplida anterioramente.<br> -En el campo de los horarios puedes fijar las horas, dónde la barra va a empezar, cuando lo ajustes en el campo correspondiente de la página. +<p>Ésta página te ofrece una vista de las canales como una tabla, en relacion al tiempo. Las horas introducidas, marcan el rango de las horas que vas a ver. Por defecto empiezara a la última hora cumplida anterioramente.<br> +En el campo de los horarios puedes entregar las horarios fijas, donde la barra va a empezar. Se refiere al campo en la página de tabla de tiempo, donde entonces puedes elegir entre esos valores predeterminados. </p> -<b>Propiedades de la autoprogramación:</b> -<p>Ház clíc en |<input type=\"radio\" checked> <i>sí</i> | o |<input type=\"radio\"> <i>no</i> | para activar las autoprogramaciones. La frequencia de las búsquedas en los datos de la guía electrónica (EPG) por las <i>Palabras claves</i>.<br> +<b>Propiedades de las autoprogramaciones:</b> +<p>Ház clíc encima de |<input type=\"radio\" checked> <i>sí</i> | o |<input type=\"radio\"> <i>no</i> | para activar las autoprogramaciones. Ajusta tambien con que frequencia se van a hacer las búsquedas en los datos de la guía electrónica (EPG) por las <i>Palabras claves</i>.<br> La durabilidad se puede ajustar entre 0 y 99 para dar a la grabación creada de ésta autoprogramación el valor deseado. El valor se refiere al día de la grabacion - más el rango que pones.<br> -Con el valor de la prioridad de la nueva grabacion tienes el segundo parámetro, para que VDR puede decidir, cuál de las grabaciones hechas se puede borrar, cuando necesita espacio en el disco duro. Por los 2 valores sabrá, si una grabación ha caducado y con una prioridad más alta de la grabación deseada entonces borraría ésta antigua. Así te ofrece VDR ajustar prioridades más altas a aquellas grabaciones, que te importan de verdad.<br> Durabilidad=99 por ejemplo, creará una grabación que nunca caduca!</p>", +Con el valor de la prioridad de la nueva grabacion tienes el segundo parámetro, para que VDR puede decidir, cuál de las grabaciones hechas se puede borrar, cuando necesita espacio en el disco duro. Por los 2 valores sabrá, si una grabación ha caducado y con una prioridad más alta de la grabación deseada entonces borraría ésta antigua. Así te ofrece VDR ajustar prioridades más altas a aquellas grabaciones, que te importan de verdad.<br> Durabilidad=99 por ejemplo, creará una grabación que nunca caduca! +</p> +<b>Propiedades de las programaciones:</b> +<p>Pon la prioridad de las programaciones, que es ajustable entre 0 y 99 . <br> +La durabilidad se puede ajustar entre 0 y 99 para dar a la grabación creada de ésta programación el valor deseado. El valor se refiere al día de la grabacion - más el rango que pones. +</p> + +<b>Propiedades del flujo</b> +<p>Si quieres usar la función del flujo (streaming over net) ajuste aquí las propiedades. +</p> + +<b>Emisoras preferidas</b> +<p>Con las emisoras preferidas te permite activar las pantallas que quieres usar con una cantidad de canales reducida. Así se carga mas rapido la página. Activa las páginas deseadas con los botones |<input type=\"radio\" checked> <i>sí</i> | o |<input type=\"radio\"> <i>no</i> | junto a los registros. +</p>", - ENOHELPMSG => "Para ésta función no hay ayuda hasta ahora. Para añadir o modificar un texto, por favor pon te en contacto con mail\@andreas.vdr-developer.org." + ENOHELPMSG => "Para ésta función no hay ayuda disponible hasta ahora. Para añadir o modificar un texto, por favor pon te en contacto con mail\@andreas.vdr-developer.org." ); diff --git a/i18n/i18n-neu.tar.bz2 b/i18n/i18n-neu.tar.bz2 Binary files differdeleted file mode 100644 index 225519c..0000000 --- a/i18n/i18n-neu.tar.bz2 +++ /dev/null diff --git a/lib/Temp/File-Temp-0.12/ChangeLog b/lib/Temp/File-Temp-0.12/ChangeLog deleted file mode 100644 index 1b716ca..0000000 --- a/lib/Temp/File-Temp-0.12/ChangeLog +++ /dev/null @@ -1,143 +0,0 @@ -2001-02-22 Tim Jenness <timj@jach.hawaii.edu> - - --- RELEASE V0.12 --- - - * t/posix.t: The unlink0 tests now skip on failure - - * t/mktemp.t: The unlink0 tests now skip on failure - - * Temp.pm (tmpfile): tmpfile returns undef on failure rather than - croaking. - -2001-02-21 Timothy Jenness <t.jenness@jach.hawaii.edu> - - * Temp.pm: - -Add fix for CGI::Carp - [Thanks to John Labovitz <johnl@valiha.inside.sealabs.com>] - - Use error string to propogate reason rather than a carp - -2000-11-24 Tim Jenness <timj@jach.hawaii.edu> - - --- RELEASE V0.11 ---- - - * t/tempfile.t: Add a test to make sure the file is present after - close and another to use tempfile in a scalar context. - - * Temp.pm: Fix bug on NT with O_TEMPORARY causing the file to be - removed before the program exits. - - ---- RELEASE V0.10 ---- - - * Temp.pm: Incorporate fixes up to bleedperl 7825. Cross platform - fixes. - - * t/security.t: Incorporate fixes from bleedperl 7825 - adds more - cross platform support and more skips on the basis that this is - not testing your system security, just the module. - -2000-08-16 Tim Jenness <timj@jach.hawaii.edu> - - * Temp.pm (_gettemp): Dont use VMS::Stdio if we want the file - to remain after closing. - -2000-08-15 Tim Jenness <timj@jach.hawaii.edu> - - * Temp.pm (_can_do_level): cygwin patch - -2000-08-14 Tim Jenness <timj@jach.hawaii.edu> - - * Temp.pm: Add OPENTEMPFLAGS to support UNLINK=>0 - More tweaks to VMS support (now uses VMS::Stdio) - -2000-07-26 Tim Jenness <timj@jach.hawaii.edu> - - * Release V0.09 to CPAN - - * README: Update for V0.09 - -2000-07-25 Tim Jenness <timj@jach.hawaii.edu> - - * t/security.t: OS/2 can not do the security tests. - - * Temp.pm: Add Support for VMS and OS/2 - -2000-05-15 Tim Jenness <timj@jach.hawaii.edu> - - * Release V0.08 to CPAN - - * t/mktemp.t: Skip the test for unlink0 if it fails since in most - cases this indicates an NFS problem. - - * Temp.pm (_can_do_level): Add check to make sure an OS can handle - the required safe level - (safe_level): Check the level can be supported before allowing it - to change - (END): Change order of cleanup so that files are removed ahead of - temp dirs (since files may be in the temp dirs) - -2000-05-08 Tim Jenness <timj@jach.hawaii.edu> - - * Temp.pm: Reorganize END block - - * t/tempfile.t: Correct tests for new position of END{} block - - * t/security.t: Correct tests for new position of END{} block - - * t/posix.t: add # to print output - - * t/tempfile.t: Add # to print output - - * t/mktemp.t: Add # to print output - - * t/security.t: Add # to print output - -2000-04-28 Tim Jenness <timj@jach.hawaii.edu> - - * Temp.pm: Calculate OPENFLAGS outside of subroutine. This - improves speed of the commands by nearly a factor of 3. - (_replace_XX): Inline the character replacement code rather than - using _randchar subroutine. Improves performance by an additional 8%. - -2000-04-27 Tim Jenness <t.jenness@jach.hawaii.edu> - - * t/posix.t: Add explicit autoflush on filehandle - - * t/mktemp.t: Add explicit autoflush on filehandle - - * Temp.pm: (unlink0): Disallow HIGH and MEDIUM tests if running - perl 5.005 or earlier. - - * t/security.t: Specify perl version to allow for tests - - * Add support for perl 5.005 (remove 'our' and auto-vivifying file - handles). VERSION NUMBER NOW 0.07 - - * README: Update in preparation for V0.06 - - * Temp.pm (_deferred_unlink): Add new internal routine to centralise the - configuring of END blocks. This also fixes a bug where only the - first file was being unlinked in the END block (due to scoping). - - (_can_unlink_opened_file): Rename from _can_unlink. Will now - return false if running on Windows. - - (_is_verysafe): If _PC_CHOWN_RESTRICTED is not available assume - that "chown giveaway" is possible anyway. - - (unlink0): If can not unlink an open file, simply defer removal - until later. - - (_gettemp): Add O_NOINHERIT and O_TEMPORARY flags to sysopen if - they are available (Thanks to Tom Christiansen for this) - - * t/mktemp.t: Add test - - * t/posix.t: Add test - - * t/security.t: Add test - - * t/tempfile.t: Add test - -2000-03-14 Tim Jenness <t.jenness@jach.hawaii.edu> - - * Release v0.05 to CPAN diff --git a/lib/Temp/File-Temp-0.12/MANIFEST b/lib/Temp/File-Temp-0.12/MANIFEST deleted file mode 100644 index 295d5fb..0000000 --- a/lib/Temp/File-Temp-0.12/MANIFEST +++ /dev/null @@ -1,11 +0,0 @@ -MANIFEST -Makefile.PL -README -Temp.pm -t/mktemp.t -t/posix.t -t/tempfile.t -t/security.t -ChangeLog -misc/benchmark.pl -misc/results.txt diff --git a/lib/Temp/File-Temp-0.12/Makefile b/lib/Temp/File-Temp-0.12/Makefile deleted file mode 100644 index deb9438..0000000 --- a/lib/Temp/File-Temp-0.12/Makefile +++ /dev/null @@ -1,734 +0,0 @@ -# This Makefile is for the File::Temp extension to perl. -# -# It was generated automatically by MakeMaker version -# 6.17 (Revision: 1.133) from the contents of -# Makefile.PL. Don't edit this file, edit Makefile.PL instead. -# -# ANY CHANGES MADE HERE WILL BE LOST! -# -# MakeMaker ARGV: () -# -# MakeMaker Parameters: - -# ABSTRACT_FROM => q[Temp.pm] -# AUTHOR => q[Tim Jenness <t.jenness@jach.hawaii.edu>] -# NAME => q[File::Temp] -# PREREQ_PM => { Fcntl=>q[1.03], File::Spec=>q[0.8], File::Path=>undef } -# VERSION_FROM => q[Temp.pm] -# dist => { COMPRESS=>q[gzip -9f] } - -# --- MakeMaker post_initialize section: - - -# --- MakeMaker const_config section: - -# These definitions are from config.sh (via /usr/lib/perl5/5.8.5/i686-linux/Config.pm) - -# They may have been overridden via Makefile.PL or on the command line -AR = ar -CC = gcc -CCCDLFLAGS = -fPIC -CCDLFLAGS = -rdynamic -DLEXT = so -DLSRC = dl_dlopen.xs -LD = gcc -LDDLFLAGS = -shared -L/usr/local/lib -LDFLAGS = -L/usr/local/lib -LIBC = /lib/libc-2.3.4.so -LIB_EXT = .a -OBJ_EXT = .o -OSNAME = linux -OSVERS = 2.6.10-gentoo-r4 -RANLIB = : -SITELIBEXP = /usr/lib/perl5/site_perl/5.8.5 -SITEARCHEXP = /usr/lib/perl5/site_perl/5.8.5/i686-linux -SO = so -EXE_EXT = -FULL_AR = /usr/bin/ar -VENDORARCHEXP = /usr/lib/perl5/vendor_perl/5.8.5/i686-linux -VENDORLIBEXP = /usr/lib/perl5/vendor_perl/5.8.5 - - -# --- MakeMaker constants section: -AR_STATIC_ARGS = cr -DIRFILESEP = / -NAME = File::Temp -NAME_SYM = File_Temp -VERSION = 0.12 -VERSION_MACRO = VERSION -VERSION_SYM = 0_12 -DEFINE_VERSION = -D$(VERSION_MACRO)=\"$(VERSION)\" -XS_VERSION = 0.12 -XS_VERSION_MACRO = XS_VERSION -XS_DEFINE_VERSION = -D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\" -INST_ARCHLIB = blib/arch -INST_SCRIPT = blib/script -INST_BIN = blib/bin -INST_LIB = blib/lib -INST_MAN1DIR = blib/man1 -INST_MAN3DIR = blib/man3 -MAN1EXT = 1 -MAN3EXT = 3pm -INSTALLDIRS = site -DESTDIR = -PREFIX = -PERLPREFIX = /usr -SITEPREFIX = /usr -VENDORPREFIX = /usr -INSTALLPRIVLIB = $(PERLPREFIX)/lib/perl5/5.8.5 -DESTINSTALLPRIVLIB = $(DESTDIR)$(INSTALLPRIVLIB) -INSTALLSITELIB = $(SITEPREFIX)/lib/perl5/site_perl/5.8.5 -DESTINSTALLSITELIB = $(DESTDIR)$(INSTALLSITELIB) -INSTALLVENDORLIB = $(VENDORPREFIX)/lib/perl5/vendor_perl/5.8.5 -DESTINSTALLVENDORLIB = $(DESTDIR)$(INSTALLVENDORLIB) -INSTALLARCHLIB = $(PERLPREFIX)/lib/perl5/5.8.5/i686-linux -DESTINSTALLARCHLIB = $(DESTDIR)$(INSTALLARCHLIB) -INSTALLSITEARCH = $(SITEPREFIX)/lib/perl5/site_perl/5.8.5/i686-linux -DESTINSTALLSITEARCH = $(DESTDIR)$(INSTALLSITEARCH) -INSTALLVENDORARCH = $(VENDORPREFIX)/lib/perl5/vendor_perl/5.8.5/i686-linux -DESTINSTALLVENDORARCH = $(DESTDIR)$(INSTALLVENDORARCH) -INSTALLBIN = $(PERLPREFIX)/bin -DESTINSTALLBIN = $(DESTDIR)$(INSTALLBIN) -INSTALLSITEBIN = $(SITEPREFIX)/bin -DESTINSTALLSITEBIN = $(DESTDIR)$(INSTALLSITEBIN) -INSTALLVENDORBIN = $(VENDORPREFIX)/bin -DESTINSTALLVENDORBIN = $(DESTDIR)$(INSTALLVENDORBIN) -INSTALLSCRIPT = $(PERLPREFIX)/bin -DESTINSTALLSCRIPT = $(DESTDIR)$(INSTALLSCRIPT) -INSTALLMAN1DIR = $(PERLPREFIX)/share/man/man1 -DESTINSTALLMAN1DIR = $(DESTDIR)$(INSTALLMAN1DIR) -INSTALLSITEMAN1DIR = $(SITEPREFIX)/share/man/man1 -DESTINSTALLSITEMAN1DIR = $(DESTDIR)$(INSTALLSITEMAN1DIR) -INSTALLVENDORMAN1DIR = $(VENDORPREFIX)/share/man/man1 -DESTINSTALLVENDORMAN1DIR = $(DESTDIR)$(INSTALLVENDORMAN1DIR) -INSTALLMAN3DIR = $(PERLPREFIX)/share/man/man3 -DESTINSTALLMAN3DIR = $(DESTDIR)$(INSTALLMAN3DIR) -INSTALLSITEMAN3DIR = $(SITEPREFIX)/share/man/man3 -DESTINSTALLSITEMAN3DIR = $(DESTDIR)$(INSTALLSITEMAN3DIR) -INSTALLVENDORMAN3DIR = $(VENDORPREFIX)/share/man/man3 -DESTINSTALLVENDORMAN3DIR = $(DESTDIR)$(INSTALLVENDORMAN3DIR) -PERL_LIB = /usr/lib/perl5/5.8.5 -PERL_ARCHLIB = /usr/lib/perl5/5.8.5/i686-linux -LIBPERL_A = libperl.a -FIRST_MAKEFILE = Makefile -MAKEFILE_OLD = $(FIRST_MAKEFILE).old -MAKE_APERL_FILE = $(FIRST_MAKEFILE).aperl -PERLMAINCC = $(CC) -PERL_INC = /usr/lib/perl5/5.8.5/i686-linux/CORE -PERL = /usr/bin/perl5.8.5 -FULLPERL = /usr/bin/perl5.8.5 -ABSPERL = $(PERL) -PERLRUN = $(PERL) -FULLPERLRUN = $(FULLPERL) -ABSPERLRUN = $(ABSPERL) -PERLRUNINST = $(PERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" -FULLPERLRUNINST = $(FULLPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" -ABSPERLRUNINST = $(ABSPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" -PERL_CORE = 0 -PERM_RW = 644 -PERM_RWX = 755 - -MAKEMAKER = /usr/lib/perl5/5.8.5/ExtUtils/MakeMaker.pm -MM_VERSION = 6.17 -MM_REVISION = 1.133 - -# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle). -# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle) -# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar) -# DLBASE = Basename part of dynamic library. May be just equal BASEEXT. -FULLEXT = File/Temp -BASEEXT = Temp -PARENT_NAME = File -DLBASE = $(BASEEXT) -VERSION_FROM = Temp.pm -OBJECT = -LDFROM = $(OBJECT) -LINKTYPE = dynamic - -# Handy lists of source code files: -XS_FILES = -C_FILES = -O_FILES = -H_FILES = -MAN1PODS = -MAN3PODS = Temp.pm - -# Where is the Config information that we are using/depend on -CONFIGDEP = $(PERL_ARCHLIB)$(DIRFILESEP)Config.pm $(PERL_INC)$(DIRFILESEP)config.h - -# Where to build things -INST_LIBDIR = $(INST_LIB)/File -INST_ARCHLIBDIR = $(INST_ARCHLIB)/File - -INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT) -INST_ARCHAUTODIR = $(INST_ARCHLIB)/auto/$(FULLEXT) - -INST_STATIC = -INST_DYNAMIC = -INST_BOOT = - -# Extra linker info -EXPORT_LIST = -PERL_ARCHIVE = -PERL_ARCHIVE_AFTER = - - -TO_INST_PM = Temp.pm - -PM_TO_BLIB = Temp.pm \ - $(INST_LIB)/File/Temp.pm - - -# --- MakeMaker platform_constants section: -MM_Unix_VERSION = 1.42 -PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc - - -# --- MakeMaker tool_autosplit section: -# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto -AUTOSPLITFILE = $(PERLRUN) -e 'use AutoSplit; autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)' - - - -# --- MakeMaker tool_xsubpp section: - - -# --- MakeMaker tools_other section: -SHELL = /bin/sh -CHMOD = chmod -CP = cp -MV = mv -NOOP = $(SHELL) -c true -NOECHO = @ -RM_F = rm -f -RM_RF = rm -rf -TEST_F = test -f -TOUCH = touch -UMASK_NULL = umask 0 -DEV_NULL = > /dev/null 2>&1 -MKPATH = $(PERLRUN) "-MExtUtils::Command" -e mkpath -EQUALIZE_TIMESTAMP = $(PERLRUN) "-MExtUtils::Command" -e eqtime -ECHO = echo -ECHO_N = echo -n -UNINST = 0 -VERBINST = 0 -MOD_INSTALL = $(PERLRUN) -MExtUtils::Install -e 'install({@ARGV}, '\''$(VERBINST)'\'', 0, '\''$(UNINST)'\'');' -DOC_INSTALL = $(PERLRUN) "-MExtUtils::Command::MM" -e perllocal_install -UNINSTALL = $(PERLRUN) "-MExtUtils::Command::MM" -e uninstall -WARN_IF_OLD_PACKLIST = $(PERLRUN) "-MExtUtils::Command::MM" -e warn_if_old_packlist - - -# --- MakeMaker makemakerdflt section: -makemakerdflt: all - $(NOECHO) $(NOOP) - - -# --- MakeMaker dist section: -TAR = tar -TARFLAGS = cvf -ZIP = zip -ZIPFLAGS = -r -COMPRESS = gzip -9f -SUFFIX = .gz -SHAR = shar -PREOP = $(NOECHO) $(NOOP) -POSTOP = $(NOECHO) $(NOOP) -TO_UNIX = $(NOECHO) $(NOOP) -CI = ci -u -RCS_LABEL = rcs -Nv$(VERSION_SYM): -q -DIST_CP = best -DIST_DEFAULT = tardist -DISTNAME = File-Temp -DISTVNAME = File-Temp-0.12 - - -# --- MakeMaker macro section: - - -# --- MakeMaker depend section: - - -# --- MakeMaker cflags section: - - -# --- MakeMaker const_loadlibs section: - - -# --- MakeMaker const_cccmd section: - - -# --- MakeMaker post_constants section: - - -# --- MakeMaker pasthru section: - -PASTHRU = LIB="$(LIB)"\ - LIBPERL_A="$(LIBPERL_A)"\ - LINKTYPE="$(LINKTYPE)"\ - PREFIX="$(PREFIX)"\ - OPTIMIZE="$(OPTIMIZE)"\ - PASTHRU_DEFINE="$(PASTHRU_DEFINE)"\ - PASTHRU_INC="$(PASTHRU_INC)" - - -# --- MakeMaker special_targets section: -.SUFFIXES: .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT) - -.PHONY: all config static dynamic test linkext manifest - - - -# --- MakeMaker c_o section: - - -# --- MakeMaker xs_c section: - - -# --- MakeMaker xs_o section: - - -# --- MakeMaker top_targets section: -all :: pure_all manifypods - $(NOECHO) $(NOOP) - - -pure_all :: config pm_to_blib subdirs linkext - $(NOECHO) $(NOOP) - -subdirs :: $(MYEXTLIB) - $(NOECHO) $(NOOP) - -config :: $(FIRST_MAKEFILE) $(INST_LIBDIR)$(DIRFILESEP).exists - $(NOECHO) $(NOOP) - -config :: $(INST_ARCHAUTODIR)$(DIRFILESEP).exists - $(NOECHO) $(NOOP) - -config :: $(INST_AUTODIR)$(DIRFILESEP).exists - $(NOECHO) $(NOOP) - -$(INST_AUTODIR)/.exists :: /usr/lib/perl5/5.8.5/i686-linux/CORE/perl.h - $(NOECHO) $(MKPATH) $(INST_AUTODIR) - $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/lib/perl5/5.8.5/i686-linux/CORE/perl.h $(INST_AUTODIR)/.exists - - -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_AUTODIR) - -$(INST_LIBDIR)/.exists :: /usr/lib/perl5/5.8.5/i686-linux/CORE/perl.h - $(NOECHO) $(MKPATH) $(INST_LIBDIR) - $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/lib/perl5/5.8.5/i686-linux/CORE/perl.h $(INST_LIBDIR)/.exists - - -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_LIBDIR) - -$(INST_ARCHAUTODIR)/.exists :: /usr/lib/perl5/5.8.5/i686-linux/CORE/perl.h - $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR) - $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/lib/perl5/5.8.5/i686-linux/CORE/perl.h $(INST_ARCHAUTODIR)/.exists - - -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_ARCHAUTODIR) - -config :: $(INST_MAN3DIR)$(DIRFILESEP).exists - $(NOECHO) $(NOOP) - - -$(INST_MAN3DIR)/.exists :: /usr/lib/perl5/5.8.5/i686-linux/CORE/perl.h - $(NOECHO) $(MKPATH) $(INST_MAN3DIR) - $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/lib/perl5/5.8.5/i686-linux/CORE/perl.h $(INST_MAN3DIR)/.exists - - -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_MAN3DIR) - -help: - perldoc ExtUtils::MakeMaker - - -# --- MakeMaker linkext section: - -linkext :: $(LINKTYPE) - $(NOECHO) $(NOOP) - - -# --- MakeMaker dlsyms section: - - -# --- MakeMaker dynamic section: - -dynamic :: $(FIRST_MAKEFILE) $(INST_DYNAMIC) $(INST_BOOT) - $(NOECHO) $(NOOP) - - -# --- MakeMaker dynamic_bs section: - -BOOTSTRAP = - - -# --- MakeMaker dynamic_lib section: - - -# --- MakeMaker static section: - -## $(INST_PM) has been moved to the all: target. -## It remains here for awhile to allow for old usage: "make static" -static :: $(FIRST_MAKEFILE) $(INST_STATIC) - $(NOECHO) $(NOOP) - - -# --- MakeMaker static_lib section: - - -# --- MakeMaker manifypods section: - -POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--" -POD2MAN = $(POD2MAN_EXE) - - -manifypods : pure_all \ - Temp.pm \ - Temp.pm - $(NOECHO) $(POD2MAN) --section=3 --perm_rw=$(PERM_RW)\ - Temp.pm $(INST_MAN3DIR)/File::Temp.$(MAN3EXT) - - - - -# --- MakeMaker processPL section: - - -# --- MakeMaker installbin section: - - -# --- MakeMaker subdirs section: - -# none - -# --- MakeMaker clean_subdirs section: -clean_subdirs : - $(NOECHO) $(NOOP) - - -# --- MakeMaker clean section: - -# Delete temporary files but do not touch installed files. We don't delete -# the Makefile here so a later make realclean still has a makefile to use. - -clean :: clean_subdirs - -$(RM_RF) ./blib $(MAKE_APERL_FILE) $(INST_ARCHAUTODIR)/extralibs.all $(INST_ARCHAUTODIR)/extralibs.ld perlmain.c tmon.out mon.out so_locations pm_to_blib *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT) $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def lib$(BASEEXT).def $(BASEEXT).exp $(BASEEXT).x core core.*perl.*.? *perl.core core.[0-9] core.[0-9][0-9] core.[0-9][0-9][0-9] core.[0-9][0-9][0-9][0-9] core.[0-9][0-9][0-9][0-9][0-9] - -$(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL) - - -# --- MakeMaker realclean_subdirs section: -realclean_subdirs : - $(NOECHO) $(NOOP) - - -# --- MakeMaker realclean section: - -# Delete temporary files (via clean) and also delete installed files -realclean purge :: clean realclean_subdirs - $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR) - $(RM_RF) $(DISTVNAME) - $(RM_F) $(MAKEFILE_OLD) $(FIRST_MAKEFILE) $(INST_LIB)/File/Temp.pm - - -# --- MakeMaker metafile section: -metafile : - $(NOECHO) $(ECHO) '# http://module-build.sourceforge.net/META-spec.html' > META.yml - $(NOECHO) $(ECHO) '#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX#' >> META.yml - $(NOECHO) $(ECHO) 'name: File-Temp' >> META.yml - $(NOECHO) $(ECHO) 'version: 0.12' >> META.yml - $(NOECHO) $(ECHO) 'version_from: Temp.pm' >> META.yml - $(NOECHO) $(ECHO) 'installdirs: site' >> META.yml - $(NOECHO) $(ECHO) 'requires:' >> META.yml - $(NOECHO) $(ECHO) ' Fcntl: 1.03' >> META.yml - $(NOECHO) $(ECHO) ' File::Path: ' >> META.yml - $(NOECHO) $(ECHO) ' File::Spec: 0.8' >> META.yml - $(NOECHO) $(ECHO) '' >> META.yml - $(NOECHO) $(ECHO) 'distribution_type: module' >> META.yml - $(NOECHO) $(ECHO) 'generated_by: ExtUtils::MakeMaker version 6.17' >> META.yml - - -# --- MakeMaker metafile_addtomanifest section: -metafile_addtomanifest: - $(NOECHO) $(PERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) } ' \ - -e ' or print "Could not add META.yml to MANIFEST: $${'\''@'\''}\n"' - - -# --- MakeMaker dist_basics section: -distclean :: realclean distcheck - $(NOECHO) $(NOOP) - -distcheck : - $(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck - -skipcheck : - $(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck - -manifest : - $(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest - -veryclean : realclean - $(RM_F) *~ *.orig */*~ */*.orig - - - -# --- MakeMaker dist_core section: - -dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE) - $(NOECHO) $(PERLRUN) -l -e 'print '\''Warning: Makefile possibly out of date with $(VERSION_FROM)'\''' \ - -e ' if -e '\''$(VERSION_FROM)'\'' and -M '\''$(VERSION_FROM)'\'' < -M '\''$(FIRST_MAKEFILE)'\'';' - -tardist : $(DISTVNAME).tar$(SUFFIX) - $(NOECHO) $(NOOP) - -uutardist : $(DISTVNAME).tar$(SUFFIX) - uuencode $(DISTVNAME).tar$(SUFFIX) $(DISTVNAME).tar$(SUFFIX) > $(DISTVNAME).tar$(SUFFIX)_uu - -$(DISTVNAME).tar$(SUFFIX) : distdir - $(PREOP) - $(TO_UNIX) - $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME) - $(RM_RF) $(DISTVNAME) - $(COMPRESS) $(DISTVNAME).tar - $(POSTOP) - -zipdist : $(DISTVNAME).zip - $(NOECHO) $(NOOP) - -$(DISTVNAME).zip : distdir - $(PREOP) - $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME) - $(RM_RF) $(DISTVNAME) - $(POSTOP) - -shdist : distdir - $(PREOP) - $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar - $(RM_RF) $(DISTVNAME) - $(POSTOP) - - -# --- MakeMaker distdir section: -distdir : metafile metafile_addtomanifest - $(RM_RF) $(DISTVNAME) - $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \ - -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');" - - - -# --- MakeMaker dist_test section: - -disttest : distdir - cd $(DISTVNAME) && $(ABSPERLRUN) Makefile.PL - cd $(DISTVNAME) && $(MAKE) $(PASTHRU) - cd $(DISTVNAME) && $(MAKE) test $(PASTHRU) - - -# --- MakeMaker dist_ci section: - -ci : - $(PERLRUN) "-MExtUtils::Manifest=maniread" \ - -e "@all = keys %{ maniread() };" \ - -e "print(qq{Executing $(CI) @all\n}); system(qq{$(CI) @all});" \ - -e "print(qq{Executing $(RCS_LABEL) ...\n}); system(qq{$(RCS_LABEL) @all});" - - -# --- MakeMaker install section: - -install :: all pure_install doc_install - -install_perl :: all pure_perl_install doc_perl_install - -install_site :: all pure_site_install doc_site_install - -install_vendor :: all pure_vendor_install doc_vendor_install - -pure_install :: pure_$(INSTALLDIRS)_install - -doc_install :: doc_$(INSTALLDIRS)_install - -pure__install : pure_site_install - $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site - -doc__install : doc_site_install - $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site - -pure_perl_install :: - $(NOECHO) $(MOD_INSTALL) \ - read $(PERL_ARCHLIB)/auto/$(FULLEXT)/.packlist \ - write $(DESTINSTALLARCHLIB)/auto/$(FULLEXT)/.packlist \ - $(INST_LIB) $(DESTINSTALLPRIVLIB) \ - $(INST_ARCHLIB) $(DESTINSTALLARCHLIB) \ - $(INST_BIN) $(DESTINSTALLBIN) \ - $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \ - $(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) \ - $(INST_MAN3DIR) $(DESTINSTALLMAN3DIR) - $(NOECHO) $(WARN_IF_OLD_PACKLIST) \ - $(SITEARCHEXP)/auto/$(FULLEXT) - - -pure_site_install :: - $(NOECHO) $(MOD_INSTALL) \ - read $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist \ - write $(DESTINSTALLSITEARCH)/auto/$(FULLEXT)/.packlist \ - $(INST_LIB) $(DESTINSTALLSITELIB) \ - $(INST_ARCHLIB) $(DESTINSTALLSITEARCH) \ - $(INST_BIN) $(DESTINSTALLSITEBIN) \ - $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \ - $(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) \ - $(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR) - $(NOECHO) $(WARN_IF_OLD_PACKLIST) \ - $(PERL_ARCHLIB)/auto/$(FULLEXT) - -pure_vendor_install :: - $(NOECHO) $(MOD_INSTALL) \ - read $(VENDORARCHEXP)/auto/$(FULLEXT)/.packlist \ - write $(DESTINSTALLVENDORARCH)/auto/$(FULLEXT)/.packlist \ - $(INST_LIB) $(DESTINSTALLVENDORLIB) \ - $(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) \ - $(INST_BIN) $(DESTINSTALLVENDORBIN) \ - $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \ - $(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) \ - $(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR) - -doc_perl_install :: - $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod - -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB) - -$(NOECHO) $(DOC_INSTALL) \ - "Module" "$(NAME)" \ - "installed into" "$(INSTALLPRIVLIB)" \ - LINKTYPE "$(LINKTYPE)" \ - VERSION "$(VERSION)" \ - EXE_FILES "$(EXE_FILES)" \ - >> $(DESTINSTALLARCHLIB)/perllocal.pod - -doc_site_install :: - $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod - -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB) - -$(NOECHO) $(DOC_INSTALL) \ - "Module" "$(NAME)" \ - "installed into" "$(INSTALLSITELIB)" \ - LINKTYPE "$(LINKTYPE)" \ - VERSION "$(VERSION)" \ - EXE_FILES "$(EXE_FILES)" \ - >> $(DESTINSTALLARCHLIB)/perllocal.pod - -doc_vendor_install :: - $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod - -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB) - -$(NOECHO) $(DOC_INSTALL) \ - "Module" "$(NAME)" \ - "installed into" "$(INSTALLVENDORLIB)" \ - LINKTYPE "$(LINKTYPE)" \ - VERSION "$(VERSION)" \ - EXE_FILES "$(EXE_FILES)" \ - >> $(DESTINSTALLARCHLIB)/perllocal.pod - - -uninstall :: uninstall_from_$(INSTALLDIRS)dirs - -uninstall_from_perldirs :: - $(NOECHO) $(UNINSTALL) $(PERL_ARCHLIB)/auto/$(FULLEXT)/.packlist - -uninstall_from_sitedirs :: - $(NOECHO) $(UNINSTALL) $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist - -uninstall_from_vendordirs :: - $(NOECHO) $(UNINSTALL) $(VENDORARCHEXP)/auto/$(FULLEXT)/.packlist - - -# --- MakeMaker force section: -# Phony target to force checking subdirectories. -FORCE: - $(NOECHO) $(NOOP) - - -# --- MakeMaker perldepend section: - - -# --- MakeMaker makefile section: - -# We take a very conservative approach here, but it's worth it. -# We move Makefile to Makefile.old here to avoid gnu make looping. -$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP) - $(NOECHO) $(ECHO) "Makefile out-of-date with respect to $?" - $(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..." - $(NOECHO) $(RM_F) $(MAKEFILE_OLD) - $(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) - -$(MAKE) -f $(MAKEFILE_OLD) clean $(DEV_NULL) || $(NOOP) - $(PERLRUN) Makefile.PL - $(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <==" - $(NOECHO) $(ECHO) "==> Please rerun the make command. <==" - false - - - -# --- MakeMaker staticmake section: - -# --- MakeMaker makeaperl section --- -MAP_TARGET = perl -FULLPERL = /usr/bin/perl5.8.5 - -$(MAP_TARGET) :: static $(MAKE_APERL_FILE) - $(MAKE) -f $(MAKE_APERL_FILE) $@ - -$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) - $(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET) - $(NOECHO) $(PERLRUNINST) \ - Makefile.PL DIR= \ - MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \ - MAKEAPERL=1 NORECURS=1 CCCDLFLAGS= - - -# --- MakeMaker test section: - -TEST_VERBOSE=0 -TEST_TYPE=test_$(LINKTYPE) -TEST_FILE = test.pl -TEST_FILES = t/*.t -TESTDB_SW = -d - -testdb :: testdb_$(LINKTYPE) - -test :: $(TEST_TYPE) - -test_dynamic :: pure_all - PERL_DL_NONLAZY=1 $(FULLPERLRUN) "-MExtUtils::Command::MM" "-e" "test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')" $(TEST_FILES) - -testdb_dynamic :: pure_all - PERL_DL_NONLAZY=1 $(FULLPERLRUN) $(TESTDB_SW) "-I$(INST_LIB)" "-I$(INST_ARCHLIB)" $(TEST_FILE) - -test_ : test_dynamic - -test_static :: test_dynamic -testdb_static :: testdb_dynamic - - -# --- MakeMaker ppd section: -# Creates a PPD (Perl Package Description) for a binary distribution. -ppd: - $(NOECHO) $(ECHO) '<SOFTPKG NAME="$(DISTNAME)" VERSION="0,12,0,0">' > $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' <TITLE>$(DISTNAME)</TITLE>' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' <ABSTRACT>return name and handle of a temporary file safely</ABSTRACT>' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' <AUTHOR>Tim Jenness <t.jenness@jach.hawaii.edu></AUTHOR>' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' <IMPLEMENTATION>' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' <DEPENDENCY NAME="Fcntl" VERSION="1,03,0,0" />' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' <DEPENDENCY NAME="File-Path" VERSION="0,0,0,0" />' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' <DEPENDENCY NAME="File-Spec" VERSION="0,8,0,0" />' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' <OS NAME="$(OSNAME)" />' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' <ARCHITECTURE NAME="i686-linux" />' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' <CODEBASE HREF="" />' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) ' </IMPLEMENTATION>' >> $(DISTNAME).ppd - $(NOECHO) $(ECHO) '</SOFTPKG>' >> $(DISTNAME).ppd - - -# --- MakeMaker pm_to_blib section: - -pm_to_blib: $(TO_INST_PM) - $(NOECHO) $(PERLRUN) -MExtUtils::Install -e 'pm_to_blib({@ARGV}, '\''$(INST_LIB)/auto'\'', '\''$(PM_FILTER)'\'')'\ - Temp.pm $(INST_LIB)/File/Temp.pm - $(NOECHO) $(TOUCH) $@ - -# --- MakeMaker selfdocument section: - - -# --- MakeMaker postamble section: - - -# End. diff --git a/lib/Temp/File-Temp-0.12/Makefile.PL b/lib/Temp/File-Temp-0.12/Makefile.PL deleted file mode 100644 index 638e77f..0000000 --- a/lib/Temp/File-Temp-0.12/Makefile.PL +++ /dev/null @@ -1,17 +0,0 @@ -use ExtUtils::MakeMaker; - -# Write the makefile -WriteMakefile( - 'NAME' => 'File::Temp', - 'VERSION_FROM' => 'Temp.pm', # finds $VERSION - - 'PREREQ_PM' => { - File::Spec => 0.8, - Fcntl => 1.03, - File::Path => undef, - }, - 'dist' => { COMPRESS => "gzip -9f" }, - ($] >= 5.005 ? ## Add these new keywords supported since 5.005 - (ABSTRACT_FROM => 'Temp.pm', - AUTHOR => 'Tim Jenness <t.jenness@jach.hawaii.edu>') : ()), -); diff --git a/lib/Temp/File-Temp-0.12/README b/lib/Temp/File-Temp-0.12/README deleted file mode 100644 index 07874fc..0000000 --- a/lib/Temp/File-Temp-0.12/README +++ /dev/null @@ -1,161 +0,0 @@ -File::Temp - provides functions for generating temporary files - -This is release V0.12 of File::Temp. This module can be used to -generate temporary files (providing a filename and filehandle) or directories. -Possible race conditions are avoided and some security checks are performed -(eg making sure the sticky bit is set on world writeable temp directories). - -It could be considered to be in a beta state since it has only been -tested on six operating systems. - -Please let me know if it fails on other operating systems. - -INSTALLATION - - % perl Makefile.PL - % make - % make test - % make install - -TEST FAILURES - -Test failures from lib/ftmp-security saying "system possibly insecure" - -Firstly, test failures from the ftmp-security are not necessarily -serious or indicative of a real security threat. That being said, -they bear investigating. - -The tests may fail for the following reasons. Note that each of the -tests is run both in the building directory and the temporary -directory, as returned by File::Spec->tmpdir(). - -(1) If the directory the tests are being run is owned by somebody else -than the user running the tests, or root (uid 0). This failure can -happen if the Perl source code distribution is unpacked in a way that -the user ids in the distribution package are used as-is. Some tar -programs do this. - -(2) If the directory the test are being run in is writable by group -or by other (remember: with UNIX/POSIX semantics, write access to -a directory means the right to add/remove files in that directory), -and there is no sticky bit set in the directory. 'Sticky bit' is -a feature used in some UNIXes to give extra protection to files: if -the bit is on a directory, no one but the owner (or the root) can remove -that file even if the permissions of the directory would allow file -removal by others. This failure can happen if the permissions in the -directory simply are a bit too liberal for the tests' liking. This -may or may not be a real problem: it depends on the permissions policy -used on this particular directory/project/system/site. This failure -can also happen if the system either doesn't support the sticky bit -(this is the case with many non-UNIX platforms: in principle the -File::Temp should know about these platforms and skip the tests), or -if the system supports the sticky bit but for some reason or reasons -it is not being used. This is for example the case with HP-UX: as of -HP-UX release 11.00, the sticky bit is very much supported, but HP-UX -doesn't use it on its /tmp directory as shipped. Also as with the -permissions, some local policy might dictate that the stickiness is -not used. - -(3) If the system supports the POSIX 'chown giveaway' feature and if -any of the parent directories of the temporary file back to the root -directory are 'unsafe', using the definitions given above in (1) and -(2). - -See the documentation for the File::Temp module for more information -about the various security aspects. - -REQUIREMENTS - -Requires perl 5.005 or newer. -Perl 5.6.0 will give access to extra security checks. - -Written completely in Perl. XS is not required. - -File::Spec greater than or equal to 0.8 is required. -Fcntl from perl5.5.670 or higher [but will work without it]. -The above two modules are standard on Perl 5.6 - -PLATFORMS - -Tested on the following platforms: - - RedHat Linux 7, perl 5.6.0 - Solaris 2.6, perl 5.6.0 - Windows NT 4, perl 5.6.0 - VMS, perl5.7.0 - OS/2, perl5.7.0 - DOS/DJGPP, perl5.7.0 - - RedHat Linux 6.1, perl 5.005_03 - Digital Unix 4.0, perl 5.005_03 - -File::Temp is a standard Perl module as of perl 5.7.0 and 5.6.1. - -Still may need work on non-Unix platforms to adjust test severity (for example -stickyness test does not work on NT, and neither does unlink on an open -file). MEDIUM and HIGH security checks have only been tested on Unix. -Porting notes are provided at the start of Temp.pm. - -AUTHOR - -Tim Jenness <t.jenness@jach.hawaii.edu> - -Copyright (C) 1999 - 2001 Tim Jenness and the UK Particle Physics and -Astronomy Research Council. All Rights Reserved. This program is free -software; you can redistribute it and/or modify it under the same -terms as Perl itself. - -CHANGES IN THIS RELEASE - -V0.12: - - Fix problem with Fcntl warnings on CGI and CGI::Carp - [Thanks to John Labovitz <johnl@valiha.inside.sealabs.com>] - - Remove most of the carp warnings and wrap all information into a - single croak (this allows security failures to die without - additional warnings getting in the way) - -V0.11: - - Fix bug on NT with O_TEMPORARY. The file was removed on close - rather than on exit - -V0.10: - - More fixes for VMS - - Add DOS/DJGPP support - - Make security test less prone to failure on insecure systems - since we are testing the module rather than the system. - - Security tests is run in build dir and tmpdir - -V0.09: - - Add VMS support - - OS/2 can not understand sticky bits - -V0.08: - - Improve performance by a factor of 3 over V0.07 - - Simplify the END block code - - Ignore requests for HIGH or MEDIUM safety on platforms that - can not support it (rather than generating a fatal error) - - Add OS/2 to list of platforms that can not unlink open file - -V0.07: - - Add support for perl 5.005. On perl 5.005 the HIGH and - MEDIUM security levels are not supported due to changes in - the Fcntl module. - - - A benchmark has been added to the misc directory to compare - IO::File->new_tmpfile, File::Temp and a simple creation wrapper - around POSIX::tmpnam. On my Linux system File::Temp::tempfile() - is an order of magnitude slower than the other two...... - -V0.06: - - Add a test suite - - Fix unlinking during the END blocks (was only removing the - first file generated) - - unlink0 can now be run on WinNT - the unlink of the file - is now deferred to an END block since can not unlink an - open file on WinNT - - If the POSIX _PC_CHOWN_RESTRICTED symbol is not available - it is assumed that "chown giveaway" is allowed. - - -V0.05: - - First release to CPAN diff --git a/lib/Temp/File-Temp-0.12/Temp.pm b/lib/Temp/File-Temp-0.12/Temp.pm deleted file mode 100644 index b686682..0000000 --- a/lib/Temp/File-Temp-0.12/Temp.pm +++ /dev/null @@ -1,1863 +0,0 @@ -package File::Temp; - -=head1 NAME - -File::Temp - return name and handle of a temporary file safely - -=begin __INTERNALS - -=head1 PORTABILITY - -This module is designed to be portable across operating systems -and it currently supports Unix, VMS, DOS, OS/2 and Windows. When -porting to a new OS there are generally three main issues -that have to be solved: - -=over 4 - -=item * - -Can the OS unlink an open file? If it can not then the -C<_can_unlink_opened_file> method should be modified. - -=item * - -Are the return values from C<stat> reliable? By default all the -return values from C<stat> are compared when unlinking a temporary -file using the filename and the handle. Operating systems other than -unix do not always have valid entries in all fields. If C<unlink0> fails -then the C<stat> comparison should be modified accordingly. - -=item * - -Security. Systems that can not support a test for the sticky bit -on a directory can not use the MEDIUM and HIGH security tests. -The C<_can_do_level> method should be modified accordingly. - -=back - -=end __INTERNALS - -=head1 SYNOPSIS - - use File::Temp qw/ tempfile tempdir /; - - $dir = tempdir( CLEANUP => 1 ); - ($fh, $filename) = tempfile( DIR => $dir ); - - ($fh, $filename) = tempfile( $template, DIR => $dir); - ($fh, $filename) = tempfile( $template, SUFFIX => '.dat'); - - $fh = tempfile(); - -MkTemp family: - - use File::Temp qw/ :mktemp /; - - ($fh, $file) = mkstemp( "tmpfileXXXXX" ); - ($fh, $file) = mkstemps( "tmpfileXXXXXX", $suffix); - - $tmpdir = mkdtemp( $template ); - - $unopened_file = mktemp( $template ); - -POSIX functions: - - use File::Temp qw/ :POSIX /; - - $file = tmpnam(); - $fh = tmpfile(); - - ($fh, $file) = tmpnam(); - ($fh, $file) = tmpfile(); - - -Compatibility functions: - - $unopened_file = File::Temp::tempnam( $dir, $pfx ); - -=begin later - -Objects (NOT YET IMPLEMENTED): - - require File::Temp; - - $fh = new File::Temp($template); - $fname = $fh->filename; - -=end later - -=head1 DESCRIPTION - -C<File::Temp> can be used to create and open temporary files in a safe way. -The tempfile() function can be used to return the name and the open -filehandle of a temporary file. The tempdir() function can -be used to create a temporary directory. - -The security aspect of temporary file creation is emphasized such that -a filehandle and filename are returned together. This helps guarantee -that a race condition can not occur where the temporary file is -created by another process between checking for the existence of the -file and its opening. Additional security levels are provided to -check, for example, that the sticky bit is set on world writable -directories. See L<"safe_level"> for more information. - -For compatibility with popular C library functions, Perl implementations of -the mkstemp() family of functions are provided. These are, mkstemp(), -mkstemps(), mkdtemp() and mktemp(). - -Additionally, implementations of the standard L<POSIX|POSIX> -tmpnam() and tmpfile() functions are provided if required. - -Implementations of mktemp(), tmpnam(), and tempnam() are provided, -but should be used with caution since they return only a filename -that was valid when function was called, so cannot guarantee -that the file will not exist by the time the caller opens the filename. - -=cut - -# 5.6.0 gives us S_IWOTH, S_IWGRP, our and auto-vivifying filehandls -# People would like a version on 5.005 so give them what they want :-) -use 5.005; -use strict; -use Carp; -use File::Spec 0.8; -use File::Path qw/ rmtree /; -use Fcntl 1.03; -use Errno; -require VMS::Stdio if $^O eq 'VMS'; - -# Need the Symbol package if we are running older perl -require Symbol if $] < 5.006; - - -# use 'our' on v5.6.0 -use vars qw($VERSION @EXPORT_OK %EXPORT_TAGS $DEBUG); - -$DEBUG = 0; - -# We are exporting functions - -use base qw/Exporter/; - -# Export list - to allow fine tuning of export table - -@EXPORT_OK = qw{ - tempfile - tempdir - tmpnam - tmpfile - mktemp - mkstemp - mkstemps - mkdtemp - unlink0 - }; - -# Groups of functions for export - -%EXPORT_TAGS = ( - 'POSIX' => [qw/ tmpnam tmpfile /], - 'mktemp' => [qw/ mktemp mkstemp mkstemps mkdtemp/], - ); - -# add contents of these tags to @EXPORT -Exporter::export_tags('POSIX','mktemp'); - -# Version number - -$VERSION = '0.12'; - -# This is a list of characters that can be used in random filenames - -my @CHARS = (qw/ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z - a b c d e f g h i j k l m n o p q r s t u v w x y z - 0 1 2 3 4 5 6 7 8 9 _ - /); - -# Maximum number of tries to make a temp file before failing - -use constant MAX_TRIES => 10; - -# Minimum number of X characters that should be in a template -use constant MINX => 4; - -# Default template when no template supplied - -use constant TEMPXXX => 'X' x 10; - -# Constants for the security level - -use constant STANDARD => 0; -use constant MEDIUM => 1; -use constant HIGH => 2; - -# OPENFLAGS. If we defined the flag to use with Sysopen here this gives -# us an optimisation when many temporary files are requested - -my $OPENFLAGS = O_CREAT | O_EXCL | O_RDWR; - -for my $oflag (qw/ FOLLOW BINARY LARGEFILE EXLOCK NOINHERIT /) { - my ($bit, $func) = (0, "Fcntl::O_" . $oflag); - no strict 'refs'; - $OPENFLAGS |= $bit if eval { - # Make sure that redefined die handlers do not cause problems - # eg CGI::Carp - local $SIG{__DIE__} = sub {}; - local $SIG{__WARN__} = sub {}; - $bit = &$func(); - 1; - }; -} - -# On some systems the O_TEMPORARY flag can be used to tell the OS -# to automatically remove the file when it is closed. This is fine -# in most cases but not if tempfile is called with UNLINK=>0 and -# the filename is requested -- in the case where the filename is to -# be passed to another routine. This happens on windows. We overcome -# this by using a second open flags variable - -my $OPENTEMPFLAGS = $OPENFLAGS; -for my $oflag (qw/ TEMPORARY /) { - my ($bit, $func) = (0, "Fcntl::O_" . $oflag); - no strict 'refs'; - $OPENTEMPFLAGS |= $bit if eval { - # Make sure that redefined die handlers do not cause problems - # eg CGI::Carp - local $SIG{__DIE__} = sub {}; - local $SIG{__WARN__} = sub {}; - $bit = &$func(); - 1; - }; -} - -# INTERNAL ROUTINES - not to be used outside of package - -# Generic routine for getting a temporary filename -# modelled on OpenBSD _gettemp() in mktemp.c - -# The template must contain X's that are to be replaced -# with the random values - -# Arguments: - -# TEMPLATE - string containing the XXXXX's that is converted -# to a random filename and opened if required - -# Optionally, a hash can also be supplied containing specific options -# "open" => if true open the temp file, else just return the name -# default is 0 -# "mkdir"=> if true, we are creating a temp directory rather than tempfile -# default is 0 -# "suffixlen" => number of characters at end of PATH to be ignored. -# default is 0. -# "unlink_on_close" => indicates that, if possible, the OS should remove -# the file as soon as it is closed. Usually indicates -# use of the O_TEMPORARY flag to sysopen. -# Usually irrelevant on unix - -# Optionally a reference to a scalar can be passed into the function -# On error this will be used to store the reason for the error -# "ErrStr" => \$errstr - -# "open" and "mkdir" can not both be true -# "unlink_on_close" is not used when "mkdir" is true. - -# The default options are equivalent to mktemp(). - -# Returns: -# filehandle - open file handle (if called with doopen=1, else undef) -# temp name - name of the temp file or directory - -# For example: -# ($fh, $name) = _gettemp($template, "open" => 1); - -# for the current version, failures are associated with -# stored in an error string and returned to give the reason whilst debugging -# This routine is not called by any external function -sub _gettemp { - - croak 'Usage: ($fh, $name) = _gettemp($template, OPTIONS);' - unless scalar(@_) >= 1; - - # the internal error string - expect it to be overridden - # Need this in case the caller decides not to supply us a value - # need an anonymous scalar - my $tempErrStr; - - # Default options - my %options = ( - "open" => 0, - "mkdir" => 0, - "suffixlen" => 0, - "unlink_on_close" => 0, - "ErrStr" => \$tempErrStr, - ); - - # Read the template - my $template = shift; - if (ref($template)) { - # Use a warning here since we have not yet merged ErrStr - carp "File::Temp::_gettemp: template must not be a reference"; - return (); - } - - # Check that the number of entries on stack are even - if (scalar(@_) % 2 != 0) { - # Use a warning here since we have not yet merged ErrStr - carp "File::Temp::_gettemp: Must have even number of options"; - return (); - } - - # Read the options and merge with defaults - %options = (%options, @_) if @_; - - # Make sure the error string is set to undef - ${$options{ErrStr}} = undef; - - # Can not open the file and make a directory in a single call - if ($options{"open"} && $options{"mkdir"}) { - ${$options{ErrStr}} = "doopen and domkdir can not both be true\n"; - return (); - } - - # Find the start of the end of the Xs (position of last X) - # Substr starts from 0 - my $start = length($template) - 1 - $options{"suffixlen"}; - - # Check that we have at least MINX x X (eg 'XXXX") at the end of the string - # (taking suffixlen into account). Any fewer is insecure. - - # Do it using substr - no reason to use a pattern match since - # we know where we are looking and what we are looking for - - if (substr($template, $start - MINX + 1, MINX) ne 'X' x MINX) { - ${$options{ErrStr}} = "The template must contain at least ". - MINX . " 'X' characters\n"; - return (); - } - - # Replace all the X at the end of the substring with a - # random character or just all the XX at the end of a full string. - # Do it as an if, since the suffix adjusts which section to replace - # and suffixlen=0 returns nothing if used in the substr directly - # and generate a full path from the template - - my $path = _replace_XX($template, $options{"suffixlen"}); - - - # Split the path into constituent parts - eventually we need to check - # whether the directory exists - # We need to know whether we are making a temp directory - # or a tempfile - - my ($volume, $directories, $file); - my $parent; # parent directory - if ($options{"mkdir"}) { - # There is no filename at the end - ($volume, $directories, $file) = File::Spec->splitpath( $path, 1); - - # The parent is then $directories without the last directory - # Split the directory and put it back together again - my @dirs = File::Spec->splitdir($directories); - - # If @dirs only has one entry that means we are in the current - # directory - if ($#dirs == 0) { - $parent = File::Spec->curdir; - } else { - - if ($^O eq 'VMS') { # need volume to avoid relative dir spec - $parent = File::Spec->catdir($volume, @dirs[0..$#dirs-1]); - $parent = 'sys$disk:[]' if $parent eq ''; - } else { - - # Put it back together without the last one - $parent = File::Spec->catdir(@dirs[0..$#dirs-1]); - - # ...and attach the volume (no filename) - $parent = File::Spec->catpath($volume, $parent, ''); - } - - } - - } else { - - # Get rid of the last filename (use File::Basename for this?) - ($volume, $directories, $file) = File::Spec->splitpath( $path ); - - # Join up without the file part - $parent = File::Spec->catpath($volume,$directories,''); - - # If $parent is empty replace with curdir - $parent = File::Spec->curdir - unless $directories ne ''; - - } - - # Check that the parent directories exist - # Do this even for the case where we are simply returning a name - # not a file -- no point returning a name that includes a directory - # that does not exist or is not writable - - unless (-d $parent) { - ${$options{ErrStr}} = "Parent directory ($parent) is not a directory"; - return (); - } - unless (-w _) { - ${$options{ErrStr}} = "Parent directory ($parent) is not writable\n"; - return (); - } - - - # Check the stickiness of the directory and chown giveaway if required - # If the directory is world writable the sticky bit - # must be set - - if (File::Temp->safe_level == MEDIUM) { - my $safeerr; - unless (_is_safe($parent,\$safeerr)) { - ${$options{ErrStr}} = "Parent directory ($parent) is not safe ($safeerr)"; - return (); - } - } elsif (File::Temp->safe_level == HIGH) { - my $safeerr; - unless (_is_verysafe($parent, \$safeerr)) { - ${$options{ErrStr}} = "Parent directory ($parent) is not safe ($safeerr)"; - return (); - } - } - - - # Now try MAX_TRIES time to open the file - for (my $i = 0; $i < MAX_TRIES; $i++) { - - # Try to open the file if requested - if ($options{"open"}) { - my $fh; - - # If we are running before perl5.6.0 we can not auto-vivify - if ($] < 5.006) { - $fh = &Symbol::gensym; - } - - # Try to make sure this will be marked close-on-exec - # XXX: Win32 doesn't respect this, nor the proper fcntl, - # but may have O_NOINHERIT. This may or may not be in Fcntl. - local $^F = 2; - - # Store callers umask - my $umask = umask(); - - # Set a known umask - umask(066); - - # Attempt to open the file - my $open_success = undef; - if ( $^O eq 'VMS' and $options{"unlink_on_close"} ) { - # make it auto delete on close by setting FAB$V_DLT bit - $fh = VMS::Stdio::vmssysopen($path, $OPENFLAGS, 0600, 'fop=dlt'); - $open_success = $fh; - } else { - my $flags = ( $options{"unlink_on_close"} ? - $OPENTEMPFLAGS : - $OPENFLAGS ); - $open_success = sysopen($fh, $path, $flags, 0600); - } - if ( $open_success ) { - - # Reset umask - umask($umask); - - # Opened successfully - return file handle and name - return ($fh, $path); - - } else { - # Reset umask - umask($umask); - - # Error opening file - abort with error - # if the reason was anything but EEXIST - unless ($!{EEXIST}) { - ${$options{ErrStr}} = "Could not create temp file $path: $!"; - return (); - } - - # Loop round for another try - - } - } elsif ($options{"mkdir"}) { - - # Store callers umask - my $umask = umask(); - - # Set a known umask - umask(066); - - # Open the temp directory - if (mkdir( $path, 0700)) { - # created okay - # Reset umask - umask($umask); - - return undef, $path; - } else { - - # Reset umask - umask($umask); - - # Abort with error if the reason for failure was anything - # except EEXIST - unless ($!{EEXIST}) { - ${$options{ErrStr}} = "Could not create directory $path: $!"; - return (); - } - - # Loop round for another try - - } - - } else { - - # Return true if the file can not be found - # Directory has been checked previously - - return (undef, $path) unless -e $path; - - # Try again until MAX_TRIES - - } - - # Did not successfully open the tempfile/dir - # so try again with a different set of random letters - # No point in trying to increment unless we have only - # 1 X say and the randomness could come up with the same - # file MAX_TRIES in a row. - - # Store current attempt - in principal this implies that the - # 3rd time around the open attempt that the first temp file - # name could be generated again. Probably should store each - # attempt and make sure that none are repeated - - my $original = $path; - my $counter = 0; # Stop infinite loop - my $MAX_GUESS = 50; - - do { - - # Generate new name from original template - $path = _replace_XX($template, $options{"suffixlen"}); - - $counter++; - - } until ($path ne $original || $counter > $MAX_GUESS); - - # Check for out of control looping - if ($counter > $MAX_GUESS) { - ${$options{ErrStr}} = "Tried to get a new temp name different to the previous value $MAX_GUESS times.\nSomething wrong with template?? ($template)"; - return (); - } - - } - - # If we get here, we have run out of tries - ${ $options{ErrStr} } = "Have exceeded the maximum number of attempts (" - . MAX_TRIES . ") to open temp file/dir"; - - return (); - -} - -# Internal routine to return a random character from the -# character list. Does not do an srand() since rand() -# will do one automatically - -# No arguments. Return value is the random character - -# No longer called since _replace_XX runs a few percent faster if -# I inline the code. This is important if we are creating thousands of -# temporary files. - -sub _randchar { - - $CHARS[ int( rand( $#CHARS ) ) ]; - -} - -# Internal routine to replace the XXXX... with random characters -# This has to be done by _gettemp() every time it fails to -# open a temp file/dir - -# Arguments: $template (the template with XXX), -# $ignore (number of characters at end to ignore) - -# Returns: modified template - -sub _replace_XX { - - croak 'Usage: _replace_XX($template, $ignore)' - unless scalar(@_) == 2; - - my ($path, $ignore) = @_; - - # Do it as an if, since the suffix adjusts which section to replace - # and suffixlen=0 returns nothing if used in the substr directly - # Alternatively, could simply set $ignore to length($path)-1 - # Don't want to always use substr when not required though. - - if ($ignore) { - substr($path, 0, - $ignore) =~ s/X(?=X*\z)/$CHARS[ int( rand( $#CHARS ) ) ]/ge; - } else { - $path =~ s/X(?=X*\z)/$CHARS[ int( rand( $#CHARS ) ) ]/ge; - } - - return $path; -} - -# internal routine to check to see if the directory is safe -# First checks to see if the directory is not owned by the -# current user or root. Then checks to see if anyone else -# can write to the directory and if so, checks to see if -# it has the sticky bit set - -# Will not work on systems that do not support sticky bit - -#Args: directory path to check -# Optionally: reference to scalar to contain error message -# Returns true if the path is safe and false otherwise. -# Returns undef if can not even run stat() on the path - -# This routine based on version written by Tom Christiansen - -# Presumably, by the time we actually attempt to create the -# file or directory in this directory, it may not be safe -# anymore... Have to run _is_safe directly after the open. - -sub _is_safe { - - my $path = shift; - my $err_ref = shift; - - # Stat path - my @info = stat($path); - unless (scalar(@info)) { - $$err_ref = "stat(path) returned no values"; - return 0; - }; - return 1 if $^O eq 'VMS'; # owner delete control at file level - - # Check to see whether owner is neither superuser (or a system uid) nor me - # Use the real uid from the $< variable - # UID is in [4] - if ($info[4] > File::Temp->top_system_uid() && $info[4] != $<) { - - Carp::cluck(sprintf "uid=$info[4] topuid=%s \$<=$< path='$path'", - File::Temp->top_system_uid()); - - $$err_ref = "Directory owned neither by root nor the current user" - if ref($err_ref); - return 0; - } - - # check whether group or other can write file - # use 066 to detect either reading or writing - # use 022 to check writability - # Do it with S_IWOTH and S_IWGRP for portability (maybe) - # mode is in info[2] - if (($info[2] & &Fcntl::S_IWGRP) || # Is group writable? - ($info[2] & &Fcntl::S_IWOTH) ) { # Is world writable? - # Must be a directory - unless (-d _) { - $$err_ref = "Path ($path) is not a directory" - if ref($err_ref); - return 0; - } - # Must have sticky bit set - unless (-k _) { - $$err_ref = "Sticky bit not set on $path when dir is group|world writable" - if ref($err_ref); - return 0; - } - } - - return 1; -} - -# Internal routine to check whether a directory is safe -# for temp files. Safer than _is_safe since it checks for -# the possibility of chown giveaway and if that is a possibility -# checks each directory in the path to see if it is safe (with _is_safe) - -# If _PC_CHOWN_RESTRICTED is not set, does the full test of each -# directory anyway. - -# Takes optional second arg as scalar ref to error reason - -sub _is_verysafe { - - # Need POSIX - but only want to bother if really necessary due to overhead - require POSIX; - - my $path = shift; - print "_is_verysafe testing $path\n" if $DEBUG; - return 1 if $^O eq 'VMS'; # owner delete control at file level - - my $err_ref = shift; - - # Should Get the value of _PC_CHOWN_RESTRICTED if it is defined - # and If it is not there do the extensive test - my $chown_restricted; - $chown_restricted = &POSIX::_PC_CHOWN_RESTRICTED() - if eval { &POSIX::_PC_CHOWN_RESTRICTED(); 1}; - - # If chown_resticted is set to some value we should test it - if (defined $chown_restricted) { - - # Return if the current directory is safe - return _is_safe($path,$err_ref) if POSIX::sysconf( $chown_restricted ); - - } - - # To reach this point either, the _PC_CHOWN_RESTRICTED symbol - # was not avialable or the symbol was there but chown giveaway - # is allowed. Either way, we now have to test the entire tree for - # safety. - - # Convert path to an absolute directory if required - unless (File::Spec->file_name_is_absolute($path)) { - $path = File::Spec->rel2abs($path); - } - - # Split directory into components - assume no file - my ($volume, $directories, undef) = File::Spec->splitpath( $path, 1); - - # Slightly less efficient than having a a function in File::Spec - # to chop off the end of a directory or even a function that - # can handle ../ in a directory tree - # Sometimes splitdir() returns a blank at the end - # so we will probably check the bottom directory twice in some cases - my @dirs = File::Spec->splitdir($directories); - - # Concatenate one less directory each time around - foreach my $pos (0.. $#dirs) { - # Get a directory name - my $dir = File::Spec->catpath($volume, - File::Spec->catdir(@dirs[0.. $#dirs - $pos]), - '' - ); - - print "TESTING DIR $dir\n" if $DEBUG; - - # Check the directory - return 0 unless _is_safe($dir,$err_ref); - - } - - return 1; -} - - - -# internal routine to determine whether unlink works on this -# platform for files that are currently open. -# Returns true if we can, false otherwise. - -# Currently WinNT, OS/2 and VMS can not unlink an opened file -# On VMS this is because the O_EXCL flag is used to open the -# temporary file. Currently I do not know enough about the issues -# on VMS to decide whether O_EXCL is a requirement. - -sub _can_unlink_opened_file { - - if ($^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'VMS' || $^O eq 'dos') { - return 0; - } else { - return 1; - } - -} - -# internal routine to decide which security levels are allowed -# see safe_level() for more information on this - -# Controls whether the supplied security level is allowed - -# $cando = _can_do_level( $level ) - -sub _can_do_level { - - # Get security level - my $level = shift; - - # Always have to be able to do STANDARD - return 1 if $level == STANDARD; - - # Currently, the systems that can do HIGH or MEDIUM are identical - if ( $^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'cygwin' || $^O eq 'dos') { - return 0; - } else { - return 1; - } - -} - -# This routine sets up a deferred unlinking of a specified -# filename and filehandle. It is used in the following cases: -# - Called by unlink0 if an opened file can not be unlinked -# - Called by tempfile() if files are to be removed on shutdown -# - Called by tempdir() if directories are to be removed on shutdown - -# Arguments: -# _deferred_unlink( $fh, $fname, $isdir ); -# -# - filehandle (so that it can be expclicitly closed if open -# - filename (the thing we want to remove) -# - isdir (flag to indicate that we are being given a directory) -# [and hence no filehandle] - -# Status is not referred to since all the magic is done with an END block - -{ - # Will set up two lexical variables to contain all the files to be - # removed. One array for files, another for directories - # They will only exist in this block - # This means we only have to set up a single END block to remove all files - # @files_to_unlink contains an array ref with the filehandle and filename - my (@files_to_unlink, @dirs_to_unlink); - - # Set up an end block to use these arrays - END { - # Files - foreach my $file (@files_to_unlink) { - # close the filehandle without checking its state - # in order to make real sure that this is closed - # if its already closed then I dont care about the answer - # probably a better way to do this - close($file->[0]); # file handle is [0] - - if (-f $file->[1]) { # file name is [1] - unlink $file->[1] or warn "Error removing ".$file->[1]; - } - } - # Dirs - foreach my $dir (@dirs_to_unlink) { - if (-d $dir) { - rmtree($dir, $DEBUG, 1); - } - } - - } - - # This is the sub called to register a file for deferred unlinking - # This could simply store the input parameters and defer everything - # until the END block. For now we do a bit of checking at this - # point in order to make sure that (1) we have a file/dir to delete - # and (2) we have been called with the correct arguments. - sub _deferred_unlink { - - croak 'Usage: _deferred_unlink($fh, $fname, $isdir)' - unless scalar(@_) == 3; - - my ($fh, $fname, $isdir) = @_; - - warn "Setting up deferred removal of $fname\n" - if $DEBUG; - - # If we have a directory, check that it is a directory - if ($isdir) { - - if (-d $fname) { - - # Directory exists so store it - # first on VMS turn []foo into [.foo] for rmtree - $fname = VMS::Filespec::vmspath($fname) if $^O eq 'VMS'; - push (@dirs_to_unlink, $fname); - - } else { - carp "Request to remove directory $fname could not be completed since it does not exist!\n" if $^W; - } - - } else { - - if (-f $fname) { - - # file exists so store handle and name for later removal - push(@files_to_unlink, [$fh, $fname]); - - } else { - carp "Request to remove file $fname could not be completed since it is not there!\n" if $^W; - } - - } - - } - - -} - -=head1 FUNCTIONS - -This section describes the recommended interface for generating -temporary files and directories. - -=over 4 - -=item B<tempfile> - -This is the basic function to generate temporary files. -The behaviour of the file can be changed using various options: - - ($fh, $filename) = tempfile(); - -Create a temporary file in the directory specified for temporary -files, as specified by the tmpdir() function in L<File::Spec>. - - ($fh, $filename) = tempfile($template); - -Create a temporary file in the current directory using the supplied -template. Trailing `X' characters are replaced with random letters to -generate the filename. At least four `X' characters must be present -in the template. - - ($fh, $filename) = tempfile($template, SUFFIX => $suffix) - -Same as previously, except that a suffix is added to the template -after the `X' translation. Useful for ensuring that a temporary -filename has a particular extension when needed by other applications. -But see the WARNING at the end. - - ($fh, $filename) = tempfile($template, DIR => $dir); - -Translates the template as before except that a directory name -is specified. - - ($fh, $filename) = tempfile($template, UNLINK => 1); - -Return the filename and filehandle as before except that the file is -automatically removed when the program exits. Default is for the file -to be removed if a file handle is requested and to be kept if the -filename is requested. In a scalar context (where no filename is -returned) the file is always deleted either on exit or when it is closed. - -If the template is not specified, a template is always -automatically generated. This temporary file is placed in tmpdir() -(L<File::Spec>) unless a directory is specified explicitly with the -DIR option. - - $fh = tempfile( $template, DIR => $dir ); - -If called in scalar context, only the filehandle is returned -and the file will automatically be deleted when closed (see -the description of tmpfile() elsewhere in this document). -This is the preferred mode of operation, as if you only -have a filehandle, you can never create a race condition -by fumbling with the filename. On systems that can not unlink -an open file or can not mark a file as temporary when it is opened -(for example, Windows NT uses the C<O_TEMPORARY> flag)) -the file is marked for deletion when the program ends (equivalent -to setting UNLINK to 1). The C<UNLINK> flag is ignored if present. - - (undef, $filename) = tempfile($template, OPEN => 0); - -This will return the filename based on the template but -will not open this file. Cannot be used in conjunction with -UNLINK set to true. Default is to always open the file -to protect from possible race conditions. A warning is issued -if warnings are turned on. Consider using the tmpnam() -and mktemp() functions described elsewhere in this document -if opening the file is not required. - -Options can be combined as required. - -=cut - -sub tempfile { - - # Can not check for argument count since we can have any - # number of args - - # Default options - my %options = ( - "DIR" => undef, # Directory prefix - "SUFFIX" => '', # Template suffix - "UNLINK" => 0, # Do not unlink file on exit - "OPEN" => 1, # Open file - ); - - # Check to see whether we have an odd or even number of arguments - my $template = (scalar(@_) % 2 == 1 ? shift(@_) : undef); - - # Read the options and merge with defaults - %options = (%options, @_) if @_; - - # First decision is whether or not to open the file - if (! $options{"OPEN"}) { - - warn "tempfile(): temporary filename requested but not opened.\nPossibly unsafe, consider using tempfile() with OPEN set to true\n" - if $^W; - - } - - if ($options{"DIR"} and $^O eq 'VMS') { - - # on VMS turn []foo into [.foo] for concatenation - $options{"DIR"} = VMS::Filespec::vmspath($options{"DIR"}); - } - - # Construct the template - - # Have a choice of trying to work around the mkstemp/mktemp/tmpnam etc - # functions or simply constructing a template and using _gettemp() - # explicitly. Go for the latter - - # First generate a template if not defined and prefix the directory - # If no template must prefix the temp directory - if (defined $template) { - if ($options{"DIR"}) { - - $template = File::Spec->catfile($options{"DIR"}, $template); - - } - - } else { - - if ($options{"DIR"}) { - - $template = File::Spec->catfile($options{"DIR"}, TEMPXXX); - - } else { - - $template = File::Spec->catfile(File::Spec->tmpdir, TEMPXXX); - - } - - } - - # Now add a suffix - $template .= $options{"SUFFIX"}; - - # Determine whether we should tell _gettemp to unlink the file - # On unix this is irrelevant and can be worked out after the file is - # opened (simply by unlinking the open filehandle). On Windows or VMS - # we have to indicate temporary-ness when we open the file. In general - # we only want a true temporary file if we are returning just the - # filehandle - if the user wants the filename they probably do not - # want the file to disappear as soon as they close it. - # For this reason, tie unlink_on_close to the return context regardless - # of OS. - my $unlink_on_close = ( wantarray ? 0 : 1); - - # Create the file - my ($fh, $path, $errstr); - croak "Error in tempfile() using $template: $errstr" - unless (($fh, $path) = _gettemp($template, - "open" => $options{'OPEN'}, - "mkdir"=> 0 , - "unlink_on_close" => $unlink_on_close, - "suffixlen" => length($options{'SUFFIX'}), - "ErrStr" => \$errstr, - ) ); - - # Set up an exit handler that can do whatever is right for the - # system. This removes files at exit when requested explicitly or when - # system is asked to unlink_on_close but is unable to do so because - # of OS limitations. - # The latter should be achieved by using a tied filehandle. - # Do not check return status since this is all done with END blocks. - _deferred_unlink($fh, $path, 0) if $options{"UNLINK"}; - - # Return - if (wantarray()) { - - if ($options{'OPEN'}) { - return ($fh, $path); - } else { - return (undef, $path); - } - - } else { - - # Unlink the file. It is up to unlink0 to decide what to do with - # this (whether to unlink now or to defer until later) - unlink0($fh, $path) or croak "Error unlinking file $path using unlink0"; - - # Return just the filehandle. - return $fh; - } - - -} - -=item B<tempdir> - -This is the recommended interface for creation of temporary directories. -The behaviour of the function depends on the arguments: - - $tempdir = tempdir(); - -Create a directory in tmpdir() (see L<File::Spec|File::Spec>). - - $tempdir = tempdir( $template ); - -Create a directory from the supplied template. This template is -similar to that described for tempfile(). `X' characters at the end -of the template are replaced with random letters to construct the -directory name. At least four `X' characters must be in the template. - - $tempdir = tempdir ( DIR => $dir ); - -Specifies the directory to use for the temporary directory. -The temporary directory name is derived from an internal template. - - $tempdir = tempdir ( $template, DIR => $dir ); - -Prepend the supplied directory name to the template. The template -should not include parent directory specifications itself. Any parent -directory specifications are removed from the template before -prepending the supplied directory. - - $tempdir = tempdir ( $template, TMPDIR => 1 ); - -Using the supplied template, creat the temporary directory in -a standard location for temporary files. Equivalent to doing - - $tempdir = tempdir ( $template, DIR => File::Spec->tmpdir); - -but shorter. Parent directory specifications are stripped from the -template itself. The C<TMPDIR> option is ignored if C<DIR> is set -explicitly. Additionally, C<TMPDIR> is implied if neither a template -nor a directory are supplied. - - $tempdir = tempdir( $template, CLEANUP => 1); - -Create a temporary directory using the supplied template, but -attempt to remove it (and all files inside it) when the program -exits. Note that an attempt will be made to remove all files from -the directory even if they were not created by this module (otherwise -why ask to clean it up?). The directory removal is made with -the rmtree() function from the L<File::Path|File::Path> module. -Of course, if the template is not specified, the temporary directory -will be created in tmpdir() and will also be removed at program exit. - -=cut - -# ' - -sub tempdir { - - # Can not check for argument count since we can have any - # number of args - - # Default options - my %options = ( - "CLEANUP" => 0, # Remove directory on exit - "DIR" => '', # Root directory - "TMPDIR" => 0, # Use tempdir with template - ); - - # Check to see whether we have an odd or even number of arguments - my $template = (scalar(@_) % 2 == 1 ? shift(@_) : undef ); - - # Read the options and merge with defaults - %options = (%options, @_) if @_; - - # Modify or generate the template - - # Deal with the DIR and TMPDIR options - if (defined $template) { - - # Need to strip directory path if using DIR or TMPDIR - if ($options{'TMPDIR'} || $options{'DIR'}) { - - # Strip parent directory from the filename - # - # There is no filename at the end - $template = VMS::Filespec::vmspath($template) if $^O eq 'VMS'; - my ($volume, $directories, undef) = File::Spec->splitpath( $template, 1); - - # Last directory is then our template - $template = (File::Spec->splitdir($directories))[-1]; - - # Prepend the supplied directory or temp dir - if ($options{"DIR"}) { - - $template = File::Spec->catdir($options{"DIR"}, $template); - - } elsif ($options{TMPDIR}) { - - # Prepend tmpdir - $template = File::Spec->catdir(File::Spec->tmpdir, $template); - - } - - } - - } else { - - if ($options{"DIR"}) { - - $template = File::Spec->catdir($options{"DIR"}, TEMPXXX); - - } else { - - $template = File::Spec->catdir(File::Spec->tmpdir, TEMPXXX); - - } - - } - - # Create the directory - my $tempdir; - my $suffixlen = 0; - if ($^O eq 'VMS') { # dir names can end in delimiters - $template =~ m/([\.\]:>]+)$/; - $suffixlen = length($1); - } - - my $errstr; - croak "Error in tempdir() using $template: $errstr" - unless ((undef, $tempdir) = _gettemp($template, - "open" => 0, - "mkdir"=> 1 , - "suffixlen" => $suffixlen, - "ErrStr" => \$errstr, - ) ); - - # Install exit handler; must be dynamic to get lexical - if ( $options{'CLEANUP'} && -d $tempdir) { - _deferred_unlink(undef, $tempdir, 1); - } - - # Return the dir name - return $tempdir; - -} - -=back - -=head1 MKTEMP FUNCTIONS - -The following functions are Perl implementations of the -mktemp() family of temp file generation system calls. - -=over 4 - -=item B<mkstemp> - -Given a template, returns a filehandle to the temporary file and the name -of the file. - - ($fh, $name) = mkstemp( $template ); - -In scalar context, just the filehandle is returned. - -The template may be any filename with some number of X's appended -to it, for example F</tmp/temp.XXXX>. The trailing X's are replaced -with unique alphanumeric combinations. - -=cut - - - -sub mkstemp { - - croak "Usage: mkstemp(template)" - if scalar(@_) != 1; - - my $template = shift; - - my ($fh, $path, $errstr); - croak "Error in mkstemp using $template: $errstr" - unless (($fh, $path) = _gettemp($template, - "open" => 1, - "mkdir"=> 0 , - "suffixlen" => 0, - "ErrStr" => \$errstr, - ) ); - - if (wantarray()) { - return ($fh, $path); - } else { - return $fh; - } - -} - - -=item B<mkstemps> - -Similar to mkstemp(), except that an extra argument can be supplied -with a suffix to be appended to the template. - - ($fh, $name) = mkstemps( $template, $suffix ); - -For example a template of C<testXXXXXX> and suffix of C<.dat> -would generate a file similar to F<testhGji_w.dat>. - -Returns just the filehandle alone when called in scalar context. - -=cut - -sub mkstemps { - - croak "Usage: mkstemps(template, suffix)" - if scalar(@_) != 2; - - - my $template = shift; - my $suffix = shift; - - $template .= $suffix; - - my ($fh, $path, $errstr); - croak "Error in mkstemps using $template: $errstr" - unless (($fh, $path) = _gettemp($template, - "open" => 1, - "mkdir"=> 0 , - "suffixlen" => length($suffix), - "ErrStr" => \$errstr, - ) ); - - if (wantarray()) { - return ($fh, $path); - } else { - return $fh; - } - -} - -=item B<mkdtemp> - -Create a directory from a template. The template must end in -X's that are replaced by the routine. - - $tmpdir_name = mkdtemp($template); - -Returns the name of the temporary directory created. -Returns undef on failure. - -Directory must be removed by the caller. - -=cut - -#' # for emacs - -sub mkdtemp { - - croak "Usage: mkdtemp(template)" - if scalar(@_) != 1; - - my $template = shift; - my $suffixlen = 0; - if ($^O eq 'VMS') { # dir names can end in delimiters - $template =~ m/([\.\]:>]+)$/; - $suffixlen = length($1); - } - my ($junk, $tmpdir, $errstr); - croak "Error creating temp directory from template $template\: $errstr" - unless (($junk, $tmpdir) = _gettemp($template, - "open" => 0, - "mkdir"=> 1 , - "suffixlen" => $suffixlen, - "ErrStr" => \$errstr, - ) ); - - return $tmpdir; - -} - -=item B<mktemp> - -Returns a valid temporary filename but does not guarantee -that the file will not be opened by someone else. - - $unopened_file = mktemp($template); - -Template is the same as that required by mkstemp(). - -=cut - -sub mktemp { - - croak "Usage: mktemp(template)" - if scalar(@_) != 1; - - my $template = shift; - - my ($tmpname, $junk, $errstr); - croak "Error getting name to temp file from template $template: $errstr" - unless (($junk, $tmpname) = _gettemp($template, - "open" => 0, - "mkdir"=> 0 , - "suffixlen" => 0, - "ErrStr" => \$errstr, - ) ); - - return $tmpname; -} - -=back - -=head1 POSIX FUNCTIONS - -This section describes the re-implementation of the tmpnam() -and tmpfile() functions described in L<POSIX> -using the mkstemp() from this module. - -Unlike the L<POSIX|POSIX> implementations, the directory used -for the temporary file is not specified in a system include -file (C<P_tmpdir>) but simply depends on the choice of tmpdir() -returned by L<File::Spec|File::Spec>. On some implementations this -location can be set using the C<TMPDIR> environment variable, which -may not be secure. -If this is a problem, simply use mkstemp() and specify a template. - -=over 4 - -=item B<tmpnam> - -When called in scalar context, returns the full name (including path) -of a temporary file (uses mktemp()). The only check is that the file does -not already exist, but there is no guarantee that that condition will -continue to apply. - - $file = tmpnam(); - -When called in list context, a filehandle to the open file and -a filename are returned. This is achieved by calling mkstemp() -after constructing a suitable template. - - ($fh, $file) = tmpnam(); - -If possible, this form should be used to prevent possible -race conditions. - -See L<File::Spec/tmpdir> for information on the choice of temporary -directory for a particular operating system. - -=cut - -sub tmpnam { - - # Retrieve the temporary directory name - my $tmpdir = File::Spec->tmpdir; - - croak "Error temporary directory is not writable" - if $tmpdir eq ''; - - # Use a ten character template and append to tmpdir - my $template = File::Spec->catfile($tmpdir, TEMPXXX); - - if (wantarray() ) { - return mkstemp($template); - } else { - return mktemp($template); - } - -} - -=item B<tmpfile> - -In scalar context, returns the filehandle of a temporary file. - - $fh = tmpfile(); - -The file is removed when the filehandle is closed or when the program -exits. No access to the filename is provided. - -If the temporary file can not be created undef is returned. -Currently this command will probably not work when the temporary -directory is on an NFS file system. - -=cut - -sub tmpfile { - - # Simply call tmpnam() in a list context - my ($fh, $file) = tmpnam(); - - # Make sure file is removed when filehandle is closed - # This will fail on NFS - unlink0($fh, $file) - or return undef; - - return $fh; - -} - -=back - -=head1 ADDITIONAL FUNCTIONS - -These functions are provided for backwards compatibility -with common tempfile generation C library functions. - -They are not exported and must be addressed using the full package -name. - -=over 4 - -=item B<tempnam> - -Return the name of a temporary file in the specified directory -using a prefix. The file is guaranteed not to exist at the time -the function was called, but such guarantees are good for one -clock tick only. Always use the proper form of C<sysopen> -with C<O_CREAT | O_EXCL> if you must open such a filename. - - $filename = File::Temp::tempnam( $dir, $prefix ); - -Equivalent to running mktemp() with $dir/$prefixXXXXXXXX -(using unix file convention as an example) - -Because this function uses mktemp(), it can suffer from race conditions. - -=cut - -sub tempnam { - - croak 'Usage tempnam($dir, $prefix)' unless scalar(@_) == 2; - - my ($dir, $prefix) = @_; - - # Add a string to the prefix - $prefix .= 'XXXXXXXX'; - - # Concatenate the directory to the file - my $template = File::Spec->catfile($dir, $prefix); - - return mktemp($template); - -} - -=back - -=head1 UTILITY FUNCTIONS - -Useful functions for dealing with the filehandle and filename. - -=over 4 - -=item B<unlink0> - -Given an open filehandle and the associated filename, make a safe -unlink. This is achieved by first checking that the filename and -filehandle initially point to the same file and that the number of -links to the file is 1 (all fields returned by stat() are compared). -Then the filename is unlinked and the filehandle checked once again to -verify that the number of links on that file is now 0. This is the -closest you can come to making sure that the filename unlinked was the -same as the file whose descriptor you hold. - - unlink0($fh, $path) or die "Error unlinking file $path safely"; - -Returns false on error. The filehandle is not closed since on some -occasions this is not required. - -On some platforms, for example Windows NT, it is not possible to -unlink an open file (the file must be closed first). On those -platforms, the actual unlinking is deferred until the program ends and -good status is returned. A check is still performed to make sure that -the filehandle and filename are pointing to the same thing (but not at -the time the end block is executed since the deferred removal may not -have access to the filehandle). - -Additionally, on Windows NT not all the fields returned by stat() can -be compared. For example, the C<dev> and C<rdev> fields seem to be -different. Also, it seems that the size of the file returned by stat() -does not always agree, with C<stat(FH)> being more accurate than -C<stat(filename)>, presumably because of caching issues even when -using autoflush (this is usually overcome by waiting a while after -writing to the tempfile before attempting to C<unlink0> it). - -Finally, on NFS file systems the link count of the file handle does -not always go to zero immediately after unlinking. Currently, this -command is expected to fail on NFS disks. - -=cut - -sub unlink0 { - - croak 'Usage: unlink0(filehandle, filename)' - unless scalar(@_) == 2; - - # Read args - my ($fh, $path) = @_; - - warn "Unlinking $path using unlink0\n" - if $DEBUG; - - # Stat the filehandle - my @fh = stat $fh; - - if ($fh[3] > 1 && $^W) { - carp "unlink0: fstat found too many links; SB=@fh" if $^W; - } - - # Stat the path - my @path = stat $path; - - unless (@path) { - carp "unlink0: $path is gone already" if $^W; - return; - } - - # this is no longer a file, but may be a directory, or worse - unless (-f _) { - confess "panic: $path is no longer a file: SB=@fh"; - } - - # Do comparison of each member of the array - # On WinNT dev and rdev seem to be different - # depending on whether it is a file or a handle. - # Cannot simply compare all members of the stat return - # Select the ones we can use - my @okstat = (0..$#fh); # Use all by default - if ($^O eq 'MSWin32') { - @okstat = (1,2,3,4,5,7,8,9,10); - } elsif ($^O eq 'os2') { - @okstat = (0, 2..$#fh); - } elsif ($^O eq 'VMS') { # device and file ID are sufficient - @okstat = (0, 1); - } elsif ($^O eq 'dos') { - @okstat = (0,2..7,11..$#fh); - } - - # Now compare each entry explicitly by number - for (@okstat) { - print "Comparing: $_ : $fh[$_] and $path[$_]\n" if $DEBUG; - # Use eq rather than == since rdev, blksize, and blocks (6, 11, - # and 12) will be '' on platforms that do not support them. This - # is fine since we are only comparing integers. - unless ($fh[$_] eq $path[$_]) { - warn "Did not match $_ element of stat\n" if $DEBUG; - return 0; - } - } - - # attempt remove the file (does not work on some platforms) - if (_can_unlink_opened_file()) { - # XXX: do *not* call this on a directory; possible race - # resulting in recursive removal - croak "unlink0: $path has become a directory!" if -d $path; - unlink($path) or return 0; - - # Stat the filehandle - @fh = stat $fh; - - print "Link count = $fh[3] \n" if $DEBUG; - - # Make sure that the link count is zero - # - Cygwin provides deferred unlinking, however, - # on Win9x the link count remains 1 - # On NFS the link count may still be 1 but we cant know that - # we are on NFS - return ( $fh[3] == 0 or $^O eq 'cygwin' ? 1 : 0); - - } else { - _deferred_unlink($fh, $path, 0); - return 1; - } - -} - -=back - -=head1 PACKAGE VARIABLES - -These functions control the global state of the package. - -=over 4 - -=item B<safe_level> - -Controls the lengths to which the module will go to check the safety of the -temporary file or directory before proceeding. -Options are: - -=over 8 - -=item STANDARD - -Do the basic security measures to ensure the directory exists and -is writable, that the umask() is fixed before opening of the file, -that temporary files are opened only if they do not already exist, and -that possible race conditions are avoided. Finally the L<unlink0|"unlink0"> -function is used to remove files safely. - -=item MEDIUM - -In addition to the STANDARD security, the output directory is checked -to make sure that it is owned either by root or the user running the -program. If the directory is writable by group or by other, it is then -checked to make sure that the sticky bit is set. - -Will not work on platforms that do not support the C<-k> test -for sticky bit. - -=item HIGH - -In addition to the MEDIUM security checks, also check for the -possibility of ``chown() giveaway'' using the L<POSIX|POSIX> -sysconf() function. If this is a possibility, each directory in the -path is checked in turn for safeness, recursively walking back to the -root directory. - -For platforms that do not support the L<POSIX|POSIX> -C<_PC_CHOWN_RESTRICTED> symbol (for example, Windows NT) it is -assumed that ``chown() giveaway'' is possible and the recursive test -is performed. - -=back - -The level can be changed as follows: - - File::Temp->safe_level( File::Temp::HIGH ); - -The level constants are not exported by the module. - -Currently, you must be running at least perl v5.6.0 in order to -run with MEDIUM or HIGH security. This is simply because the -safety tests use functions from L<Fcntl|Fcntl> that are not -available in older versions of perl. The problem is that the version -number for Fcntl is the same in perl 5.6.0 and in 5.005_03 even though -they are different versions. - -On systems that do not support the HIGH or MEDIUM safety levels -(for example Win NT or OS/2) any attempt to change the level will -be ignored. The decision to ignore rather than raise an exception -allows portable programs to be written with high security in mind -for the systems that can support this without those programs failing -on systems where the extra tests are irrelevant. - -If you really need to see whether the change has been accepted -simply examine the return value of C<safe_level>. - - $newlevel = File::Temp->safe_level( File::Temp::HIGH ); - die "Could not change to high security" - if $newlevel != File::Temp::HIGH; - -=cut - -{ - # protect from using the variable itself - my $LEVEL = STANDARD; - sub safe_level { - my $self = shift; - if (@_) { - my $level = shift; - if (($level != STANDARD) && ($level != MEDIUM) && ($level != HIGH)) { - carp "safe_level: Specified level ($level) not STANDARD, MEDIUM or HIGH - ignoring\n" if $^W; - } else { - # Dont allow this on perl 5.005 or earlier - if ($] < 5.006 && $level != STANDARD) { - # Cant do MEDIUM or HIGH checks - croak "Currently requires perl 5.006 or newer to do the safe checks"; - } - # Check that we are allowed to change level - # Silently ignore if we can not. - $LEVEL = $level if _can_do_level($level); - } - } - return $LEVEL; - } -} - -=item TopSystemUID - -This is the highest UID on the current system that refers to a root -UID. This is used to make sure that the temporary directory is -owned by a system UID (C<root>, C<bin>, C<sys> etc) rather than -simply by root. - -This is required since on many unix systems C</tmp> is not owned -by root. - -Default is to assume that any UID less than or equal to 10 is a root -UID. - - File::Temp->top_system_uid(10); - my $topid = File::Temp->top_system_uid; - -This value can be adjusted to reduce security checking if required. -The value is only relevant when C<safe_level> is set to MEDIUM or higher. - -=back - -=cut - -{ - my $TopSystemUID = 10; - sub top_system_uid { - my $self = shift; - if (@_) { - my $newuid = shift; - croak "top_system_uid: UIDs should be numeric" - unless $newuid =~ /^\d+$/s; - $TopSystemUID = $newuid; - } - return $TopSystemUID; - } -} - -=head1 WARNING - -For maximum security, endeavour always to avoid ever looking at, -touching, or even imputing the existence of the filename. You do not -know that that filename is connected to the same file as the handle -you have, and attempts to check this can only trigger more race -conditions. It's far more secure to use the filehandle alone and -dispense with the filename altogether. - -If you need to pass the handle to something that expects a filename -then, on a unix system, use C<"/dev/fd/" . fileno($fh)> for arbitrary -programs, or more generally C<< "+<=&" . fileno($fh) >> for Perl -programs. You will have to clear the close-on-exec bit on that file -descriptor before passing it to another process. - - use Fcntl qw/F_SETFD F_GETFD/; - fcntl($tmpfh, F_SETFD, 0) - or die "Can't clear close-on-exec flag on temp fh: $!\n"; - -=head2 Temporary files and NFS - -Some problems are associated with using temporary files that reside -on NFS file systems and it is recommended that a local filesystem -is used whenever possible. Some of the security tests will most probably -fail when the temp file is not local. Additionally, be aware that -the performance of I/O operations over NFS will not be as good as for -a local disk. - -=head1 HISTORY - -Originally began life in May 1999 as an XS interface to the system -mkstemp() function. In March 2000, the OpenBSD mkstemp() code was -translated to Perl for total control of the code's -security checking, to ensure the presence of the function regardless of -operating system and to help with portability. - -=head1 SEE ALSO - -L<POSIX/tmpnam>, L<POSIX/tmpfile>, L<File::Spec>, L<File::Path> - -See L<IO::File> and L<File::MkTemp> for different implementations of -temporary file handling. - -=head1 AUTHOR - -Tim Jenness E<lt>t.jenness@jach.hawaii.eduE<gt> - -Copyright (C) 1999-2001 Tim Jenness and the UK Particle Physics and -Astronomy Research Council. All Rights Reserved. This program is free -software; you can redistribute it and/or modify it under the same -terms as Perl itself. - -Original Perl implementation loosely based on the OpenBSD C code for -mkstemp(). Thanks to Tom Christiansen for suggesting that this module -should be written and providing ideas for code improvements and -security enhancements. - -=cut - - -1; diff --git a/lib/Temp/File-Temp-0.12/blib/arch/auto/File/Temp/.exists b/lib/Temp/File-Temp-0.12/blib/arch/auto/File/Temp/.exists deleted file mode 100644 index e69de29..0000000 --- a/lib/Temp/File-Temp-0.12/blib/arch/auto/File/Temp/.exists +++ /dev/null diff --git a/lib/Temp/File-Temp-0.12/blib/lib/auto/File/Temp/.exists b/lib/Temp/File-Temp-0.12/blib/lib/auto/File/Temp/.exists deleted file mode 100644 index e69de29..0000000 --- a/lib/Temp/File-Temp-0.12/blib/lib/auto/File/Temp/.exists +++ /dev/null diff --git a/lib/Temp/File-Temp-0.12/blib/man3/.exists b/lib/Temp/File-Temp-0.12/blib/man3/.exists deleted file mode 100644 index e69de29..0000000 --- a/lib/Temp/File-Temp-0.12/blib/man3/.exists +++ /dev/null diff --git a/lib/Temp/File-Temp-0.12/blib/man3/File::Temp.3pm b/lib/Temp/File-Temp-0.12/blib/man3/File::Temp.3pm deleted file mode 100644 index 1b7e1f4..0000000 --- a/lib/Temp/File-Temp-0.12/blib/man3/File::Temp.3pm +++ /dev/null @@ -1,681 +0,0 @@ -.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.14 -.\" -.\" Standard preamble: -.\" ======================================================================== -.de Sh \" Subsection heading -.br -.if t .Sp -.ne 5 -.PP -\fB\\$1\fR -.PP -.. -.de Sp \" Vertical space (when we can't use .PP) -.if t .sp .5v -.if n .sp -.. -.de Vb \" Begin verbatim text -.ft CW -.nf -.ne \\$1 -.. -.de Ve \" End verbatim text -.ft R -.fi -.. -.\" Set up some character translations and predefined strings. \*(-- will -.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left -.\" double quote, and \*(R" will give a right double quote. | will give a -.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to -.\" do unbreakable dashes and therefore won't be available. \*(C` and \*(C' -.\" expand to `' in nroff, nothing in troff, for use with C<>. -.tr \(*W-|\(bv\*(Tr -.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' -.ie n \{\ -. ds -- \(*W- -. ds PI pi -. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch -. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch -. ds L" "" -. ds R" "" -. ds C` "" -. ds C' "" -'br\} -.el\{\ -. ds -- \|\(em\| -. ds PI \(*p -. ds L" `` -. ds R" '' -'br\} -.\" -.\" If the F register is turned on, we'll generate index entries on stderr for -.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index -.\" entries marked with X<> in POD. Of course, you'll have to process the -.\" output yourself in some meaningful fashion. -.if \nF \{\ -. de IX -. tm Index:\\$1\t\\n%\t"\\$2" -.. -. nr % 0 -. rr F -.\} -.\" -.\" For nroff, turn off justification. Always turn off hyphenation; it makes -.\" way too many mistakes in technical documents. -.hy 0 -.if n .na -.\" -.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). -.\" Fear. Run. Save yourself. No user-serviceable parts. -. \" fudge factors for nroff and troff -.if n \{\ -. ds #H 0 -. ds #V .8m -. ds #F .3m -. ds #[ \f1 -. ds #] \fP -.\} -.if t \{\ -. ds #H ((1u-(\\\\n(.fu%2u))*.13m) -. ds #V .6m -. ds #F 0 -. ds #[ \& -. ds #] \& -.\} -. \" simple accents for nroff and troff -.if n \{\ -. ds ' \& -. ds ` \& -. ds ^ \& -. ds , \& -. ds ~ ~ -. ds / -.\} -.if t \{\ -. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" -. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' -. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' -. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' -. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' -. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' -.\} -. \" troff and (daisy-wheel) nroff accents -.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' -.ds 8 \h'\*(#H'\(*b\h'-\*(#H' -.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] -.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' -.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' -.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] -.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] -.ds ae a\h'-(\w'a'u*4/10)'e -.ds Ae A\h'-(\w'A'u*4/10)'E -. \" corrections for vroff -.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' -.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' -. \" for low resolution devices (crt and lpr) -.if \n(.H>23 .if \n(.V>19 \ -\{\ -. ds : e -. ds 8 ss -. ds o a -. ds d- d\h'-1'\(ga -. ds D- D\h'-1'\(hy -. ds th \o'bp' -. ds Th \o'LP' -. ds ae ae -. ds Ae AE -.\} -.rm #[ #] #H #V #F C -.\" ======================================================================== -.\" -.IX Title "Temp 3" -.TH Temp 3 "2001-02-23" "perl v5.8.5" "User Contributed Perl Documentation" -.SH "NAME" -File::Temp \- return name and handle of a temporary file safely -.SH "SYNOPSIS" -.IX Header "SYNOPSIS" -.Vb 1 -\& use File::Temp qw/ tempfile tempdir /; -.Ve -.PP -.Vb 2 -\& $dir = tempdir( CLEANUP => 1 ); -\& ($fh, $filename) = tempfile( DIR => $dir ); -.Ve -.PP -.Vb 2 -\& ($fh, $filename) = tempfile( $template, DIR => $dir); -\& ($fh, $filename) = tempfile( $template, SUFFIX => '.dat'); -.Ve -.PP -.Vb 1 -\& $fh = tempfile(); -.Ve -.PP -MkTemp family: -.PP -.Vb 1 -\& use File::Temp qw/ :mktemp /; -.Ve -.PP -.Vb 2 -\& ($fh, $file) = mkstemp( "tmpfileXXXXX" ); -\& ($fh, $file) = mkstemps( "tmpfileXXXXXX", $suffix); -.Ve -.PP -.Vb 1 -\& $tmpdir = mkdtemp( $template ); -.Ve -.PP -.Vb 1 -\& $unopened_file = mktemp( $template ); -.Ve -.PP -\&\s-1POSIX\s0 functions: -.PP -.Vb 1 -\& use File::Temp qw/ :POSIX /; -.Ve -.PP -.Vb 2 -\& $file = tmpnam(); -\& $fh = tmpfile(); -.Ve -.PP -.Vb 2 -\& ($fh, $file) = tmpnam(); -\& ($fh, $file) = tmpfile(); -.Ve -.PP -Compatibility functions: -.PP -.Vb 1 -\& $unopened_file = File::Temp::tempnam( $dir, $pfx ); -.Ve -.SH "DESCRIPTION" -.IX Header "DESCRIPTION" -\&\f(CW\*(C`File::Temp\*(C'\fR can be used to create and open temporary files in a safe way. -The \fItempfile()\fR function can be used to return the name and the open -filehandle of a temporary file. The \fItempdir()\fR function can -be used to create a temporary directory. -.PP -The security aspect of temporary file creation is emphasized such that -a filehandle and filename are returned together. This helps guarantee -that a race condition can not occur where the temporary file is -created by another process between checking for the existence of the -file and its opening. Additional security levels are provided to -check, for example, that the sticky bit is set on world writable -directories. See \*(L"safe_level\*(R" for more information. -.PP -For compatibility with popular C library functions, Perl implementations of -the \fImkstemp()\fR family of functions are provided. These are, \fImkstemp()\fR, -\&\fImkstemps()\fR, \fImkdtemp()\fR and \fImktemp()\fR. -.PP -Additionally, implementations of the standard \s-1POSIX\s0 -\&\fItmpnam()\fR and \fItmpfile()\fR functions are provided if required. -.PP -Implementations of \fImktemp()\fR, \fItmpnam()\fR, and \fItempnam()\fR are provided, -but should be used with caution since they return only a filename -that was valid when function was called, so cannot guarantee -that the file will not exist by the time the caller opens the filename. -.SH "FUNCTIONS" -.IX Header "FUNCTIONS" -This section describes the recommended interface for generating -temporary files and directories. -.IP "\fBtempfile\fR" 4 -.IX Item "tempfile" -This is the basic function to generate temporary files. -The behaviour of the file can be changed using various options: -.Sp -.Vb 1 -\& ($fh, $filename) = tempfile(); -.Ve -.Sp -Create a temporary file in the directory specified for temporary -files, as specified by the \fItmpdir()\fR function in File::Spec. -.Sp -.Vb 1 -\& ($fh, $filename) = tempfile($template); -.Ve -.Sp -Create a temporary file in the current directory using the supplied -template. Trailing `X' characters are replaced with random letters to -generate the filename. At least four `X' characters must be present -in the template. -.Sp -.Vb 1 -\& ($fh, $filename) = tempfile($template, SUFFIX => $suffix) -.Ve -.Sp -Same as previously, except that a suffix is added to the template -after the `X' translation. Useful for ensuring that a temporary -filename has a particular extension when needed by other applications. -But see the \s-1WARNING\s0 at the end. -.Sp -.Vb 1 -\& ($fh, $filename) = tempfile($template, DIR => $dir); -.Ve -.Sp -Translates the template as before except that a directory name -is specified. -.Sp -.Vb 1 -\& ($fh, $filename) = tempfile($template, UNLINK => 1); -.Ve -.Sp -Return the filename and filehandle as before except that the file is -automatically removed when the program exits. Default is for the file -to be removed if a file handle is requested and to be kept if the -filename is requested. In a scalar context (where no filename is -returned) the file is always deleted either on exit or when it is closed. -.Sp -If the template is not specified, a template is always -automatically generated. This temporary file is placed in \fItmpdir()\fR -(File::Spec) unless a directory is specified explicitly with the -\&\s-1DIR\s0 option. -.Sp -.Vb 1 -\& $fh = tempfile( $template, DIR => $dir ); -.Ve -.Sp -If called in scalar context, only the filehandle is returned -and the file will automatically be deleted when closed (see -the description of \fItmpfile()\fR elsewhere in this document). -This is the preferred mode of operation, as if you only -have a filehandle, you can never create a race condition -by fumbling with the filename. On systems that can not unlink -an open file or can not mark a file as temporary when it is opened -(for example, Windows \s-1NT\s0 uses the \f(CW\*(C`O_TEMPORARY\*(C'\fR flag)) -the file is marked for deletion when the program ends (equivalent -to setting \s-1UNLINK\s0 to 1). The \f(CW\*(C`UNLINK\*(C'\fR flag is ignored if present. -.Sp -.Vb 1 -\& (undef, $filename) = tempfile($template, OPEN => 0); -.Ve -.Sp -This will return the filename based on the template but -will not open this file. Cannot be used in conjunction with -\&\s-1UNLINK\s0 set to true. Default is to always open the file -to protect from possible race conditions. A warning is issued -if warnings are turned on. Consider using the \fItmpnam()\fR -and \fImktemp()\fR functions described elsewhere in this document -if opening the file is not required. -.Sp -Options can be combined as required. -.IP "\fBtempdir\fR" 4 -.IX Item "tempdir" -This is the recommended interface for creation of temporary directories. -The behaviour of the function depends on the arguments: -.Sp -.Vb 1 -\& $tempdir = tempdir(); -.Ve -.Sp -Create a directory in \fItmpdir()\fR (see File::Spec). -.Sp -.Vb 1 -\& $tempdir = tempdir( $template ); -.Ve -.Sp -Create a directory from the supplied template. This template is -similar to that described for \fItempfile()\fR. `X' characters at the end -of the template are replaced with random letters to construct the -directory name. At least four `X' characters must be in the template. -.Sp -.Vb 1 -\& $tempdir = tempdir ( DIR => $dir ); -.Ve -.Sp -Specifies the directory to use for the temporary directory. -The temporary directory name is derived from an internal template. -.Sp -.Vb 1 -\& $tempdir = tempdir ( $template, DIR => $dir ); -.Ve -.Sp -Prepend the supplied directory name to the template. The template -should not include parent directory specifications itself. Any parent -directory specifications are removed from the template before -prepending the supplied directory. -.Sp -.Vb 1 -\& $tempdir = tempdir ( $template, TMPDIR => 1 ); -.Ve -.Sp -Using the supplied template, creat the temporary directory in -a standard location for temporary files. Equivalent to doing -.Sp -.Vb 1 -\& $tempdir = tempdir ( $template, DIR => File::Spec->tmpdir); -.Ve -.Sp -but shorter. Parent directory specifications are stripped from the -template itself. The \f(CW\*(C`TMPDIR\*(C'\fR option is ignored if \f(CW\*(C`DIR\*(C'\fR is set -explicitly. Additionally, \f(CW\*(C`TMPDIR\*(C'\fR is implied if neither a template -nor a directory are supplied. -.Sp -.Vb 1 -\& $tempdir = tempdir( $template, CLEANUP => 1); -.Ve -.Sp -Create a temporary directory using the supplied template, but -attempt to remove it (and all files inside it) when the program -exits. Note that an attempt will be made to remove all files from -the directory even if they were not created by this module (otherwise -why ask to clean it up?). The directory removal is made with -the \fIrmtree()\fR function from the File::Path module. -Of course, if the template is not specified, the temporary directory -will be created in \fItmpdir()\fR and will also be removed at program exit. -.SH "MKTEMP FUNCTIONS" -.IX Header "MKTEMP FUNCTIONS" -The following functions are Perl implementations of the -\&\fImktemp()\fR family of temp file generation system calls. -.IP "\fBmkstemp\fR" 4 -.IX Item "mkstemp" -Given a template, returns a filehandle to the temporary file and the name -of the file. -.Sp -.Vb 1 -\& ($fh, $name) = mkstemp( $template ); -.Ve -.Sp -In scalar context, just the filehandle is returned. -.Sp -The template may be any filename with some number of X's appended -to it, for example \fI/tmp/temp.XXXX\fR. The trailing X's are replaced -with unique alphanumeric combinations. -.IP "\fBmkstemps\fR" 4 -.IX Item "mkstemps" -Similar to \fImkstemp()\fR, except that an extra argument can be supplied -with a suffix to be appended to the template. -.Sp -.Vb 1 -\& ($fh, $name) = mkstemps( $template, $suffix ); -.Ve -.Sp -For example a template of \f(CW\*(C`testXXXXXX\*(C'\fR and suffix of \f(CW\*(C`.dat\*(C'\fR -would generate a file similar to \fItesthGji_w.dat\fR. -.Sp -Returns just the filehandle alone when called in scalar context. -.IP "\fBmkdtemp\fR" 4 -.IX Item "mkdtemp" -Create a directory from a template. The template must end in -X's that are replaced by the routine. -.Sp -.Vb 1 -\& $tmpdir_name = mkdtemp($template); -.Ve -.Sp -Returns the name of the temporary directory created. -Returns undef on failure. -.Sp -Directory must be removed by the caller. -.IP "\fBmktemp\fR" 4 -.IX Item "mktemp" -Returns a valid temporary filename but does not guarantee -that the file will not be opened by someone else. -.Sp -.Vb 1 -\& $unopened_file = mktemp($template); -.Ve -.Sp -Template is the same as that required by \fImkstemp()\fR. -.SH "POSIX FUNCTIONS" -.IX Header "POSIX FUNCTIONS" -This section describes the re-implementation of the \fItmpnam()\fR -and \fItmpfile()\fR functions described in \s-1POSIX\s0 -using the \fImkstemp()\fR from this module. -.PP -Unlike the \s-1POSIX\s0 implementations, the directory used -for the temporary file is not specified in a system include -file (\f(CW\*(C`P_tmpdir\*(C'\fR) but simply depends on the choice of \fItmpdir()\fR -returned by File::Spec. On some implementations this -location can be set using the \f(CW\*(C`TMPDIR\*(C'\fR environment variable, which -may not be secure. -If this is a problem, simply use \fImkstemp()\fR and specify a template. -.IP "\fBtmpnam\fR" 4 -.IX Item "tmpnam" -When called in scalar context, returns the full name (including path) -of a temporary file (uses \fImktemp()\fR). The only check is that the file does -not already exist, but there is no guarantee that that condition will -continue to apply. -.Sp -.Vb 1 -\& $file = tmpnam(); -.Ve -.Sp -When called in list context, a filehandle to the open file and -a filename are returned. This is achieved by calling \fImkstemp()\fR -after constructing a suitable template. -.Sp -.Vb 1 -\& ($fh, $file) = tmpnam(); -.Ve -.Sp -If possible, this form should be used to prevent possible -race conditions. -.Sp -See \*(L"tmpdir\*(R" in File::Spec for information on the choice of temporary -directory for a particular operating system. -.IP "\fBtmpfile\fR" 4 -.IX Item "tmpfile" -In scalar context, returns the filehandle of a temporary file. -.Sp -.Vb 1 -\& $fh = tmpfile(); -.Ve -.Sp -The file is removed when the filehandle is closed or when the program -exits. No access to the filename is provided. -.Sp -If the temporary file can not be created undef is returned. -Currently this command will probably not work when the temporary -directory is on an \s-1NFS\s0 file system. -.SH "ADDITIONAL FUNCTIONS" -.IX Header "ADDITIONAL FUNCTIONS" -These functions are provided for backwards compatibility -with common tempfile generation C library functions. -.PP -They are not exported and must be addressed using the full package -name. -.IP "\fBtempnam\fR" 4 -.IX Item "tempnam" -Return the name of a temporary file in the specified directory -using a prefix. The file is guaranteed not to exist at the time -the function was called, but such guarantees are good for one -clock tick only. Always use the proper form of \f(CW\*(C`sysopen\*(C'\fR -with \f(CW\*(C`O_CREAT | O_EXCL\*(C'\fR if you must open such a filename. -.Sp -.Vb 1 -\& $filename = File::Temp::tempnam( $dir, $prefix ); -.Ve -.Sp -Equivalent to running \fImktemp()\fR with \f(CW$dir\fR/$prefixXXXXXXXX -(using unix file convention as an example) -.Sp -Because this function uses \fImktemp()\fR, it can suffer from race conditions. -.SH "UTILITY FUNCTIONS" -.IX Header "UTILITY FUNCTIONS" -Useful functions for dealing with the filehandle and filename. -.IP "\fBunlink0\fR" 4 -.IX Item "unlink0" -Given an open filehandle and the associated filename, make a safe -unlink. This is achieved by first checking that the filename and -filehandle initially point to the same file and that the number of -links to the file is 1 (all fields returned by \fIstat()\fR are compared). -Then the filename is unlinked and the filehandle checked once again to -verify that the number of links on that file is now 0. This is the -closest you can come to making sure that the filename unlinked was the -same as the file whose descriptor you hold. -.Sp -.Vb 1 -\& unlink0($fh, $path) or die "Error unlinking file $path safely"; -.Ve -.Sp -Returns false on error. The filehandle is not closed since on some -occasions this is not required. -.Sp -On some platforms, for example Windows \s-1NT\s0, it is not possible to -unlink an open file (the file must be closed first). On those -platforms, the actual unlinking is deferred until the program ends and -good status is returned. A check is still performed to make sure that -the filehandle and filename are pointing to the same thing (but not at -the time the end block is executed since the deferred removal may not -have access to the filehandle). -.Sp -Additionally, on Windows \s-1NT\s0 not all the fields returned by \fIstat()\fR can -be compared. For example, the \f(CW\*(C`dev\*(C'\fR and \f(CW\*(C`rdev\*(C'\fR fields seem to be -different. Also, it seems that the size of the file returned by \fIstat()\fR -does not always agree, with \f(CW\*(C`stat(FH)\*(C'\fR being more accurate than -\&\f(CW\*(C`stat(filename)\*(C'\fR, presumably because of caching issues even when -using autoflush (this is usually overcome by waiting a while after -writing to the tempfile before attempting to \f(CW\*(C`unlink0\*(C'\fR it). -.Sp -Finally, on \s-1NFS\s0 file systems the link count of the file handle does -not always go to zero immediately after unlinking. Currently, this -command is expected to fail on \s-1NFS\s0 disks. -.SH "PACKAGE VARIABLES" -.IX Header "PACKAGE VARIABLES" -These functions control the global state of the package. -.IP "\fBsafe_level\fR" 4 -.IX Item "safe_level" -Controls the lengths to which the module will go to check the safety of the -temporary file or directory before proceeding. -Options are: -.RS 4 -.IP "\s-1STANDARD\s0" 8 -.IX Item "STANDARD" -Do the basic security measures to ensure the directory exists and -is writable, that the \fIumask()\fR is fixed before opening of the file, -that temporary files are opened only if they do not already exist, and -that possible race conditions are avoided. Finally the unlink0 -function is used to remove files safely. -.IP "\s-1MEDIUM\s0" 8 -.IX Item "MEDIUM" -In addition to the \s-1STANDARD\s0 security, the output directory is checked -to make sure that it is owned either by root or the user running the -program. If the directory is writable by group or by other, it is then -checked to make sure that the sticky bit is set. -.Sp -Will not work on platforms that do not support the \f(CW\*(C`\-k\*(C'\fR test -for sticky bit. -.IP "\s-1HIGH\s0" 8 -.IX Item "HIGH" -In addition to the \s-1MEDIUM\s0 security checks, also check for the -possibility of ``\fIchown()\fR giveaway'' using the \s-1POSIX\s0 -\&\fIsysconf()\fR function. If this is a possibility, each directory in the -path is checked in turn for safeness, recursively walking back to the -root directory. -.Sp -For platforms that do not support the \s-1POSIX\s0 -\&\f(CW\*(C`_PC_CHOWN_RESTRICTED\*(C'\fR symbol (for example, Windows \s-1NT\s0) it is -assumed that ``\fIchown()\fR giveaway'' is possible and the recursive test -is performed. -.RE -.RS 4 -.Sp -The level can be changed as follows: -.Sp -.Vb 1 -\& File::Temp->safe_level( File::Temp::HIGH ); -.Ve -.Sp -The level constants are not exported by the module. -.Sp -Currently, you must be running at least perl v5.6.0 in order to -run with \s-1MEDIUM\s0 or \s-1HIGH\s0 security. This is simply because the -safety tests use functions from Fcntl that are not -available in older versions of perl. The problem is that the version -number for Fcntl is the same in perl 5.6.0 and in 5.005_03 even though -they are different versions. -.Sp -On systems that do not support the \s-1HIGH\s0 or \s-1MEDIUM\s0 safety levels -(for example Win \s-1NT\s0 or \s-1OS/2\s0) any attempt to change the level will -be ignored. The decision to ignore rather than raise an exception -allows portable programs to be written with high security in mind -for the systems that can support this without those programs failing -on systems where the extra tests are irrelevant. -.Sp -If you really need to see whether the change has been accepted -simply examine the return value of \f(CW\*(C`safe_level\*(C'\fR. -.Sp -.Vb 3 -\& $newlevel = File::Temp->safe_level( File::Temp::HIGH ); -\& die "Could not change to high security" -\& if $newlevel != File::Temp::HIGH; -.Ve -.RE -.IP "TopSystemUID" 4 -.IX Item "TopSystemUID" -This is the highest \s-1UID\s0 on the current system that refers to a root -\&\s-1UID\s0. This is used to make sure that the temporary directory is -owned by a system \s-1UID\s0 (\f(CW\*(C`root\*(C'\fR, \f(CW\*(C`bin\*(C'\fR, \f(CW\*(C`sys\*(C'\fR etc) rather than -simply by root. -.Sp -This is required since on many unix systems \f(CW\*(C`/tmp\*(C'\fR is not owned -by root. -.Sp -Default is to assume that any \s-1UID\s0 less than or equal to 10 is a root -\&\s-1UID\s0. -.Sp -.Vb 2 -\& File::Temp->top_system_uid(10); -\& my $topid = File::Temp->top_system_uid; -.Ve -.Sp -This value can be adjusted to reduce security checking if required. -The value is only relevant when \f(CW\*(C`safe_level\*(C'\fR is set to \s-1MEDIUM\s0 or higher. -.SH "WARNING" -.IX Header "WARNING" -For maximum security, endeavour always to avoid ever looking at, -touching, or even imputing the existence of the filename. You do not -know that that filename is connected to the same file as the handle -you have, and attempts to check this can only trigger more race -conditions. It's far more secure to use the filehandle alone and -dispense with the filename altogether. -.PP -If you need to pass the handle to something that expects a filename -then, on a unix system, use \f(CW\*(C`"/dev/fd/" . fileno($fh)\*(C'\fR for arbitrary -programs, or more generally \f(CW\*(C`"+<=&" . fileno($fh)\*(C'\fR for Perl -programs. You will have to clear the close-on-exec bit on that file -descriptor before passing it to another process. -.PP -.Vb 3 -\& use Fcntl qw/F_SETFD F_GETFD/; -\& fcntl($tmpfh, F_SETFD, 0) -\& or die "Can't clear close-on-exec flag on temp fh: $!\en"; -.Ve -.Sh "Temporary files and \s-1NFS\s0" -.IX Subsection "Temporary files and NFS" -Some problems are associated with using temporary files that reside -on \s-1NFS\s0 file systems and it is recommended that a local filesystem -is used whenever possible. Some of the security tests will most probably -fail when the temp file is not local. Additionally, be aware that -the performance of I/O operations over \s-1NFS\s0 will not be as good as for -a local disk. -.SH "HISTORY" -.IX Header "HISTORY" -Originally began life in May 1999 as an \s-1XS\s0 interface to the system -\&\fImkstemp()\fR function. In March 2000, the OpenBSD \fImkstemp()\fR code was -translated to Perl for total control of the code's -security checking, to ensure the presence of the function regardless of -operating system and to help with portability. -.SH "SEE ALSO" -.IX Header "SEE ALSO" -\&\*(L"tmpnam\*(R" in \s-1POSIX\s0, \*(L"tmpfile\*(R" in \s-1POSIX\s0, File::Spec, File::Path -.PP -See IO::File and File::MkTemp for different implementations of -temporary file handling. -.SH "AUTHOR" -.IX Header "AUTHOR" -Tim Jenness <t.jenness@jach.hawaii.edu> -.PP -Copyright (C) 1999\-2001 Tim Jenness and the \s-1UK\s0 Particle Physics and -Astronomy Research Council. All Rights Reserved. This program is free -software; you can redistribute it and/or modify it under the same -terms as Perl itself. -.PP -Original Perl implementation loosely based on the OpenBSD C code for -\&\fImkstemp()\fR. Thanks to Tom Christiansen for suggesting that this module -should be written and providing ideas for code improvements and -security enhancements. diff --git a/lib/Temp/File-Temp-0.12/misc/benchmark.pl b/lib/Temp/File-Temp-0.12/misc/benchmark.pl deleted file mode 100755 index bdea837..0000000 --- a/lib/Temp/File-Temp-0.12/misc/benchmark.pl +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/local/bin/perl -w - -# Simple benchmark of temporary file creation (no filename just a handle) -# Uses the following: -# - temporary file creation created by IO::File -# - temporary file creation using File::Temp (uses security checking) -# - A roll-our-own wrapper on top of POSIX::tempnam (essentially -# a compact form of File::Temp without all the extras) taken from -# the Perl cookbook - -# Would not - -use strict; -use Benchmark; -use IO::File; -use POSIX qw/ tmpnam /; -use File::Temp qw/ tempfile /; -use Symbol; - -# Benchmark IO::File and File::Temp - -timethese(10000, { - 'IO::File' => sub { - my $fh = IO::File::new_tmpfile || die $ !; - }, - 'File::Temp::tempfile' => sub { - my $fh = tempfile() || die $ !; - }, - 'POSIX::tmpnam' => sub { - my $fh = gensym;; - my $name; - for (;;) { - $name = tmpnam(); - sysopen( $fh, $name, O_RDWR | O_CREAT | O_EXCL ) - && last; - } - unlink $name; - } - } - ); - - diff --git a/lib/Temp/File-Temp-0.12/misc/results.txt b/lib/Temp/File-Temp-0.12/misc/results.txt deleted file mode 100644 index b73196a..0000000 --- a/lib/Temp/File-Temp-0.12/misc/results.txt +++ /dev/null @@ -1,33 +0,0 @@ -This file contains the results of the File::Temp benchmark script -by File::Temp version, perl version and OS. - -On Windows NT, currently have problems with this benchmark since it -runs into a file limit after a while (this is because unlinking of the -open file is deferred until the end of the program rather than closing -it and unlinking it explcitly round the loop). - -Times are in CPU seconds. - -VERSION PERL OS File::Temp/s IO::File/s POSIX::tmpnam - -0.07 5.6.0 linux(1) 22.4 1.7 2.1 - 5.005_03 linux(1) 33.6 1.6 2.1 - -0.08 5.6.0 linux(1) 8.1 1.7 2.1 - 5.005_03 linux(1) 8.4 1.6 2.1 - - 5.6.0 solaris(2) 32.3 237.0 229.5 - - 5.005_03 dig.unix(3) 153.2 44.9 51.5 - - - - -1. A 600 MHz pentium III running RedHat 6.1 - -2. A Sparc Ultra 1 running Solaris 2.6. /tmp local, /var/tmp on NFS - (/var/tmp is the default temp location on Solaris and is used by - POSIX::tmpnam whereas /tmp is used by File::Temp since that is the - location specified by File::Spec) - -3. DEC 3000 Alpha running digital unix 4.0. diff --git a/lib/Temp/File-Temp-0.12/pm_to_blib b/lib/Temp/File-Temp-0.12/pm_to_blib deleted file mode 100644 index e69de29..0000000 --- a/lib/Temp/File-Temp-0.12/pm_to_blib +++ /dev/null diff --git a/lib/Temp/File-Temp-0.12/t/mktemp.t b/lib/Temp/File-Temp-0.12/t/mktemp.t deleted file mode 100755 index 2014e30..0000000 --- a/lib/Temp/File-Temp-0.12/t/mktemp.t +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/local/bin/perl -w - -# Test for mktemp family of commands in File::Temp -# Use STANDARD safe level for these tests - -use strict; -use Test; -BEGIN { plan tests => 9 } - -use File::Spec; -use File::Path; -use File::Temp qw/ :mktemp unlink0 /; -use FileHandle; - -ok(1); - -# MKSTEMP - test - -# Create file in temp directory -my $template = File::Spec->catfile(File::Spec->tmpdir, 'wowserXXXX'); - -(my $fh, $template) = mkstemp($template); - -print "# MKSTEMP: FH is $fh File is $template fileno=".fileno($fh)."\n"; -# Check if the file exists -ok( (-e $template) ); - -# Autoflush -$fh->autoflush(1) if $] >= 5.006; - -# Try printing something to the file -my $string = "woohoo\n"; -print $fh $string; - -# rewind the file -ok(seek( $fh, 0, 0)); - -# Read from the file -my $line = <$fh>; - -# compare with previous string -ok($string, $line); - -# Tidy up -# This test fails on Windows NT since it seems that the size returned by -# stat(filehandle) does not always equal the size of the stat(filename) -# This must be due to caching. In particular this test writes 7 bytes -# to the file which are not recognised by stat(filename) -# Simply waiting 3 seconds seems to be enough for the system to update - -if ($^O eq 'MSWin32') { - sleep 3; -} -my $status = unlink0($fh, $template); -if ($status) { - ok( $status ); -} else { - skip("Skip test failed probably due to \$TMPDIR being on NFS",1); -} - -# MKSTEMPS -# File with suffix. This is created in the current directory so -# may be problematic on NFS - -$template = "suffixXXXXXX"; -my $suffix = ".dat"; - -($fh, my $fname) = mkstemps($template, $suffix); - -print "# MKSTEMPS: File is $template -> $fname fileno=".fileno($fh)."\n"; -# Check if the file exists -ok( (-e $fname) ); - -# This fails if you are running on NFS -# If this test fails simply skip it rather than doing a hard failure -$status = unlink0($fh, $fname); - -if ($status) { - ok($status); -} else { - skip("Skip test failed probably due to cwd being on NFS",1) -} - -# MKDTEMP -# Temp directory - -$template = File::Spec->catdir(File::Spec->tmpdir, 'tmpdirXXXXXX'); - -my $tmpdir = mkdtemp($template); - -print "# MKDTEMP: Name is $tmpdir from template $template\n"; - -ok( (-d $tmpdir ) ); - -# Need to tidy up after myself -rmtree($tmpdir); - -# MKTEMP -# Just a filename, not opened - -$template = File::Spec->catfile(File::Spec->tmpdir, 'mytestXXXXXX'); - -my $tmpfile = mktemp($template); - -print "# MKTEMP: Tempfile is $template -> $tmpfile\n"; - -# Okay if template no longer has XXXXX in - - -ok( ($tmpfile !~ /XXXXX$/) ); diff --git a/lib/Temp/File-Temp-0.12/t/posix.t b/lib/Temp/File-Temp-0.12/t/posix.t deleted file mode 100755 index b63fb29..0000000 --- a/lib/Temp/File-Temp-0.12/t/posix.t +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/local/bin/perl -w -# Test for File::Temp - POSIX functions - -use strict; -use Test; -BEGIN { plan tests => 7} - -use File::Temp qw/ :POSIX unlink0 /; -use FileHandle; -ok(1); - -# TMPNAM - scalar - -print "# TMPNAM: in a scalar context: \n"; -my $tmpnam = tmpnam(); - -# simply check that the file does not exist -# Not a 100% water tight test though if another program -# has managed to create one in the meantime. -ok( !(-e $tmpnam )); - -print "# TMPNAM file name: $tmpnam\n"; - -# TMPNAM list context -# Not strict posix behaviour -(my $fh, $tmpnam) = tmpnam(); - -print "# TMPNAM: in list context: $fh $tmpnam\n"; - -# File is opened - make sure it exists -ok( (-e $tmpnam )); - -# Unlink it - a possible NFS issue again if TMPDIR is not a local disk -my $status = unlink0($fh, $tmpnam); -if ($status) { - ok( $status ); -} else { - skip("Skip test failed probably due to \$TMPDIR being on NFS",1); -} - -# TMPFILE - -$fh = tmpfile(); - -if (defined $fh) { - ok( $fh ); - print "# TMPFILE: tmpfile got FH $fh\n"; - - $fh->autoflush(1) if $] >= 5.006; - - # print something to it - my $original = "Hello a test\n"; - print "# TMPFILE: Wrote line: $original"; - print $fh $original - or die "Error printing to tempfile\n"; - - # rewind it - ok( seek($fh,0,0) ); - - # Read from it - my $line = <$fh>; - - print "# TMPFILE: Read line: $line"; - ok( $original, $line); - - close($fh); - -} else { - # Skip all the remaining tests - foreach (1..3) { - skip("Skip test failed probably due to \$TMPDIR being on NFS",1); - } -} - - - - diff --git a/lib/Temp/File-Temp-0.12/t/security.t b/lib/Temp/File-Temp-0.12/t/security.t deleted file mode 100755 index f08f6db..0000000 --- a/lib/Temp/File-Temp-0.12/t/security.t +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/perl -w -# Test for File::Temp - Security levels - -# Some of the security checking will not work on all platforms -# Test a simple open in the cwd and tmpdir foreach of the -# security levels - -use Test; -BEGIN { plan tests => 13 } - -use strict; -use File::Spec; - -# Set up END block - this needs to happen before we load -# File::Temp since this END block must be evaluated after the -# END block configured by File::Temp -my @files; # list of files to remove -END { foreach (@files) { ok( !(-e $_) )} } - -use File::Temp qw/ tempfile unlink0 /; -ok(1); - -# The high security tests must currently be skipped on some platforms -my $skipplat = ( ( - # No sticky bits. - $^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'dos' - ) ? 1 : 0 ); - -# Can not run high security tests in perls before 5.6.0 -my $skipperl = ($] < 5.006 ? 1 : 0 ); - -# Determine whether we need to skip things and why -my $skip = 0; -if ($skipplat) { - $skip = "Skip Not supported on this platform"; -} elsif ($skipperl) { - $skip = "Skip Perl version must be v5.6.0 for these tests"; - -} - -print "# We will be skipping some tests : $skip\n" if $skip; - -# start off with basic checking - -File::Temp->safe_level( File::Temp::STANDARD ); - -print "# Testing with STANDARD security...\n"; - -&test_security(0); - -# Try medium - -File::Temp->safe_level( File::Temp::MEDIUM ) - unless $skip; - -print "# Testing with MEDIUM security...\n"; - -# Now we need to start skipping tests -&test_security($skip); - -# Try HIGH - -File::Temp->safe_level( File::Temp::HIGH ) - unless $skip; - -print "# Testing with HIGH security...\n"; - -&test_security($skip); - -exit; - -# Subroutine to open two temporary files. -# one is opened in the current dir and the other in the temp dir - -sub test_security { - - # Read in the skip flag - my $skip = shift; - - # If we are skipping we need to simply fake the correct number - # of tests -- we dont use skip since the tempfile() commands will - # fail with MEDIUM/HIGH security before the skip() command would be run - if ($skip) { - - skip($skip,1); - skip($skip,1); - - # plus we need an end block so the tests come out in the right order - eval q{ END { skip($skip,1); skip($skip,1) } 1; } || die; - - return; - } - - # Create the tempfile - my $template = "tmpXXXXX"; - my ($fh1, $fname1) = eval { tempfile ( $template, - DIR => File::Spec->tmpdir, - UNLINK => 1, - ); - }; - - if (defined $fname1) { - print "# fname1 = $fname1\n"; - ok( (-e $fname1) ); - push(@files, $fname1); # store for end block - } elsif (File::Temp->safe_level() != File::Temp::STANDARD) { - my $skip2 = "Skip system possibly insecure, see INSTALL, section 'make test'"; - skip($skip2, 1); - # plus we need an end block so the tests come out in the right order - eval q{ END { skip($skip2,1); } 1; } || die; - } else { - ok(0); - } - - # Explicitly - if ( $< < File::Temp->top_system_uid() ){ - skip("Skip Test inappropriate for root", 1); - eval q{ END { skip($skip,1); } 1; } || die; - return; - } - my ($fh2, $fname2) = eval { tempfile ($template, UNLINK => 1 ); }; - if (defined $fname2) { - print "# fname2 = $fname2\n"; - ok( (-e $fname2) ); - push(@files, $fname2); # store for end block - close($fh2); - } elsif (File::Temp->safe_level() != File::Temp::STANDARD) { - my $skip2 = "Skip system possibly insecure, see INSTALL, section 'make test'"; - skip($skip2, 1); - # plus we need an end block so the tests come out in the right order - eval q{ END { skip($skip2,1); } 1; } || die; - } else { - ok(0); - } - -} diff --git a/lib/Temp/File-Temp-0.12/t/tempfile.t b/lib/Temp/File-Temp-0.12/t/tempfile.t deleted file mode 100644 index 6e3fa94..0000000 --- a/lib/Temp/File-Temp-0.12/t/tempfile.t +++ /dev/null @@ -1,140 +0,0 @@ -#!/usr/local/bin/perl -w -# Test for File::Temp - tempfile function - -use strict; -use Test; -BEGIN { plan tests => 20} -use File::Spec; - -# Will need to check that all files were unlinked correctly -# Set up an END block here to do it - -# Arrays containing list of dirs/files to test -my (@files, @dirs, @still_there); - -# And a test for files that should still be around -# These are tidied up -END { - foreach (@still_there) { - ok( -f $_ ); - ok( unlink( $_ ) ); - ok( !(-f $_) ); - } -} - -# Loop over an array hoping that the files dont exist -END { foreach (@files) { ok( !(-e $_) )} } - -# And a test for directories -END { foreach (@dirs) { ok( !(-d $_) )} } - -# Need to make sure that the END blocks are setup before -# the ones that File::Temp configures since END blocks are evaluated -# in revers order and we need to check the files *after* File::Temp -# removes them -use File::Temp qw/ tempfile tempdir/; - -# Now we start the tests properly -ok(1); - - -# Tempfile -# Open tempfile in some directory, unlink at end -my ($fh, $tempfile) = tempfile( - UNLINK => 1, - SUFFIX => '.txt', - ); - -ok( (-f $tempfile) ); -# Should still be around after closing -ok( close( $fh ) ); -ok( (-f $tempfile) ); -# Check again at exit -push(@files, $tempfile); - -# TEMPDIR test -# Create temp directory in current dir -my $template = 'tmpdirXXXXXX'; -print "# Template: $template\n"; -my $tempdir = tempdir( $template , - DIR => File::Spec->curdir, - CLEANUP => 1, - ); - -print "# TEMPDIR: $tempdir\n"; - -ok( (-d $tempdir) ); -push(@dirs, $tempdir); - -# Create file in the temp dir -($fh, $tempfile) = tempfile( - DIR => $tempdir, - UNLINK => 1, - SUFFIX => '.dat', - ); - -print "# TEMPFILE: Created $tempfile\n"; - -ok( (-f $tempfile)); -push(@files, $tempfile); - -# Test tempfile -# ..and again -($fh, $tempfile) = tempfile( - DIR => $tempdir, - ); - - -ok( (-f $tempfile )); -push(@files, $tempfile); - -print "# TEMPFILE: Created $tempfile\n"; - -# and another (with template) - -($fh, $tempfile) = tempfile( 'helloXXXXXXX', - DIR => $tempdir, - UNLINK => 1, - SUFFIX => '.dat', - ); - -print "# TEMPFILE: Created $tempfile\n"; - -ok( (-f $tempfile) ); -push(@files, $tempfile); - - -# Create a temporary file that should stay around after -# it has been closed -($fh, $tempfile) = tempfile( 'permXXXXXXX', UNLINK => 0 ); -print "# TEMPFILE: Created $tempfile\n"; -ok( -f $tempfile ); -ok( close( $fh ) ); -push( @still_there, $tempfile); # check at END - -# Would like to create a temp file and just retrieve the handle -# but the test is problematic since: -# - We dont know the filename so we cant check that it is tidied -# correctly -# - The unlink0 required on unix for tempfile creation will fail -# on NFS -# Try to do what we can. -# Tempfile croaks on error so we need an eval -$fh = eval { tempfile( 'ftmpXXXXX', DIR => File::Spec->tmpdir ) }; - -if ($fh) { - - # print something to it to make sure something is there - ok( print $fh "Test\n" ); - - # Close it - can not check it is gone since we dont know the name - ok( close($fh) ); - -} else { - skip "Skip Failed probably due to NFS", 1; - skip "Skip Failed probably due to NFS", 1; -} - -# Now END block will execute to test the removal of directories -print "# End of tests. Execute END blocks\n"; - diff --git a/template/default/at_timer_list.html b/template/default/at_timer_list.html index cdb022d..c1bba7a 100644 --- a/template/default/at_timer_list.html +++ b/template/default/at_timer_list.html @@ -99,7 +99,7 @@ </td> <td width="30" background="bilder/uebersicht_oben.gif"> </td> <td width="30" background="bilder/uebersicht_oben.gif"> </td> - <td align="right" width="30" background="bilder/uebersicht_oben.gif"> </td> + <td align="center" width="30" background="bilder/uebersicht_oben.gif"><input type="checkbox" name="SELALL" value="SELALL" onclick="AllMessages(this.form);" title="<?% msg.c_select_allnone %?>"></td> <td valign="top" width="30"><img src="bilder/uebersicht_oben_rechts.gif" alt="" height="30" width="30" border="0"></td> </tr> diff --git a/template/default/config.html b/template/default/config.html index aac351d..690cf37 100644 --- a/template/default/config.html +++ b/template/default/config.html @@ -195,17 +195,17 @@ <td width="30" height="25" background="bilder/uebersicht_rechts_dark.gif"></td> </tr> <tr height="25"> - <td width="30" height="25" background="bilder/uebersicht_links.gif"></td> - <td height="25" background="bilder/uebersicht_mitte.gif"><?% msg.c_lifetime %?></td> - <td width="30%" height="25" background="bilder/uebersicht_mitte.gif"><input type="text" name="AT_LIFETIME" value="<tmpl_var AT_LIFETIME>" size="2" maxlength="2"></td> - <td width="30" height="25" background="bilder/uebersicht_rechts.gif"></td> - </tr> - <tr height="25"> <td width="30" height="25" background="bilder/uebersicht_links_dark.gif"></td> <td height="25" background="bilder/uebersicht_mitte_dark.gif"><?% msg.c_priority %?></td> <td width="30%" height="25" background="bilder/uebersicht_mitte_dark.gif"><input type="text" name="AT_PRIORITY" value="<tmpl_var AT_PRIORITY>" size="2" maxlength="2"></td> <td width="30" height="25" background="bilder/uebersicht_rechts_dark.gif"></td> </tr> + <tr height="25"> + <td width="30" height="25" background="bilder/uebersicht_links.gif"></td> + <td height="25" background="bilder/uebersicht_mitte.gif"><?% msg.c_lifetime %?></td> + <td width="30%" height="25" background="bilder/uebersicht_mitte.gif"><input type="text" name="AT_LIFETIME" value="<tmpl_var AT_LIFETIME>" size="2" maxlength="2"></td> + <td width="30" height="25" background="bilder/uebersicht_rechts.gif"></td> + </tr> <!-- <tr height="25"> <td width="30" height="25" background="bilder/uebersicht_links.gif"></td> diff --git a/template/default/library.js b/template/default/library.js index 2377bb3..75c8ad3 100644 --- a/template/default/library.js +++ b/template/default/library.js @@ -32,3 +32,12 @@ function popup(URL) { function toolbar(URL) { window.open(URL, '_new', 'width=200, height=50'); } + +function AllMessages(myform) +{ + for (var x = 0; x < myform.elements.length; x++) { + var y = myform.elements[x]; + if (y.name != 'SELALL') + y.checked = myform.SELALL.checked; + } +} diff --git a/template/default/prog_detail.html b/template/default/prog_detail.html index dd75def..16b1d67 100644 --- a/template/default/prog_detail.html +++ b/template/default/prog_detail.html @@ -31,6 +31,7 @@ <a href="javascript:callurl('<tmpl_var switchurl>')">[<?% msg.pd_view %?>]</a> <a href="javascript:window.close();opener.location.href='<tmpl_var recurl>'">[<?% msg.pd_record %?>]</a> <a href="vdradmin.pl?search=<tmpl_var title>&aktion=prog_summary&submit=go11)" target="main">[<?% msg.pd_search %?>]</a> + <a href="http://akas.imdb.com/Tsearch?title=<tmpl_var title>" target="_blank" title="<?% msg.pd_imdb %?>">[IMDb]</a> </tmpl_if> </td> <td width="30" background="bilder/uebersicht_rechts.gif"> </td> diff --git a/template/default/rec_list.html b/template/default/rec_list.html index 5f55369..4036167 100644 --- a/template/default/rec_list.html +++ b/template/default/rec_list.html @@ -85,7 +85,7 @@ </td> <td width="30" background="bilder/uebersicht_oben.gif"> </td> <td width="30" background="bilder/uebersicht_oben.gif"> </td> - <td width="30" background="bilder/uebersicht_oben.gif"> </td> + <td width="30" align="center" background="bilder/uebersicht_oben.gif"><input type="checkbox" name="SELALL" value="SELALL" onclick="AllMessages(this.form);" title="<?% msg.c_select_allnone %?>"></td> <td width="70" background="bilder/uebersicht_oben.gif"> </td> <td valign="top" width="30"><img src="bilder/uebersicht_oben_rechts.gif" alt="" height="30" width="30" border="0"></td> </tr> diff --git a/template/default/timer_list.html b/template/default/timer_list.html index ca68ce6..2f21143 100644 --- a/template/default/timer_list.html +++ b/template/default/timer_list.html @@ -270,7 +270,7 @@ </td> <td width="30" background="bilder/uebersicht_oben.gif"> </td> <td width="30" background="bilder/uebersicht_oben.gif"> </td> - <td width="30" background="bilder/uebersicht_oben.gif"> </td> + <td width="30" align="center" background="bilder/uebersicht_oben.gif"><input type="checkbox" name="SELALL" value="SELALL" onclick="AllMessages(this.form);" title="<?% msg.c_select_allnone %?>"></td> <td valign="top" width="30"><img src="bilder/uebersicht_oben_rechts.gif" alt="" height="30" width="30" border="0"></td> </tr> diff --git a/template/default/tv.html b/template/default/tv.html index 1ed81b9..21d3ecb 100644 --- a/template/default/tv.html +++ b/template/default/tv.html @@ -38,14 +38,19 @@ interval = val; v_Stop(); if(interval > 0) { - go() + go(); }; } function v_changeSize(val) { size = val; v_Stop(); - go() + if(interval > 0) { + go(); + } + else { + WebcamUpdate(); + }; } //--> </script> diff --git a/vdradmind.pl b/vdradmind.pl index af2a98b..62bf7db 100755 --- a/vdradmind.pl +++ b/vdradmind.pl @@ -22,11 +22,15 @@ # # 08.10.2001 # - +# +# VDRAdmin-AM by Andreas Mair <mail@andreas.vdr-developer.org> +# my $BASENAME; +my $EXENAME; BEGIN { $0 =~ /(^.*\/)/; + $EXENAME = $0; $BASENAME = $1; #TODO: $0 = "vdradmind"; # does this harm any external script that depend on vdradmind.pl? unshift(@INC, "/usr/share/vdradmin/lib"); @@ -43,6 +47,7 @@ use Time::Local qw(timelocal); use POSIX ":sys_wait_h", qw(strftime mktime); use MIME::Base64(); use File::Temp(); +use Shell qw(ps); $SIG{CHLD} = sub { wait }; @@ -71,7 +76,7 @@ $CONFIG{USERNAME} = "linvdr"; $CONFIG{PASSWORD} = "linvdr"; $CONFIG{GUEST_ACCOUNT} = 0; $CONFIG{TEMPLATE} = "default"; -$CONFIG{LANGUAGE} = "Deutsch"; +$CONFIG{LANGUAGE} = "English"; $CONFIG{LOGLEVEL} = 81; # 32799 $CONFIG{CACHE_TIMEOUT} = 60; $CONFIG{LOCAL_NET} = "0.0.0.0/32"; @@ -91,19 +96,24 @@ $CONFIG{LOGGING} = 0; $CONFIG{MOD_GZIP} = 0; # $CONFIG{LOGFILE} = "vdradmind.log"; -$CONFIG{SERVERHOST} = "localhost"; +$CONFIG{SERVERHOST} = "0.0.0.0"; $CONFIG{SERVERPORT} = 8001; $CONFIG{RECORDINGS} = 1; $CONFIG{ZEITRAHMEN} = 1; -$CONFIG{TIMES} = '18:00, 20:00, 21:00, 22:00'; -$CONFIG{EPG_DIRECT} = 1; +$CONFIG{TIMES} = "18:00, 20:00, 21:00, 22:00"; +$CONFIG{EPG_DIRECT} = 0; $CONFIG{EPG_FILENAME} = "/video/epg.data"; -$CONFIG{SKIN} = 'bilder'; - -my $VERSION = "0.97-am3.0"; +$CONFIG{EPG_PRUNE} = 0; +$CONFIG{SKIN} = "bilder"; +$CONFIG{AT_SENDMAIL} = 0; # set to 1 and set the all "MAIL_" things if you want email notification on new autotimers. +$CONFIG{MAIL_PROG} = "./sendEmail"; +$CONFIG{MAIL_FROMDOMAIN} = "fromaddress.tld"; +$CONFIG{MAIL_TO} = "your\@email.address"; +$CONFIG{MAIL_SERVER} = "your.email.server"; + +my $VERSION = "0.97-am3.1"; my $SERVERVERSION = "vdradmind/$VERSION"; my $VIDEODIR = "/video"; -my $DONE = &DONE_Read || {}; my($TEMPLATEDIR, $I18NDIR, $CONFFILE, $LOGFILE, $PIDFILE, $AT_FILENAME, $DONE_FILENAME, $BL_FILENAME); if(!$SEARCH_FILES_IN_SYSTEM) { @@ -125,21 +135,22 @@ if(!$SEARCH_FILES_IN_SYSTEM) { $DONE_FILENAME = "/etc/vdradmin/vdradmind.done"; $BL_FILENAME = "/etc/vdradmin/vdradmind.bl"; } +my $DONE = &DONE_Read || {}; #use Template::Constants qw( :debug ); # IMHO a better Template Modul ;-) # some useful options (see below for full list) my $Xconfig = { - START_TAG => '\<\?\%', # Tagstyle - END_TAG => '\%\?\>', # Tagstyle - INCLUDE_PATH => $TEMPLATEDIR, # or list ref - INTERPOLATE => 1, # expand "$var" in plain text - PRE_CHOMP => 1, # cleanup whitespace - POST_CHOMP => 1, # cleanup whitespace - EVAL_PERL => 1, # evaluate Perl code blocks - CACHE_SIZE => 10000, # Tuning for Templates - COMPILE_EXT => 'cache', # Tuning for Templates - COMPILE_DIR => '/tmp', # Tuning for Templates + START_TAG => '\<\?\%', # Tagstyle + END_TAG => '\%\?\>', # Tagstyle + INCLUDE_PATH => $TEMPLATEDIR, # or list ref + INTERPOLATE => 1, # expand "$var" in plain text + PRE_CHOMP => 1, # cleanup whitespace + POST_CHOMP => 1, # cleanup whitespace + EVAL_PERL => 1, # evaluate Perl code blocks + CACHE_SIZE => 10000, # Tuning for Templates + COMPILE_EXT => 'cache', # Tuning for Templates + COMPILE_DIR => '/tmp', # Tuning for Templates }; # create Template object @@ -149,22 +160,17 @@ my $Xtemplate = Template->new($Xconfig); my $I18NFILE = "i18n.pl"; my $USE_SHELL_GZIP = false; # set on false to use the gzip library -if($CONFIG{MOD_GZIP}) { - # lib gzipping - require Compress::Zlib; -} - my($DEBUG) = 0; -my(%EPG, @CHAN, $q, $ACCEPT_GZIP, $SVDRP, $HOST); +my(%EPG, @CHAN, $q, $ACCEPT_GZIP, $SVDRP, $HOST, $low_time); my(%mimehash) = ( - html => "text/html", - png => "image/png", - gif => "image/gif", - jpg => "image/jpeg", + html => "text/html", + png => "image/png", + gif => "image/gif", + jpg => "image/jpeg", css => "text/css", - ico => "image/x-icon", - js => "application/x-javascript", - swf => "application/x-shockwave-flash" + ico => "image/x-icon", + js => "application/x-javascript", + swf => "application/x-shockwave-flash" ); my @LOGINPAGES = qw(prog_list prog_list2 prog_summary prog_timeline timer_list rec_list); @@ -177,78 +183,93 @@ $SIG{PIPE} = 'IGNORE'; # my $DAEMON = 1; for(my $i = 0; $i < scalar(@ARGV); $i++) { - $_ = $ARGV[$i]; - if(/-h|--help/) { - print("Usage $0 [OPTION]...\n"); - print("A perl client for the Linux Video Disk Recorder.\n\n"); - print(" -nf --nofork don't fork\n"); - print(" -c --config run configuration dialog\n"); - print(" -k --kill kill a forked vdradmin\n"); - print(" -h --help this message\n"); - print("\nReport bugs to <vdradmin\@linvdr.org>.\n"); - exit(0); - } - if(/--nofork|-nf/) { $DAEMON = 0; last; } - if(/--config|-c/) { - $CONFIG{VDR_HOST} = Question("What's your VDR hostname (e.g video.intra.net)?", $CONFIG{VDR_HOST}); + $_ = $ARGV[$i]; + if(/-h|--help/) { + print("Usage $0 [OPTION]...\n"); + print("A perl client for the Linux Video Disk Recorder.\n\n"); + print(" -nf --nofork don't fork\n"); + print(" -c --config run configuration dialog\n"); + print(" -k --kill kill a forked vdradmind\n"); + print(" -h --help this message\n"); + print("\nReport bugs to <mail\@andreas.vdr-developer.org>.\n"); + exit(0); + } + if(/--nofork|-nf/) { $DAEMON = 0; last; } + if(/--config|-c/) { + $CONFIG{VDR_HOST} = Question("What's your VDR hostname (e.g video.intra.net)?", $CONFIG{VDR_HOST}); $CONFIG{VDR_PORT} = Question("On which port does VDR listen to SVDRP queries?", $CONFIG{VDR_PORT}); $CONFIG{SERVERHOST} = Question("On which address should vdradmin listen (0.0.0.0 for any)?", $CONFIG{SERVERHOST}); $CONFIG{SERVERPORT} = Question("On which port should vdradmin listen?", $CONFIG{SERVERPORT}); $CONFIG{USERNAME} = Question("Username?", $CONFIG{USERNAME}); $CONFIG{PASSWORD} = Question("Password?", $CONFIG{PASSWORD}); $CONFIG{EPG_FILENAME} = Question("Where is your epg.data?", $CONFIG{EPG_FILENAME}); - $CONFIG{EPG_DIRECT} = ($CONFIG{EPG_FILENAME} and -e $CONFIG{EPG_FILENAME} ? 1 : 0); + $CONFIG{EPG_DIRECT} = ($CONFIG{EPG_FILENAME} and -e $CONFIG{EPG_FILENAME} ? 1 : 0); WriteConfig(); - print("Config file written successfully.\n"); - exit(0); - } - if(/--kill|-k/) { + print("Config file written successfully.\n"); + exit(0); + } + if(/--kill|-k/) { my $killed = kill(2, getPID($PIDFILE)); - unlink($PIDFILE); - exit($killed > 0 ? 0 : 1); - } - if(/--displaycall|-i/) { - for(my $z = 0; $z < 5; $z++) { - DisplayMessage($ARGV[$i+1]); - sleep(3); - } - CloseSocket(); - exit(0); - } - if(/--message|-m/) { - DisplayMessage($ARGV[$i+1]); - CloseSocket(); - exit(0); - } + unlink($PIDFILE); + exit($killed > 0 ? 0 : 1); + } + if(/--displaycall|-i/) { + for(my $z = 0; $z < 5; $z++) { + DisplayMessage($ARGV[$i+1]); + sleep(3); + } + CloseSocket(); + exit(0); + } + if(/--message|-m/) { + DisplayMessage($ARGV[$i+1]); + CloseSocket(); + exit(0); + } } ReadConfig(); +if ($CONFIG{EPG_DIRECT}) { + print("!!! YOU REQUESTED EPG_DIRECT !!!\nBut there seems to be a bug in it, so that timers with certain summaries don't get added.\nIf you have problems and don't want to debug them, please set EPG_DIRECT to 0.\n\n"); +} +if ($CONFIG{LANGUAGE} eq "Español") { + # i18n/Español has been renamed to i18n/Spanish + $CONFIG{LANGUAGE} = "Spanish"; +} +if($CONFIG{MOD_GZIP}) { + # lib gzipping + require Compress::Zlib; +} if(-e "$PIDFILE") { - print "There's already a copy of this program running! (pid: " . getPID($PIDFILE) . ")\n"; - print "If you feel this is an error, remove $PIDFILE!\n"; - exit(1); + my $pid = getPID($PIDFILE); + print "There's already a copy of this program running! (pid: $pid)\n"; + $_ = ps("ax"); + if (/\n($pid) [!\n]*( |\/)$EXENAME/) { + print "If you feel this is an error, remove $PIDFILE!\n"; + exit(1); + } + print "The pid $pid is not a running $EXENAME process, so I'll start anyway.\n" } if($DAEMON) { - my($pid) = fork; - if($pid != 0) { - print("vdradmind.pl $VERSION started with pid $pid.\n"); - writePID($pid); - exit(0); - } + my($pid) = fork; + if($pid != 0) { + print("vdradmind.pl $VERSION started with pid $pid.\n"); + writePID($pid); + exit(0); + } } - my($Socket) = IO::Socket::INET->new( - Proto => 'tcp', - LocalPort => $CONFIG{SERVERPORT}, - LocalAddr => $CONFIG{SERVERHOST}, - Listen => 10, - Reuse => 1 + Proto => 'tcp', + LocalPort => $CONFIG{SERVERPORT}, + LocalAddr => $CONFIG{SERVERHOST}, + Listen => 10, + Reuse => 1 ); die("can't start server: $!\n") if (!$Socket); $Socket->timeout($CONFIG{AT_TIMEOUT} * 60) if($CONFIG{AT_FUNC}); @@ -265,8 +286,8 @@ my($Client, $MyURL, $Referer, $Request, $Query, $Guest); my @GUEST_USER = qw(prog_detail prog_list prog_list2 prog_timeline timer_list at_timer_list prog_summary rec_list rec_detail show_top toolbar show_help); my @TRUSTED_USER = (@GUEST_USER, qw(at_timer_edit at_timer_new at_timer_save - at_timer_delete timer_new_form timer_add timer_delete timer_toggle rec_delete rec_rename rec_edit - conf_list prog_switch rc_show rc_hitk grab_picture at_timer_toggle tv_show + at_timer_delete timer_new_form timer_add timer_delete timer_toggle rec_delete rec_rename rec_edit + conf_list prog_switch rc_show rc_hitk grab_picture at_timer_toggle tv_show live_stream rec_stream force_update)); # Force Update at start @@ -274,7 +295,7 @@ UptoDate(1); while(true) { - $Client = $Socket->accept(); + $Client = $Socket->accept(); # if(!$Client) { @@ -288,11 +309,11 @@ while(true) { $ACCEPT_GZIP = 0; - if($raw_request =~ /^GET (\/[\w\.\/-\:]*)([\?[\w=&\.\+\%-\:\!]*]*)[\#\d ]+HTTP\/1.\d$/) { + if($raw_request =~ /^GET (\/[\w\.\/-\:]*)([\?[\w=&\.\+\%-\:\!]*]*)[\#\d ]+HTTP\/1.\d$/) { ($Request, $Query) = ($1, $2 ? substr($2, 1, length($2)) : undef); } else { - Error("404", $MESSAGES{err_notfound}, $MESSAGES{err_notfound_long}); - close($Client); + Error("404", $MESSAGES{err_notfound}, $MESSAGES{err_notfound_long}); + close($Client); next; } @@ -325,7 +346,7 @@ while(true) { $Guest = 1; } else { headerNoAuth(); - close($Client); + close($Client); next; } @@ -348,7 +369,7 @@ while(true) { eval("(\$http_status, \$bytes_transfered) = $aktion();"); } else { # XXX redirect to no access template - Error("403", $MESSAGES{err_forbidden}, $MESSAGES{err_forbidden_long}); + Error("403", $MESSAGES{err_forbidden}, $MESSAGES{err_forbidden_long}); next; } } elsif($Request eq "/") { @@ -357,34 +378,34 @@ while(true) { } elsif($Request eq "/left.html") { ($http_status, $bytes_transfered) = show_navi(); } else { - ($http_status, $bytes_transfered) = SendFile($Request); + ($http_status, $bytes_transfered) = SendFile($Request); } - Log(LOG_ACCESS, access_log($Client->peerhost, $username, time(), $raw_request, - $http_status, $bytes_transfered, $Request, $http_useragent)); - close($Client); - $SVDRP->close; + Log(LOG_ACCESS, access_log($Client->peerhost, $username, time(), $raw_request, + $http_status, $bytes_transfered, $Request, $http_useragent)); + close($Client); + $SVDRP->close; } ############################################################################# ############################################################################# sub GetChannelDesc { - my(%hash); - for(@CHAN) { - $hash{$_->{id}} = $_->{name}; - } - return(%hash); + my(%hash); + for(@CHAN) { + $hash{$_->{id}} = $_->{name}; + } + return(%hash); } sub GetChannelDescByNumber { - my $vdr_id = shift; + my $vdr_id = shift; - if($vdr_id) { - for(@CHAN) { - if($_->{vdr_id} == $vdr_id) { + if($vdr_id) { + for(@CHAN) { + if($_->{vdr_id} == $vdr_id) { return($_->{name}); - } - } - } else { return(0); } + } + } + } else { return(0); } } sub include { @@ -395,10 +416,10 @@ sub include { } sub ReadFile { - my $file = shift; - return if(!$file); + my $file = shift; + return if(!$file); - open(I18N, $file) || HTMLError(sprintf($MESSAGES{err_cant_open}, $file)); + open(I18N, $file) || HTMLError(sprintf($MESSAGES{err_cant_open}, $file)); my $buf = join("", <I18N>); close(I18N); return($buf); @@ -608,58 +629,68 @@ sub EPG_buildTree { $SVDRP->command("lste"); my($i, @events); my($id, $bc) = (1, 0); + $low_time = time; undef(%EPG); while($_ = $SVDRP->readoneline) { chomp; if(/^C ([^ ]+) *(.*)/) { - $bc++; undef(@events); my($channel_id, $channel_name) = ($1, $2); my $vdr_id = get_vdrid_from_channelid($channel_id); - while($_ = $SVDRP->readoneline) { - if(/^E (.*) (.*) (.*) (.*)/ || /^E (.*) (.*) (.*)/) { - my($event_id, $time, $duration) = ($1, $2, $3); - my($title, $subtitle, $summary); - while($_ = $SVDRP->readoneline) { + if($CONFIG{EPG_PRUNE}>0 && $vdr_id >= $CONFIG{EPG_PRUNE}) { + # diesen channel nicht einlesen + while($_ = $SVDRP->readoneline) { + last if(/^c/) + } + } + else { + $bc++; + while($_ = $SVDRP->readoneline) { + if(/^E (.*) (.*) (.*) (.*)/ || /^E (.*) (.*) (.*)/) { + my($event_id, $time, $duration) = ($1, $2, $3); + my($title, $subtitle, $summary); + while($_ = $SVDRP->readoneline) { # if(/^T (.*)/) { $title = $1; $title =~ s/\|/<br>/sig } # if(/^S (.*)/) { $subtitle = $1; $subtitle =~ s/\|/<br>/sig } # if(/^D (.*)/) { $summary = $1; $summary =~ s/\|/<br>/sig } - if(/^T (.*)/) { $title = $1; } - if(/^S (.*)/) { $subtitle = $1; } - if(/^D (.*)/) { $summary = $1; } - if(/^e/) { - # - push(@events, { - channel_name => $channel_name, - start => $time, - stop => $time + $duration, - duration => $duration, - title => $title, - subtitle => $subtitle, - summary => $summary, - id => $id, - vdr_id => $vdr_id, - event_id => $event_id - }); - $id++; - last; + if(/^T (.*)/) { $title = $1; } + if(/^S (.*)/) { $subtitle = $1; } + if(/^D (.*)/) { $summary = $1; } + if(/^e/) { + # + $low_time = $time if($time < $low_time); + push(@events, { + channel_name => $channel_name, + start => $time, + stop => $time + $duration, + duration => $duration, + title => $title, + subtitle => $subtitle, + summary => $summary, + id => $id, + vdr_id => $vdr_id, + event_id => $event_id + }); + $id++; + last; + } } + } elsif(/^c/) { + my($last) = 0; + my(@temp); + for(sort({ $a->{start} <=> $b->{start} } @events)) { + next if($last == $_->{start}); + push(@temp, $_); + $last = $_->{start}; + } + $EPG{$vdr_id} = [ @temp ]; + last; } - } elsif(/^c/) { - my($last) = 0; - my(@temp); - for(sort({ $a->{start} <=> $b->{start} } @events)) { - next if($last == $_->{start}); - push(@temp, $_); - $last = $_->{start}; - } - $EPG{$vdr_id} = [ @temp ]; - last; } } } } - Log(LOG_STATS, "EPGTree: $id events, $bc broadcasters"); + Log(LOG_STATS, "EPGTree: $id events, $bc broadcasters (lowtime $low_time)"); } @@ -993,10 +1024,6 @@ sub AutoTimer { for my $sender (keys(%EPG)) { for my $event (@{$EPG{$sender}}) { - for my $at (@at) { - if(!$at->{active}) { - next; - } # Ein Timer der schon programmmiert wurde kann # ignoriert werden @@ -1008,15 +1035,11 @@ sub AutoTimer { next unless defined $wanted->{ $event->{vdr_id} }; } - if($at->{channel}) { - if($at->{channel} != $event->{vdr_id}) { - next; - } - } # Hamwa schon gehabt? - my $DoneStr = sprintf('%s~%s', - $event->{title}, + my $DoneStr = sprintf('%s~%d~%s', + $event->{title}, + $event->{event_id}, ($event->{subtitle} ? $event->{subtitle} : ''), ); @@ -1034,7 +1057,9 @@ sub AutoTimer { next; } - + for my $at (@at) { + next if(!$at->{active}); + next if(($at->{channel}) && ($at->{channel} != $event->{vdr_id})); my $SearchStr; if($at->{section} & 1) { @@ -1179,7 +1204,7 @@ sub AutoTimer { $directory =~ s#/#~#g; } - if($directory && $directory =~ /%/) { + if($directory && $directory =~ /\%.*\%/) { $title = $directory; $at_details{'title'} = $event->{title}; $at_details{'subtitle'} = $event->{subtitle} ? $event->{subtitle} : my_strftime("%Y-%m-%d", $event->{start}); @@ -1209,7 +1234,7 @@ sub AutoTimer { # gemaess vdr.5 alle : durch | ersetzen. $title =~ s#:#|#g; - # sind irgendweche Tags verwendet worden, die leer waren und die doppelte Verzeichnisse erzeugten? + # sind irgendwelche Tags verwendet worden, die leer waren und die doppelte Verzeichnisse erzeugten? $title =~ s#~+#~#g; $title =~ s#^~##; @@ -1219,6 +1244,30 @@ sub AutoTimer { Log(LOG_AT, sprintf("AutoTimer: Programming Timer \"%s\" (Event-ID %s, %s - %s)", $title, $event->{event_id}, strftime("%Y%m%d-%H%M", localtime($event->{start})), strftime("%Y%m%d-%H%M", localtime($event->{stop})))); + # AUTOTIMER-Notification patch start + if ($CONFIG{AT_SENDMAIL} == 1) { + my $mail = ""; + my $sum = ""; + my $strt = ""; + my $end = ""; + my $dat = ""; + $sum = $event->{summary}; + # remove all HTML-Tags from text + $sum =~ s/\<[^\>]+\>/ /g; + $dat = strftime("%Y/%m/%d", localtime($event->{start})); + $strt= strftime("%H:%M", localtime($event->{start})); + $end = strftime("%H:%M", localtime($event->{stop})); + $mail = sprintf("Created AUTOTIMER for $event->{title}\n===========================================================================\n$dat,$strt-$end\n\nSummary:\n--------\n$sum"); + + # + # the "sendEmail" tool (written by "caspian at dotconf.net") is available from [URL]http://caspian.dotconf.net/menu/Software/SendEmail/[/URL] + # + open (MAIL, "|$CONFIG{MAIL_PROG} -q -f autotimer\@$CONFIG{MAIL_FROMDOMAIN} -t $CONFIG{MAIL_TO} -u \"AUTOTIMER: New timer created for $event->{title}\" -s $CONFIG{MAIL_SERVER}"); + print MAIL $mail; + close(MAIL); + } + # AUTOTIMER-Notification patch end + AT_ProgTimer(0x8001, $event->{event_id}, $event->{vdr_id}, $event->{start}, $event->{stop}, $title, $event->{summary}, $at->{prio}, $at->{lft}); @@ -1237,8 +1286,8 @@ sub AutoTimer { } Log(LOG_AT, "Auto Timer: Done."); - Log(LOG_AT, "Auto Timer: Search for old Done Entrys..."); - for(keys %$DONE) { delete $DONE->{$_} if(time > $DONE->{$_}) } + Log(LOG_AT, "Auto Timer: Purging done list... (lowtime $low_time)"); + for(keys %$DONE) { delete $DONE->{$_} if($low_time > $DONE->{$_}) } Log(LOG_AT, "Auto Timer: Save done list..."); &DONE_Write($DONE) if($DONE); Log(LOG_AT, "Auto Timer: Done."); @@ -1464,6 +1513,9 @@ sub ParseTimer { # direct recording (menu, red) $active = 1 if($active == 3); + # replace "|" by ":" in timer's title (man vdr.5) + $title =~ s/\|/\:/g; + if(length($dor) == 7) { # repeating timer $startsse = my_mktime(substr($start, 2, 2), substr($start, 0, 2), my_strftime("%d"), (my_strftime("%m") - 1), my_strftime("%Y")); $stopsse = my_mktime(substr($stop, 2, 2), substr($stop, 0, 2), my_strftime("%d"), (my_strftime("%m") - 1), my_strftime("%Y")); @@ -1603,7 +1655,7 @@ sub ProgTimer { # $start and $stop are expected as seconds since 00:00:00 1970-01-01 UTC. my($timer_id, $active, $event_id, $channel, $start, $stop, $prio, $lft, $title, $summary, $dor) = @_; - $title =~ s/\://g; + $title =~ s/\:/|/g; # replace ":" by "|" in timer's title (man vdr.5) if(($CONFIG{NO_EVENTID} == 1) && ($event_id > 0)) { $event_id = 0; @@ -1632,7 +1684,7 @@ sub ProgTimer { $lft, $title, $summary - ) + ) ); return $return; @@ -2689,13 +2741,13 @@ sub timer_add { if(length($q->param("summary")) > 0) { $data->{summary} = $q->param("summary"); - $data->{summary} =~ s/\://g; +# $data->{summary} =~ s/\://g; # summary may have colons (man vdr.5) $data->{summary} =~ s/\r//g; $data->{summary} =~ s/\n/|/g; } my $dor = $data->{dor}; - if(length($data->{dor}) == 7 || length($data->{dor}) == 18) { + if(length($data->{dor}) == 7 || length($data->{dor}) == 10 || length($data->{dor}) == 18) { # dummy $dor = 1; } @@ -2817,7 +2869,7 @@ sub live_stream { } else { $ip= $CONFIG{VDR_HOST}; } - $data="http://$ip:3000/$channel"; + $data="http://$ip:$CONFIG{ST_STREAMDEV_PORT}/$channel"; return(header("200", "audio/x-mpegurl", $data)); } diff --git a/vdradmind.pl.1 b/vdradmind.pl.1 new file mode 100644 index 0000000..f64da84 --- /dev/null +++ b/vdradmind.pl.1 @@ -0,0 +1,44 @@ +.\" Man page for vdradmind.pl + +.TH vdradmind.pl 1 + +.SH NAME +vdradmind.pl + +.SH SYNOPSIS + +.B vdradmind.pl [ \-\-nofork ] [ \-\-config ] [ \-\-kill ] + +.SH DESCRIPTION +.B vdradmind.pl +provides a webinterface for managing the Linux Video Disk Recorder (VDR), it has a virtual remote to control your VDR, you can view live-tv as a small slideshow, you can search for certain shows in the EPG.... +.PP +By default +.B vdradmind.pl +will listen on port 8001. +.PP +.B Note: Your VDR must be configured to be accesable vie SVDRP from the machine, you run vdradmind.pl from. + +.SH OPTIONS + +.IP "\-\-nofork / -nf" +Do not fork on start of vdradmin. (vdradmin does not go into daemon-mode) + +.IP "\-\-config / -c" +Ask some questions, to interactively generate the config-file /etc/vdradmin/vdradmind.conf + +.IP "\-\-kill / -k" +Kill a forked vdradmin. + +.IP "\-\-help" +Display a short message about the options of the tool. + +.SH AUTHOR +This man-page has been written by Thomas Schmidt <thomas@thsnet.de> +.PP +Permission is granted to copy, distribute and/or modify this document under +the terms of the GNU General Public License, Version 2 any +later version published by the Free Software Foundation. +.PP +On Debian systems, the complete text of the GNU General Public +License can be found in /usr/share/common\-licenses/GPL. |