27 oct. 2016

[JSON] Diviser (ou éclater) un fichier avec jq

Je souhaitais éclater un fichier json en plein de petits fichiers.

pour ce faire, il faut installer jq
$ sudo yum install -y jq
j'ai fais ensuite un script (json_spliter.sh):
#!/bin/sh
file=$1
output_dir="splited"
count=1
mkdir $output_dir
cat $file | jq -c -M '.[]' | sed 's/\\"/\\\\"/g' | \
while read line
do
        echo $line > $output_dir/$count.json
        count=`expr $count + 1`
done
Il suffit pour l'utiliser :
$ ./json_spliter.sh fichier.json

[JSON] Convertir un csv en json

on part du principe que l'on est sous linux.
on a installé nodejs avec npm

Tapper :
$ sudo npm install -g csv2json
pour l'utiliser:
$ csv2json fichier.csv
(ce qui va afficher le json à la volée)

on peut donc rediriger le tout vers un fichier:
$ csv2json fichier.csv > fichier.json


17 oct. 2016

[TV] Darknet le côté obscur du web - Envoyé spécial

[Ansible] échapper des accolades dans un jinja2

Ou comment ignorer les variables dans Ansible.

Parfois on a besoin d'échapper des doubles accolades correspondants à une variable.



voilà la technique :
{% raw %}
Anything in this block is treated as raw text,
including {{ curly braces }} and
{% other block-like syntax %}
{% endraw %}

5 oct. 2016

[Secu] Fabriquer une cage de faraday simplement

Article vu sur Korben : http://korben.info/realiser-une-cage-de-faraday-simplement.html

Dans un récent article du New York Times au sujet d'Edward Snowden, on apprenait que ce dernier avait demandé aux personnes qui lui rendaient visite (avocats, journalistes) de mettre leur téléphone dans le réfrigérateur pour éviter les écoutes.

Hmmm... Le réfrigérateur est-il vraiment un cage de Faraday qui permet de bloquer les ondes ?

C'est à ça qu'a voulu répondre Michael Colombo pour le site Make en faisant le test... La caméra tremble, les mains de Michael tremblent... et le résultat est...



Donc, non, le frigo n'est pas une option viable pour bloquer les ondes. Par contre, le shaker à cocktail, ça semble fonctionner.

J'ai aussi testé chez moi avec le frigo, diverses casseroles et la cocotte minute, sans succès et finalement, j'ai trouvé encore mieux et beaucoup plus simple que le shaker à cocktail : La feuille d'aluminium !

Démonstration :



27 sept. 2016

Pourquoi les nouvelles méthodes de travail ne fonctionnent pas…


Être « agile » ne signifie pas tant « écrire ses idées sur des post-its » qu’être capable de vite les modifier, les déprioriser et même les jeter pour toujours s’adapter !

Origine du « culte du cargo » : Au XXe siècle, des aborigènes Mélanésiens crurent que les provisions reçues par leurs colonisateurs via avions-cargo étaient dues à une faveur divine invoquée par le biais de leurs antennes radios !

Ils construisirent alors des imitations de ces antennes en espérant eux aussi profiter de cette faveur divine…



Les origines du culte du cargo

Force fut alors de constater qu’il ne suffisait pas d’imiter les pratiques et coutumes apparentes d’autrui pour obtenir les mêmes résultats !

Source : http://bloculus.com/pourquoi-les-nouvelles-methodes-de-travail-ne-fonctionnent-pas/

pm2 - quelques astuces

Installer pm2

online
npm install -g pm2

offline
aller sur https://github.com/Unitech/PM2/releases et télécharger la dernière version en tar.gz (ex: https://github.com/Unitech/pm2/archive/2.0.15.tar.gz)

$ sudo npm install 2.0.15.tar.gz

Configurer pm2 pour le lancer au démarrage :
Paramétrer pm2 (ici sur centos 7 avec systemd)
# Auto-detect platform
$ pm2 startup
# OR
# Render startup-script for a specific platform, the [platform] could be one of:
#   ubuntu|centos|redhat|gentoo|systemd|darwin|amazon
$ pm2 startup [platform] -

pm2 startup systemd

Générer le fichier systemd
$ sudo su -c "env PATH=$PATH:/usr/bin pm2 startup systemd -u stan --hp /home/stan"
ensuite il faut lancer la commande :
$ pm2 start process.json
puis ensuite enregistrer le process  :
$ pm2 save
et au redémarrage c'est bon. Après il suffit de gérer le service comme il suit :

sudo systemctl status pm2-init.service

commandes pm2

Liste processus

$ pm2 list
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ memory      │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ index    │ 0  │ fork │ 1314 │ online │ 0       │ 5h     │ 34.801 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
 Use `pm2 show ` to get more details about an app

 Plus de détails sur le processus:

$ pm2 show 0

Plus d'informations sur PM2 : http://pm2.keymetrics.io/docs/usage/startup/

19 sept. 2016

[Low-Tech] Aigles VS Drones

La police néerlandaise utilise des aigles pour lutter contre les drones indésirables
Une solution peu commune face à un problème général

Alors que les modes de vie se modifient avec l’apparition des technologies nouvelles, les autorités ne manquent pas d’inventivité pour suivre le pas. La semaine dernière, les forces de police néerlandaise ont procédé à une démonstration mettant en scène un aigle en train de capturer un drone en plein vol. Il n’y a pas à s’y méprendre, ce n’est pas une confusion faite par l’aigle en cherchant à capturer une proie vivante. Mais c’est plutôt le moyen qu’a trouvé la police néerlandaise afin de lutter contre les drones indésirables.

Selon les dires deMichel Baeten, le représentant de la police néerlandaise, la police utilise déjà toute sorte de solutions technologiques comme les impulsions électromagnétiques ou les lasers pour lutter contre les drones indésirables. Mais en plus de ces outils, elle s’est également lancée dans le projet d’utiliser des oiseaux de proie pour venir à bout des drones volant dans des endroits où ils n’ont pas le droit ou dans des endroits mettant la vie de personnes en danger.



À en juger par la vidéo, cette solution semble prometteuse, car l’aigle fait ce qu’on lui demande. Pour y arriver, la police néerlandaise s’est entourée de l’expertise d’une entreprise tierce afin de dompter cet animal sauvage et l’amener à réagir comme il faut à la vue de certains drones.

