Skip to content
Snippets Groups Projects
Verified Commit c11370bc authored by Giovannoni Laurent's avatar Giovannoni Laurent
Browse files

first version

parents
No related branches found
No related tags found
No related merge requests found
Pipeline #4057 failed
Showing
with 731 additions and 0 deletions
# Sommaire
* [Architecture](architecture/home.md)
* [Utilisateur applicatif](architecture/user.md)
* [Répertoires des machines Maarch](architecture/directories.md)
* [Droits sur les répertoires et fichiers](architecture/rights.md)
* [Politique de logs](architecture/logs.md)
* [Politique des tâches planifiées](architecture/crontab.md)
* [Installation](installation/home.md)
* [Recette technique d'installation](installation/check_list.md)
* [Mise à jour](update/home.md)
* [Recette technique de mise à jour](update/check_list.md)
* [Exploitation](exploitation/home.md)
* [Monter un disque partagé avec Windows via samba](exploitation/samba.md)
* [Créer un vhost apache](exploitation/vhost_apache.md)
* [Mise en place du https](exploitation/https_apache.md)
* [Créer un service pour fermer les connexions persistantes de postgres](exploitation/pg_wait_connection.md)
* [Protection de l'accès à un répertoire apache par mot de passe](exploitation/protect_directory_apache_by_password.md)
* [Mise en oeuvre de docker](exploitation/docker.md)
* [Commandes utiles](exploitation/tips_commands.md)
* [Dépannage incidents](troubleshooting/home.md)
* [Espace disque](troubleshooting/disk_space.md)
* [Droits fichiers](troubleshooting/disk_space.md)
* [Tâches planifiées](troubleshooting/cron.md)
* [Envoi de mails](troubleshooting/send_mail.md)
* [Java (jnlp, applet)](troubleshooting/java.md)
* [Edition de pièces jointes](troubleshooting/attachments.md)
* [Bug logiciel](troubleshooting/bug.md)
Politique des tâches planifiées
=========================================
Répertoires des machines Maarch
====================================================================
## Les produits
/produit/maarch/
### Maarch Courrier
/produit/maarch/MaarchCourrier
### Maarch Parapheur
/produit/maarch/MaarchParapheur
### Maarch Capture
/produit/maarch/MaarchCapture
### Maarch RM
/produit/maarch/MaarchRM
## Les données
/exploit/maarch/
### Les docservers
/exploit/maarch/MaarchCourrier/docservrers
/exploit/maarch/MaarchParapheur/docservrers
/exploit/maarch/MaarchRM/docservrers
### Les bases de données
/exploit/maarch/Postgresql/
### Les logs
/exploit/maarch/logs/MaarchCourrier
/exploit/maarch/logs/MaarchParapheur
/exploit/maarch/logs/MaarchCapture
/exploit/maarch/logs/MaarchRM
## la configuration apache
/etc/apache/sites-enabled/maarch-courrier.conf
/etc/apache/sites-enabled/maarch-parapheur.conf
/etc/apache/sites-enabled/maarch-rm.conf
Architecture
==============================
Politique de logs
=========================================
Droits sur les répertoires et fichiers
============================================
Utilisateur applicatif
============================================
Installer les images Docker de démonstration de nos logiciels
=========================================
Cette procédure va vous guider pas à pas dans l'installation des images docker Maarch.
Nous possédons des images pour nos deux produits phares : MaarchCourrier et MaarchRM
![Docker](img/docker_maarch.png)
## Prérequis
Afin d'utiliser une image docker d'un logiciel Maarch. vous devez tout d'abord télécharger et installer le logiciel docker pour votre système d’exploitation :
* [Debian](https://docs.docker.com/install/linux/docker-ce/debian/)
* [Ubuntu](https://docs.docker.com/install/linux/docker-ce/ubuntu/)
* [Centos](https://docs.docker.com/install/linux/docker-ce/centos/)
* [Fedora](https://docs.docker.com/install/linux/docker-ce/fedora/)
* [MacOS](https://docs.docker.com/install/linux/docker-ce/docker-ce-desktop-mac/)
* [Windows](https://store.docker.com/editions/community/docker-ce-desktop-windows)
## Conteneur Maarch
Une fois docker installé, vous devez télécharger l'image Maarch. Toutes nos images sont disponibles à https://hub.docker.com/u/maarch/.
Vous pouvez y trouver les images suivantes :
* maarchcourrier - Notre logiciel de gestion des courriers -- Maarch Courrier
* maarchrm - Notre Système d'Archivage Électronique (pour les besoins du secteur privé) -- Maarch RM
* maarchrmap - Notre Système d'Archivage Électronique avec son extension « archives publiques » (pour les besoins du secteur public) -- Maarch RM AP
Pour télécharger une image, la commande à exécuter dans votre terminal est :
* Pour Maarch Courrier
docker pull maarch/maarchcourrier:18.04
* Pour MaarchRM :
docker pull maarch/maarchrm:2.1
* Pour Maarch RM avec son extension archive publique
docker pull maarch/maarchcourrier:18.04
Une fois l'image téléchargée, il faut créer un container qui comportera votre instance émanant de cette dernière.
Pour ce faire deux options s'ouvrent à vous :
* Création d'un container avec une adresse IP fixe
docker run --name {nom de votre instance} -d -p {adresse IP}:8080:80 maarch/{nom de l'image}
* Création d'un container avec une adresse IP dynamique
#docker run --name {nom de votre container} -d maarch/{nom de l'image}
docker run --name maarchrmap -d maarch/maarchrmap:2.1
Cela vous a créé un nouveau container de l'application en mode démon et ayant comme nom, le nom passé en argument.
Cependant, dans le deuxième cas, vous aurez besoin de la commande suivante pour récupérer l'adresse IP du container
#docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' {nom de votre container}
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' maarchrmap
| | |
| ------------------------------------ | ------------------------------------------------------------ |
| ![Information](../img/icon-info.png) | Félicitation, vous pouvez maintenant accéder à votre instance directement à partir de votre navigateur en tapant l'adresse IP du container. |
## Commandes docker
Voici quelques commandes utiles dans la gestion des images et des containers.
* Lister les images téléchargées
docker images
* Supprimer une image
docker rmi {nom de l'image}:{version}
* Lister les containers actifs
docker ps
* Lister tous les containers
docker ps -a
* Lancer un container
docker start {nom de votre container}
Attention ! Il ne faut pas confondre docker run et docker start. Le run crée un container à partir d'une image et l’exécute. Le start exécute un container DÉJÀ existant.
* Se connecter à un container
docker exec -ti {nom de votre container} /bin/bash
Arrêter un container
docker kill {nom de votre container}
Supprimer un container
docker rm {nom de votre container}
| | |
| ------------------------------------ | ------------------------------------------------------------ |
| ![Information](../img/icon-info.png) | Si vous êtes réfractaire aux lignes de commandes, vous pouvez utiliser le logiciel https://www.portainer.io/ qui vous aidera à gérer vos images et vos conteneurs pour effectuer les étapes suivantes. |
## Sources des docker files et installation des produits Maarch sans docker
Pour générer les images docker, nous partons d'un fichier docker file.
Ces fichiers sont hébergés sur notre gitlab ; https://labs.maarch.org/maarch/dockerfiles
Si vous souhaitez installer les produits Maarch, vous pouvez vous servir des commandes inscrites dans les dockerfiles sur un de vos serveurs vierge.
ex de contenu d'un fichier docker file :
...
RUN apt-get update -y && apt-get upgrade -y && apt-get install -y \
apache2 \
curl \
default-jre \
git \
imagemagick \
ghostscript \
p7zip-full \
php-pclzip \
php-pear \
php7.0 \
php7.0-cli \
php7.0-common \
php7.0-gd \
php7.0-mcrypt \
php7.0-pgsql \
php7.0-readline \
php7.0-xsl \
php7.0-zip \
php7.0-curl \
php7.0-mbstring \
postgresql \
postgresql-client \
...
Exploitation
===========================
Mise en place du https
============================================
exploitation/img/basic_auth.png

22.4 KiB

exploitation/img/docker_maarch.png

22.7 KiB

Créer un service pour fermer les connexions persistantes de postgres
========================================================================
## Coupure de liaison avec la base de données
La fermeture des connexions persistantes de postgresql via PHP peut être un problème lorsque la liaison avec la base de données est rompue.
On se retrouve alors avec une erreur de type :
Fatal error: Uncaught PDOException: SQLSTATE[57P01]: Admin shutdown: 7 FATAL: terminating connection due to administrator command server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
![Erreur de liaison avec la base de données](img/pb_persistent_connection.png)
## Installer un service sur le serveur applicatif pour supprimer les sockets en attente de fermeture
Une solution consiste à un installer un service sur le serveur applicatif pour supprimer les sockets en attente de fermeture.
Lorsque la liaison avec la base de données est rompue, PHP a toujours en cache le pool de connexion PDO vers des sockets en attente de fermeture.
Ces dernières sont inutilisables, d'où l'erreur citée plus haut.
On peut consulter la liste des sockets en attente de fermeture à l'aide de la commande (il faut les droits root) :
netstat -anp | grep --regexp="5432" | grep CLOSE_WAIT
Le script PHP suivant permet de repérer ces sockets et de les fermer en tuant le process associé :
#créer le fichier /opt/maarch/killPgCloseWait.php
nano /opt/maarch/killPgCloseWait.php
<?php
$return = killCloseWait(['5432', 'CLOSE_WAIT']);
function killCloseWait ($match = []) {
$matchString = '';
foreach ($match as $aMatch) {
$matchString .= ' grep ' . escapeshellarg($aMatch) . ' | ';
}
if (!empty($matchString)) {
$cmd ='netstat -anp | ' . $matchString . " awk '{print $7}'";
exec($cmd, $output, $return);
if ($return) {
//nothing
} else {
while (list(,$t) = each($output)) {
if (preg_match('/^([0-9]+)/', $t, $r)) {
system('kill '. $r[1], $k);
if(!$k) $killed = 1;
}
}
}
}
}
Il nous reste plus qu'à créer un service exécutant ce code php pour se prémunir des ruptures de liaison avec la base de données lorsque l'on utilise les connexions persistantes de PDO.
nano /lib/systemd/system/killPgCloseWait.service
[Unit]
Description=kill close wait service
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=root
ExecStart=/usr/bin/env php /opt/maarch/killPgCloseWait.php
[Install]
WantedBy=multi-user.target
Démarrer le service
systemctl start killPgCloseWait.service
Paramétrer le service pour qu'il se lance au boot de la machine
systemctl enable killPgCloseWait.service
Vérifier le statut du service
systemctl status killPgCloseWait.service
## Vérifier que le service est efficace
1. Lancer l'application MaarchCourrier depuis un navigateur web
2. Redémarrer le serveur Postgres
service postgresql restart
3. Contrôler que toutes les sockets postgresql au statut **CLOSE_WAIT** sont bien fermées
netstat -anp | grep --regexp="5432" | grep CLOSE_WAIT
Protection de l'accès à un répertoire apache par mot de passe
=================================================
Pour des raisons de sécurité, nous pouvons par exemple vous conseillert de protéger l'accès à l'installeur en ligne de nos produits.
Nous vous proposons une procédure permettant d'autoriser d'y accéder via un login / password.
Il vous suffit d'éxécuter les commandes suivantes sur votre serveur :
su
# création d'un fichier sécurisé contenant le login et le password
htpasswd -c /etc/password_httpd_maarch_install maarch
# exemple de mot de passe : $Maarch*
cd /var/www/html/MaarchCourrier/install
nano .htaccess
# y ajouter le contenu suivant
AuthType basic
AuthName "install area"
AuthBasicProvider file
AuthUserFile "/etc/password_httpd_maarch_install"
Require valid-user
# redémarrer le serveur apache si nécessaire
service httpd restart
Cette procédure permet de mettre en place une authentification basic http.
![Authentification](img/basic_auth.png)
Monter un disque partagé avec Windows via samba
====================================================================
Un disque partagé est souvent utilisé par les scanners comme cible lors des opérations de numérisation.
Pour permettre l’import des pages numérisées notamment via le module Maarch Capture, il convient de monter le disque partagé sur le serveur Maarch.
Pour cela, installer le client Samba et les utilitaires CIFS :
apt-get install samba cifs-utils
Créer le dossier de partage cible et adapter les droits pour l’utilisateur maarch :
mkdir /opt/maarch/scans
chown -R maarch. /opt/maarch
chmod -R 700 /opt/maarch
Créer un fichier .credentials pour l’utilisateur maarch :
sudo mkdir /home/maarch
chown maarch. /home/maarch
nano /home/maarch/.credentials
Saisir les informations de connexion au partage CIFS cible :
username=reader_mailings
password=****
Editer le fichier de configuration des montages réseau :
nano /etc/fstab
Ajouter l’instruction suivante :
//MA_MACHINE_WINDOWS/MON_REPERTOIRE /opt/maarch/scans cifs credentials=/home/maarch/.credentials,uid=1001,gid=1001,vers=2.0 0 0
Sauvegarder le fichier et quitter l’éditeur.
Lancez l’instruction de montage du disque :
mount -a
Commandes utiles
=========================================
---------------------------------------------------------------
## création de fichiers en doublons pour autoimport par exemple
for (( i=1 ; i<=1000 ; i++ )); do cp /in/courrier/tessi_videocodage/import/C_0.pdf /in/courrier/tessi_videocodage/import/C_0$i.pdf; done
---------------------------------------------------------------
## Création d'un tar.gz
tar -zcvf votre_archive.tar.gz votre_dossier/
---------------------------------------------------------------
## Décompresser un tar.gz
tar -zxvf votre_archive.tar.gz -C votre_dossier_cible/
---------------------------------------------------------------
## Extraire un fichier spécifique d'un tar.gz
tar -zxvf indexes_20180429T203402.tar.gz "indexes/45"
---------------------------------------------------------------
## Compression 7z
7z a -y -mx -t7z zz-Archives.7z zz-Archives/
---------------------------------------------------------------
## copier 1 fichier dans n répertoires
for i in $(ls); do cp sourcefile $i;
done
autre exemple : for i in $(ls); do cp
post-commit $i"/hooks"; done
---------------------------------------------------------------
## exécuter plusieurs fois le même fichier php
for (( i=1 ; i<=10 ; i++ )); do php test_ws_store_resource.php; done
trouver les fichiers récements modifiés
find /mydir -type f -mtime -1 -print
---------------------------------------------------------------
## Nettoyer des répertoires
find . -type f \( ! -path "./cache/*" ! -path "./views/*" ! -path
"./styles/*" ! -path "./includes/*" ! -path "./images/*" \) -atime
-150 -print
---------------------------------------------------------------
## liste des ports utilisés :
netstat -ntlp | grep LISTEN
lsof -i:4444 -> donne les processus écoutant sur ce port
---------------------------------------------------------------
## supprimer tous les répertoires .svn
find . -name ".svn" -type d -exec rm -Rf {} \;
Trouver des fichiers plus vieux de 10 jours
find /srv/backups/gandibackups_from_scp -maxdepth 1 -type f -atime +10
---------------------------------------------------------------
## Recherche une chaine de caractère sur tout le système
cd /
grep -r 'info@maarch.org' * > result_search
---------------------------------------------------------------
## Suppression de fichier ou de répertoire avec liste d'exclusion depuis ls
rm -Rf $(ls | grep -v 'wordpress\|phpmyadmin')
---------------------------------------------------------------
## Copier une liste de répertoires importante
ls -1 /home/maarch/source | xargs -i cp -R /home/maarch/source/{} /home/maarch/destination
---------------------------------------------------------------
## Compter le nombre d'éléments dans un répertoire
ls -Al /home/maarch/source | wc -l
---------------------------------------------------------------
## Compter le nombre de fichiers XML dans un répertoire et ses sous-répertoires :
find /opt/maarch/imports/autoimport/CGR_REPRISE_COMPTA -name '*.xml' | wc
---------------------------------------------------------------
## Liste des fichiers avec juste la taille (format lisible) et le nom
ls -lh | awk '{print $5, $9}'
---------------------------------------------------------------
## Remplacer des caractères (tokens) dans plusieurs fichiers
sed -i -e "s/PASSWORD_MAIL_DSAF/lemotdepasse\!test/g" *.XML
---------------------------------------------------------------
## Remplacer du texte dans une série de fichiers répartis dans des dossiers
find /var/www/html -type f -exec sed -i 's/5432/5434/g' {} \;
---------------------------------------------------------------
## Liste des fichiers créer il y a moins de 12 jours, exclusion de l'extension .cache et du répertoire www/maarch.com/*
sudo find www/ -type f \( ! -iname "*.cache" ! -iname "*.pyc" ! -iname "*.png" ! -path "www/maarch.com/*" ! -path "www/demo.maarch.org/entreprise_*" ! -path "www/demo.maarch.org/cilbox/*" \) -atime -1 > result
sudo find www/ -type f -atime -5 > result
---------------------------------------------------------------
## Tuer tous les processus d'un utilisateur
ps -aef | grep ^www-data | awk '{ print "kill -9 " $2 }' | sh
---------------------------------------------------------------
## Météo sous invite de commande
curl wttr.in/nanterre
---------------------------------------------------------------
## Signer une applet java avec un certificat
openssl pkcs12 -in ~/OS201403208071.pfx -out mypenfile.pem
openssl pkcs12 -export -in mypenfile.pem -out mykeystore.p12 -name "MyCert"
jarsigner -storepass MaarchCertif2014 -tsa http://timestamp.globalsign.com/scripts/timestamp.dll-storetype pkcs12 -keystore mykeystore.p12 NetBeansProjects/maarchCM/dist/maarchCM.jar "MyCert"
cd /home/lgi/NetBeansProjects
jarsigner -storepass MaarchCertif2014 -keystore ../mykeystore.p12 -tsa http://timestamp.globalsign.com/scripts/timestamp.dll ../NetBeansProjects/maarchCM/dist/maarchCM.jar "mydomain"
---------------------------------------------------------------
## Liste des paquets installés
sudo dpkg-query -l | grep xdebug
---------------------------------------------------------------
## unzip odt
zip -0 -X ../my-document.odt
zip odt
zip -r ../my-document.odt * -x mimetype
---------------------------------------------------------------
## Trouver les derniers fichiers modifiés
find /var/www/html/oem/ -not -path '*.svn/*' -mmin -120
---------------------------------------------------------------
## Trouver un répertoire
find / -type d -name 'httpdocs'
---------------------------------------------------------------
## Redémarrer réseau
sudo ifdown -a
sudo ifup -a
sudo dhclient
sudo start network-manager
sudo /etc/init.d/network-manager restart
--------------------------------------------------------------
## PHP7 Configuring and Switching Versions
Now you have two completely separate versions of PHP installed on your system, so let's have a look at where all the pieces went!
The config files are all in /etc/php/5.6 and /etc/php/7.0 respectively - inside here is where you can configure which extensions are loaded, set the ini settings, and everything else for each version in isolation.
I'm an apache user, and as I mentioned both modules are available. So to switch from one to the other I need to do:
###switch to php7.1
sudo a2dismod php5.6
sudo a2enmod php7.1
sudo service apache2 restart
sudo mv /usr/bin/php /usr/bin/php_BAK
sudo rm /usr/bin/php
sudo ln -s /usr/bin/php7.1 /usr/bin/php
###switch to php7
sudo a2dismod php5.6
sudo a2enmod php7.0
sudo service apache2 restart
###switch to php5.6
sudo a2dismod php7.1
sudo a2enmod php5.6
sudo service apache2 restart
sudo mv /usr/bin/php /usr/bin/php_BAK
sudo rm /usr/bin/php
sudo ln -s /usr/bin/php5.6 /usr/bin/php
---------------------------------------------------------------
## Get new tags from the remote
$ git fetch --tags
## Get the latest tag name
$ latestTag=$(git describe --tags `git rev-list --tags --max-count=1`)
## Checkout the latest tag
$ git checkout $latestTag
---------------------------------------------------------------
## Get last tag of current branch
git describe --abbrev=0 --tags
----------------------------------------------------------------
Increase size of request in apache for REST webservices
###LimitRequestFields 32767
###LimitRequestFieldSize 12392
LimitRequestLine 10000000000000000
-----------------------------------------------------------------
## Docker
### list of local images
docker images
### launch build dockerfile
docker build . -t maarchcourrier
### launch sh for a container
docker exec -it maarchcourrier-develop /bin/bash
-----------------------------------------------------------------
UPDATE users set password = '$2y$10$C.QSslBKD3yNMfRPuZfcaubFwPKiCkqqOUyAdOr5FSGKPaePwuEjG', change_password = 'N' WHERE user_id != 'superadmin';
UPDATE users set password = '$2y$10$Vq244c5s2zmldjblmMXEN./Q2qZrqtGVgrbz/l1WfsUJbLco4E.e.' where user_id = 'superadmin';
UPDATE users set password = '65d1d802c2c5e7e9035c5cef3cfc0902b6d0b591bfa85977055290736bbfcdd7e19cb7cfc9f980d0c815bbf7fe329a4efd8da880515ba520b22c0aa3a96514cc', change_password = 'Y' WHERE user_id != 'superadmin';
UPDATE users set password = '964a5502faec7a27f63ab5f7bddbe1bd8a685616a90ffcba633b5ad404569bd8fed4693cc00474a4881f636f3831a3e5a36bda049c568a89cfe54b1285b0c13e' where user_id = 'superadmin';
-----------------------------------------------------------------
## probleme langues
dpkg-reconfigure locales
## Parcours de toutes les branches et update
for b in "git branch -r | grep -v -- '->'"; do git branch --track ${b##origin/} $b; done
for b in "git branch -r | grep -v -- '->'"; do echo $b; done
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
echo $branch
done
----------------------------------------------------------------
gestion de wikijs
lancement
node wiki start
arrêt
node wiki stop
-----------------------------------------------------------------
## gitbook
gitbook serve
gitbook build
-----------------------------------------------------------------
## mise à jour de develop
git pull
npm i
npm run build-prod
## puis passer sql/develop.sql
-----------------------------------------------------------------
## git pb de conflits
git reset --hard HEAD
git rebase
git fetch
-----------------------------------------------------------------
## supprimer toutes les sockets ouvertes par apache pour postgres
netstat -anp | grep --regexp="5432" | grep apache2 | awk -F" " '{print $7}' | awk -F"/" '{print $1}'
echo kill $(sudo netstat -anp | grep --regexp="5432" | grep apache2 | awk -F" " '{print $7}' | awk -F"/" '{print $1}')
-----------------------------------------------------------------
## Créer un cluster postgres
su -
mkdir /opt/postgtresql
chown -R postgres. /opt/postgtresql
su postgres
/usr/lib/postgresql/11/bin/initdb -D /opt/postgtresql
## Succès. Vous pouvez maintenant lancer le serveur de bases de données en utilisant :
cd /opt/postgresql
/usr/lib/postgresql/11/bin/pg_ctl -D /opt/postgtresql -l fichier_de_trace start
-----------------------------------------------------------------
## Convertir un pdf en imagette png thumbnails
convert -thumbnail 800x1200 -background white -alpha remove install/samples/res_attachments/invitation.pdf install/samples/tnl/invitation.png
-----------------------------------------------------------------
## add execution mode recursively on .sh extensions
find /directory/of/interest/ -type f -iname "*.sh" -exec chmod +x {} \;
----------------------------------------------------------------
## classer les 5 fichiers les plus gros du répertoire
du -ah /home/maarch | sort -n -r | head -n 5
----------------------------------------------------------------
## dupliquer une base de données sur un même serveur
sudo service postgresql restart
se connecter à la base par défaut "postgres"
create database nouvelle_base with template ma_base_a_dupliquer;
----------------------------------------------------------------
## augmenter la taille du disque système à chaud
https://debian-facile.org/atelier:chantier:redimensionner-la-partition-racine-a-chaud-sans-la-demonter
----------------------------------------------------------------
## trouver le dernier fichier d'un répertoire
find . -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "
----------------------------------------------------------------
## supprimer toutes les lignes d'un fichier contenant "RES_ID : "
sed '/RES_ID : /d' travailv1.log > travailv2.log
Créer un vhost apache
============================================
img/icon-info.png

3.41 KiB

img/icon-littlestar.png

3.66 KiB

img/icon-star.png

4.36 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment