2010-04-19 5 views
4

Chacun de mes utilisateurs a un (éventuellement) TZ différent défini dans leur .bashrc. J'ai un script Perl qui affiche la date/heure et je veux qu'il l'affiche avec son fuseau horaire de profil.Comment puis-je obtenir et utiliser le paramètre TZ d'un utilisateur à partir de son .bashrc dans un script CGI Perl?

Est-ce que quelqu'un sait la meilleure façon de le faire?

+0

Comment le script Perl est-il exécuté? – cjm

+0

D'un CGI sur mon serveur web. – NinjaCat

+0

Comment le serveur web pourrait-il savoir quel utilisateur l'interroge? –

Répondre

3

Une réponse simple est d'utiliser:

use POSIX; 
    .... 
    print strftime("%H:%M %Z", localtime); 

Mais la zone retournée par Z% varie d'un système à. J'ai GMT Daylight Time et BST sur deux plates-formes différentes.

Modifier Voici une expérience montrant que (au moins pour moi)% Z tient compte de la TZ

export TZ='' 
    perl -MPOSIX -e 'print strftime("%H:%M %Z\n", localtime)' 
    export TZ=America/Los_Angeles 
    perl -MPOSIX -e 'print strftime("%H:%M %Z\n", localtime)' 

produit une sortie

16:45 UTC 
    09:45 PDT 
+0

% Z renvoie le fuseau horaire du serveur. Je cherche un moyen de retourner l'ensemble TZ dans /.bashrc ou /.bash_profile de l'utilisateur. Connaissez-vous un moyen de le faire? Désolé si mon message original n'était pas clair. – NinjaCat

+0

Il me renvoie le fuseau horaire de l'utilisateur (debian). Quelles odes le script ci-dessus donnent pour vous. – justintime

+0

Même sortie que vous ... alors je me rapproche ... Si je mets ceci dans mon script perl: $ ENV {'TZ'} = "America/Los Angeles"; il renvoie la bonne TZ. Maintenant, mon script perl s'exécutera pour n'importe quel utilisateur, et je connais la valeur de $ CURRENT_USER qui correspond à/home//... comment puis-je sortir la variable TZ de cet utilisateur depuis basrc ou bash_profile? – NinjaCat

0

Ce qui est un "profil" dans ce le contexte?

+0

dans/home/ /.bashrc J'ai la ligne suivante: export TZ = "/ usr/share/zoneinfo/Europe/Paris" Un autre utilisateur @/home/ /.bashrc a: export TZ = »/usr/share/zoneinfo/Europe/London " J'aimerais que mon script perl utilise cette TZ pour son affichage. – NinjaCat

3

Vous pouvez utiliser le module merveilleux DateTime pour cela:

use strict; use warnings; 
use DateTime; 

# extract timezone name from file in env variable 
(my $tz = $ENV{TZ}) =~ s#^/usr/share/zoneinfo/##; 
my $now = DateTime->now(time_zone => $tz); 

print "The current time is: " . $now->strftime('%F %T %Z') . "\n"; 

Quand je lance cela avec TZ = "/ usr/share/zoneinfo/Europe/Paris", je vois:

L'heure actuelle est: 2010-04-19 20:09:03 CEST

Pour extraire les données de fuseau horaire du fichier de l'utilisateur: une solution rapide est de stocker la configuration TZ de cet utilisateur dans un fichier séparé (qui pourrait .bashrc source), et vous pouvez analyser manuellement dans le CGI (mais cela entre dans un autre sujet: Comment mieux stocker les configurations par utilisateur pour un CGI?)

# /home/<user>/.tz should have the content: export TZ="/usr/share/zoneinfo/timezonename" 
open(my $tz_fh, "/home/${user}/.tz"); 
chomp(my $tz_data = <$tz_fh>); 
close $tz_fh; 
(my $tz_path) = $tz_data =~ m/^export TZ\s*=\s*"(.+)"$/; 

# now $tz_path contains what $ENV{TZ} would contain in the earlier code snippet. 
+0

Cool - et il fonctionne sur mine machien aussi ...la question est comment peut-il lire dynamiquement à partir du profil d'un utilisateur? Si le script s'exécute sous l'utilisateur "apache", et qu'il saisit $ CURRENT_USER, comment puis-je dire au script d'extraire la variable d'environnement CURRENT_USER? – NinjaCat

+0

Ah, j'ai mal compris - je pensais qu'il fonctionnait sous l'environnement de l'utilisateur, auquel cas l'utilisateur .bashrc serait déjà chargé. Dans ce cas, la meilleure solution pourrait être de stocker la configuration TZ de cet utilisateur dans un fichier séparé (que .bashrc pourrait fournir), et vous pouvez l'analyser manuellement dans le CGI: je mettrai à jour ma réponse. – Ether

+1

Wow, génial! C'est sympa... – NinjaCat