On sait déjà que les animaux comme les chiens sont utilisés par les forces de l’ordre en raison de leur odorat hypersensible ou encore les chevaux qui se tiennent aux côtés de l’homme afin de servir de moyens de transport. En ce qui concerne les aigles, on les sait très habiles pour la chasse. Mais passer de la chasse aux animaux à la lutte contre les drones hostiles, il fallait y penser et la police néerlandaise l’a fait. Cette police devient par la même occasion, la première police au monde à utiliser un aigle pour la capture d’un drone survolant une zone interdite ou sensible.

Nous rappelons également que d’autres États ont préféré adopter des solutions plus communes comme l’usage d’armes à feu pour mettre à l’arrêt des drones incontrôlables ou survolant des zones sensibles telles que des aéroports. Le Japon pour sa part utilise des filets pour faire descendre les drones. Mais pour ce qui concerne la police néerlandaise, elle n’a pas manqué d’originalité sur ce coup. Et selon l’agent de police, c’est l’une des mesures les plus efficaces pour lutter contre les drones hostiles.


Source : http://www.developpez.com/actu/104092/La-police-neerlandaise-utilise-des-aigles-pour-lutter-contre-les-drones-indesirables-une-solution-peu-commune-face-a-un-probleme-general/

13 juil. 2016

[AI] Conférence sur le deep learning de Yann LeCun

Conférence de Yann LeCun sur le Deep Learning (apprentissage profond) à l'USI.

Introduction de la vidéo:
Jamais l'intelligence artificielle n'aura été aussi proche d'égaler l'intelligence naturelle qu'avec le deep learning. Notre compréhension actuelle de l'apprentissage machine, la disponibilité de données massives, d'ordinateurs parallèles rapides, et d'inspiration venant des neurosciences contribuent à l'explosion récente de cette nouvelle science qui depuis quelques années révolutionne l'état de l'art en reconnaissance de l'image et de la parole et en compréhension de la langue.Bien que les éléments techniques et scientifiques sous-jacents soient très complexes, la compréhension des principes fondamentaux du deep learning reste accessible à un public de non-initiés. Professeur à l’Université de New York, Yann LeCun est aujourd’hui reconnu comme étant le spécialiste mondial de l’intelligence artificielle et a tout récemment rejoint Facebook pour travailler sur le nouveau programme FAIR (Facebook Artificial Intelligence Research) dont un des bureaux se trouve à Paris. Cette session vous initiera à ce qui sera au cœur de l'intelligence artificielle de demain et de la R&D de Facebook.

1 juil. 2016

Comment créer votre startup de sécurité informatique

La sécurité des informations est devenue une fonction essentielle pour beaucoup d’organisations à l’âge digital et comme de plus en plus d’organisations externalisent leurs besoins en sécurité informatique, des opportunités pour les professionnels de la sécurité digitale de créer leur propre entreprise émergent.

Créer une entreprise
Créer une entreprise en sécurité informatique implique de s’astreindre à certaines régulations et lois. En France, cela signifie définir quel type de structure est préférable – une forme d’autoentrepreneur ou de société. Une société offre une sécurité accru des biens personnels, bien qu’un autoentrepreneur puisse protéger ses biens sous certaines conditions, telle qu’une déclaration de saisie, qui a pour but d’empêcher la saisie d’une maison pour payer une dette professionnelle. Un autoentrepreneur peut choisir de payer ses taxes comme des impôts sur le revenu ou bien comme l’impôt sur les sociétés s’il s’enregistre en tant que AERL (Autoentrepreneur à Responsabilité Limitée), une autre catégorie qui permet de séparer les biens professionnels et des biens personnels. Une société paiera soit l’impôt sur les sociétés ou bien sera taxée au régime du réel. Créer une société est plus complexe que de s’enregistrer en tant qu’autoentrepreneur puisque cela implique l’enregistrement d’un statut de compagnie auprès de la direction des finances publiques, la nomination de dirigeants, ainsi que la publication dans la presse légale. Les sociétés assujetties à la TVA doivent collecter la TVA sur les biens et les services qu’elles proposent et reverser ces fonds au gouvernement.

Qualifications
Un diplôme ou au moins un degré élevé de qualification sur les technologies de l’information fait partie du minimum requis pour toute personne désireuse de créer sa propre compagnie de sécurité informatique. Cependant, les habilitations professionnelles ne s’arrêtent pas à un diplôme. Quelqu’un qui cherche à créer sa compagnie en sécurité informatique ferait mieux d’avoir des certifications professionnelles telles que celles fournies par Microsoft ou Cisco. Les habilitations professionnelles apportent la tranquillité aux clients de la compagnie à laquelle ils confient leurs données de sécurité informatique et que cette dernière sait ce qu’elle fait et qu’elle dispose des qualifications et de l’expertise pour le prouver. La sécurité informatique repose sur la tranquillité, pourquoi dans ce cas une startup sur la sécurité informatique donnerait des raisons à ses clients de douter de son professionnalisme ? 
Toute personne souhaitant créer une startup en sécurité informatique doit s’assurer que les futurs employés embauchés au fur et à mesure que la compagnie se développe ont le même niveau de qualification.

Plans de développement
Les plans de développement sont essentiels à toute personne qui désire créer sa propre entreprise. On imagine souvent le plan de développement comme un document nécessaire à l’obtention de fond et d’investissement de la part d’une institution financière ou autre, mais un plan de développement est plus qu’un document qui permet la levée de fond. En réalité, avoir un plan de développement est très intéressant afin de définir des objectifs dès le début et de suivre les progrès à mesure que la compagnie se développe. Définir un plan de développement permet également à l’entrepreneur de reconsidérer certaines hypothèses, particulièrement si des tiers, plus objectifs, y ont accès et peuvent commenter ce document. Le gérant de l’entreprise peut également visualiser rapidement si deux objectifs ne sont pas en adéquation, comme par exemple les projections de vente et le budget marketing, ce qui lui permet de revoir ses buts.



Création d’un réseau
Dès lors que l’on lance une entreprise, il est primordial de créer un réseau et d’obtenir les noms des différentes compagnies. Créer un réseau est plus que le démarchage de clients potentiels. Cela signifie également créer des liens avec les professionnels de l’industrie visée et se tenir au courant de ce qui se passe dans ce domaine. La sécurité informatique, les professionnels le savent bien, est en constante évolution en matière de menaces possibles ; se tenir au courant de ces développements est donc indispensable à toute startup qui espère attirer des clients et les persuader qu’ils peuvent compter sur elle. Une startup dans la sécurité informatique à tout intérêt à rejoindre son groupe d’entreprises locales ainsi que toute autre association de professionnels du secteur.

Recherche
Se tenir informé au travers d’associations professionnelles est une chose, mais pour toute compagnie de sécurité informatique sérieuse, il est important de mener ses propres recherches sur les menaces actuelles. De nombreuses organisations n’ont tout simplement pas les ressources de se maintenir à niveau des menaces elles-mêmes et seront impressionnées par un fournisseur de service extérieur capable de discuter avec elles des dangers potentiels et de comment les suivre d’un point de vue sécuritaire.

Facturation
Être à la tête d’une entreprise florissante signifie avoir son propre système de facturation de clients et de collecte de l’argent. Pour de nombreuses startups, un système de facturation adapté est au-dessus de leurs moyens, sûrement à cause de ressources limitées mais peut-être aussi par manque de temps. Après tout, une entreprise débutante se doit de se centraliser sur la collecte et le maintien de clients, ce qui peut entraîner une faiblesse dans la partie administrative.

Il est possible de gérer la facturation de manière très efficace pour ces entreprises en utiliseun modèle de facturation créé spécialement pour que les petites entreprises facturent leurs clients. De la même manière qu’une startup de sécurité digitale est experte pour assister les clients dans la protection de leur système informatique, les professionnelles de la facturation ont l’expérience dont les petites entreprises ont besoin pour facturer leurs clients efficacement. Utiliser un modèle de facturation revient à accélérer la facturation et envoyer des modèles de factures qui impressionneront les clients qui verront qu’ils ont à faire à des gens sérieux. Les modèles de facturation peuvent être modifiés à chaque fois afin de prendre en compte tous les détails d’un système de comptes défini. Par exemple, certains clients pourraient demander une séparation détaillée de tous les services ou produits pour lesquelles ils payent.

L’aspect personnel
Démarrer une nouvelle entreprise est très chronophage et pour ceux impliqués dans la startup, ils découvriront qu’ils ne disposent que de peu de temps pour leur vie privée, au moins durant les premières années. Chaque entrepreneur en herbe se doit de parler à sa famille et ses proches pour leurs expliquer qu’il ne pourra peut-être pas passer autant de temps avec eux qu’il le souhaite. S’il peut se dégager un peu de temps libre, il serait sage pour le propriétaire de la nouvelle startup de le passer avec ses proches, ou de faire quelque chose d’agréable plutôt que de se concentrer seulement sur le travail.

Une entreprise de sécurité informatique doit être capable de convaincre les clients qu’elle est une compagnie sérieuse qui prend l’approche la plus professionnelle possible. Avoir des systèmes en place efficaces à toutes les étapes de la relation avec les clients, du marketing aux ventes en passant par l’intégrité du service lui-même et de la facturation des clients est essentiel.


30 juin 2016

[ANSIBLE] Multistage environments with Ansible

Article intéressant concernant la gestion de multiples environnements dans Ansible, et notamment des variables.


Ansible has excellent documentation but one thing I was confused about was the best way to store the configuration for multistage projects: say, different passwords for dev, staging, production. This isn’t really covered in the ansible-examples repo because it’s specific to your project and while the documentation has recommendations, it doesn’t spell it out completely (which I need since I’m an idiot).

In the old days, the easiest place to keep the configuration was in your inventory file. Since these store the server IPs you run your playbooks against, they’re inherently stage-specific. However, storing everything in the inventory can be limiting and is officially discouraged.

Instead, the best practices guide suggests a different structure, one that’s based on keeping your config in the group_vars and host_vars directories. At first glance, the linked example confused me because it seemed to be mixing a lot things together in one file: IP addresses, role assignments, location, datacenter, etc and then mixing these together. However, after some trial & error, talking to some smart folks and a lot of googling, I’ve hit on a structure that’s worked well for my last couple of projects so I’d like to write about it here.

So, let’s take the example above and pare it down to something simpler:

We’ll create an inventories directory and place a “production_servers” inventory file in there.
; inventories/production_servers
[web]
4.2.2.1
4.2.2.2
[database]
8.8.8.8
This file does one thing and does it well, it sorts our server IPs into different groups. Now, “Group” is the magic word here. Whenever we run a playbook with this inventory, Ansible isn’t just loading the inventory. It’s also looking at the group names we set (the header sections of the INI) and then trying to match those to a file with the same name in the group_vars directory. This isn’t explicitly configured, it’s just something Ansible does by default.

So, since we mentioned a “web” group and a “database” group, Ansible will try to load the files “group_vars/web” and “group_vars/database”. These are expected to be YAML key/values lists and we can use them to define all Ansible variables that you likely have sprinkled throughout your roles. For example, the database vars file might look like this:
# group_vars/database
---
db_port: 3306
db_user: app_user
db_password: SuperSecureSecretPassword1
# group_vars/web

---
domain_name: myapp.com
csrf_secret: foobarbaz
Here we’ve defined a few variables you’d use in a role like {{ db_password }} or {{ domain_name }}.

So far, so good. By now, our ansible directory probably looks something like the example below. Keep in mind the group_var file names are based entirely on the header names inside the inventory file, NOT the naming of the inventory file themselves.

    .
    ├── group_vars
    │   ├── database
    │   └── web
    │
    ├── inventories
    │   └── production_servers
    │
    ├── roles
    │   └── ...
    │
    └── my_playbook.yml

Now comes the multistage part. We don’t want to use the same db_password for dev, staging and production, that’d be terrible security. And we probably want to change the domain name. And the SSL certificates. And all sorts of other things, which we’d prefer to maintain in just one place. How can we group the configuration together per stage?


Remember, Ansible will try to load a group_vars file for any group it encounters in your inventory. All it takes to define a group is adding a section for it in the inventory’s INI file. So, why don’t we create a “production” group?
; inventories/production_servers
[web]
4.2.2.1
4.2.2.2
[database]
8.8.8.8
[production]
4.2.2.1
4.2.2.2
8.8.8.8
We’ve now created a production group and assigned all the production servers to live underneath it so they all get the exact same configuration. I haven’t tested it completely but this is really important if your configuration overlaps between roles, such as using the db_password on the web servers.

However, duplicating all of the IP addresses is a real pain and it would super easy to add another web server and forget to update the list at the bottom of the file. Luckily, Ansible has an inheritance syntax to make this easier.
; inventories/production_servers
[web]
4.2.2.1
4.2.2.2
[database]
8.8.8.8
[production:children]
web
database
This example does the exact same thing as the previous version: it creates a group called “production” but now it’s defined as a group of groups. Any IP address added to the “web” or “database” groups is automatically part of the “production” group (at least, when running a playbook with this inventory).

