IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Supprimer ou ajouter le symbole # en début de chaîne


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut Supprimer ou ajouter le symbole # en début de chaîne
    Bonjour

    Je suis actuellement entrain d'écrire un script qui permet de mettre via un simple bouton mon site en maintenance et inversement.

    Pour ce faire, j'utilise un fichier .htaccess:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # This website is in maintenance
    RewriteCond %{REQUEST_URI} !/tcsh.css$
    RewriteCond %{REQUEST_URI} !/img/back.gif$
    RewriteCond %{REQUEST_URI} !/img/obsd.gif$
    RewriteCond %{REMOTE_ADDR} !^41\.201\.2\.120
    RewriteRule . http://www.oregnier.org/$ [R=302,L]
    Bien entendu, je connais la position de ces lignes dans le fichier mais celui-ci peut-être à tout moment modifié. Je ne préfère pas jouer sur les numéros de ligne.

    Concernant le script perl, j'ai insérer sur ma page un formulaire avec un bouton de type submit. Ce qui me gène le plus ce n'est pas d'ouvrir ou fermer le fichier ou en vérifier sa présence c'est plutôt de le modifier en ne connaissant pas la position de ces lignes.

    L'objectif c'est de placer ces lignes en commentaires pour activer le site internet et inversement pour le positionner en statut maintenance.

    Pour le moment, je me pose la question suivante, dois-je dupliquer ce fichier pour lui apporter les modifications ou peut-on le faire directement ?

    Merci de vos réponses

  2. #2
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Voici le contenu de mon .htaccess:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    <-- code avant
     
    # Turn off directory listing
    options -indexes
     
    # Defines the default page
    DirectoryIndex index.php
     
    # The rewrite addresses
    Options +FollowSymlinks
    RewriteEngine on
    RewriteBase /
     
    # This website is in maintenance
    RewriteCond %{REQUEST_URI} !/tcsh.css$
    RewriteCond %{REQUEST_URI} !/img/back.gif$
    RewriteCond %{REQUEST_URI} !/img/obsd.gif$
    RewriteCond %{REMOTE_ADDR} !^10\.245\.4\.25
    RewriteRule . http://www.oregnier.org/$ [R=302,L]
     
    --> code après
    J'ai commencé par écrire du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # Chemin vers le fichier
    my $htaccess="/home/olivier/www/.htaccess";
     
    # On test si le fichier est présent, dans ce cas on l'ouvre
    open my ($in),'<', $htaccess or $msg="Pas moyen d'ouvrir $htaccess: $!";
        # On place le fichier dans un tableau de lignes
        my @lines = <$in>;
    close ($in);
     
    # On modifie la ligne 25
    $lines[25] .= "#RewriteCond %{REQUEST_URI} !/tcsh.css$\n";
     
    # On ouvre le fichier
    open my ($in),'>', $htaccess or $msg="Ce fichier $htaccess n'a pu être ouvert : $!";
       # On écrit le contenu
        print $htaccess @lines; # ---> ligne 62
    # On ferme le fichier
    close ($in);
    A l'exécution, j'obtiens ce messsage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Can't use string ("/home/olivier/www/.htaccess") as a symbol ref while "strict refs" in use at admin.cgi line 62.
    Un avis ?

    Merci

  3. #3
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Je ne comprends pas pourquoi je m'énerve tout seul

    Pouvez-vous s'il vous plaît me dire d'où vient le problème ? Ce message Can't use string, est omniprésent et je voudrais bien dormir cette nuit

    Merci

  4. #4
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    dois-je dupliquer ce fichier pour lui apporter les modifications ou peut-on le faire directement ?
    Tu dois le lire ligne par ligne et le recopier dans un nouveau fichier en modifiant les lignes que tu veux changer.
    Can't use string ("/home/olivier/www/.htaccess") as a symbol ref while "strict refs" in use at admin.cgi line 62.
    J'ai déjà eu des messages similaires pour la première partie (Can't use string ("/home/olivier/www/.htaccess") as a symbol ref while "strict refs" ) quand je donnais un FileHandle comme nom de fichier.
    Je ne connais pas les fichiers ".htaccess" mais peut-être que Perl ne peut pas l'ouvrir directement.

    Jasmine,

  5. #5
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    bon déjà je ne suis pas habitué a la syntaxe de ton open, je préfère de loin le basique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $htaccess = "my/path";
    open (my $in, "<$htaccess") or die "mais euh !!"
    ensuite tu veux remplacer ta ligne 25 non ? donc utilises plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lines[25] = "#RewriteCond %{REQUEST_URI} !/tcsh.css\$\n";
    au passage n'oublie pas d'échapper le $

    enfin après la modification, tu as un filehandle $in ouvert en écriture sur ton ficher, c'est lui que tu dois utiliser, pas ton nom de fichier. Ça dégagera ton erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # On ouvre le fichier
    open ($in, ">$htaccess") or $msg="Ce fichier $htaccess n'a pu être ouvert : $!";
       # On écrit le contenu
        print $in @lines; # ---> ligne 62
    # On ferme le fichier
    close ($in);
    Et je ne pense pas que Perl aie un problème pour ouvrir les .htaccess, à moins que l'utilisateur qui lance le script n'en ai pas le droit au départ

  6. #6
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Tout d'abord merci à tous les deux pour vos réponses.

    $lines[25] = "#RewriteCond %{REQUEST_URI} !/tcsh.css\$\n";
    Cette ligne est parfaite. Je l'ai testé et fonctionne

    J'ai une question, je voudrais vérifier que les lignes de 25 à 30 commencent par le symbole #. Est-ce que ce début de test pourrait fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if ($lines[25-30] =~ s/#\s+//g;)
    {
       print "Le site est en ligne\n";
    }
    else
    { 
       print "Le site est en maintenance\n";
    }
    Merci

  7. #7
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    je ne pense pas que cela fonctionne.

    déjà $lines[15-20] te donnera l'élément situé a la 5e position avant la fin ou undef si ta liste n'est pas assez grande

    la notation correcte est @list[1..3] mais ton test ne peut pas être appliqué tel quel.

    Jettes donc un coup d'œil aux fonctions grep et map

  8. #8
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Bonjour Gardyen
    Citation Envoyé par Gardyen Voir le message
    la notation correcte est @list[1..3] mais ton test ne peut pas être appliqué tel quel.
    Et pourquoi ?

    le premier test de mon script permet de savoir via un message affiché à l'écran si le site est en maintenance ou pas. Donc je dois vérifier si les lignes de 1 à 5 sont commentées, donc le test est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (@lines[1..5] =~ /^#/)
    {
      print "Le site est opérationnel";
    }
    else
    {
      print "Le site est en maintenance";
    }
    Qu'en penses-tu ? C'est le seulement le premier test

  9. #9
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Par défaut
    Olivier,
    as-tu la possibilité d'ajouter dans ton .htaccess un tag autour de ces lignes ?
    Si oui tu peux fonctionner autrement

    Disons que ton .htaccess ressemble maintenant à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # This website is in maintenance
    #-#START#-#
    RewriteCond %{REQUEST_URI} !/tcsh.css$
    RewriteCond %{REQUEST_URI} !/img/back.gif$
    RewriteCond %{REQUEST_URI} !/img/obsd.gif$
    RewriteCond %{REMOTE_ADDR} !^41\.201\.2\.120
    RewriteRule . http://www.oregnier.org/$ [R=302,L]
    #-#STOP#-#
    Ce code va parcourir le fichier et se contenter d'afficher la ligne
    si nous ne sommes pas entre les tags.

    Une fois dans les tags,
    il va retirer les espaces et les # en début si $enable est vrai.
    il va mettre un '# ' si $disable est vrai.

    Ce code se contente d'afficher les modifications.
    Il reste à gérer la modification dans le code actuel, le plus propre
    étant de passer par File::Temp et d'inverser les fichiers ce qui permet
    en plus de se garder une copie de secours.

    Le gros du boulot est fait par les regexp dans le range operator
    /foo/ .. /bar/
    Il est vrai au premier foo rencontré et jusqu'au bar suivant.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #!/usr/bin/perl
    use warnings;
    use strict;
     
    my $enable  = 1;
    my $disable = not $enable;
     
    my $tag_start = '^#-#START#-#';
    my $tag_stop  = '^#-#STOP#-#';
     
    my $file = '/tmp/.htaccess';
    open my $fh, "<$file" or die "$file : $!";
    while(<$fh>) {
        if(/$tag_start/ .. /$tag_stop/) {
            if(not /$tag_start|$tag_stop/) {
                if($enable) {
                    s/^[# \t]+//;
                }
                elsif($disable) {
                    s/^[# \t]*/# /;
                }
                else {
                    die "cas non gere\n";
                }
            }
        }
        print;
    }
    close $fh;
    David "Sniper" Rigaudiere

  10. #10
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Bonjour David
    Citation Envoyé par drigaudiere Voir le message
    Olivier,
    as-tu la possibilité d'ajouter dans ton .htaccess un tag autour de ces lignes ?
    Non pas à ma connaissance mais je vais garder ton code dans un coin car il peut servir pour d'autres fichiers de configuration

    Bonjour jedai

    Ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sub all (&@) {my $block = shift; $block->($_) || return 0 for @_; 1 }
    fonctionne très bien.
    J'ai commencé par produire ce morceau de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    sub check_file ()
    {
    	open my ($in), '<', "$htaccess" or die "$htaccess : $!";
    	my @lines=<$in>;
    	    if (all {m/^#/} @lines[1..5])
    	    {
    	    	$value="Disabled";
    	    }
         	    else
        	    {
    		$value="Enabled"; (code pour supprimer le # => à faire)
    	    }
    	close ($in);
    }
    ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    if ($cgi->param("submit"))
     
    {
    	open my $in, "<$htaccess" or die "$htaccess : $!";
    	my @lines=<$in>;
    	    if ($value eq "Disabled")
    	    {
    	    	print $in @lines[1..5] =~ s/^\#//;
    	    }
    	    else
    	    {
    	    	$value="Disabled";
    	    }
        close $in;
    }
    Lorsque $value est égale à Disabled, je voudrais supprimer le symbole # devant les 5 lignes mais malheureusement, cela ne fonctionne pas, il doit manquer quelque chose $value correspond au texte de mon bouton submit.

    Merci

  11. #11
    Membre Expert
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Par défaut
    Bonjour Olivier,

    Comme te l'as dis Jedai, une regex ne s'aplique qu'à un scalaire... Utilise donc map :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @int = map (s/^#.//, @lines[1..5]);
    print $in @int;
    Code non test, pas beaucoup de temps...

  12. #12
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Citation Envoyé par Woufeil Voir le message
    Bonjour Olivier,
    Comme te l'as dis Jedai, une regex ne s'aplique qu'à un scalaire...
    Effectivement
    Citation Envoyé par Woufeil Voir le message
    Utilise donc map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @int = map (s/^#.//, @lines[1..5]);
    print $in @int;
    Ok
    Citation Envoyé par Woufeil Voir le message
    Code non test, pas beaucoup de temps...
    Ne t'inquiète pas, ce n'est pas à toi de tester c'est mon rôle

    Merci

  13. #13
    Membre Expert
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Par défaut
    Ne cherche même pas, c'est totalement faux

    J'étais fatigué... Voici la bonne commande (testé cette fois ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @int = map ({s/^#+//; $_} @lines[1..5]);
    Désolé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Modifier, supprimer ou ajouter des champs
    Par dudu134 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 15/10/2007, 14h35
  2. Réponses: 3
    Dernier message: 16/07/2007, 15h16
  3. Réponses: 19
    Dernier message: 10/07/2007, 09h24
  4. Réponses: 5
    Dernier message: 17/08/2006, 14h45
  5. Ajout de colonnes en début de table ?
    Par joseph_p dans le forum Oracle
    Réponses: 14
    Dernier message: 16/08/2006, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo