﻿
============================================================================================================
Some ideas about services discovery:

* With SLP, we could add more attributes, even optional.
* Consider using UPNP with drag'n'drop, for merging.

============================================================================================================
Bookmarks taken from the "Summary" window.
See display_bookmarks.py and lib_bookmark.py

The idea is to model the current document with a tree of URLs.
At the moment this is just a list.
Building a tree implieds grouping individual URLs into merged URLs: This already works.
A tree of URLs can be handled just like a bookmarks page.
============================================================================================================
Graphic attributes applicable to all objects:
* Check if the owner of an object is similar to the user running the agent.
* Most object belong to a user on this machine: This could be a standard attribute of all objects.
* Any error, or impossiblity to get an information about an object, could be returned.
  We could then add a little graphic information: The goal is to make the D3 rendering, less dull.
* Or attribute to each user, a little icon with the initial of the username.  
============================================================================================================

The idea of merging identical nodes came from RDF: http://www.w3.org/TR/rdf-mt/

This allows identical nodes calculated form several scripts, and several agents running on different 
machines, to be merged into one. This is the role of the universal alias.

============================================================================================================
DOT format allows to create embedded graphes.
This can be used to gather urls into parents, parents of parents etc...
This is similar to the representation of bookmarks.htm file.
Also, the concept is the same as merging ruls, then merging the merged urls etc...
At each level of imbrication, it will be possible to implode graphes,
that is, to replace all objects of an URL by a single object,
keeping only the links between internal nodes (Now replaced by a single one)
and external nodes. 
============================================================================================================

"A responsive table will display a horizontal scroll bar if the screen is too small to display the full content.
Resize the browser window to see the effect. To create a responsive table,
add a container element (like div) with overflow-x:auto around the table element:"
https://www.w3schools.com/css/tryit.asp?filename=trycss_table_responsive

============================================================================================================

RRD data store ? http://en.wikipedia.org/wiki/RRDtool

========================================================================================================================
http://www.ntcore.com/pedetective.php
http://bob.droppages.com/projects/peid
https://reverseengineering.stackexchange.com/questions/3362/how-to-know-in-which-language-technology-program-exe-is-written

https://www.logilab.org/project/pyreverse

============================================================================================================
Representation: Visio VSD

=============================================
http://docs.fedoraproject.org/en-US/Fedora/17/html/System_Administrators_Guide/sect-System_Monitoring_Tools-Net-SNMP-Retrieving.html

HOST-RESOURCES-MIB::hrSWRun  	 Contains a listing of all running processes.

============================================================================================================
As a design rule: Scripts are redundant. This means that several scripts might return the same information,
or redundant data etc... But identical data is merged, which makes redundancy invisible.
Redundancy of scripts make the system more robust.
============================================================================================================
Graphic design: Zoom on D3 document.
Sometimes, there are thousands of D3 nodes simultaneously displayed.
It would be nice to a zoom as a magnifying glass, which would focus
on nodes detected by a search engine: Small box where a text can be entered;
The nagnifying class moves to the object whose caption matches the search pattern.
Arrows moves from one object to the next matching the same pattern.
Other possibility: Several magnifying glasses: If many objects, they do not zoom much.
============================================================================================================
FROM HERE, IDEAS, NOTES ETC... CURRENTLY BEING TRANSLATED
============================================================================================================

============================================================================================================

Certaines relations sont plus visibles, representees avec des boites plutot qu'avec des aretes. 

Trouver un moyen de controler le SVG a partir du RDF: listes, arbres etc;..
Par exemple, on sait que les pids sont forcement arborescent, donc on pourrati forcer une presentation.
Ou bien, y a-t-il des "hints" dans le langage dot ?

Ce qui est une liste de listes et a coup sur un DAG peut-etre transforme en record,
surtout si c'est pas profond.
Faut juste parcourir certaines proprietes d'une certaines facon.
Et traiter autrement les nœuds qui font de boucles (Les mettre dans un nœud normal
ou un autre record et meme on s'en fiche)
Mais on n'ajoute pas les aretes quand elles sont implicites dans le DAG.
Meme approche pour HTML.
 
Le resultat d'un browse (net view, tnsnames etc... : Ne pas les relier a la machine principale
si pas de raison particuliere.

http://stackoverflow.com/questions/9869799/service-location-protocol-slp-binding-in-python
Python library for service discovery using SSDP or UPnP?
 
Donc, difficulte: Il faut non seulement publier des URL, mais aussi les categoriser avec un type: "",
"process", "file", etc...
Peuit-etre peut-on ajouter un mot-clef?
 
On peut peut-etre changer le format:
 
SLP ne va publier que le sommet de l'arbre, et on peut interroger pour avoir les listes de scripts,
un peu comme le parcours de directories:
SLP publie http:/machine:host/
 
Alors: http:/machine:host/ renvoie une liste d'URLS, idem http:/machine:host/BY_process,
http:/machine:host/BY_file etc...
et pour vraiment se simplifier la vie, ca renvoie une page HTML qu'on va parser.
 
Est-ce necessaire ??? Non! C'est necessaire uniquement pour fabriquer une liste d'URL pour une entite,
mais c'est déjà renvoye par le RDF
 
============================================================================================================
 
http://stackoverflow.com/questions/243616/visualization-tools-for-huge-graphs
Mais pourquoi pas, mettre a jour un SVG avec du Javascript ???
 
Et il faudrait quelques convertisseurs pour pouvoir regarder n'importe quel source RDF
dans des logiciels de visualisation de graph.
Autrement dit, par exemple, on choisit un url complexe, et on le paste dans un convertisseur,
et ca fabrique immediatement un fichier a downloader ?
En meme temps, ca nous fera travailler le drag'n'drop.
Donc : Une page qui permet de lister les urls habituels. Et en plus, on a quelques icones, "DOT", "GraphML" etc..
et quand on drag dessus un url RDF, ça fait la conversion. Pas idéal mais à force de petits outils,
 on aura toute la souplesse necessaire.
 
Note : On ne peut pas lister les sources qui ont besoin d'un argument (pid, file etc..)
On ne le liste qu'indirectement quand on fabrique un RDF a partir d'une source sans argument.
  
http://semweb.salzburgresearch.at/apps/rdf-gravity/index.html
http://nlp.fi.muni.cz/projekty/visualbrowser/index.html
 
... et dans les softs de visualisation de RDF,
sont-ils capables d'utiliser l'URN d'un vertex quand il génère du RDF ? J'en doute.
 
On retrace l'historique de chaque fichier, on associe chaque entite a un intervalle de temps,
ce qui permet de reconstruire l'état du système a un instant donne.
Du coup, si on retrouve la meme entite dans plusieurs sources RDF, on peut avoir son intervalle de vie total.
  
Fabriquer du DOT intelligemment au lieu de betement créer des aretes :
Ceci afin de faire quelque chose de plus joli.
Notamment, detecter les arbres (Sous-fichiers dans un directory).
 
Idem pour l'arbres des modules : On essaie de rassembler les vertices dans des classes.
 

https://gephi.org/2009/rich-svg-export/
https://gephi.org/toolkit/
http://gephi.org/users/supported-graph-formats/
Ca montre bien qu'il ne faut pas trop s'attacher a un format intermediaire, a part RDF et les formats MIME.
Donc, avoir des chaines de traitement bien modulaires.

Mais pourquoi pas, mettre a jour un SVG avec du Javascript ?
Pas possible apparemment avec le SVG cree par DOT.

Le plus crucial est le traitement RDF.
Et il faudrait quelques convertisseurs pour pouvoir regarder n'importe quel source RDF
dans des logiciels de visualisation de graph.
Autrement dit, par exemple, on choisit un url complexe, et on le paste dans un convertisseur,
et ca fabrique immediatement un fichier a downloader ? En meme temps, ca nous fera travailler le drag'n'drop.
Donc : Une page qui permet de lister les urls habituels. Et en plus, on a quelques icones, "DOT", "GraphML" etc
et quand on drag dessus un url RDF, ça fait la conversion. Pas idéal mais à force de petits outils,
on aura toute la souplesse necessaire.

Est-ce qu'on pourrait utiliser ceci pour nos besoins ???
http://cytoscape.org/what_is_cytoscape.html

Tester absolument ceux-la :
http://www.mkbergman.com/414/large-scale-rdf-graph-visualization-tools/
http://semweb.salzburgresearch.at/apps/rdf-gravity/index.html
http://nlp.fi.muni.cz/projekty/visualbrowser/index.html
... et dans les softs de visualisation de RDF,
sont-ils capables d'utiliser l'URN d'un vertex quand il génère du RDF ? J'en doute.
 
 
Premiere phase est un operateur rdf=>rdf
Construire le graphe des operateurs rdf=>rdf a partir des bookmarks :
Autre facon de visualiser les book-marks : On en fait un RDF.
Google sur les RDF
Longueur maxi d'un URL ? Pouvoir le décomposer facilement en sous-URL.
Ainsi, l'affichage d'une page est la composition d'un opérateur fabriquant du RDF (Eventuellement un simple url),
compose avec un opérateur transformant du RDF en quelque chose d'affichable (Eventuellement du RDF)
 
Il faudrait un framework qui puisse utiliser des url existants.
 
http://www.academia.edu/1424450/A_Software_Reverse_Engineering_Methodology_For_Legacy_Modernization

============================================================================================================

Visualiser du RDF (Nexus, RDF Gravity http://semweb.salzburgresearch.at/apps/rdf-gravity/index.html )
http://swui.semanticweb.org/swui06/papers/Karger/Pathetic_Fallacy.html

http://www.legacysoftware.co.uk/faq.php
www.st.ewi.tudelft.nl/~arie/phds/Kuipers.pdf

============================================================================================================

Pour l'affichage des flux, on peut encore simplifier:
Quand le script en Python, charge de renvoyer un snapshot, est lance,
il va créer une query vers le vrai serveur qui est en train de tourner
En background: Il ne fait q'une redirection. Et donc ce petit script n'a comme role que de
- Par sa seule presence dans l'arborescence des scripts, permettre de le trouver.
- Rediriger la requete vers ce serveur, et d'abord le lancer s'il n'est pas present.
Mais a part ca, on pourrait fort bien l'appeler directement. Si on pouvait enregistrer des URL dans SLP,
par categories, ca reviendrait au meme.
Il y a une erreur de conception dans la facon dont on va chercher les scripts par categorie,
par rapport a ceux qui sont enregistres dans SLP.
On peut peut-etre changer le format:
SLP ne va publier que le sommet de l'arbre, et on peut interroger pour avoir les listes de scripts,
un peu comme le parcours de directories: SLP publie http:/machine:host/
Alors: http:/machine:host/ renvoie une liste d'URLS, idem http:/machine:host/BY_process,
http:/machine:host/BY_file etc... et pour vraiment se simplifier la vie, ca renvoie une page HTML qu'on va parser.
Est-ce necessaire ??? Non! C'est necessaire uniquement pour fabriquer une liste d'URL pour une entite,
mais c'est déjà renvoye par le RDF
============================================================================================================


On veut, a partir d'un graphe qui affiche des ressources, progresser d'une ressource a l'autre.
Autrement dit, quand on clique sur un nœud, on voudrait aller chercher tous les cgi
(Sauf ceux du document courant), les exécuter, ne garder que les arêtes aboutissant a notre noeud,
et fusionner avec l'URL (Avant rdf=>dot) qui a abouti a l'affichage courant.

============================================================================================================

S'arranger pour que copier/coller un nom de fichier dans la saisie de entity, fonctionne.
Il faut que ce soit utilisable de plusieurs facons, et robuste.

Dans Oracle, si utilisateur remote, il faut ajouter le host si different du host courant ? Idem
les icones doivent etre differentes ?

============================================================================================================

import rlcompleter, readline
readline.parse_and_bind('tab:complete')
 
http://blog.e-shell.org/221
 
Ya plus qu'a le mettre dans le autologin si ca exste en python.
  
============================================================================================================
Notre javascript: Rajouter un menu ou on peut cocher toutes les proprietes,
reaffichage immediat.
Idem: Ajouter un menu de tick-box pour les categories d'objets: On les cache ou pas.
On va reutiliser la meme logique en texte et en graphique.

Que fait-on pour les objets ? Ce serait bien de selectionner deux objets
ou sujets, et visualiser le lien entre les deux.

============================================================================================================
On voulait ajouter un time-stamp aux literaux. Pourquoi ne pas leur ajouter
aussi un attribut graphique ?
Ou: Pour les literaux discrets, on batit a la volee une table et on leur attribue
des couleurs. Mais il faudrait que ce soit toujours les memes couleurs,
ou a peu pres toujours les memes.
Comment faire ? Il faudrait reutiliser la table precedente en la completant.
Ou bien attribuer les couleurs aux literaux en conservant
l'ordre d'apparition des literaux.
============================================================================================================

Choisir des parametres pour graphviz, mais aussi
permettre d'afficher du RDF avec d3.
Donc bien separer le merge de la visualisation?
Au lieu de renvoyer du SVG, on renverra du Javascript
avec des appels D3?

Ceux qui fonctionnent sur le vieux navigateur.
Autant etre conservateur. Il nous faut un modele tres general.
Mais idealement il faut melanger des types de graphes differents.

Arbre:
http://mbostock.github.io/d3/talk/20111116/force-collapsible.html
Arbre:
http://mbostock.github.io/d3/talk/20111018/tree.html
Reseau avec zoom: Pratique pour nos arbres
http://bost.ocks.org/mike/fisheye/
Pratique a cause du placement, mais peut-on attraper les noeuds ?
http://bl.ocks.org/MoritzStefaner/1377729

Eventuellement ca pourrait servir a creer des arbres d'URL RDF:
http://bl.ocks.org/benzguo/4370043

http://orgo.stolarsky.com/

Ce genre d'affichage peut servir.
http://www.jasondavies.com/collatz-graph/

http://www.redotheweb.com/DependencyWheel/
Eventuellement ceci car ça rejoint nos preoccupations.
Voir comment on peut le merger au milieu d'un reseau 
d'objets differents.


http://tw.rpi.edu/web/tool/vraer

Adding and removing nodes:
http://stackoverflow.com/questions/11606214/adding-and-removing-nodes-in-d3js-force-graph
============================================================================================================

L'algo qu'on veut modifier pour mettre des tableaux en SVG:
L'utiliser pour mettre des arbres au milieu d'un graphe.
Et aussi le rendre debrayable.
En fonction des proprietes, ca marche ou pas.
Ca ne doit pas etre obligatoire.


============================================================================================================

entity.py?xid=hostname

Si machine courante, afficher aussi le contenu de "top".

Sinon, ajouter traceroute.
Afficher aussi les interfaces reseau.
Les serveurs DNS?

BY_hostname/hostname_nmap.py?xid=hostname:192.168.1.67 affiche plein de sockets et puis c'est tout.
Y a-t-il vraiment de l'information?

============================================================================================================

Dans la page d'un groupe, mettre lien vers la page de tous les groupes.
Idem process et user.

Il faut aussi pointer vers le haut, equivalent de ".." !!!
OUI: Dans le cartouche, on met le lien "TOP" qui envoie vers le niveau tout en haut
selon le cas (process=>process Init, user => liste des users, fichier => "/", etc...).
Different du niveau au-dessus que nous faisons deja.


Type             Script quelconque                                  index.py
addr             ??
com_type_lib     Les typelib.
file             Directory au-dessus                       
group            Les groupes                                        hostname de la machine.
hostname         Ou machines ethernet ? Ou interfaces ?
oracle_db        Le tnsnames.ora ?                                  hostname machine
oracle_schema    Les schemas de la bdd du schema.
oracle_session   Les sessions du schema courant.
oracle_table     Les tables du schema courant.                      schemas de la bdd courante.
oracle_view      Les views du schema courant.                       schemas de la bdd courante.
partition        Les partitions de la machine courante.             hostname machine.
process          Process au-dessus                                  idem
service          Idem services. Peut-etre le niveau d'en haut ?
smbfile          les smbshr de la machine.
smbserver        IMPOSSIBLE. Sauf si machine courante ?
smbshr           Les shares de la machine courante ?
user             Les utilisateurs de la machine courante.

Mais quand on liste tous les objets d'un type (Cad dans un script index.py)
le lien "home" ne peut pas etre le meme
Si IMPOSSIBLE, vers quoi va pointer le lien "Home" des scripts ?
Par exemple, pour les schemas, il faut pointer vers la liste des schemas de la bdd
du schema courant. Donc, on peut s'en sortir si index.py?id=xxx . 
Mais attention, car le meme index sera appele par entity.py, sans ID.
Meme chose a partir de objtypes.py.
On peut s'en sortir en jouant a nouveau sur les nom de scripts:
BY_<type>/index.py    Affiche tous les objets de type <type>, sans argument.
BY_?<type>/home.py?xid=<type>:<id>    Affiche le parent et les siblings de l'objet <type>:<id>

Il faut aussi creer une nouvelle propriete: rdf_parent, mais on peut aussi reutiliser rdf_data
si on ne veut pas encombrer le cartouche.
Du reste, on pourrait mettre les rdf_data dans le cartouche?
Si rien du tout, on prend "entity.py" ?

Oui, mais si on veut dans le cas general, afficher le "parent" de l'objet ? C'est autre chose,
car par exemple la liste des services n'est pas le "parent" d'un service.
Ici: On veut ajouter un lien similaire a rdf_data, qu'on va peut-etre afficher dans le cartouche.

============================================================================================================

Ajouter des infos dans la legende comme quand pas vraiment un message d'erreur.
Ou bien des warnings.

============================================================================================================

Utiliser des frames ?

Pas suffisant de fusionner des urls dans une page seulement, bien entendu.

Peut-on ajouter une page dans un frameset en faisant du drag and drop ? 

Ou alors une frame set fait de trois frames :
- La page courante, entity.py
- Une frame qui permet de cliquer "fusionner", et qui contient la liste des liens selectionnes dans chaque entity.py visite.
- La frame du resultat de la fusion.

Quand on coche un lien dans un entity.py en HTML, ca rajoute une ligne dans la frame de fusion.
Quand on clique cette ligne, ca ramene ce lien dans la page courante (Ou plutot le entity.py qui y correspond ?)

Si on ne permet pas de cliquer les urls dans une page en html, mais qu'on fait uniquement du drag'n'drop dans un frameset, ca permet d'utiliser les mêmes urls.

Meme pas besoin de frameset : On repart de la fenêtre existante : Drag'n'drop de liens, click "Fusion",
on peut rééditer la liste d'urls (Avec un logo de poubelle), on peut cliquer individuellement sur les liens.

http://www.w3schools.com/jsref/event_ondrop.asp
<div ondrop="myFunction(event)"></div>
Execute a JavaScript when a draggable element is dropped in a <div> element:

A la limite on pourrait meme fusionner immediatement, des le drop. En revanche, trouver un moyen propre de virer les urls.

http://stackoverflow.com/questions/21143504/drag-and-drop-how-to-get-the-url-of-image-being-dropped-if-image-is-a-link-not

============================================================================================================
Pour les fichiers, trouver un moyen de sauter une etape:
Donc avoir les scripts mais aussi un ou deux liens preferentiels.

C'est comme si EntityUri() rendait un lien different.
Ou bien que entity.py?xid=file:xx.yyy appelle en fait  
sources_types/file/file_directory.py?xid=file:xx.yyy
mais garde un lien vers le "vrai" entity.py ?

Ou bien deux frames:
* Une contenant les scripts de entity.py.
* Une autre qui contient l'execution de file_directory.py
Autrement dit: Si on est dans la frame de navigation, entity.py appelle file_directory.py.
Sinon ca procede comme d'habitude.
Ou bien: Pour les directory, on appelle toujours file_directory.

AUSSI: Ne pas afficher file_directory.py si ce n'est pas un directory, justement.

Autres explorations:
Sous-processes.

Autre possibilite: On ajoute dans les informations, un lien vers le script de navigation.
Mais le texte d'information devra etre raccourci.

Autrement dit: Pour certains types, on peut mettre dans les infos, pas seulement un literal,
mais aussi un lien vers un script. Surtout pas (Actuellement) un lien vers une entite
car ca casserait la logique d'associer un icone SVG a chaque entite afin d'avoir un graphe.

Aussi: C'est lie a l'affichage , dans les listes de fichiers, de petites infos, sur une autre colonne.

============================================================================================================
Il faut creer un rect pour la table, comme ca, d3.force fera le placement.
Implicitement, une arete qui se dirige vers cette matrice va vers chacun des <tr>.
On va commencer par ca, ca resoud la plupart des cas.
Mais en plus, des <tr> ayant des aretes qui se dirigent vers d'autres nodes
vont eux aussi recevoir un rect. Toutefois:
* Ces rect aurant toujours la meme position relativement a la table: "fixed=True".
* Il y a a moyen, je crois, de donner le point d'attache sur le rect ou ces aretes se connectent:
Il faudrait permettre seulement les cotes gauche ou droite.

D'abord, mettre une table

http://bl.ocks.org/AMDS/4a61497182b8fcb05906

Le sort ne fonctionne pas mais on peut au moins commencer avec ca.


D'apres cet autre site, on voit bien que c est une fonctionnalite de D3:
http://bl.ocks.org/biovisualize/1226718

============================================================================================================

Exemple de JQuery pour alleger le style (Mais d3.json fait ca aussi bien):

    $.getJSON("../api/GridType/GetGridTypes", function (objectJson) {}; );

http://api.jquery.com/jQuery.post/

// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
var jqxhr = $.post( "example.php", function() {
  alert( "success" );
})
  .done(function() {
    alert( "second success" );
  })
  .fail(function() {
    alert( "error" );
  })
  .always(function() {
    alert( "finished" );
  });
============================================================================================================

https://stackoverflow.com/questions/10363526/pycharm-running-wayyyy-slow
Memory upgrade ?

============================================================================================================
IIS Express et WSGI ??
============================================================================================================
Options:
* Blink connected nodes.
* Delete nodes par types d'aretes.
* Delete nodes venant d'un URL.
============================================================================================================
Installation sur OVH:
Python 2.7
Modules manquants:
psutil   : Tant pis.
six      : Peu utilise, heureusement.
rdflib   : On cree un module de meme nom ou bien on renomme.
           De toute facon, on sait qu'on est compatible, alors on peut aussi bien
           renommer et travailler sur une liste de triplets.
isodate  : Jamais utilise directement, uniquement a travers rdflib.

De4mander a leur forum.


Si SLP, on peut utiliser les attributs pour dire quel genre d'info est stockee,
quel est l'index etc...
D'un autre cote ca nous oblige a coller a SLP.

Peut-etre utiliser nmap qui peut renvoyer des infos interessantes sur le reseau ?

Eventuellement RDP (Remote Desktop Protocol) pour avoir une liste de processes sur les
machines Windows.

Transformer une operation de merge en une source d'informations: Il suffit de lister
son URL, enregistrer ses parametres et declarer avec SLP par exemple.


=============================================
UDP:
Etablir la correlation entre:
* Des trames UDP venant d'un certain process, vers une adresse multicast donnée (Ou
bien eventuellement on regroupe) et un port donné.
* Des processes qui manifestent une certaine activité quand cette trame
arrive. Comme cette trame est traitée dans du code utilisateur,
et pas forcement dansune librairie donnée, on ne peut que se referer
a l'activité CPU.

Toutefois, on peut s'aider de lsof/netstat pour reduire le nombre
de processes possibles?

On pourrait se connecter a tous les messages TIBCO et verifier les processes
qui reagissent. Ca revient au meme probleme:
- Des evenements d'une part (Trames UDP ou n'importe quoi d'autre
associés soit a une adresse IP ou bien un sujet tibco)
- D'autre part la reactivite des processes.

Voir si on pourrait maquetter avec gdb, ptrace etc...
=============================================

On voudrait integrer ceci: On prend un CSV quelconque et on genere
un graphe. Ca, c'est l'equivalent de "rdfdot", la transformation en quelque chose de visible.
http://d3-generator.com/

Mais on veut aussi permettre de faire des traitements numeriques sur les CSV,
style moyenne, somme etc... qui eux-memes generent d'autres CSV.

Bref: On va avoir des liens qui generent du CSV, eventuellement en continu.
On utilise le mime type: text/csv, pour appeler le bon programme.

On pourrait associer un predicat RDF a un nom de colonne CSV.
Et une valeur CSV a un litteral associé a ce predicat.
=> Modifier les valeurs d'un fichier dot grace a un CSV.
=> Et creer un petit RDF representant le header d'un CSV.

Par exemple, le resultat d'un "ps -ef" peut creer un RDF.

Du coup, transformer des triples RDF en CSV.
Et aussi, lire un CSV et, en javascript, mettre a jour
le RDF et donc les fichiers .dot et SVG.
Par exemple pour reconstituer des evenements,
visualiser un vmstat dans un graphe SVG.

============================================
http://www.w3.org/TR/rdf-mt/

Il faut s'assurer que le merge permet par exemple que processes ayant le meme
pid se retrouvent fusionnes.
Si ce n'est pas le cas, il faut une regle permettant de construire le meme URN
par exemple pour le meme pid.

Quelles sont les regles du merge en RDF ????

http://www.w3.org/TR/rdf-mt/

To merge N-Triples documents it is necessary to check if the same nodeID
is used in two or more documents, and to replace it with a distinct nodeID
in each of them, before merging the documents.

Ca veut dire qu'il ne faut surtout pas creer des blank nodes en esperant que
le merge de RDF sera capable de les fusionner.
==============================================
Details sur les CSV et les mime-type:
http://stackoverflow.com/questions/398237/how-to-use-the-csv-mime-type

http://stackoverflow.com/questions/15457752/proper-syntax-for-optional-header-parameter-for-text-csv-mimetype

http://blog.teksol.info/2009/04/06/returning-csv-data-to-the-browser-revisited.html
text/csv; charset=UTF-8; header=present

==============================================
Periodicite: On en revient a notre probleme de snapshot CPU+memoire
qui determine tout.

On pourrait faire simple, se focaliser sur /proc,
mais faire des traitements complexes derriere.

============================================
Avec DOT, on peut, je crois representer des graphes imbriques.
S'en servir pour mettre representer la hierarchie des sous-processes
sans modifier le dessin d'ensemble.
Aussi, probablement necessaire pour AC2.

============================================
Dans KDE, dessin des rectangles emboités pour representer des
grandeurs imbriquees: Treemap: http://bl.ocks.org/mbostock/4063582
Ou des cercles:
http://bl.ocks.org/mbostock/4063530

La aussi, on peut mettre notre connaissance des OS.
Par exemple decomposer un executable en ses librairies (Visualiser ldd),
au point de vue de la taille mais aussi du temps passe dans le code.
Ou un dtrace.
Ou un strace en prenant en compte la creation des sous-processes.
============================================
Detecter des dependances:
 Echantillonner l'etat des processes.
grep  "State:[   ]*[A-RT-Z]" /proc/*/status

Correler avec d'autres evenements.
http://www.mathworks.com/matlabcentral/answers/60725

https://en.wikipedia.org/wiki/Mutual_information

Arriver a correler un network storm avec l'activité de tel ou tel process.
============================================
Liens entre les pages de visualisation.

On doit avoir sur une meme page des listes de CGI qu'on peut fusionner
soit en RDF soit en CVS et peut etre un melange des deux.

Mais peut-on melanger tous les liens ensemble?

Exemple:
CGI qui affiche la liste des processes,
et un autre la liste des segments de memoire dans un process
https://www.kernel.org/doc/Documentation/filesystems/proc.txt
cat /proc/self/maps

b55bc000-b56fa000 r--s 00000000 08:01 412045     /var/tmp/kdecache-rchateau/ksycoca
b56fa000-b571d000 r-xp 00000000 08:01 35037      /usr/lib/kde3/konq_sidebartree_dirtree.so
 r = read
 w = write
 x = execute
 s = shared
 p = private (copy on write)

Comment visualiser cette page pour un process seulement?

============================================
A quoi ca sert d'utiliser le format CSV pour des snapshots quand RDF
rend parfaitement le meme service?

Le seul interet du format CSV est pour des donnees en continu,
mais c est quelque chose de particulier que d3 ne couvre a priori pas.

On peut aussi avoir en quelqe sorte des donnees en continu en RDF,
il suffit de rappeler le meme script. Non: L'interet du CSV est
pour des donnees en continu sans polling.
Mais nous, on se concentre sur la logique des processes.

============================================
Choisir des parametres pour graphviz, mais aussi
permettre d'afficher du RDF avec d3.
Donc bien separer le merge de la visualisation?
Au lieu de renvoyer du SVG, on renverra du Javascript
avec des appels D3?
============================================
Les bookmarks ont un titre qui contient des slashes permettant de definir des sous-niveaux.
Pour le renommage, on detruit un ancien nom et construit un nouveau,
c'est la commande update.
On doit donc associer un titre arborescent avec un sous-objet
dans un arbre en json.
============================================
Meta-CGI
Accumuler des triplets d'un cgi rdf.
Ca permet de "moyenner" des snapshots.
============================================
Apparemment, on ne peut pas ajouter de meta-data a un fichier RDF.
L'objectif etait de donner un rapport d'execution d'un URL,
a l'URL appelant. Notamment, on voulait permettre au sous-url
de faire des filtrages de donnees, lourds en CPU et memoire, par exemple
isoler uniquement les triplets relatifs a un noeud particulier.
Le faire au plus bas niveau possible est tres profitable. Et donc,
si le sous-url n'est pas capable de le faire, faire le filtrage
dans l'URL appelant, ce qui est plus couteux.
Aussi, dire explicitement a l'URL appelant que telle ou telle requete n'est pas possible.

Autre approche pour signaler des erreurs:
On renvoie les messages directement dans le document RDF, ce qui fait que
l'utilisateur ne peut pas les eviter.
Par exemple, en creant des nodes artificiels. Mais il faudrait que ca aie un sens,
ce qui est parfois possible.
Autrement dit, on integre les erreurs dans les donnees normales, traitees normalement.
Ca a l'avantage de ne jamais les perdre.
========================================================================================================================

IBM MQ Light
https://developer.ibm.com/answers/questions/14213/how-to-get-vcap-services.html
BlueMix
VCAP_SERVICES
========================================================================================================================
Le mode HTML devrait fabriquer un rapport en texte, decrivant la page.

J ai vu dans les sysinternals tools qu'on peut avoir une description d un exe.

Fichiers ouverts d une autre machine (psfile.exe)

kde kioslave

Lister le contenu des RPM

========================================================================================================================
win32net.NetFileEnum
https://msdn.microsoft.com/fr-fr/library/windows/desktop/bb525378%28v=vs.85%29.aspx

Returns information about some or all open files on a server, depending on the parameters specified.

========================================================================================================================
win32net.NetShareGetInfo
========================================================================================================================
NetSessionEnum
Provides information about sessions established on a server.
========================================================================================================================
win32net.NetSessionGetInfo
========================================================================================================================
win32process.EnumProcesses
========================================================================================================================
win32process.EnumProcessModules
========================================================================================================================
win32ts.ProcessIdToSessionId
Retrieves the Remote Desktop Services session associated with a specified process.
========================================================================================================================

Ajouter les NetGroup aux NetLocalGroup: Quelle est la difference ?

Logiquement, plein de scripts qui sont dans sources_top devraient etre dans sources_types/CIM_ComputerSystem,
avec une valeur par defaut pour le host courant.
Par exemple la liste des processes etc... Sans grande importance: On peut dupliquer ces scripts.
Entretemps, on pourrait, a partir de sources_top, pointer vers les scripts de CIM_ComputerSystem pour  le host courant.

========================================================================================================================

Pour associer la meme entite vue de deux facons, on crée un lien avec la propriete pc.equivalent_node.
Par exemple, si on cree une entite avec son lien wmi, on cree aussi le node comme si le hostname
faisait tourner survol (Ca s'appelle le node canonique decrivant une entite),
et on relie les deux avec pc.equivalent_node

Exemple: le même processus sur Titi vue avec Wmi de ma machine, et en se connectant sur titi.

Donc, si on va merger, on ajoute un argument cgi will_merge_remote_entities.
Si positionne, quand on fait un entite remote, on ajoute son node canonique, cad comme si survol tournait sur le node en question.
Et on relie les deux avec pc.equivalent_node.

Dans le processus de creation dd l affichage, quand on detecte des liens pc.equivalent:
Si le node canonique marche, car survol est installe sur cette machine, alors on affiche normalement
s'il ne marche pas car pas de survol, et si le node canonique est connecte a d autres nodes, on le garde mais non clickable.
Sinon, on n affiche pas le node canonique.
Pour savoir si survol est installe, on peut utiliser slp ou bien des ports par defaut. On suppose qu il est installe.
Ou bien, si equivalent a un node tout seul, on l'affiche comme une propriete, afin de ne pas encombrer
l'affichage.

Seul hic: ce nettoyage intervient lors de la creation du dot: il vaudrait mieux epurer le rdf pour que tous les affichages en beneficient.

Comment definir le node canonique d'une entite qui n'est pas clairement liee a une machine ?
Est-ce qu'une telle entite existe ?

============================================
Sur can_remote
Ca ne sert qu'à planter un script si le remote host est mis.
Mais le script ne sera pas affiché si test variable globale car aucun n'était affiche maintenant.
 Les scripts remote sont affiches autrement, sans exploration et ce test est inutile.
Donc ?
========================================================================================================================

Dans obj_types.py, en -dessous de CIM_Process, on affiche "Generic class CIM_Process/memory_regex_search"
alors que c'est un simple module sans ontologie.

========================================================================================================================
Pour associer la meme entite vue de deux facons, on cree un lien avec la propriete pc.equivalent

Exemple: le meme process sur Titi vue avec Wmi de ma machine, et en se connectant sur titi.

Donc, si on va merger, on ajoutr ... ?

Types dynamiques: on ajoute "/" et on remplit certains caches.
Si un type n a pas d ontologie, on peut remonter la hierarchie des modules.
Idem pour AddInfo. Meme logique que pour les attributs graphiques. Et d'ailleurs utiliser le meme code. Peut etre utiliser ca pour les fichiers, si certaines extensions tres specifiques doivent etre traitees a part.
Liens symboliques: entite specifique.
Premiere page: reprendre des elements du desktop pour le look:
Et pourquoi les scripts AC2 dans  entity n ont pas la bonne couleur ?

========================================================================================================================
Pour un process afficher l environnement et essayer d associer quelque chose,
probablement un fichier.
Notamment pour le PATH.

========================================================================================================================

Trier les processes en fonction du langage.

Donc tenir compte du langage. Ce qui permet d'analyser intelligemment les variables d environnement.

Et on peut donner une couleur differente aux processes, trouvee dans les __init__.py.

Interpreteurs: Sous unix, utiliser le shebang.

On a un sous-directory par interpreteur, cad par type de process, avec des scripts specifiques:

* CIM_Process/perl
* CIM_Process/python
* CIM_Process/erlang
* CIM_Process/java
* CIM_Process/shell

La fonction Usable() verifie dans la ligne de commande, si l'interpreteur correspond:
"java","perl", "bash" etc...

Ce qui fait que meme pour du shell, on peut proposer des scripts car on connait le contexte.
Exemple: Analyser la ligne de commande et en extraire les noms de fichiers.


========================================================================================================================
Perl:
On l implemente en Perl appele par du Python car de toute facon Perl est necessaire.

(1) http://metacpan.org/pod/App::Stacktrace
"perl-stacktrace prints Perl stack traces of Perl threads for a given Perl process.
For each Perl frame, the full file name and line number are printed."

$ perl-stacktrace 24077
0x00d73416 in __kernel_vsyscall ()
/usr/local/bin/cpan:11
/usr/local/lib/perl5/5.12.2/App/Cpan.pm:364
/usr/local/lib/perl5/5.12.2/App/Cpan.pm:295
/usr/local/lib/perl5/5.12.2/CPAN.pm:339
/usr/local/lib/perl5/5.12.2/Term/ReadLine.pm:198

Tout en haut, comme les packages Python, on pourrait lister les modules Perl (Style CPAN).
Et donc creer un directory "Langages".

========================================================================================================================

Python:

(1) $ sudo pip install pyrasite
https://news.ycombinator.com/item?id=3014484 It uses gdb
$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope # If YAMA activated, see below.
$ pyrasite-shell 16262
>>> globals()
>>> print(db_session)
>>> run_some_local_function()
>>> some_existing_local_variable = 'new value'
# Le process n est pas interrompu. On peut modifier les variables ! Marche que sous Linux.


Plusieurs scripts possibles:
- Afficher les globales.
- afficher la pile et les locales a chaque niveau.
- Afficher les modules et leurs variables.

Pour un symbole Python, le fichier est un fichier Python.

Les globales sont: process+module+nom autrement dit: pid+symbole.
Si le module est un fichier python, on deduit que c'est une variable python.

Symbole partage par plusieurs processes ? Ce serait shared_mem+symbole.

Un module charge par un process, cest davantage qu'un module dans un fichier: Taille memoire etc...

pdb : Cannot interrupt a running process.
http://stackoverflow.com/questions/4163964/python-is-it-possible-to-attach-a-console-into-a-running-process

(2) Afficher le PYTHON_PATH


========================================================================================================================
Java:
On l implemente en Java appele par du Python car de toute facon Java est necessaire.

(1) http://stackoverflow.com/questions/376201/debug-a-java-application-without-starting-the-jvm-with-debug-arguments
http://docs.oracle.com/cd/E19205-01/819-5257/blabw/index.html

Debugging a Program With dbx using the Process ID:
$ dbx [program_name|program_name{.class | .jar}|-] process_id

(2)http://docs.oracle.com/javase/7/docs/technotes/guides/jvmti/
Java™ Virtual Machine Tool Interface (JVM TI) is a native programming interface for use by tools.
It provides both a way to inspect the state and to control the execution of applications
running in the Java virtual machine (JVM). JVM TI supports the full breadth of tools that need access to JVM state,
including but not limited to: profiling, debugging, monitoring, thread analysis, and coverage analysis tools.

JVM TI replaces the Java Virtual Machine Profiler Interface (JVMPI)
and the Java Virtual Machine Debug Interface (JVMDI).
http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp-spec.html

https://en.wikipedia.org/wiki/Java_Platform_Debugger_Architecture
========================================================================================================================
Shell

(1) Regarder l'arborescence des sous-processes. eventuellement on va y trouver la pile des scripts.
(2) Scanner le script.
(3) Afficher le PATH

========================================================================================================================
Erlang

(1) Live inspection of running code without prior instrumentation is a great feature of Erlang
========================================================================================================================
Mono
On l implemente en Mono appele par du Python car de toute facon Mono est necessaire.

(1) The debugger agent is a module inside the mono runtime which offers debugging services to client programs.
http://www.mono-project.com/docs/advanced/runtime/docs/soft-debugger/
The client library is a C# assembly which uses the wire protocol to communicate
with the debugger agent running inside the mono runtime.

========================================================================================================================
Dans le cas general, afficher les globales si Linux (Mais peut etre aussi Windows si gdb y tourne)

http://stackoverflow.com/questions/6261392/printing-all-global-variables-local-variables

========================================================================================================================
Attach to a running instance of a COM application

Peut-etre Excel ou VBA ? Interroger un process Excel ?

http://timgolden.me.uk/python/win32_how_do_i/attach-to-a-com-instance.html
========================================================================================================================
Recherche des liens qui peuvent relier deux nodes.
Soit on clicke deux nodes, soit on les rentre en ligne de commande,
avec recherche style "class,k1=v1" vers "class,k1=v1".
On execute les scripts des deux classes en essayant de trouver un lien.
On accumule les objets et les relations dans un document RDF.
On peut le faire de facon visuelle et ca ajoute les liens au fur et a mesure dans D3.
========================================================================================================================
Memoriser les URLs de l'edition et les afficher en DOT ou HTML.
Et les sauvegarder dans un format specifique: On revient vers la page de liens !!!
Ca sera:
"class,k1=v1" + "class,k1=v1" - "class,k1=v1" + "class,k1=v1" etc ...
Du coup, ca nous permet de coder le UNDO: En effet, quand on zappe un objet,
il est defini par sa classe et ses proprietes.
Il nous faudra un petit lien qui transforme un URL en sa definition JSON:
primhillcomputers.ddns.net/Survol/survol/entity.py?xid=rabbitmq/manager.Url=LOCALHOST:12345&mode=definition
... renverra:
{
  "class" : "rabbitmq/manager"
  "script": null
  "Url"   : "LOCALHOST:12345"
}

http://primhillcomputers.ddns.net/Survol/survol/sources_types/dbus/bus/dbus_bus_connections.py?xid=dbus/bus.Bus%3Dsystem
... renverra:
{
  "class" : "dbus/bus"
  "script": "dbus/bus/dbus_bus_connections.py"
  "Url"   : "Bus%3Dsystem"
}

Et donc il suffit de memoriser ces objets separes par des + et des -.
Tant pis s'il manque des proprietes, ce qui permet du pattern matching si on remplace "script":null
par "enumerate...py"

NOTE: Dans l'interface, on devrait permettre de soustraire un script.

========================================================================================================================
http://svg-whiz.com/svg/table.svg

Ajouter les nodes “infos” que au moins on puisse les voir.

force layout with images and connection thickness

http://bl.ocks.org/mostaphaRoudsari/82f51f01b4619db2f09f

========================================================================================================================
Il faut commencer a penser serieusement a l'affichage des grandeurs:
Logarithme taille des fichiers.
Idem taille mémoire process.

Changer formes et couleurs des shapes en fonction d'attributs.
  Pour Graphviz
  Et en Javascript aussi.
  Et aussi en HTML, d'ailleurs.

Taille fichier.
Pourcentage CPU
Etat socket.
Fichier ou directory.

========================================================================================================================
Mise a jour automatique. Redesign complet, vu ce qu on a fait avec D3.
Abonnement aux mises a jour pour chaque objet (classes  props).
Plusieurs abonnements: Survol, WBEM, WMI.
Peut-etre y a-t-il du natif avec WMI ou WBEM, c est a dire que ca proposerait des URLS sans meme passer par nous.
On se le permet, c est a dire que pluseurs URLs sont possibles pour chaque node.
Chaque node affiche a droit a samise a jour, qui peut etrainer la creation de nouveaux nodes,
et sa propre destruction.
En cliquant a droite sur un node, on peut s'abonner ou se desabonner, en moderant le rythme
pour ne pas saturer la machine.
========================================================================================================================
Les aretes:
On ne peut pas vraiment les rattacher a un module, justement.
Virer leur definition statique qui ne sert a rien ?
Avoir par nom d aretes, un fichier CSS. Idealement tout est defini par le CSS?
On remplace "pc.xxxxx" par un lookup dynamique sur l object pc, avec creation du Node,
et ca remplacera MakeProp.
Peut etre que les caracteristiques pourraient etre rattachees aux deux nodes:
On afficherait une arete differente, selon les classes et proprietes de ses vertex.
Ex:
   pid(system) <-> pid(rchateau)   : Affichage arete avec tels parametres.
========================================================================================================================
Utiliser les treemaps pour les fichiers (Taille fichier), les process (CPU ou taille memoire) ?
Mais il faudrait pouvoir melanger avec des nodes.
Comment mettre en place plusieurs modes d'affichage ?
========================================================================================================================
Si on met les nodes en table, il faudrait forcer naturellement une distribution en arbre:
Les noeuds montants seraient a gauche, les descendants a droite.
========================================================================================================================

On accumule les nodes d un url. Transparence en fonction du nombre d occurences.

Drag'n'drop de liens.

Créer du JSON pour D3 qui contienne eventuellement des positions calculees par graphviz, Ce qui pourrait accelerer le routage.

Il faut flagguer tous les nœuds avec le numero du script qui les a crees, sachant qu'ils peuvent etre dans plusieurs scripts.

Si D3, on ne tiendrait pas compte des attributs "tree" de la meme facon mais on pourrait tagger des nodes
comme étant la racine d'un arbre pour les proprietes donnees.
Il faut ajouter cette information dans le json.

========================================================================================================================
JMX et Java
http://stackoverflow.com/questions/35593185/is-there-a-jmx-service-url-for-local-non-tcp-connections

http://stackoverflow.com/questions/516142/does-java-6-open-a-default-port-for-jmx-remote-connections/6985565#6985565
========================================================================================================================

https://lwn.net/Articles/725725/

WMI for Linux ?

https://wiki.ubuntu.com/Kernel/Reference/WMI

De toute facon ce n'est pas encore en userspace alors on s'en fout.

========================================================================================================================
https://en.wikipedia.org/wiki/Windows_Script_Host

https://stackoverflow.com/questions/6288580/does-there-exist-a-way-by-which-i-can-use-wmi-classes-in-java
Javascript is available under Windows Scripting Host (WSH). With it, it is fairly easy to access WMI:

var loc = new ActiveXObject("WbemScripting.SWbemLocator");
var svc = loc.ConnectServer(".", "root\\cimv2");
coll = svc.ExecQuery("select * from Win32_Process");
var items = new Enumerator(coll);

while (!items.atEnd())
{
    WScript.Echo(items.item().Name);
    items.moveNext();
}

========================================================================================================================
Utiliser FileAPI pour des infos read-only sur les fichiers.
https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications
========================================================================================================================

Détecter dans la mémoire d'un process, dans des fichiers, des sockets.

Il faudrait utiliser les memes moteurs de recherche quelque soit le domaine :
- URLs
- Noms de fichiers
- requêtes SQL
- Chaines de connexion ODBC
- clefs du registry: HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG

.../...
Domaines de recherche (Pour certains domaines, on doit caler le debut de la recherche :
Cellule CSV, tag HTML, champ table SQL ... Pour d'autres, on cherche vraiment en vrac).
- Fichiers (A priori, tous)
- Mémoire process.
- Socket (Mais c est une recherche au fil de l'eau)
- Peut-être champs de bases de données ?

Voir aussi https://en.wikipedia.org/wiki/Entity_Framework, ADO.NET

========================================================================================================================
Base whois
localisation geographique
https://www.ripe.net/manage-ips-and-asns/db/support/querying-the-ripe-database
ip-api.com/docs/api:json

========================================================================================================================
Renommer "xid=" en "path=" et "entity.py" en "cimobj.py" ou qq chose comme ca.
========================================================================================================================
On garde "notre" wmi en Python car ca marche avec tous les browsers.
On donne la possibilite de surfer uniquement avec WMI
mais avec nos scripts en plus, de facon transparente.
Pour les infos WMI, peut-etre les ajouter dans right-click.

On peut recreer un explorateur, exactement comme en Python.
Trouver un moyen de retraduire ca en Python quand on va basculer dans le mode Print.
Peut-etre des combinaisons de:
index_wmi.py?CLASS.key=val,key=val
ET:
enumerate_wmi.py?CLASS.key=val,key=val
Du reste, il faudrait transformer et generaliser:
enumerate_CIM_Process.py en "enumerate.py?xid=CIM_Process."
qui va appeler enumerate_CIM_Process.py ?
Pouvoir, pour chaque classe, appeler les trois enumerate.
Pour tout objet, on doit pouvoir enumerer les objets de cette classe (Ajouter les liens)
Tenir compte aussi de la clusterization.

Difference en entity.py et enumerate.py ?
enumerate.py affiche moins d'infos
========================================================================================================================


// Dans Chrome:
try
{
    d3.json(theUrl,
        // Est-ce que d3.json verifie la signature de la function ??? JUSTE TESTER POUR VOIR SI MARCHE EN TEMPS NORMAL.
        function(error,data)
        {
            if(error)
            {
                console.log("Caught:"+error);
                var data = { nodes: [], links: [] };
            }
            LoaderCallback(data,funcDisplay,theUrl);

Tester si on detecte les erreurs en mettant de mauvaises requetes WQL.

        // Adds a context menu for the background.
        function AddsDefaultCtxtMenu(dfltItms)
        {
// Si Ni WMI ni python fonctionnent.
            if( dfltItms == null ) {
                dfltItms = {};
            }

========================================================================================================================
Reverse-engineer WBEM et le reproduire avec Ajax ?
Mais il faudra du cross-request.

http://www.wbemsolutions.com/tutorials/snia/SMI/Technical/cim-xml.html

"CIM-XML is the protocol that is used by SMI-S 1.1.0 to exchange CIM and WBEM information
between a Client and a WBEM Agent. CIM-XML uses xmlCIM as the payload and HTTP as the transport.
Currently, both HTTP 1.0 and 1.1 are supported. SMI-S 1.1.0 chose CIM-XML because it required by WBEM.
Moreover,
HTTP is a widely supported protocol that is usable by almost all existing infrastructures and over the Internet."

Using HTTP, SMI-S 1.1.0 can leverage the existing HTTP mechanisms to define extension headers.
A SMI-S 1.1.0 WBEM Agent is required to support the HTTP operations of POST and MPOST.
The CIM Operations over HTTP Specification v1.2 defines specific extension headers
for a Client request and a WBEM Agent response.
Different extension header are defined for single versus multiple (i.e., batch) operations.
The example below shows several CIM-XML extension headers for a GetClass operation on the root/cimv2 namespace

M-POST /cimom HTTP/1.0
Content-Type: text/xml;charset=UTF-8
Accept: text/xml, application/xml
Man: http://www.dmtf.org/cim/mapping/http/v1.0;ns=48
48-CIMProtocolVersion: 1.0
48-CIMOperation: MethodCall
48-CIMMethod: GetClass
48-CIMObject: root%2Fcimv2
User-Agent: Java1.2.1
Host: edoc5-pc
Content-length: 445
<?xml version="1.0" encoding="UTF-8"?>

https://www.synology.com/en-uk/releaseNote/SynoSmisProvider?model=DS1515

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
Access-Control-Allow-Origin: *

Voir avec Jeremie F, demonstration SMI-S.
========================================================================================================================
Micropython
https://forum.pycom.io/
Wipy
========================================================================================================================
Mieux integrer WMI et WBEM ?
Peut-etre les considerer comme scripts, toujours utilisables ?
========================================================================================================================

Faire un URL a partir d'une query WQL: Oui dans une certaine mesure, c'est possible.
Pour les associators, on cree un autre script ?? associators_wmi.py ?xid=CLASS.Key1=Val1,Key2=Val2
Ou bien on decrete que entity_wmi.py et entity_wbem.py renvoie les associators ?
CIM operations over HTTP CIM-XML

http://www.dmtf.org/sites/default/files/standards/documents/DSP0200_1.3.1.pdf
A partir de Javascript. Le probleme est que ca ne renvoie pas du JSON.

JSONP ?
Sauver les mots de passe comme on le fait avec WMI (Qu'il faudra d'ailleurs terminer).

«Geographical Visualisation of CIM Networks Using Google APIs”
"IEC 61968 classes for geographical data”
Si on veut afficher des donnees D3 avec du KML:
·         On s'arrange pour que les distances soient raisonnables en fonction de ce qu'on veut afficher :
·         Tout ce qui concerne un ordinateur tient dans une boite de 30cm*30cm
·         Distances entre machines : 1m si dans un LAN.

Revenir sur SLP et OpenPegasus :
https://github.com/xenserver/openpegasus/tree/master/pegasus/src

https://github.com/brunolauze
Bruno Lauze.

========================================================================================================================

Refresh rate en minutes: Pour afficher la lente disparition des objets, au lieu de deleter,
on fait baisser un compteur et on detruit seulement si le compteur passe a zero.
L'affichage des aretes tient compte des compteurs des liens.
Quand on cree un node, on met son compteur au maxi ou bien on increment s'il existe déjà ?

Remplacer un node : Refresh, en plusieurs passes :
Chaque node recoit un timestamp de la dernière fois ou il a été vu.
- On vire un node qui n'a pas été vu depuis X minutes, parmi tous les nodes appartenant au script (Exclusivement ou pas).
- Ce delai tient compte du taux de rafraichissement ?
- Si on voit un node, on met a jour son timestamp (Valable pour tous les scripts quel que soit le chargement)
- L'affichage du node et des links est plus transparent selon le nombre de generation ou on n'a pas vu le node.
- L'interet est de ne pas faire brutalement disparaitre un objet.
  Mais ca ne s'applique que s'il y a un rafraichissement automatique.

Evidemment on affiche ce timestamp (A propos, reparer le tooltip).
Du coup, ca cree un historique des objets en fonctions des scripts qui leur ont donne des links.
L'historique est fait des links successifs et des objets de l'autre cote, qui ont disparu.
Ex: Pour un fichier, on va avoir la suite des process qui ont ouvert ce fichier, avec le timestamp.
Ca cree un log. On peut imaginer de relier ca avec le resultat du parsing de vrais logfiles.
Et aussi le resultat de strace (truss). Event de Windows, Oracle etc...

Attention si on rafraichit un script qui va prendre une partie d'un log comme strace :
Ne plus voir un objet dans N lignes de log ne veut pas dire que l'objet a disparu.
En revanche, il faut bien les detruire a un moment ou un autre.
Ou alors on le cree, mais on ne detruit pas les objets vus il y a longtemps, et crees par notre script.
Autrement dit, differencier les scripts qui donnent un etat
(et donc peuvent constater qu'un node n'existe plus pour ce script), des scripts qui donnent une suite d evenements.

========================================================================================================================
Choisir l icone:

Utiliser l'extension du fichier, ou le type MIME.

Utiliser pour les dll et .exe, les fonctions, les .obj,
l'icone du langage de developpement qui a ete utilise.

Icone pour un directory entier (Pingouin de Linux etc...)
Et les utiliser dans les SVG.

Calculer un thumbnail si le fichier est une image.


========================================================================================================================

FAIRE DU MENAGE :
=================

Ajouter des pages CSS dynamiquement.
https://stackoverflow.com/questions/4847313/dynamically-add-css-to-page-via-javascript

Modifier ActiveX de facon a tester la creation locale d objets.
On veut que les memes css soient accessibles cote serveur et cote client,
mais qu eventuellement le serveur ne soit pas deploye:

On deploierait uniquement le client qui utiliserait javascript et aurait
une liste pre-etablie de serveurs.
Ca revient a devoir deployer deux fois, sauf qu'on peut ruser:
survol/html/ : html et js
survol/css/ : css
survol/survol/ : python
Du cote client, on peut alors ne deployer que html et css ?
Mais ca ne va pas, car on veut tout regrouper ...
Et quid des images qu'on veut eventuellemetn avoir cote client et serveur ?
Si on veut deployer en client-only, on peut imaginer de copier la meme hierarchie mais sans les fichiers py.
Ce serait alors transparent pour js, selon que la page html est locale ou sur un serveur.
Toujours est-il qu'il faut qu'on charge les CSS a la volee.
Mais ca veut dire qu'on ne tient plus compte des couleurs quand on fabrique du json ?
Ben oui, car les attributs peuvent etre tres complexes,
et il faut laisser toute latitude au graphisme.
=> Python met une couleur si on a.
=> Javascript de toute facon utilise le CSS s'il est la.
A terme, Python parsera le javascript pour generer le DOT.


========================================================================================================================

Voir si ODBC est utilisable/utilise sous Linux. Pyodbc est portable mais ne sait pas acceder toutes les BDD bien entendu.
ODBC a besoin d'un driver pour chaque DBMS. Il faut refleter ca :

* odbc devrait permettre de creer des tables oracle.
* On ne devrait pas avoir besoin de "odbc/table" etc sauf comme table par defaut si on n'a pas le provider.
  Je crois que c'est le cas.
* "oracle/table" et "sqlserver/table" devraient pointer vers "odbc/table" d'une facon ou d'une autre.
  Ou en tout cas leinverse.


https://stackoverflow.com/questions/401358/how-do-i-create-a-dsn-for-odbc-in-linux

For unixODBC, DSNs are listed in /usr/local/etc/odbc.ini.
Installed ODBC drivers will be listed in /usr/local/etc/odbcinst.ini

Donc, avoir la liste des DSN est un concept portable.

Example de odbc.ini :

[testdsn]
Driver=/opt/teradata/client/14.10/odbc_32/lib/tdata.so
Description=Teradata running Teradata V1R5.2
DBCName=208.199.59.208
Username=

Donc, le DSN est bien un lookup dans la liste des DSN.
Et pourtant le mot-clef "DSN=" est admis dans les connections strings.

On pourrait dire que si le parametre CGI est crypte, alors c'est une connection string.
Sinon c'est un DSN, exactement comme maintenant.
C'est different de b64, il faut reellement crypter, car confidentialite.
Et quand on decrypte pour l'affichage, il faut remplacer le mot de passe par "****" par exemple.

Peut-on avoir des DSN qui pointent les uns vers les autres avec DSN=xxx ou FILEDSN=yyy
Difference entre "OLE DB connector" et "Connection String" ? Ca a l'air d'etre la meme chose.

"For some reason there's no WMI class or other COM object designed to retrieve System DSNs.
But that's OK: because this information is stored in the registry we can still write a script to grab and return the DSNs.
As you might expect, that's exactly what the preceding script does:
it opens the registry, zips down to HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC DATA SOURCES,
and then returns the names and values of the all the registry entries found there."

https://blogs.technet.microsoft.com/heyscriptingguy/2005/07/25/how-can-i-retrieve-a-list-of-the-system-dsns-on-a-computer/

On dirait vraiment qu'abusivement, DSN est pris pour "connection string stockee avec un label – ou pas stockee".
Ca nous arrange.
Il faudrait trouver qq chose pour stocker la chaine DSN ou bien la connection string ?
Le type d'objet "odbc/dsn" signifie "le synonyme d'un DSN".

On a besoin d'un dossier SQL server, bien qu'on utilise ODBC :
Tout simplement car on fait des requetes qui ne peuvent fonctionner que avec SQLServer.
Par ailleurs, on est certain que ca genere des tables, vues etc... purement sqlserver.

Toutefois, avoir sqlserver/dsn est redondant : On voudrait utiliser odbc/dsn.
Par ailleurs, plus tard, si on a un acces natif sqlserver, on voudrait utiliser les memes queries.

On peut les mettre dans sqlserver/__init__.py.
Mais il faudrait deux types de scripts, ceux qui prennent "dsn=" (odbc) et les autres ?
Ou alors : On utilise une connection string avec le parametre "dsn",
MAIS ...  on se reserve le droit, selon la connection-string,
localement, de fabriquer la connection nous-meme :

Dans sqlserver/__init__.py on cree la connection avec le parametre "Dsn=" et si on ne sait pas faire,

On va créer une connection grace a odbc/__init__.py : Du coup, pyodbc ne sera importe que dans odbc/__init__.py

Donc on met dans odbc/
* La connection si la connection string n'a pas Driver et qu on n'a que pyODBC.
* Idem tables etc...
* La liste des DSN car c est du ODBC (Dans les registres).

En principe, sqlserver/tables etc.. aurait plus de sens si on etait en natif.
Malgre tout, c'est deja necessaire a cause des requetes particulieres.

Pour le scan qui renvoie du DSN ODBC, on va aller utiliser les requetes odbc/dsn : On a juste besoin du format special
Pour coder et crypter les dsn.
"MY_TRUC_DSN"

Ou "UID=xxx;PWD=yyy;DRIVER=zzz"

Penser a JDBC:
jdbc:odbc:DRIVER=Microsoft Access Driver (*.mdb, *.accdb);DBQ=
jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=

DSN-Less ODBC simply means that instead of storing connection information (like server, database, etc.)
in a file or the Windows Registry, you have plunked them into a connect string,
which is then associated with some data object, like an Access linked table.
Here is an example of the connect string generated by my tutorial:
    ODBC;DRIVER={SQL Server};SERVER=cliff;DATABASE=pubs;UID=sa;PWD=;
http://www.databasejournal.com/features/mssql/article.php/10894_1491011_2

Sous Unix:
"Connections to a data source can be made via a connection string without referring to a data source name (DSN-less connections).
This is done by specifying the "DRIVER=" keyword instead of the "DSN=" keyword in a connection string,
as outlined in the ODBC specification.
A file named odbcinst.ini must exist when the driver encounters DRIVER= in a connection string."
http://media.datadirect.com/download/docs/odbc/allodbc/index.html#page/odbc/dsn-less-connections.html

Bref: Ce qui nous reste a faire:
* Ajouter "DSN=" quand on affiche les listes.
* Arranger MakeConnectionString pour mieux filtrer.
* Crypter la connexion string et ne jamais afficher le mot de passe.
* Ajouter bien plus de mots-clefs.

ADO est capable de faire un lookup dans le registry. Faut-il garder cette possibilite en n'ajoutant pas DSN= au debut ?

"The .NET Framework Data Provider for SQL Server uses its own protocol to communicate with SQL Server.
Therefore, it does not support the use of an ODBC data source name (DSN) when connecting to SQL Server
because it does not add an ODBC layer."

https://stackoverflow.com/questions/15025055/server-vs-data-source-in-connection-string
* Data Source
* Server
* Address
* Addr
* Network Address

https://msdn.microsoft.com/en-gb/library/system.data.sqlclient.sqlconnection.connectionstring.aspx

Tres complet:
http://www.dofactory.com/reference/connection-strings
Quand il y a Dsn, c'est un DSN... (On peut devoir ajouter USD et PASSWD)
Sinon, on n'a pas forcement driver : ca peut etre aussi ien DataBase.

Du coup, ca donne la possiblite d'interroger un fichier XLS avec ODBC :
ConnectionString =
1.  "Driver={Microsoft Excel Driver (*.xls)};" +
2.  "Driverid=790;" +
3.  "Dbq=C:\MyPath\SpreadSheet.xls;" +
4.  "DefaultDir=C:\MyPath;";

... ou texte/csv :
1.  conn.ConnectionString =
2.   "Driver={Microsoft Text Driver (*.txt; *.csv)};" +
3.   "Dbq=C:\MyPath\;" +
4.   "Extensions=asc,csv,tab,txt;";
... etc ...



De toute facon le DSN fait partie de la connection string: Donc on remplace sqlserver/dsn par sqlserver/connection_string
On a plusieurs occurences de:
dsnNam = cgiEnv.m_entity_id_dict["Dsn"]
ODBC_ConnectString = survol_odbc_dsn.MakeOdbcConnectionString(dsnNam)
et il faut les remplacer PROPREMENT par:
ODBC_ConnectString = cgiEnv.m_entity_id_dict["ConnectionString"]
Et pour eviter le renommage de plein de trucs, on dit que DSN
est en fait une generalisation, et on tolere de ne pas avoir DSN=dsn.
C'est  MakeOdbcConnectionString qui fera cette analyse.
* On peut mettre dans le Dsn une connection string.
* Le DSN actuel est recode (eventuellement) en "DSN=dsn"
* On encode64 le 'DSN' de facon transparente,
c'est obligatoire a cause des mots de passe.
Ce qui est dommage est que la meme table peut etre designee
de facons differentes, non reductibles: avec le DSN
et avec la connection string.
Le DSN ou la connection string devraient probablement etre des entites a part ?
La connect string est une abstraction, mais ca peut decrire aussi
precisement la facon d'acceder a un objet de BDD.
Oui, on peut dire que c'est une connection abstraite.

A faire en meme temps: Lister toutes les BDD sql server, et pas grace au DSN retourne par ODBC.

A propos de la modelisation DSN etc...
L object ODBC DSN existe, donc on garde.
Qu'une table existe uniquement a travers ODBC
(Car on ne connait pas forcement la base) aussi.
Il faudrait passer de la table avec DSN a la table d'une base de donnees.
Et aussi de la table+dsn a la table+connection_string,
Apparemment (A verifier) la connection a une BDD ne se fait pas avec un DSN
mais avec une connection string.
Toutefois, on peut imaginer de garder l objet abstrait DSN+table
qui pointe vers differentes BDD selon la config de la machine.
Mais il faudrait differencier "table abstraite DSN (ODBC ?)" d'une
"table concrete, connection string, acceedee eventuellement avec ODBC mais pas seulement"

Liste des DSN :
Je me demande si on a vraiment besoin de "odbc/dsn" : Ce n'est pas un objet,
Mais juste un pointeur vers une connection string.

 List all database files in a SQL Server instance with Python and pyodbc”

============================================================================================================

DSN encoding:

On a odbc/dsn mais aussi sqlserver/dsn car on utilise pyodbc pour y accéder en Python

Sqlserver/dsn/__init__.py ne contient quasiment rien: Toutefois, attention au MakeUri qui n'encode rien:
Il faudra le remplacer par odbc.

Ca serait a refaire, peut-etre que les modules feraient deriver de cgiEnv ?

On remplace cgiEnv.m_entity_id_dict[] par une classe qui calcule le module courant
Et voit s'il faut decoder tel ou tel argument. Sinon valeur existante.
Meme logique d'import que l'affichage donc ca devrait marcher.

============================================================================================================
ENCODAGE TRANSPARENT DES ARGUMENTS CGI

On veut qu un parametre CGI soit encode/decode de facon transparente.
On ajoute une fonction speciale ? Mais il faudrait la mettre dans tous
Les modules qui utilisent "dsn=" : "odbc/table", "odbc/view", "sqlserver/table" etc...

Voir sources_types/sql/query/__init__.py la classe class CgiPropertyQuery(CgiPropertyB64)

Mais il serait peut-etre plus simple de convenir d'un prefixe pour le parametre dans la chaine CGI:
b64 etc... On pourrait dynamiquement tester si le parametre peut etre encode dans du CGI.


============================================================================================================
Database web admin. Urls permettant d'acceder a une base de donnees.

https://docs.oracle.com/cd/B25329_01/doc/admin.102/b25107/getstart.htm#BABHJAGE

"Oracle Database Express Edition (Oracle Database XE) has a browser-based user interface for administering the database,
running scripts and queries, building Web-based applications, and more.
The starting point for this interface is the Database Home Page."

Donc, ajouter un lien vers cette page. For example, if you installed Oracle Database XE with the default port number,
you would access the Database Home Page at this URL:
http://127.0.0.1:8080/apex

Pour aller directement a la page d'une table, essayer:@
"Navigating Using Breadcrumbs Breadcrumbs (also called locator links) appear at the top of every page in the Oracle Database XE graphical user interface.
Each breadcrumb trail indicates where the current page is in the hierarchy of pages.
You can use breadcrumbs to instantly link to the previous page or to any of the pages above the current page in the hierarchy.
In the following example, which is taken from the Query Builder page, clicking Home takes you to the Database Home Page"

Ca, je ne sais pas a quoi ca sert:
https://docs.oracle.com/cd/E28280_01/doc.1111/e26695/get_started_oldui.htm#WCCUS2314


MySql:
phpMyAdmin


https://github.com/rickbergfalk/sqlpad
" Web-based SQL editor run in your own private cloud. Supports MySQL, Postgres, SQL Server, Vertica, Crate, and Presto."

Iisnode ?

SqlServer
http://sqlwebadmin.codeplex.com/
" The SQL Server Web Data Administrator enables you to easily manage your SQL Server data, wherever you are."

============================================================================================================
Augmented reality:
On top of the desktop, display graphic objects associated to visible software objects.

TODO: Translate this:
Afficher par dessus le desktop les object de grph qui correspondent aux objects visibles.
La "realite" est ce qu on voit sur le desktop.
Donc, on va afficher les process au-dessus des fentres des applications qui ont cree ces process.
Idem les icones du desktop.
Quand on ouvre FileExprolrer, on ajoute nos icones SVG en semi-transparence.
Mais ca exige de pouvoir afficher du SVG en semi-transparence sur tout le desktop.
Avec un fond de page transparent.

Pour forcer l affichage, on peut renforcer la proximite de certains objets en les liant avec
une propriete bidon, dont l arete est transparente.

============================================================================================================
Information which are not very important should be hidden with a specific flag in scripts. Examples:

Processes:
Option "Hide system software" ON by default ?
=> Do not show executables which are in /usr/bin or C:\Windows

Shared memory :
=> Option "Hide system DLLs"

============================================================================================================
For the documentation, consider:
http://www.purplepixie.org/freenats/wiki/Introduction
https://www.mediawiki.org/wiki/MediaWiki

============================================================================================================
D3 Javascript interface:
- Mix SVG nodes with graphes and trees. Maybe they could be linked in a matrix ?
- For colors, use CSS.
- When a Json document is empty, the interface should display a message.

========================================================================================================================
D3 Javascript interface:
Ajuster la trajectoire et le rythme du placement des nodes de D3.

============================================================================================================
Undo edition: For this, use a specific script deleting the object passed in parameters: entity_deleted.py
We wish to pass several parameters so that scripts and objects can be added or substracted,
with pattern matching possibilities.
Should we pass the arguments as GET or as a JSON document ?
This could assume the CGI structure:
"http://127.0.0.1:8000/survol.html?xid=CIM_Directory.Name=E%3A%2FHewlett-Packard%2FSystemDiags"

xxx.htm?xid=(XID1)&script=(SCRIPT1)&operator=+&xid=(XID2)&script=(SCRIPT2)

============================================================================================================
Consider restoring merge_rdf_inputs_graphviz_only.htm,
in fact it can handle all modes, something like merger.py.
Its role is to produce a document based on several URLs.
The files *merge*.htm  are no longer necessary

============================================================================================================
Graphic properties must be transmitted to edges: This simply means having a specific object:
"COLLAPSED_PROPERTY" property "True"
... or:
"PROPERTY_LAYOUT" property "Ortho"



TODO: We need another operator which applies a script on all object of a given class
in the current graph. Example:
url=sources_types/all_processes.py
&operator=*
&url=sources_types/ComputerSystem/process_open_files.py

This would display the open files of all processes.
*/