That means we can now create a group_vars/production file where we can group the parts that are specific to this stage:
# group_vars/production
---
domain_name: myapp.com
db_password: SuperSecureSecretPassword1
csrf_secret: foobarbaz
These are the things we’re interested in changing per stage. Other stuff that’s the same 99% of the time like port numbers or standard users, we can leave in group_vars/database.

Now, if we wanted to add a staging setup, we only need to add two files: a new inventory…
; inventories/staging_servers
[web]
8.8.4.4
[database]
4.2.2.3
[staging:children]
web
database
and a group_var/staging config.
# group_vars/staging
---
domain_name: staging.myapp.com
db_password: LessSecretButStillSecurePassword
csrf_secret: St4gingCSRFToken
Notice that the basic format is the same, and we can use this to add any number of stages we like:

    .
    ├── group_vars
    │   ├── all
    │   ├── database
    │   ├── dev
    │   ├── production
    │   ├── staging
    │   └── web
    │
    ├── inventories
    │   ├── dev_servers
    │   ├── production_servers
    │   └── staging_servers
    │
    ├── roles
    │   └── ...
    │
    └── my_playbook.yml

In the above example, we’ve now added a dev stage which probably lists our Vagrant IP as both the web server and db server. You might also notice a group_vars/all file. This is a special file that Ansible loads in every time, no matter what groups you use, making it an excellent place to stash your default config.

So, using this setup we have a working and reasonably well centralized multistage setup in Ansible. We’ve also got the config split out nicely so we can use ansible-vault to encrypt our staging and production settings. This works really well and I’ve used it successfully in a couple projects now.

However, there are a couple gotchas to notice. The big one is inheritance order. If you define a config value in multiple groups (say, “db_port” in both “database” and “all”), then Ansible follows particular rules to determine which one wins. For this setup, the priority from highest to lowest is:

type (web, database)
stage (dev, staging)
the “all” file
This is kind of bad, because we probably want the stage files to take precedence but the type files are overriding. It turns out, this is because we used the “:children” style to define the stage in our inventory. This marks the “web” and “database” servers as children of the “production” group and as the Ansible documentation says “Child groups override parent groups”. We could try to work around it by making more specific groups and controlling the hierarchy more tightly:
[production-web]
4.2.2.1
4.2.2.2
[production-database]
8.8.8.8
[production:children]
web
database
[web:children]
production-web
[database:children]
production-database
But this hasn’t worked in testing for me because when the groups are equal, Ansible does precedence alphabetically so “web” is still overriding “production”. Also, while more specific, this is quite a bit more boilerplate for each ansible file.

In practice, I haven’t used the type specific group_vars files much, instead relying on role defaults or the “all” file. The end result has been much simpler and I don’t have to worry as much about where something is defined.

This brings us to the second gotcha: This is reasonably simple on the small scale but it can be more complex. Super nice guy Ramon de la Fuente told me he’s been running this setup (or one very similar) for a while and has found it a bit awkward to manage as it grows. I haven’t tried it on a very large installation yet but I’m inclined to believe him. You should check out his latest Ansible article for more tips.

Still, for a small to mid-size project, this is a straightforward, practical setup. If you do need very fine-grained control and you’re not running several servers per stage, consider looking into the host_vars directory which is the same thing as group_vars but per server instead of per group. And finally, remember, Ansible’s group system is essentially a free-form tagging system: it’s a simple, powerful way to build any setup you want.

Like, you know, Ansible itself.

Update: Erika Heidi wrote a great add-on post to this that talks about integrating this setup with Vagrant and how to configure your remote servers

The setup presented here is essentially that from the (excellent) Ansible Docs and Mailing List, I’m just explaining it a bit more. Many thanks to Ramon de la Fuente and Rafael Dohms for Ansible feedback, as well as Erika Heidi and Rick Kuipers for proofreading this article.

22 juin 2016

[SECU] si même Zuckerberg ...



Si même Mark Zuckerberg prends ce genre de précautions. Nos VIP devraient peut être en faire de même (chefs d'entreprise, industriels, hommes politiques, etc.)

Source : http://gizmodo.com/wow-mark-zuckerberg-is-paranoid-as-fuck-1782370124

[SECU] Qu'est-ce q'un Ransomware ?

Aussi connu sous le nom de "logiciel de rançonnage" ou "rançongiciel"! Cette infographie de Trend Micro explique bien à quoi correspond ce risque en sécurité et comment l'éviter:


Source: http://www.cnetfrance.fr/news/infographie-le-ransomware-explique-en-image-39838662.htm




Aller plus loin :

15 juin 2016

[ASTUCE] Ses todolist, notes et planning sur une feuille A4

L'article suivant est extrait du blog de David Manise, instructeur de survie, et patron du CEETS (Centre d’Etude et d’Enseignement des Techniques de Survie).
J'ai trouvé intéressante l'astuce qu'il a partagé consistant à faire tenir son planning, ses RDV, ses notes etc. sur une feuille A4. 

Quand on a pas mal de chose à faire ça peut être pratique. Surtout si notre smartphone tombe en panne de batterie. Bref du low-tech,
simple et concis. Bonne lecture.


Source : http://blog.davidmanise.com/todo-list-of-death/
Todo list of death
Bon…  survie ordinaire, mais survie quand-même.
Un ami m’a demandé comment je m’en sortais pour organiser l’énorme masse de boulot, de RV, de déplacements que j’ai.  Et quand je lui ai dit que tout le merdier tenait en général sur une seule feuille A4, il m’a ri au nez.  Et je lui ai montré, et il a compris…  le tout, c’est de comprimer les données grâce à des méta-données symboliques, qui permettent de réduire le blabla.
Donc, en clair, j’ai un bête fichier texte (police à chasse fixe) sur mon ordinateur, que j’édite et que j’imprime au besoin.  Ca me permet d’avoir le truc papier sur moi et de pouvoir ajouter / rayer des tâches sans devoir allumer mon ordinateur pour gérer le planning.  J’ai aussi mon agenda complet de l’année en permanence dans la poche, au moins dans les grandes lignes.  Et je mélange les tâches, les RV, les déplacements, et tout dans le même « log », avec les trucs à faire à peu près dans l’ordre.  Tous les trucs récurrents sont dans ma tête…
Et il y a un petit code tout simple qui permet de s’y retouver facilement.  Je vous montre le truc, vous allez piger tout de suite.  Je vous copie/colle l’exemple.
TODO LIST - 
.tâche  °RV  * important  //départ  \\retour  -projet à suivre

  . truc à faire
  ° 15 juin 1445 : rv trop sympa
* ° 16 juin 1700 : rv important !
  // 19 juin 1900 : aéroport machin, terminal X, #VOL, pays
   . voir untel
   ° 22 juin 1200 LOCAL : RV ambassade
   ° 23 juin 1400 LOCAL : dèj blabla
  \\ 24 juin 1700 LOCAL : aéroport mbidule, #VOL, retour pays
* . REPOS / JET LAG
  - Projet coopération : documentation 4h
  . acheter billets blabla / confirmer @ Matins du monde
  ° RV avec [surnom ou nom codé si jamais je perds la feuille...]
Bref, vous voyez le topo.
J’imprime le tout, je crayonne dessus, et de temps en temps je reporte les gribouillis, efface les trucs faits, etc. dans le fichier informatique, et j’imprime à nouveau.
Voilà, c’est gratuit ;)
David

8 juin 2016

[SECU] Des enregistreurs de frappes camouflés en chargeurs USB

Le FBI alerte ses partenaires de l'industrie privée 15 mois après le début de KeySweeper

Le FBI a publié un PDF qui décrit comment des chargeurs USB génériques peuvent être utilisés pour espionner les frappes de clavier. « S’ils sont placés stratégiquement dans un bureau ou un autre endroit où les individus peuvent utiliser des appareils sans fil, une personne malveillante pourrait potentiellement récolter des informations personnelles, la propriété intellectuelle, des secrets commerciaux, des mots de passe ou d'autres informations sensibles. Comme les données sont interceptées avant d'atteindre le CPU, les responsables de sécurité ne peuvent pas se rendre compte de cette interception de données sensibles », écrit le FBI.

Cette notification est venue 15 mois après que le hacker white-hat Samy Kamkar a mis au point son keyloggeur capable d’intercepter toutes les frappes sur un clavier Microsoft sans fil. Un keyloggeur est un logiciel capable d'enregistrer et capter toutes les frappes sur un clavier sans fil. Le keyloggeur en question ici a été baptisé KeySweeper qu'on peut traduire par « chercheur de touches ».

L’appareil composé d’un Arduino placé dans un chargeur USB pour camoufler son usage, peut être branché. Pendant ce temps, il enregistre chaque touche appuyée sur le clavier dans sa mémoire ou carrément envoie ces données en ligne à l’aide d’une puce GSM, une interface web permet alors de les capter.

Chargeur USB camouflant le KeySweeper



Le KeySweeper démonté. On peut voir la carte Arduino, un moniteur RF et une carte SIM

On se demande pourquoi le FBI a attendu 15 mois avant de prévenir ses partenaires de l'industrie privée à propos de cette menace. Quant à Microsoft, des responsables ont précisé que cette attaque ne concerne que les appareils sans fil qui n’utilisent pas une cryptographie forte pour chiffrer les données transmises entre le clavier et l’ordinateur. La firme a affirmé que ses claviers manufacturés après 2011 utilisent un chiffrement standard avancé, et de ce fait, ils sont protégés contre toute attaque de sniffing.



2 juin 2016

[ANSIBLE] variables playbooks utiles

Quelque fois on aimerait pouvoir récupérer des informations sur des machines distantes. Comme des
données sur le CPU, la RAM, le disque dur, l'interface réseau, le temps, etc.
On peut utiliser ces valeurs pour des différents besoins : remplir un fichier de config, renommer un fichier, utiliser un package 64bits plutôt qu'un 32bits, dimensioner un swap, etc...

Dans la documentation Ansible, le chapitre "playbooks variables" : http://docs.ansible.com/ansible/playbooks_variables.html

CPU
connaitre l'architecture: {{ ansible_architecture }}
information processeur: {{ ansible_processor }}
nombre de coeurs: {{ ansible_processor_cores }}
nombre de CPU: {{ ansible_processor_count }}
nombre de threads par coeurs: {{ ansible_processor_threads_per_core }}
nombre de VCPUS: {{ ansible_processor_vcpus }}
SYSTEME
connaitre le hostname: {{ ansible_hostname }}
connaitre le nom du noeud: {{ ansible_nodename }}
connaitre la famille de l'OS : {{ ansible_os_family }}
connaitre la distribution : {{ ansible_distribution }}
connaitre la release de la distribution : {{ ansible_distribution_release }}
connaitre le numéro de version de la distribution: {{ ansible_distribution_version }}
RESEAU
Connaitre l'IP: {{ ansible_eth0.ipv4.address }}
connaitre le mask : {{ ansible_eth0.ipv4.netmask }}
RAM
mémoire totale : {{ ansible_memtotal_mb }}
mémoire libre : {{ ansible_memfree_mb }}
DATE ET HEURE
La date du jour : {{ ansible_date_time.date }}
L'heure : {{ ansible_date_time.time }}
L'année : {{ ansible_date_time.year }}
DISQUE DUR
La capacité du disque sda: {{ ansible_devices.sda.size }}
connaitre la capacité de la partition sda1 : {{ ansible_devices.sda.sda1.size }}

25 mai 2016

[DevOps] vers un partenariat Jenkins/Microsoft Azure ?

Jenkins noue un partenariat avec Microsoft afin de migrer son infrastructure sur Azure

L'outil d'intégration entend mieux satisfaire ses utilisateurs

Le 23 mai 2016, par Olivier Famien, Chroniqueur Actualités

Source : developpez.net
 
Microsoft vient d’annoncer un partenariat avec l’équipe de développement de Jenkins afin d’héberger l’infrastructure de ce projet sur sa plateforme. Jenkins est un outil open source d’intégration continue. Il offre des centaines de plug-ins afin de construire, déployer et automatiser différents types de projets.

Depuis plusieurs années, explique la firme de Redmond, le projet Jenkins dont l’infrastructure est basée sur Linux s’est appuyé sur plusieurs plateformes pour fournir aux individus et aux entreprises les outils dont nous disposons actuellement. Certains de ces plateformes et serveurs ont été fournis « par les membres de la communauté, d’autres donnés par la générosité par des fondations et des établissements d’enseignement ».

« Comme le projet Jenkins et la demande pour Jenkins ont augmenté, le projet a besoin d’une plateforme Linux plus fiable, plus sure et plus agile sur laquelle construire les prochaines générations de leur réseau de distribution de contenu et des outils Java », souligne Microsoft.

Aussi, pour aider les infrastructures Jenkins à atteindre cet objectif, un partenariat a été conclu entre ces deux acteurs afin de migrer l’infrastructure Jenkins sur la plateforme Azure. De manière détaillée, Microsoft s’engage à travers ce partenariat à fournir « les ressources de calcul et l’expertise technique pour construire un développement moderne et robuste de l’infrastructure de livraison sur Linux et Java dans le cloud Azure.

De même, Microsoft ajoute que « Azure hébergera également le site Web de Jenkins et la version Jenkins qui gère le site. Jenkins offrira Jenkins 2 et les anciennes versions de Jenkins aux équipes dans le monde entier en utilisant l’infrastructure sécurisée et évolutive d’Azure ».

De son côté, Jenkins accueille avec joie ce partenariat et explique les avantages de cette alliance en soutenant ouvertement qu’il « arrive à un moment important, après le lancement récent de Jenkins 2.0, les utilisateurs Jenkins adoptent graduellement le plug-in Pipeline comme code et beaucoup d’autres plug-ins à un rythme croissant, ce qui surélève l’importance de l’infrastructure Jenkins pour la réussite globale du projet ».

Il soutient également que « cette croissance forte et continue a entrainé de nouvelles exigences pour la conception et à la mise en œuvre de notre infrastructure, ce qui nécessite la prochaine étape de son évolution ». Et de conclure que « ce partenariat nous aide à grandir avec le reste du projet en unifiant notre infrastructure existante sous une plateforme complète, moderne et évolutive ».

Manifestement, les deux structures semblent tirer de gros avantages dans cette collaboration. Jenkins qui pourra bénéficier des outils modernes et robustes de la plateforme Azure afin de maintenir la disponibilité de ses outils et Microsoft qui en accueillant ces infrastructures attirera davantage de personnes vers sa plateforme.

Source : Blog Azure, Blog Jenkins

19 mai 2016

[ANSIBLE] interagir avec des webservices

Utilisation du module uri pour interagir avec des webservices HTTP ou HTTPS

Voici plusieurs exemples de l'utilisation du module uri:
    # Check that you can connect (GET) to a page and it returns a status 200
    - uri: url=http://www.example.com

    # Check that a page returns a status 200 and fail if the word AWESOME is not
    # in the page contents.
    - action: uri url=http://www.example.com return_content=yes
      register: webpage

    - action: fail
      when: "'AWESOME' not in webpage.content"


    # Create a JIRA issue
    - uri:
        url: https://your.jira.example.com/rest/api/2/issue/
        method: POST
        user: your_username
        password: your_pass
        body: "{{ lookup('file','issue.json') }}"
        force_basic_auth: yes
        status_code: 201
        body_format: json

    # Login to a form based webpage, then use the returned cookie to
    # access the app in later tasks

    - uri:
        url: https://your.form.based.auth.example.com/index.php
        method: POST
        body: "name=your_username&password=your_password&enter=Sign%20in"
        status_code: 302
        HEADER_Content-Type: "application/x-www-form-urlencoded"
      register: login

    - uri:
        url: https://your.form.based.auth.example.com/dashboard.php
        method: GET
        return_content: yes
        HEADER_Cookie: "{{login.set_cookie}}"

    # Queue build of a project in Jenkins:
    - uri:
        url: "http://{{ jenkins.host }}/job/{{ jenkins.job }}/build?token={{ jenkins.token }}"
        method: GET
        user: "{{ jenkins.user }}"
        password: "{{ jenkins.password }}"
        force_basic_auth: yes
        status_code: 201

Mon besoin initial:

pouvoir reproduire cette commande curl:
curl -XPUT http://localhost:6059/books/test.json -H "Accept: application/json" -H "Content-Type: text/plain" -d '
user=astunix
home=/home/astunix'
en format Ansible:
- name: Create catalog on ElasticSearch
  uri:
    url: "http://localhost:6059/catalogs/{{ book_name }}.json"
    method: PUT
    HEADER_Content-Type: "application/json"
    HEADER_Content-Type: "text/plain"
    body: "user=astunix\n
home=/home/astunix"
  sudo: true
Bien entendu, method peut comporter d'autres options que PUT:
  • GET
  • POST
  • PUT
  • HEAD
  • DELETE
  • OPTIONS
  • PATCH
  • TRACE
  • CONNECT
  • REFRESH

Plus d'information sur le site officiel de Ansible : http://docs.ansible.com/ansible/uri_module.html

[ANSIBLE] ignore_errors

Ou comment ignorer une instruction en erreur dans Ansible


Il arrive que des commandes retourne des erreurs...
Dans certains cas, on peut dire que ce ne soit pas une vraie erreur mais plutôt un WARNING déguisé en ERROR :-)

Dans ce cas là, j'utilise:
ignore_errors: yes
ou
ignore_errors: true
qui fera apparaitre un petit :
...ignoring
juste après le retour d'erreur et passera à l'instruction suivante.

Bien entendu cette fonction est à utiliser avec parcimonie, et il faudra corriger ce fameux code retour en erreur.



26 avr. 2016

[JSON] correcteur de syntaxe

Comment corriger sa syntaxe ou détecter des erreurs?

il peut arriver que l'on oublie ou laisse une virgule là où il ne faut pas. Qu'une accolade ne soit pas fermée...

Ce site est pas mal pour tester son code json:

https://jsonformatter.curiousconcept.com/

21 avr. 2016

[Ansible] Réaliser une tâche si un fichier existe ou pas

Dans Ansible, si l'on cherche à réaliser une tâche, ou simplement l'ignorer, nous pouvons utiliser la fonction "stat" permettant de "variabiliser" le chemin d'un fichier et vérifier s'il est présent ou non avec "variable.stat.exists".


Plus de détail dans l'article ci-dessous (en anglais) dont voici la source : https://raymii.org/s/tutorials/Ansible_-_Only_if_a_file_exists_or_does_not_exist.html


Ansible - Only if a file exists or does not exist

Table of Contents

This Ansible playbook example helps you execute actions only if a file exists or does not exist. If you for example have a command you need to run to generate a certificate (or Diffie Hellman parameters for nginx) you only want to do that once. The command itself is not convergent so it will run with every ansible run. However, the command creates a file and Ansible is able to check if that file exists. If the file exists, it will not execute the action. The same goes for checking if a file does exist and only executing the action if it exists. (The action you want to do will remove that file).

The below example command will generate Diffi Hellman parameters for NGINX ssl. This command creates the file /etc/ssl/certs/dhparam.pem. It should run only if that file does not exist (because only newly deployed servers will not have the file), if the file exist there is no need to run again.
- command: sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 creates=/etc/ssl/certs/dhparam.pem
Ansible has the creates option in the command module. Give it a filename (directories will not work) and if it already exists Ansible will skip the action.

The same goes for only executing an action if a file exists. The command you are using will remove that file, so only if the file is there the action should be executed. Just as the creates option, there is the removes option. For the removes option, you need at least Ansible 0.8.

The below example is for a custom piece of software one of my clients uses. If we deploy a new version, we check out the code repository and run a script to install a new version. That script will only run when the configuration file is renamed to software.conf.upgrade. After the upgrade it renamed that config file to the original software.conf and also puts the config in its database. It is sadly proprietary software and the manufacturer has stated they are not changing the behavior to a more sane default. The below example will only run the upgrade script when the file /etc/software/software.conf.upgrade exists. Since the script removes it, the next time Ansible runs it does not try to upgrade the software.
- command: /opt/software/bin/upgrade removes=/etc/software/software.conf.upgrade
Documentation for the Command Module

If you have other commands which do not support the creates option, you need to first use the stat module and register the result of that. This example is for the Shorewall firewall. We first check if the rules file exists:
- stat: path=/etc/shorewall/rules
  register: shorewall_rules
We fill the shorewall_rules variable with the result of this action. The next two actions add a rule to the rules file and restart the firewall, but only if the rules file exists:
- lineinfile: 'dest=/etc/shorewall/rules state=present regexp="^ACCEPT net0:192\.0\.2\.22 \$FW tcp 5666" line="ACCEPT net0:192.0.2.22 $FW tcp 5666"'
  when: shorewall_rules.stat.exists == True

- command: "shorewall restart"
  when: shorewall_rules.stat.exists == True
If you want to do stuff when a file is not present, you can check if the result is False, like so:
- action: example
  when: stat_result.stat.exists == False


[RHEL / CENTOS 7] Créer un service systemd

Créer un fichier nom.service dans /etc/systemd/system/ avec le contenu si dessous :
[Unit]
Description=Nom Service
After=tlp-init.service

[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/usr/bin/nom-service.ksh

[Install]
WantedBy=multi-user.target
Démarrage du service :
systemctl start nom.service
Activation du service au démarrage :
systemctl enable startup.service

Source : http://www.system-linux.eu/index.php?post/2016/02/26/Cr%C3%A9er-un-service-avec-systemd

[DICO] ETL et ELT

L'ETL (Extract, Transform, Load) est un processus d'intégration des données qui permet de transférer des données brutes d'un système source, de les préparer pour une utilisation en aval et de les envoyer vers une base de données, un entrepôt de données ou un serveur cible. Dans ce processus la transformation des données intervient sur un serveur intermédiaire avant le chargement sur la cible.

Cette fonction s'avère particulièrement utile pour le traitement de vastes ensembles de données hétérogènes dans le cadre de l'analytique du Big Data et de l'informatique décisionnelle.

Une variante est l’ELT (Extract, Load, Transform) qui permet le chargement des données brutes directement sur la cible, où elles seront alors transformées.

L'un des principaux attraits de l'ELT tient à la réduction des délais de chargement par rapport au modèle ETL. En effet, tirer parti de la capacité de traitement intégrée à l'infrastructure d'un entrepôt de données permet souvent de diminuer le temps nécessaire au transfert des données et peut se révèler plus économique.



Source: http://www.lemagit.fr/definition/ETL-et-ELT

13 avr. 2016

Un shell Unix sur Windows 10?

Quand j'ai entendu parler de cette histoire de Shell sous Windows, je dois avoué que je pensais à un poisson d'avril, mais apparemment ça serait vrai! Lire l'article de developpez.net : http://www.developpez.com/actu/97678/Windows-10-la-premiere-build-avec-le-support-du-Shell-Unix-Bash-est-disponible-pour-les-testeurs-du-programme-Windows-Insider/

Windows 10 : la première build avec le support du Shell Unix Bash est disponible

Pour les testeurs du programme Windows Insider


Build 2016, la conférence annuelle de Microsoft dédiée aux développeurs s’est déroulée la semaine dernière et a livré une série d’annonces intéressantes. Parmi celles-ci, le support de Bash dans Windows 10 était l’une des plus surprenantes, mais également des plus appréciées par les développeurs. Pour rappel, Bash (l’acronyme de Bourne Again Shell) est un interpréteur de ligne de commande de type script et le Shell Unix du projet GNU.

Comme Microsoft l’a expliqué, il ne s’agit ni d’une compilation croisée ni d’une machine virtuelle qui permettra d’exécuter l’interpréteur de ligne de commande sous Windows 10. L’exécution de Bash sous Windows 10 sera native, et cela grâce à un partenariat avec Canonical qui a permis la création d'un sous-système dédié, Windows Subsystem for Linux (WSL), capable d’exécuter des binaires Linux. WSL a été discrètement débarqué dans la build 14251 de Windows 10. « La résultante est qu’il vous est désormais possible d’exécuter du Bash natif Ubuntu sur Windows », a annoncé Microsoft lors de sa conférence.

À peine une semaine après l’annonce, les développeurs membres du programme Windows Insider pourront déjà commencer à tester l’interpréteur de ligne de commande, dont le support vient de débarquer dans une nouvelle build de l’OS. En effet, dans un billet de blog dédié à la sortie de la build 14316, Microsoft a annoncé hier que « vous pouvez exécuter Bash en mode natif sous Windows comme annoncé la semaine dernière à la Build 2016 ». La société fournit également les instructions pour installer l’interpréteur de ligne commande sous Windows 10.

Toutefois, avant de se lancer, il est important de rappeler quelques précisions fournies la semaine dernière par Mike Harsh de Microsoft :
  •     tout d’abord, c’est la première fois que cet outil est proposé (et est catégorisé « bêta » pour cette raison) : nous savons qu’il y aura des choses qui ne fonctionneront pas comme vous vous y attendiez. N’espérez pas voir des scripts Bash qui vont fonctionner à la perfection. Mais essayer cette fonctionnalité nous permet de savoir ce sur quoi nous avons besoin de travailler afin de l’améliorer ;
  •     ensuite, bien que vous serez en mesure d’exécuter du Bash en natif ainsi que plusieurs lignes de commande Linux sur Windows, il est important de garder à l’esprit que c’est une boîte à outils développeurs qui a été pensée pour vous aider à écrire et concevoir vos codes pour vos scénarios et plateformes. Il ne s’agit pas là d’une plateforme serveur sur laquelle vous pourrez héberger vos sites, exécuter des infrastructures serveur, etc. ;
  •     enfin, rappelez-vous que Bash et les outils Linux ne peuvent pas interagir avec les applications et outils Windows. Alors vous ne serez pas en mesure de lancer Notepad depuis Bash ou de lancer Ruby sur Bash depuis PowerShell.
Si le Shell Bash ne sera pour l'instant disponible que pour les Windows Insiders, la nouvelle fonctionnalité pourrait débarquer chez tout le monde l’été prochain, avec la mise à jour anniversaire de Windows 10.

Source : Microsoft

12 avr. 2016

[ANSIBLE] fatal: [host1] => Missing become password

En lançant un playbook j'ai obtenu le message d'erreur suivant:
fatal: [host1] => Missing become password
 Mon playbook comportant un :
  sudo: true
et sudo ayant besoin d'un mot de passe que l'on ne peut pas taper, la solution est d'éditer ansible.cfg à la racine de votre répertoire ansible et ajouter :

ask_sudo_pass = yes
Source de la solution :  http://serverfault.com/questions/690644/what-does-localhost-failed-missing-become-password-mean-how-do-i-get-pas

8 avr. 2016

[LINUX]Comment trouver un uuid pour rajouter un disque dans /etc/ftab ?

Je voulais faire un article là dessus et finalement j'ai trouver tout ici : http://www.marmottux.org/index.php/post/2010/10/03/Comment-trouver-un-uuid-pour-rajouter-un-disque-dans-/etc/ftab


Vous avez rajouté un disque dans votre machine et vous souhaitez le rajouter dans /etc/fstab, comment procéder ?

Identifiez le disque :

Avec un disque de 1.5 To ;
dmesg |grep 1.5
3.641155 sd 2:0:0:0: sdb 2930277168 512-byte logical blocks: (1.50 TB/1.36 TiB)
Quelle partition ?
fdisk /dev/sdb
touche p
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1 1 182401 1465136001 83 Linux
quitter touche q
Trouver le uuid
ls -l /dev/disk/by-uuid/
lrwxrwxrwx 1 root root 10 oct.   3 19:14 4a21e0cc-d99d-4203-a6c7-b9fc4ddf4571 -> ../../sdb1
Editer fstab :

Créer le répertoire :
mkdir /mnt/disque
vi /etc/fstab
Rajouter une ligne :
UUID=4a21e0cc-d99d-4203-a6c7-b9fc4ddf4571 /mnt/disque               ext4  defaults        0       1
enregistrer le fichier
:wq
montez le système de fichier :
mount -a
Tapez mount :
/dev/sdb1 on /mnt/disque type ext4 (rw)
Votre système de fichier est monté et prêt à être utilisé

NB : Faites attention aux droits d'accès

1 avr. 2016

[XML] Diviser (ou éclater) un fichier XML

J'avais affaire à un fichier XML assez volumineux (~800Mo).

Pour le traiter j'avais besoin d'un outil pour éclater le fichier (split en anglais) en plusieurs petits fichiers...

J'ai donc installer l'outils xml_split à travers l'outils perl XML Twig (article lié : http://astunix.blogspot.fr/2016/03/centos-rhel-trouver-le-package-lie-une.html)
$ sudo yum install perl-XML-Twig-3.44-2.el7.noarch
Ensuite pour l'utiliser, c'est assez simple, il suffit de tapper :
xml_split fichier.xml
ou utiliser l'option de niveau si le résultat n'est pas intéressant :
xml_split -l 2 fichier.xml


Plus d'information :

xml_split(1) - Linux man page
Name

xml_split - cut a big XML file into smaller chunks

Description

"xml_split" takes a (presumably big) XML file and split it in several smaller files. The memory used is the memory needed for the biggest chunk (ie memory is reused for each new chunk).

It can split at a given level in the tree (the default, splits children of the root), or on a condition (using the subset of XPath understood by XML::Twig, so "section" or "/doc/section").

Each generated file is replaced by a processing instruction that will allow "xml_merge" to rebuild the original document. The processing instruction format is " ?>"

File names are -.xml, with -00.xml holding the main document.
Options

-l

    level to cut at: 1 generates a file for each child of the root, 2 for each grand child

    defaults to 1
-c
    generate a file for each element that passes the condition

    xml_split -c
will put each "section" element in its own file (nested sections are handled too)

    Note that at the moment this option is a lot slower than using "-l"
-s
    generates files of (approximately) . The content of each file is enclosed in a new element ("xml_split::root"), so it's well-formed XML . The size can be given in bytes, Kb, Mb or Gb.
-g
    groups elements in a single file. The content of each file is enclosed in a new element ("xml_split::root"), so it's well-formed XML .
-b
    base name for the output, files will be named -<.ext>

    is a sequence number, see below "--nb_digits" is an extension, see below "--extension"

    defaults to the original file name (if available) or "out" (if input comes from the standard input)
-n
    number of digits in the sequence number for each file

    if more digits than are needed, then they are used: if "--nb_digits 2" is used and 112 files are generated they will be named "-01.xml" to "-112.xml"

    defaults to 2
-e
    extension to use for generated files

    defaults to the original file extension or ".xml"
-i

use XInclude elements instead of Processing Instructions to mark where sub files need to be included

-v

verbose output
Note that this option can slow down processing considerably (by an order of magnitude) when generating lots of small documents
-V

outputs version and exit

-h

short help

-m

man (requires pod2text to be in the path)

Examples

xml_split foo.xml             # split at level 1
xml_split -l 2 foo.xml        # split at level 2
xml_split -c section foo.xml  # a file is generated for each section element
                              # nested sections are split properly

See Also

XML::Twig, xml_merge
Todo

optimize the code

    any idea welcome! I have already implemented most of what I thought would improve performances.
provide other methods that PIs to keep merge information
    XInclude is a good candidate (alpha support added in 0.04).

    using entities, which would seem the natural way to do it, doesn't work, as they make it impossible to have both the main document and the sub docs to be well-formed if the sub docs include sub-sub docs (you can't have entity declarations in an entity)

Author

Michel Rodriguez
License

This tool is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Source : http://search.cpan.org/dist/XML-Twig/tools/xml_split/xml_split

Vim Survival Kit

 https://learn.acloud.guru/handson/f7fcd48d-5126-48de-b7c5-7c3776bd48ce