diff --git a/source/_static/ressources/exploitation/1minute.fmw b/source/_static/ressources/exploitation/1minute.fmw new file mode 100644 index 0000000000000000000000000000000000000000..d25742ce406381274076f8354f69493676c9b38c --- /dev/null +++ b/source/_static/ressources/exploitation/1minute.fmw @@ -0,0 +1,358 @@ +#! <?xml version="1.0" encoding="UTF-8" ?> +#! <WORKSPACE +# Command-line to run this workspace: +# /opt/fme-desktop-2019/fme /home/anthony/Documents/1minute.fmw +# --lengthsec "10" +# +#! ATTR_TYPE_ENCODING="SDF" +#! BEGIN_PYTHON="" +#! BEGIN_TCL="" +#! CATEGORY="" +#! DESCRIPTION="" +#! DESTINATION="NONE" +#! DESTINATION_ROUTING_FILE="" +#! DOC_EXTENTS="1076.01 71" +#! DOC_TOP_LEFT="123.001 -308.002" +#! END_PYTHON="" +#! END_TCL="" +#! EXPLICIT_BOOKMARK_ORDER="false" +#! FME_BUILD_NUM="19643" +#! FME_DOCUMENT_GUID="a83538ea-f7e3-4a9e-8cb2-54f31b22eb1f" +#! FME_DOCUMENT_PRIORGUID="2590a2da-61ff-4d2b-8537-f126e150728e" +#! FME_GEOMETRY_HANDLING="Enhanced" +#! FME_IMPLICIT_CSMAP_REPROJECTION_MODE="Auto" +#! FME_REPROJECTION_ENGINE="FME" +#! FME_SERVER_SERVICES="" +#! FME_STROKE_MAX_DEVIATION="0" +#! HISTORY="" +#! IGNORE_READER_FAILURE="No" +#! LAST_SAVE_BUILD="FME(R) 2019.1.3.1 (20191019 - Build 19643 - linux-x64)" +#! LAST_SAVE_DATE="2020-02-20T08:39:12" +#! LOG_FILE="" +#! LOG_MAX_RECORDED_FEATURES="200" +#! MARKDOWN_DESCRIPTION="" +#! MARKDOWN_USAGE="" +#! MAX_LOG_FEATURES="200" +#! MULTI_WRITER_DATASET_ORDER="BY_ID" +#! PASSWORD="" +#! PYTHON_COMPATIBILITY="35" +#! REDIRECT_TERMINATORS="NONE" +#! SAVE_ON_PROMPT_AND_RUN="Yes" +#! SHOW_ANNOTATIONS="true" +#! SHOW_INFO_NODES="true" +#! SOURCE="NONE" +#! SOURCE_ROUTING_FILE="" +#! TERMINATE_REJECTED="YES" +#! TITLE="" +#! USAGE="" +#! USE_MARKDOWN="" +#! VIEW_POSITION="0 0" +#! WARN_INVALID_XFORM_PARAM="Yes" +#! WORKSPACE_VERSION="1" +#! ZOOM_SCALE="100" +#! > +#! <DATASETS> +#! </DATASETS> +#! <DATA_TYPES> +#! </DATA_TYPES> +#! <GEOM_TYPES> +#! </GEOM_TYPES> +#! <FEATURE_TYPES> +#! </FEATURE_TYPES> +#! <FMESERVER> +#! </FMESERVER> +#! <GLOBAL_PARAMETERS> +#! <GLOBAL_PARAMETER +#! GUI_LINE="GUI OPTIONAL RANGE_SLIDER lengthsec "RANGE:[,]" Nombre de secondes à attendre:" +#! DEFAULT_VALUE="10" +#! IS_STAND_ALONE="true" +#! /> +#! </GLOBAL_PARAMETERS> +#! <COMMENTS> +#! </COMMENTS> +#! <CONSTANTS> +#! </CONSTANTS> +#! <BOOKMARKS> +#! </BOOKMARKS> +#! <TRANSFORMERS> +#! <TRANSFORMER +#! IDENTIFIER="2" +#! TYPE="SubDocumentTransformer" +#! VERSION="1" +#! POSITION="768.00768007680063 -237.00237002370011" +#! BOUNDING_RECT="768.00768007680063 -237.00237002370011 431 71" +#! ORDER="500000000000001" +#! PARMS_EDITED="true" +#! ENABLED="true" +#! LAST_PARM_EDIT="19643" +#! > +#! <XFORM_PARM PARM_NAME="Pauser" PARM_VALUE="$(lengthsec)"/> +#! <XFORM_PARM PARM_NAME="SUB_DOC_NAME" PARM_VALUE="WorkspacePauser"/> +#! <XFORM_PARM PARM_NAME="TRANSFORMER_GROUP" PARM_VALUE=""/> +#! <XFORM_PARM PARM_NAME="XFORMER_NAME" PARM_VALUE="WorkspacePauser"/> +#! <XFORM_PARM PARM_NAME="__COMPOUND_PARAMETERS" PARM_VALUE=""/> +#! </TRANSFORMER> +#! <TRANSFORMER +#! IDENTIFIER="3" +#! TYPE="Creator" +#! VERSION="5" +#! POSITION="123.0012300123002 -237.00237002370011" +#! BOUNDING_RECT="123.0012300123002 -237.00237002370011 431 71" +#! ORDER="500000000000002" +#! PARMS_EDITED="true" +#! ENABLED="true" +#! LAST_PARM_EDIT="18552" +#! > +#! <OUTPUT_FEAT NAME="CREATED"/> +#! <FEAT_COLLAPSED COLLAPSED="0"/> +#! <XFORM_ATTR ATTR_NAME="_creation_instance" IS_USER_CREATED="false" FEAT_INDEX="0" /> +#! <XFORM_PARM PARM_NAME="ATEND" PARM_VALUE="no"/> +#! <XFORM_PARM PARM_NAME="COORDS" PARM_VALUE="<Unused>"/> +#! <XFORM_PARM PARM_NAME="COORDSYS" PARM_VALUE=""/> +#! <XFORM_PARM PARM_NAME="CRE_ATTR" PARM_VALUE="_creation_instance"/> +#! <XFORM_PARM PARM_NAME="GEOM" PARM_VALUE="<lt>?xml<space>version=<quote>1.0<quote><space>encoding=<quote>US_ASCII<quote><space>standalone=<quote>no<quote><space>?<gt><lt>geometry<space>dimension=<quote>2<quote><gt><lt>null<solidus><gt><lt><solidus>geometry<gt>"/> +#! <XFORM_PARM PARM_NAME="GEOMTYPE" PARM_VALUE="Geometry Object"/> +#! <XFORM_PARM PARM_NAME="NUM" PARM_VALUE="1"/> +#! <XFORM_PARM PARM_NAME="PARAMETERS_GROUP" PARM_VALUE=""/> +#! <XFORM_PARM PARM_NAME="TRANSFORMER_GROUP" PARM_VALUE=""/> +#! <XFORM_PARM PARM_NAME="XFORMER_NAME" PARM_VALUE="Creator"/> +#! </TRANSFORMER> +#! </TRANSFORMERS> +#! <FEAT_LINKS> +#! <FEAT_LINK +#! IDENTIFIER="4" +#! SOURCE_NODE="3" +#! TARGET_NODE="2" +#! SOURCE_PORT_DESC="fo 0 CREATED" +#! TARGET_PORT_DESC="fi 0 Input" +#! ENABLED="true" +#! EXECUTION_IDX="0" +#! HIDDEN="false" +#! EXTRA_POINTS="" +#! /> +#! </FEAT_LINKS> +#! <BREAKPOINTS> +#! </BREAKPOINTS> +#! <ATTR_LINKS> +#! </ATTR_LINKS> +#! <SUBDOCUMENTS> +#! <SUBDOCUMENT +#! NAME="WorkspacePauser" +#! CATEGORY="Workflows" +#! DESCRIPTION="<p>This transformer allows to <strong>pause</strong> a workspace at any specific place in the process. Just connect any transformer/reader to this transformer and set the puasing time (in seconds).</p> " +#! DOC_DYNAMIC_INPUT_ATTRS="0" +#! DOC_EXTENTS="1786.51 127.501" +#! DOC_TOP_LEFT="-578 -146.001" +#! FME_DOCUMENT_GUID="e549979c-fb10-4d3f-9b5d-c1a3b3707b6a" +#! FME_DOCUMENT_PRIORGUID="" +#! FME_PROCESS_COUNT="NO_PARALLELISM" +#! FME_PROCESS_GROUPS_ORDERED="No" +#! FME_PROCESS_GROUP_BY="" +#! FME_PROCESS_PRESERVE_GROUP_ATTR="No" +#! FMX_ATTRIBUTE_PROPOGATION_MODE="AUTO" +#! HISTORY="11<solidus>04<solidus>2017,Lyes<space>Mokraoui,Ver.<space>1.0," +#! IS_VISIBLE="true" +#! LAST_SAVE_BUILD="FME(R) 2017.1.0.0 (20170401 - Build 17464 - WIN64)" +#! LAST_SAVE_DATE="2017-04-11T10:45:22" +#! MARKDOWN_DESCRIPTION="This transformer allows to **pause** a workspace at any specific place in the process. Just connect any transformer/reader to this transformer and set the puasing time (in seconds)." +#! MARKDOWN_USAGE="Pausing Time in Seconds." +#! PYTHON_COMPATIBILITY="" +#! SUPPRESS_UPGRADE="false" +#! TITLE="WorkspacePauser" +#! USAGE="<p>Pausing Time in Seconds.</p>" +#! USE_MARKDOWN="YES" +#! VIEW_POSITION="-678.007 99.001" +#! XFORM_DEPRECATED="No" +#! ZOOM_SCALE="100" +#! > +#! <GLOBAL_PARAMETERS> +#! <GLOBAL_PARAMETER +#! GUI_LINE="GUI INTEGER Pauser Pausing time (Seconds):" +#! DEFAULT_VALUE="10" +#! IS_STAND_ALONE="true" +#! /> +#! </GLOBAL_PARAMETERS> +#! <COMMENTS> +#! </COMMENTS> +#! <CONSTANTS> +#! </CONSTANTS> +#! <BOOKMARKS> +#! </BOOKMARKS> +#! <TRANSFORMERS> +#! <TRANSFORMER +#! IDENTIFIER="3" +#! TYPE="PythonCaller" +#! VERSION="4" +#! POSITION="777.50800000000004 -60.000599999999999" +#! BOUNDING_RECT="777.50800000000004 -60.000599999999999 431 71" +#! ORDER="500000000000000" +#! PARMS_EDITED="true" +#! ENABLED="true" +#! LAST_PARM_EDIT="17464" +#! > +#! <OUTPUT_FEAT NAME="OUTPUT"/> +#! <FEAT_COLLAPSED COLLAPSED="0"/> +#! <XFORM_ATTR ATTR_NAME="_count" IS_USER_CREATED="false" FEAT_INDEX="0" /> +#! <XFORM_PARM PARM_NAME="ADVANCED_GROUP" PARM_VALUE=""/> +#! <XFORM_PARM PARM_NAME="HIDE_ATTRIBUTES" PARM_VALUE=""/> +#! <XFORM_PARM PARM_NAME="LIST_ATTRS" PARM_VALUE=""/> +#! <XFORM_PARM PARM_NAME="NEW_ATTRIBUTES" PARM_VALUE=""/> +#! <XFORM_PARM PARM_NAME="PARAMETERS_GROUP" PARM_VALUE=""/> +#! <XFORM_PARM PARM_NAME="PYTHONSOURCE" PARM_VALUE="import<space>fme<lf>import<space>fmeobjects<lf>import<space>time<lf><lf>#<space>Template<space>Function<space>interface:<lf>#<space>When<space>using<space>this<space>function<comma><space>make<space>sure<space>its<space>name<space>is<space>set<space>as<space>the<space>value<space>of<lf>#<space>the<space><apos>Class<space>or<space>Function<space>to<space>Process<space>Features<apos><space>transformer<space>parameter<lf><lf>def<space>processFeature<openparen>feature<closeparen>:<lf><space><space><space><space><space><lf><space><space><space><space><space>PauseTime<space>=<space>$(Pauser)<lf><space><space><space><space><space>Break<space>=<space>feature.getAttribute<openparen><apos>_count<apos><closeparen><lf><space><space><space><space><space>if<space>int<openparen>Break<closeparen><space>==<space>0:<lf><space><space><space><space><space><space><space><space>time.sleep<openparen>int<openparen>PauseTime<closeparen><closeparen><lf><space><space><space><space><space>else:<lf><space><space><space><space><lf><space><space><space><space><space><space><space><space>pass<lf><lf>"/> +#! <XFORM_PARM PARM_NAME="PYTHONSYMBOL" PARM_VALUE="processFeature"/> +#! <XFORM_PARM PARM_NAME="TRANSFORMER_GROUP" PARM_VALUE=""/> +#! <XFORM_PARM PARM_NAME="XFORMER_NAME" PARM_VALUE="PythonCaller"/> +#! </TRANSFORMER> +#! <TRANSFORMER +#! IDENTIFIER="4" +#! TYPE="Counter" +#! VERSION="2" +#! POSITION="95.001000000000005 -75.000799999999998" +#! BOUNDING_RECT="95.001000000000005 -75.000799999999998 431 71" +#! ORDER="500000000000000" +#! PARMS_EDITED="true" +#! ENABLED="true" +#! LAST_PARM_EDIT="16609" +#! > +#! <OUTPUT_FEAT NAME="OUTPUT"/> +#! <FEAT_COLLAPSED COLLAPSED="0"/> +#! <XFORM_ATTR ATTR_NAME="_count" IS_USER_CREATED="false" FEAT_INDEX="0" /> +#! <OUTPUT_FEAT NAME="<REJECTED>"/> +#! <FEAT_COLLAPSED COLLAPSED="1"/> +#! <XFORM_ATTR ATTR_NAME="fme_rejection_code" IS_USER_CREATED="false" FEAT_INDEX="1" /> +#! <XFORM_ATTR ATTR_NAME="_count" IS_USER_CREATED="false" FEAT_INDEX="1" /> +#! <XFORM_PARM PARM_NAME="CNT_ATTR" PARM_VALUE="_count"/> +#! <XFORM_PARM PARM_NAME="DOMAIN" PARM_VALUE="counterPause"/> +#! <XFORM_PARM PARM_NAME="PARAMETERS_GROUP" PARM_VALUE=""/> +#! <XFORM_PARM PARM_NAME="SCOPE" PARM_VALUE="Local"/> +#! <XFORM_PARM PARM_NAME="START" PARM_VALUE="0"/> +#! <XFORM_PARM PARM_NAME="TRANSFORMER_GROUP" PARM_VALUE=""/> +#! <XFORM_PARM PARM_NAME="XFORMER_NAME" PARM_VALUE="Counter"/> +#! </TRANSFORMER> +#! </TRANSFORMERS> +#! <SUBDOCUMENT_IOS> +#! <SUBDOCUMENT_IO +#! IDENTIFIER="2" +#! NAME="Input" +#! POSITION="-578 -18.5" +#! BOUNDING_RECT="-578 -18.5 431 71" +#! COLLAPSED="true" +#! PUBLISHED="true" +#! IS_SOURCE="true" +#! ATTR_MODE="0" +#! > +#! </SUBDOCUMENT_IO> +#! </SUBDOCUMENT_IOS> +#! <FEAT_LINKS> +#! <FEAT_LINK +#! IDENTIFIER="5" +#! SOURCE_NODE="2" +#! TARGET_NODE="4" +#! SOURCE_PORT_DESC="0" +#! TARGET_PORT_DESC="fi 0 " +#! ENABLED="true" +#! EXECUTION_IDX="0" +#! HIDDEN="false" +#! EXTRA_POINTS="" +#! /> +#! <FEAT_LINK +#! IDENTIFIER="6" +#! SOURCE_NODE="4" +#! TARGET_NODE="3" +#! SOURCE_PORT_DESC="fo 0 OUTPUT" +#! TARGET_PORT_DESC="fi 0 " +#! ENABLED="true" +#! EXECUTION_IDX="0" +#! HIDDEN="false" +#! EXTRA_POINTS="" +#! /> +#! </FEAT_LINKS> +#! <BREAKPOINTS> +#! </BREAKPOINTS> +#! <ATTR_LINKS> +#! </ATTR_LINKS> +#! </SUBDOCUMENT> +#! </SUBDOCUMENTS> +#! <LOOKUP_TABLES> +#! </LOOKUP_TABLES> +#! </WORKSPACE> + +FME_PYTHON_VERSION 35 +DEFAULT_MACRO lengthsec 10 +GUI OPTIONAL RANGE_SLIDER lengthsec "RANGE:[,]" Nombre de secondes à attendre: +#! START_HEADER +#! START_WB_HEADER +READER_TYPE MULTI_READER +WRITER_TYPE NULL +WRITER_KEYWORD NULL_DEST +NULL_DEST_DATASET null +#! END_WB_HEADER +#! START_WB_HEADER +#! END_WB_HEADER +#! END_HEADER + +LOG_FILENAME "$(FME_MF_DIR)1minute.log" +LOG_APPEND NO +FME_DEBUG MAPPING_FILE BADNEWS FME_STACK_TRACE UNGROUPED UNCORRELATED DUMP_SCHEMA XSD_VERBOSE HTTP_DEBUG FTP_DEBUG FME_DEBUG STASH +LOG_FILTER_MASK -1 +LOG_MAX_FEATURES 200 +LOG_MAX_RECORDED_FEATURES 200 +FME_REPROJECTION_ENGINE FME +FME_IMPLICIT_CSMAP_REPROJECTION_MODE Auto +FME_GEOMETRY_HANDLING Enhanced +FME_STROKE_MAX_DEVIATION 0 +# ------------------------------------------------------------------------- + +MULTI_READER_CONTINUE_ON_READER_FAILURE No + +# ------------------------------------------------------------------------- + +MACRO WORKSPACE_NAME 1minute +MACRO FME_VIEWER_APP fmedatainspector +DEFAULT_MACRO WB_CURRENT_CONTEXT +# ------------------------------------------------------------------------- +Tcl2 proc Creator_CoordSysRemover {} { global FME_CoordSys; set FME_CoordSys {}; } +MACRO Creator_XML NOT_ACTIVATED +MACRO Creator_CLASSIC NOT_ACTIVATED +MACRO Creator_2D3D 2D_GEOMETRY +MACRO Creator_COORDS <Unused> +INCLUDE [ if { {Geometry Object} == {Geometry Object} } { puts {MACRO Creator_XML *} } ] +INCLUDE [ if { {Geometry Object} == {2D Coordinate List} } { puts {MACRO Creator_2D3D 2D_GEOMETRY}; puts {MACRO Creator_CLASSIC *} } ] +INCLUDE [ if { {Geometry Object} == {3D Coordinate List} } { puts {MACRO Creator_2D3D 3D_GEOMETRY}; puts {MACRO Creator_CLASSIC *} } ] +INCLUDE [ if { {Geometry Object} == {2D Min/Max Box} } { set comment { We need to turn the COORDS which are minX minY maxX maxY into a full polygon list of coordinates }; set splitCoords [split [string trim {<Unused>}]]; if { [llength $splitCoords] > 4} { set trimmedCoords {}; foreach item $splitCoords { if { $item != {} } {lappend trimmedCoords $item} }; set splitCoords $trimmedCoords; }; if { [llength $splitCoords] != 4 } { error {Creator: Coordinate list is expected to be a space delimited list of four numbers as 'minx miny maxx maxy' - `<Unused>' is invalid}; }; set minX [lindex $splitCoords 0]; set minY [lindex $splitCoords 1]; set maxX [lindex $splitCoords 2]; set maxY [lindex $splitCoords 3]; puts "MACRO Creator_COORDS $minX $minY $minX $maxY $maxX $maxY $maxX $minY $minX $minY"; puts {MACRO Creator_2D3D 2D_GEOMETRY}; puts {MACRO Creator_CLASSIC *} } ] +FACTORY_DEF $(Creator_XML) CreationFactory FACTORY_NAME Creator_XML_Creator CREATE_AT_END no OUTPUT FEATURE_TYPE _____CREATED______ @Geometry(FROM_ENCODED_STRING,<lt>?xml<space>version=<quote>1.0<quote><space>encoding=<quote>US_ASCII<quote><space>standalone=<quote>no<quote><space>?<gt><lt>geometry<space>dimension=<quote>2<quote><gt><lt>null<solidus><gt><lt><solidus>geometry<gt>) +FACTORY_DEF $(Creator_CLASSIC) CreationFactory FACTORY_NAME Creator_CLASSIC_Creator $(Creator_2D3D) $(Creator_COORDS) CREATE_AT_END no OUTPUT FEATURE_TYPE _____CREATED______ +FACTORY_DEF * TeeFactory FACTORY_NAME Creator_Cloner INPUT FEATURE_TYPE _____CREATED______ @Tcl2(Creator_CoordSysRemover) @CoordSys() NUMBER_OF_COPIES 1 COPY_NUMBER_ATTRIBUTE "_creation_instance" OUTPUT FEATURE_TYPE Creator_CREATED fme_feature_type Creator +FACTORY_DEF * BranchingFactory FACTORY_NAME "Creator_CREATED Brancher -1 4" INPUT FEATURE_TYPE Creator_CREATED TARGET_FACTORY "$(WB_CURRENT_CONTEXT)_CREATOR_BRANCH_TARGET" MAXIMUM_COUNT None OUTPUT PASSED FEATURE_TYPE * +# ------------------------------------------------------------------------- +FACTORY_DEF * TeeFactory FACTORY_NAME "$(WB_CURRENT_CONTEXT)_CREATOR_BRANCH_TARGET" INPUT FEATURE_TYPE * OUTPUT FEATURE_TYPE * +# ------------------------------------------------------------------------- +FACTORY_DEF * TeeFactory FACTORY_NAME "WorkspacePauser Input Input Collector" INPUT FEATURE_TYPE Creator_CREATED OUTPUT FEATURE_TYPE WorkspacePauser_Input +MACRO WorkspacePauser_WORKSPACE_NAME WorkspacePauser +MACRO $(WorkspacePauser_WORKSPACE_NAME)_XFORMER_NAME WorkspacePauser +MACRO $(WorkspacePauser_WORKSPACE_NAME)_TRANSFORMER_GROUP +MACRO $(WorkspacePauser_WORKSPACE_NAME)___COMPOUND_PARAMETERS +MACRO $(WorkspacePauser_WORKSPACE_NAME)_SUB_DOC_NAME WorkspacePauser +MACRO $(WorkspacePauser_WORKSPACE_NAME)_Pauser $(lengthsec) +DEFAULT_MACRO WorkspacePauser_WORKSPACE_NAME "" +INCLUDE [puts {MACRO WB_OLD_CONTEXT_$(WorkspacePauser_WORKSPACE_NAME) $(WB_CURRENT_CONTEXT)}; puts {MACRO WB_CURRENT_CONTEXT $(WorkspacePauser_WORKSPACE_NAME)}] +FACTORY_DEF * TeeFactory FACTORY_NAME "$(WorkspacePauser_WORKSPACE_NAME)_Input1582184352 Input Splitter" INPUT FEATURE_TYPE "$(WorkspacePauser_WORKSPACE_NAME)_Input" OUTPUT FEATURE_TYPE "$(WorkspacePauser_WORKSPACE_NAME)_Input" +# ------------------------------------------------------------------------- +# Create the DomainName that this transformer will use. +# Because @Count itself will evalute the expression to calculate the +# domain, we don't need to do anything in Tcl per feature going by +INCLUDE [ set domainPrefix {}; if { {Local} == {Local} } { set domainPrefix [FME_EncodeText {$(WorkspacePauser_WORKSPACE_NAME)_Counter_}]; }; puts "MACRO $(WorkspacePauser_WORKSPACE_NAME)_Counter_FULL_DOMAIN ${domainPrefix}counterPause"; ] +FACTORY_DEF * ExecuteFunctionFactory FACTORY_NAME $(WorkspacePauser_WORKSPACE_NAME)_Counter_Rejector COMMAND_PARM_EVALUATION SINGLE_PASS INPUT FEATURE_TYPE "$(WorkspacePauser_WORKSPACE_NAME)_Input" FUNCTION_DEFINITION @Count(REJECTABLE_WITH_FLAG,fme_encoded,$($(WorkspacePauser_WORKSPACE_NAME)_Counter_FULL_DOMAIN),"0") RESULT_ATTRIBUTE "_count" OUTPUT COMPLETE FEATURE_TYPE "$(WorkspacePauser_WORKSPACE_NAME)_Counter_OUTPUT" OUTPUT REJECTED FEATURE_TYPE "$(WorkspacePauser_WORKSPACE_NAME)_Counter_<REJECTED>" +DEFAULT_MACRO _WB_BYPASS_TERMINATION No +FACTORY_DEF * TeeFactory FACTORY_NAME "$(WorkspacePauser_WORKSPACE_NAME)_Counter_<Rejected>" INPUT FEATURE_TYPE "$(WorkspacePauser_WORKSPACE_NAME)_Counter_<REJECTED>" OUTPUT FAILED FEATURE_TYPE * @Abort(ENCODED, WorkspacePauser_Counter<space>output<space>a<space><lt>Rejected<gt><space>feature.<space><space>To<space>continue<space>translation<space>when<space>features<space>are<space>rejected<comma><space>change<space><apos>Workspace<space>Parameters<apos><space><gt><space>Translation<space><gt><space><apos>Rejected<space>Feature<space>Handling<apos><space>to<space><apos>Continue<space>Translation<apos>) +# ------------------------------------------------------------------------- +FME_PYTHON_PATH "$(FME_MF_DIR)" +FACTORY_DEF * PythonFactory FACTORY_NAME $(WorkspacePauser_WORKSPACE_NAME)_PythonCaller INPUT FEATURE_TYPE "$(WorkspacePauser_WORKSPACE_NAME)_Counter_OUTPUT" SYMBOL_NAME processFeature PYTHON_NAMESPACE FMEOBJECTS SOURCE_CODE import<space>fme<lf>import<space>fmeobjects<lf>import<space>time<lf><lf>#<space>Template<space>Function<space>interface:<lf>#<space>When<space>using<space>this<space>function<comma><space>make<space>sure<space>its<space>name<space>is<space>set<space>as<space>the<space>value<space>of<lf>#<space>the<space><apos>Class<space>or<space>Function<space>to<space>Process<space>Features<apos><space>transformer<space>parameter<lf><lf>def<space>processFeature<openparen>feature<closeparen>:<lf><space><space><space><space><space><lf><space><space><space><space><space>PauseTime<space>=<space>$($(WorkspacePauser_WORKSPACE_NAME)_Pauser$encode)<lf><space><space><space><space><space>Break<space>=<space>feature.getAttribute<openparen><apos>_count<apos><closeparen><lf><space><space><space><space><space>if<space>int<openparen>Break<closeparen><space>==<space>0:<lf><space><space><space><space><space><space><space><space>time.sleep<openparen>int<openparen>PauseTime<closeparen><closeparen><lf><space><space><space><space><space>else:<lf><space><space><space><space><lf><space><space><space><space><space><space><space><space>pass<lf><lf> OUTPUT PYOUTPUT FEATURE_TYPE "$(WorkspacePauser_WORKSPACE_NAME)_PythonCaller_OUTPUT" +FACTORY_DEF * TeeFactory FACTORY_NAME "$(WorkspacePauser_WORKSPACE_NAME)_PythonCaller OUTPUT Transformer Output Nuker" INPUT FEATURE_TYPE "$(WorkspacePauser_WORKSPACE_NAME)_PythonCaller_OUTPUT" +INCLUDE [puts {MACRO WB_CURRENT_CONTEXT $(WB_OLD_CONTEXT_$(WorkspacePauser_WORKSPACE_NAME))}] +# ------------------------------------------------------------------------- + +FACTORY_DEF * RoutingFactory FACTORY_NAME "Destination Feature Type Routing Correlator" COMMAND_PARM_EVALUATION SINGLE_PASS INPUT FEATURE_TYPE * FEATURE_TYPE_ATTRIBUTE __wb_out_feat_type__ OUTPUT ROUTED FEATURE_TYPE * OUTPUT NOT_ROUTED FEATURE_TYPE __nuke_me__ @Tcl2("FME_StatMessage 818059 [FME_GetAttribute fme_template_feature_type] 818060 818061 fme_warn") +# ------------------------------------------------------------------------- + +FACTORY_DEF * TeeFactory FACTORY_NAME "Final Output Nuker" INPUT FEATURE_TYPE __nuke_me__ \ No newline at end of file diff --git a/source/concept/system/general.md b/source/concept/system/general.md index 743e2acf96d7e9e546b63a7950ea557c2f6435d7..4ec272756ddd27545bec48e5a5cfa9dfa75c4f0d 100644 --- a/source/concept/system/general.md +++ b/source/concept/system/general.md @@ -1,6 +1,6 @@ -# Conceptes de base +# Concepts de base -## Machines de Turing +## Machine de Turing Une machine de Turing est un **modèle mathématique théorique** inventé par Alan Turing en 1936. Elle est considérée comme l'un des premiers modèles de calcul, et est souvent utilisée pour illustrer les concepts de la théorie de la calculabilité. @@ -19,18 +19,17 @@ Enfin, la machine de Turing a également des implications en théorie de la comp en résumé, Alan Turing au delà d'avoir cassé l'un des sytèmes de cryptographie les plus performant de l'histoire et permis par ses actions la victoire des alliés pendant la seconde guerre mondiale, a inventé les concepts qui régissent encore aujourd'hui toutes les machines modernes. ```{Note} - Un film biopic 'Imitation Game' retrace l'histoire d'Alan turing, de son importance pendant la guerre à la fin de sa vie. - Si ça peut vous interresser de voir de manière un peu romancer l'histoire de ce génie, je ne peux que vous encourager à aller le voir. + Un film biopic 'Imitation Game' retrace l'histoire d'Alan Turing, de ses actions pendant la guerre à la fin tragique de sa vie. + Si ça peut vous interresser de voir de manière un peu romancer l'histoire de ce génie, je ne peux que vous encourager à le voir. ``` ## Fonctionnement et application -Quelques décénnies aprés la création de la machine de turing, un ordinateur, ça reste un ensemble de machine qui communique entre elles et occupe une place assez conséquente, pour une utilitée discutable vu la compléxité de fonctionnement. +Quelques décénnies aprés la création de la machine de turing, un ordinateur, ça reste un ensemble de machine qui communiquent entre elles et occupent une place assez conséquente, pour une utilité discutable vu la compléxité de fonctionnement.  -On part du principe que saisir des calculs mathématiques en binaire sans forcément être capable de lire/comprendre le résultat c'est pénible, d'où la création des applications et du métier de développeur. -Mais les bienfait de l'industrie moderne ayant réussie à bien améliorer tout ça, on va essayer de voir comment ça fonctionne. +L'humanité part du principe que saisir des calculs mathématiques en binaire sans forcément être capable de lire/comprendre le résultat c'est pénible, d'où la création des applications et du métier de développeur. Un ordinateur moderne doit être visualiser comme un empilement de couche : @@ -39,12 +38,12 @@ Un ordinateur moderne doit être visualiser comme un empilement de couche : ### Premier niveau : Hardware -Je ne vais pas faire une liste exhaustive des différents composants moderner constituant un PC. +Je ne vais pas faire une liste exhaustive des différents composants modernes constituant un PC. En ce qui concerne le développement il y en a que trois qui nous interresse : -- le CPU : on va parler de coeurs physique et virtuel (un coeurs physique peut représenter pluseirus coeurs virtuels, on peut aussi parler de thread), grossiérement un thread, c'est une tête de lecture de la machine de Turing, donc c'est la capacité à réaliser une opération mathématique. Si j'ai 8 thread, je peux réaliser 8 opérations mathématiques en parallèle. -- la RAM : On parle aussi de mémoire vive, c'est une partie du ruban infini de la machine de turing. Le proncipe c'est que l'état de ce ruban n'est conservé que tant que la machine est allumée, par contre les temps d'accés et de manipulation sur cette partie du ruban est beaucoup plus rapide. -- Le disque dur : l'autre partie du ruban de la machine de turing, celle-ci quant à elle reste dans le même état même en cas d'arret de la machine. On va retourver deux familles les HDD (Hard Disk Drive) et les SSD (Solid State Drive), l'un est bien plus rapide que l'autre et se rapproche de plus en plus des perfromances que 'lon connait avec la mémoire vive. +- le CPU : on va parler de coeurs physiques et virtuels (un coeur physique peut représenter plusieurs coeurs virtuels, on peut aussi parler de thread), grossiérement un thread, c'est une tête de lecture de la machine de Turing, donc c'est la capacité à réaliser une opération mathématique. Si j'ai 8 thread, je peux réaliser 8 opérations mathématiques en parallèle. +- la RAM : On parle aussi de mémoire vive, c'est une partie du ruban infini de la machine de turing. Le principe c'est que l'état de ce ruban n'est conservé que tant que la machine est allumée, par contre les temps d'accés et de manipulation sur cette partie du ruban est beaucoup plus rapide. +- Le disque dur : l'autre partie du ruban de la machine de turing, celle-ci quant à elle conserve son état même en cas d'arret de la machine. On va retrouver deux familles de disque les HDD (Hard Disk Drive) et les SSD (Solid State Drive), le SSD est bien plus rapide que le HDD et se rapproche de plus en plus des perfromances que l'on connait avec la RAM. ### Deuxième niveau : OS @@ -53,7 +52,7 @@ l'OS (Operating System) c'est ce qui va rendre utilisable une machine de turing Il va agir comme un traducteur entre vos application et les composant de l'ordinateur. Il va prendre sur lui la gestion de la mémoire, le stockage de fichiers, ... -Historiquement on part d'un noyau commun UNIX qui à ensuite dévie sur les divers OS que l'on connait : Windows (même ne vient pas directement d'UNIX), Linux, Mac OS. +Historiquement on part d'un noyau commun UNIX qui a ensuite dévié sur les divers OS que l'on connait : Windows (ne vient pas directement d'UNIX), Linux, Mac OS. En ce qui nous concerne on va se cantonner au Linux moderne. Un linux c'est avant tout un noyau, c'est un ensemble de fonctionnalité communes à tous les linux, puis chaque distribution va embarquer différents paquets additionnels. @@ -65,20 +64,70 @@ Grossièrement toutes les autres distributions vont être des dérivés avec plu Exemple : - Ubuntu : Debian avec un certain nombre de paquet de base installé comme par exemple nano. -- Kali : Debian qui utilise KDE à la place de gnome ou unity et qui embarque tout un tas d'application d'attaque de logiciel. +- Kali : Debian qui utilise KDE à la place de gnome ou unity et qui embarque tout un tas d'application de pentest. Il faut voir une distribution linux comme un ensemble de LEGO, on va retrouver certains LEGO chez tout le monde puis chacun va embarquer un peu ce qu'il veut. -Veremes utilise essentiellement Ubuntu qui dérive de Debian (que l'on peut utiliser aussi), cechoix est fait en fonction des préférence d'AWS qui préconise Ubuntu et est donc plus rapide sur les sortie de correctif et le suivi des nouvelles versions. +Veremes utilise essentiellement Ubuntu qui dérive de Debian (que l'on peut utiliser aussi), ce choix est induit par les préférence d'AWS qui préconise Ubuntu et est donc plus performant sur les sortie de correctifs et le suivi des nouvelles versions. -Lors des installations il faut favoriser les version LTS (Long term support) et si possible la dernière. +Lors des installations il faut favoriser les versions LTS (Long term support) et si possible la dernière. -### Dernier niveau : Librairies, API et applications +### Derniers niveaux : Librairies, API et applications -Pour développer on va se retoruver à utiliser certains composant développer par des tiers. +Pour développer on va se retrouver à utiliser certains composants développés par des tiers. -Par exemple en C/C++ on va régulièrement utiliser des librairies dynamique pour s'économiser de la production de code et profiter d'un fils ocnducteur unique, massivement utilisé et donc plus robuste. +Par exemple en C/C++ on va régulièrement utiliser des librairies dynamiques (DLL) pour s'économiser de la production de code et qui sera massivement utilisé et donc plus robuste. On peut aussi utiliser des API, SDK, ou même des exécutables. -Par exemple si je reste dans le cas de nos application, on va configurer un WebServer HTTP Apache, qui va lancer l'exécutable de PHP pour aller lancer le code API, ce qui va provoquer des actions de la machine pour produire un résultat. \ No newline at end of file +Par exemple si je reste dans le cas de nos applications, on va configurer un WebServer Apache, qui va lancer l'exécutable de PHP pour aller interpréter le code de API, ce qui va provoquer des actions de la machine pour produire un résultat. + +## Compléments sur Linux + +### système de fichiers + +La racine d'une distribution linux regroupe toujours les mêmes dossiers, cahcun de ces dossier à une fonction précise: +- **bin** : contient des programmes binaires essentiels utilisés par le système d'exploitation. +- **boot** : contient les fichiers nécessaires au démarrage du système d'exploitation. +- **dev** : contient des fichiers spéciaux représentant les périphériques matériels du système, tels que les disques durs, les claviers, les souris, etc. +- **etc** : contient des fichiers de configuration système. Les fichiers dans ce répertoire sont utilisés pour configurer divers aspects du système, tels que les paramètres réseau, les comptes d'utilisateurs, certains services, etc. +- **home** : contient les dossiers personnels des utilisateurs. +- **lib** : contient des bibliothèques partagées (fichier en .so équivalent aux dll windows) nécessaires pour exécuter les programmes système. +- **media** : contient les points de montage pour les périphériques de stockage externes tels que les CD-ROM, les DVD, les clés USB, etc. +- **mnt** : contient les points de montage pour les systèmes de fichiers temporaires, tels que les disquettes, les CD-ROM, les DVD, etc. +- **opt** : contient des packages de logiciels tiers installés sur le système. +- **proc** : contient des fichiers système spéciaux qui fournissent des informations sur les processus en cours d'exécution, les périphériques matériels, la mémoire système, etc. +- **root** : contient le dossier personnel de l'utilisateur root. +- **sbin** : contient des programmes système nécessaires à l'administration du système. +- **tmp** : contient des fichiers temporaires créés par les programmes en cours d'exécution. +- **usr** : contient des programmes, des bibliothèques, des fichiers de configuration et des données pour les utilisateurs. +- **var** : contient des fichiers de données qui changent fréquemment, tels que les journaux système et les fichiers de spool pour les tâches en attente. + +La description de chaque dossier est l'usage attendu de ce dossier, pas celui qui en est fait par toute les applications. + +### Variables d'environnement + +- **PATH** : définit les répertoires où le système d'exploitation doit chercher les programmes exécutables. Cela permet aux utilisateurs d'exécuter des commandes en tapant simplement leur nom, sans avoir à spécifier le chemin complet vers le fichier exécutable. +- **HOME** : contient le chemin du répertoire personnel de l'utilisateur. +- **USER** : contient le nom d'utilisateur de l'utilisateur actuellement connecté. +- **PS1** : définit le format de l'invite de commande, qui est l'affichage qui apparaît lorsque l'utilisateur est invité à entrer une commande. +- **LANG** : définit la langue par défaut utilisée pour les messages d'erreur et autres messages système. +- **LD_LIBRARY_PATH** : définit le chemin vers les bibliothèques partagées utilisées par les programmes installés sur le système. +- **PWD** : contient le chemin complet du répertoire de travail actuel de l'utilisateur. Le répertoire de travail actuel est le répertoire dans lequel l'utilisateur se trouve actuellement dans le système de fichiers lorsqu'il exécute des commandes à partir de l'invite de commande. + +Il existe d'autres variables, cette liste contient les variables qui sont considérées comme les plus utiles. +## Gestion de la mémoire + +Lorsque l'on développe, il faut garder à l'esprit la façon dont la mémoire va être gérée. On parle habituellement du **tas** et de la **pile**. + +Le tas et la pile sont deux structures de données importantes en programmation. Le **tas** est une région de la mémoire qui stocke les **objets dynamiquement alloués**, tandis que la **pile** est une structure de données en mémoire qui stocke **les données temporaires du programme**, telles que les variables locales et les appels de fonction. + +En utilisant la pile, un programme peut stocker temporairement des variables et des adresses de retour lorsqu'il appelle une fonction. La pile est gérée automatiquement par le compilateur ou l'interpréteur du langage de programmation, qui ajoute et retire des éléments de la pile à mesure que les fonctions sont appelées et retournées. + +Le tas, quant à lui, est utilisé pour allouer de la mémoire dynamiquement pendant l'exécution du programme. Le programmeur peut demander une quantité spécifique de mémoire à allouer sur le tas à l'aide de fonctions telles que malloc() et free(). Cela permet au programme de gérer la mémoire de manière plus flexible que la pile, mais cela nécessite également une gestion plus complexe de la mémoire pour éviter les fuites de mémoire et les problèmes de fragmentation. + +En TypeScript, la gestion de la mémoire est gérée par le moteur JavaScript qui utilise un Garbage Collector pour libérer automatiquement la mémoire allouée pour les objets qui ne sont plus utilisés. Bien que les développeurs TypeScript n'aient pas besoin de gérer explicitement la mémoire comme dans les langages à faible niveau, tels que le C ou le C++, ils doivent être conscients de l'utilisation de la mémoire pour éviter les fuites de mémoire et les performances inutiles. + +En PHP, la gestion de la mémoire est également gérée automatiquement par le moteur PHP. PHP utilise un système de gestion de mémoire par comptage de références pour allouer et libérer automatiquement la mémoire pour les variables et les objets. Cependant, les développeurs PHP peuvent également allouer de la mémoire dynamiquement à l'aide de fonctions telles que malloc() et free(), mais cela est rarement nécessaire. + +En résumé, bien que la gestion de la mémoire puisse varier entre les langages de programmation, la compréhension des concepts de tas et de pile reste importante pour les développeurs de tous les langages. Les développeurs doivent être conscients de l'utilisation de la mémoire pour éviter les fuites de mémoire et les performances inutiles, mais cela peut être géré de manière différente selon les langages. \ No newline at end of file diff --git a/source/concept/system/images/df.png b/source/concept/system/images/df.png new file mode 100644 index 0000000000000000000000000000000000000000..291031ac3565a5ee88196d3e0986bec4614ab96e Binary files /dev/null and b/source/concept/system/images/df.png differ diff --git a/source/concept/system/images/htop.png b/source/concept/system/images/htop.png new file mode 100644 index 0000000000000000000000000000000000000000..326163927acb93442b2fedfceb292c76ed92fc21 Binary files /dev/null and b/source/concept/system/images/htop.png differ diff --git a/source/concept/system/index.rst b/source/concept/system/index.rst index c63697a5422a9f3dfb02f6e94dfc0ecdd88b4782..eea6e48d9a53117c7d01c73ffdd43a747a695938 100644 --- a/source/concept/system/index.rst +++ b/source/concept/system/index.rst @@ -2,9 +2,7 @@ Linux et commandes utiles ============================================ -Nous allons parler ici de Linux, de son fonctionnement, nous verrons ensuite quelques usages/commandes utilisable dans le cadre du support. - -A quoi ça sert, pourquoi l'utiliser, comment ça fonctionne ? +Nous allons parler ici de Linux, nous verrons ensuite quelques usages/commandes utilisable dans le cadre du support. ============================================ diff --git a/source/concept/system/use_case.md b/source/concept/system/use_case.md index b21c5b2ff4a0de7cf9e05066fe85b958d02c9564..4a168f560fad0e292276e3af307df218d548a361 100644 --- a/source/concept/system/use_case.md +++ b/source/concept/system/use_case.md @@ -1,20 +1,20 @@ # Utilisation d'un système Linux -Dans cette partie on va voir les pièges à éviter et on va essayer de faire un petit tour de paquet trés pratiques dans le cadre du support ou du développement. +Dans cette partie on va voir les pièges à éviter et on va essayer de faire un petit tour des paquets trés pratiques dans le cadre du support ou du développement. -Je considère que vous connaissez les commandes de bases et les notion de redirection tel que le pipe ou les redirection de flux. +Je considère que vous connaissez les commandes de bases (ls, cd, apt, sudo, ...). ## Shell : Un pour tous et tous pour un Le shell est un programme informatique qui fournit une interface en ligne de commande (CLI) entre l'utilisateur et le système d'exploitation. Le shell est un interpréteur de commandes qui permet à l'utilisateur de saisir des commandes en texte brut pour effectuer des opérations sur le système d'exploitation. -Par abus de langage, on parle de shell ou de bash mais en réalité on ne sait pas toujours ce qu'on manipule et certains de ces interpréteur ne s'utilisent pas du toute de la même façon et ne prenne pas l'information de la même source. +Par abus de langage, on parle de shell ou de bash mais en réalité on ne sait pas toujours ce qu'on manipule et certains de ces interpréteurs ne s'utilisent pas du tout de la même façon et/ou ne prennent pas l'informations de la même source. -Windows va utiliser un Shell spécifique dans ses invites de commande et va inventer sa propre version du shell avec le PowerShell. +Windows va utiliser un Shell spécifique dans ses invites de commande et a sa propre version du shell avec le PowerShell. \ Ubuntu ou Debian vont utiliser un shell amélioré que l'on appelle Bash, mais si je reprend Kali dont j'ai parlé avant qui est une distribution type Debian -par défaut elle utilise Zsh. +par défaut elle utilise zsh à la place de bash. -Sur le système Linux au lancement du shell, les scripts .bashrc seront jouer, il y a un script principla commun a tous les utilsateur de la machine que je déconseille fortement de modifier, et un script spécifique à cotre utilisateur qui se trouve dans `$HOME/.bashrc`, mais si je reprend Zsh, le script s'appelera .zshrc et pourra avoir une syntaxe différente. +Sur le système Linux au lancement du shell, les scripts .bashrc seront jouer, il y a un script principal commun a tous les utilisateurs de la machine qu'il est fortement déconseillé de modifier, et un script spécifique à votre utilisateur qui se trouve dans `$HOME/.bashrc`, mais si je reprend zsh, le script s'appelera .zshrc et pourra avoir une syntaxe différente (chose à savoir si vous voulez modifier votre environnement ou créer des alias). C'est pour ça qu'au début de beaucoup de script shell on retrouve ce qu'on appelle un shebang qui ressemble à ça : @@ -26,14 +26,16 @@ cd .. ls -al ``` -La première ligne commenté permet de définir l'interpréteur shell à utiliser pour le script. +La première ligne commenté permet de définir l'interpréteur à utiliser pour le script, qui peut même être python ou php si on ne veut pas faire de shell. -Pour la suite des exemple nous allons otujours parler de bash linux classique. +Pour la suite des exemples nous allons toujours parler de bash linux classique. ## Interagir avec les fichiers -Par défaut il y aura toujours le paquet `vi` voir `vim` qui sont deux éditeurs de texte, trés pratique quand on les connait, mais qui est fortement déconseillé pour des débutants. -Sur un Ubuntu, il y aura généralement `nano` qui est présent sur la machine et qui est plus simple d'utilisation mais moins puissant. +Par défaut il y aura toujours le paquet `vi` voir `vim` qui sont deux éditeurs de texte, trés pratiques quand on les connait, mais qui est fortement déconseillé pour des débutants. +Sur un Ubuntu, il y aura généralement `nano` qui est présent de base sur la machine et qui est plus simple d'utilisation mais moins puissant. + +Dans tous les cas on aura le plus souvent les commande `cat` et `tail` pour lire des fichiers, ainsi que `awk` et `sed` pour les modifier même si c'est vite laborieux. ## Interroger une base de donnée Postgres @@ -41,7 +43,7 @@ Dans notre cas on va parler de postgres. En installant le paquet **postgresql**, la machine peut lancer les commandes suivantes (entre autre): - `psql` : qui permet de se connecter à une base de donnée et d'exécuter des requêtes SQL - `pg_dump`: qui permet de faire une sauvegarde de la structure de donnée et des données partiellement ou entiérement -- `pg_dump_all` : qui permet de sauvegarder toutes la base y compris les rôles mais qui est moins configurable +- `pg_dump_all` : qui permet de sauvegarder toutes les bases y compris les rôles mais qui est moins configurable que la précédente - `pg_restore` : qui permet de jouer un dump pour restaurer une base ## Localiser un fichier @@ -60,37 +62,37 @@ sudo locate mon_fichier | grep /var/www/gtf/vas Pour avoir un descriptif complet d'une commande et de son utilisation il faut utiliser la commande `man` : `man ls` pour la documentaion de ls -Pour avoir une aide simple et souvent un exemple d'utilisation il suffit le plus souvent d'ajouter l'option à la commande souhaité `--help` +Pour avoir une aide simple et ainsi qu'un exemple d'utilisation il suffit le plus souvent d'ajouter l'option `--help` à la commande souhaité ## Analyser le réseau -Chez les clients le plus souvent la Base de données se trouvent sur un autre serveur que celui utilisé pour l'applicatif. -Il arrive que pour diverses raisons le réseau bloque la communication entre les deux serveur, ou un SMTP externe ou un autre serveur. +Chez les clients le plus souvent la base de données se trouvent sur un autre serveur que celui utilisé pour l'applicatif. +Il arrive que pour diverses raisons le réseau bloque la communication entre les deux serveurs, ou un SMTP externe ou un autre serveur. -Dans ce cas là plusieurs outils peuvent vous aider à vérifier si le sevreur est accessible et joignable. +Dans ce cas là plusieurs outils peuvent vous aider à vérifier si le serveur est accessible et joignable. ### Ping -Le ping est une commande qui permet d'envoyer des paquets d'octet à une machine. -En utilisant une url vous pourrez voir si le DNS resout bien l'adresse IP et si le serveur est joignable. +Le ping est une commande qui permet d'envoyer des paquets d'octets à une machine. +En utilisant une url vous pourrez voir si le DNS résout bien l'adresse IP et si le serveur est joignable. ```{Warning} - Le ping peut être bloqué par les protections contre le DDOS, donc un retour négatif de la commande ne veut pas dire que le serveur joignable. A l'inverse un retour positif assure que le serveur est visible pour la machine qui lance la commande, en revanche ça ne garantie pas que le port de communication soit ouvert. + Le ping peut être bloqué par les protections contre le DDOS, donc un retour négatif de la commande ne veut pas dire que le serveur est injoignable. A l'inverse un retour positif assure que le serveur est visible pour la machine qui lance la commande, en revanche ça ne garantie pas que le port de communication soit ouvert. C'est pourquoi le ping est rarement suffisant pour s'assurer d'un problème réseau, mais il donne déjà des pistes ``` ### Traceroute -Traceroute à l'instar du ping va prendre un paramètre une IP ou un domaine. -Il va premièrement résoudre le domaine en IP dans tous les cas ce qui peremttra de tester la résolution DNS, il va ensuite vous afficher un maximum de rebonds par lesquelles passent vos informations. +Traceroute comme ping va prendre en paramètre une IP ou un domaine. +Il va premièrement résoudre le domaine en IP dans tous les cas ce qui permettra de tester la résolution DNS, il va ensuite vous afficher un maximum de rebonds par lesquelles passent vos informations.  -On voit sur cette exemple que je suis bien arrivé dans l'infra d'AWS c'est le dernier rebond que je vois, par contre ensuite je ne sais pas ce qui est arrivé à ma requête. +On voit sur cette exemple que je suis bien arrivé dans l'infra d'AWS c'est le dernier rebond, ensuite la commande n'a plus de retour donc on en saura pas plus. ```{Warning} - Comme pour le ping cette commande est souvent limitée pour des raisons de sécurité. Elle va vous permettre de vérifier la communication jusqu'à un certains point, là en l'occurence je suis sûr que j'arrive jusqu'à AWS, donc si ma machine ne reçoit pas ma requête soit j'ai mal configuré mon groupe de sécurité, ou alors AWS rencontre un problème et je peux m'appuyer sur le modèle de responsabilité partagé pour que le support agisse sur l'infrastructure. + Comme pour le ping cette commande est souvent limitée pour des raisons de sécurité. Elle va vous permettre de vérifier la communication jusqu'à un point. Dans l'exemple je suis sûr que j'arrive jusqu'à AWS, donc si ma machine ne reçoit pas ma requête soit j'ai mal configuré mon groupe de sécurité, soit AWS rencontre un problème et je peux m'appuyer sur le modèle de responsabilité partagé pour que le support agisse sur l'infrastructure. ``` ### Nmap @@ -102,20 +104,112 @@ nmap bien utilisé peut vous permettre de reproduire toute une architecture rés Sur l'exemple on voit une liste de port ouvert et fermé. Le port 22 pour SSH, 80/443 pour le HTTP, ... -A ce moment là vous avez une idée clair de l'accéssibilité de la machine distante et en cas d'erreur vous pouvez écarter ou incriminer le réseau de l'équation. +A ce moment là vous avez une idée clair de l'accéssibilité de la machine distante et en cas d'erreur vous pouvez écarter ou incriminer le réseau. ```{Warning} - nmap ne sera jamais installé sur les machines par défaut, il faut toujours demander au client avant d'installer une commande de ce type et demander l'autorisation de scanner la machine distante. + nmap ne sera jamais installé sur les machines par défaut, il faut toujours demander au client avant d'installer une commande de ce type et demander l'autorisation de scanner la machine cible. - Nmap est une commande connu et est souvent détecter comme une tentative d'intrucion vu qu'un attaqunant va réguliérmeent l'utiliser comme première commande avant d'attaquer réellement la machine. + Nmap est une commande connue et est souvent détecté comme une tentative d'intrusion vu qu'un attaquant va réguliérmeent l'utiliser comme première commande avant d'attaquer réellement la machine. ``` ### Telnet Quand on en arrive là, généralement c'est que ça devient compliqué. -Telnet vous permet de contacter un serveur sur un port et de lui envoyer des trame de données. +Telnet vous permet de contacter un serveur sur un port et de lui envoyer des trames de données. Une utilisation que j'ai assez souvent faite c'est pour débugguer les SMTP. Avec telnet on peut contacter le serveur sur le port, puis vérfiier sa réponse et enfin tester l'authentification, voir même l'envoi de mail complet. -C'est une commande assez complexe dont l'utilisation dépend de ce que 'lon veut tester, je vous conseille de chercher l'utilisation du protocole à tester avec telnet directement sur le net. \ No newline at end of file +On peut aussi l'utiliser pour tester de l'IMAP ou tout autre protocole. + +C'est une commande assez complexe dont l'utilisation dépend de ce que l'on veut tester, je vous conseille de chercher l'utilisation du protocole à tester avec telnet directement pour votre cas spécifiquement. + +## Récupération des statistiques de la machine + +Par défaut les commandes `top` et `ps -ax` devraient toujours être présente et fonctionner. +Une autre commande à installer qui est souvent pratique est `htop`, qui est plus simple à analyser, dynamique et présente d'autre fonctionnalités comme le `kill` via la sélection de processus ou la recherche de processus. + + + +Deux autres commande qui seront trés pratique pour récupérer l'état des disques sont `df` et `du`. + +`df` donnera une vue globale de l'état de la machine, alors que `du` permettra de voir létat d'un dossier sur le disque + + + +## Utiliser la commande précédente + +En shell il est possible d'utiliser `!!` pour rejouer la commande précédente. + +Exemple d'utilisation : +```shell +rm -rf mondossier +# Vous n'avez pas les droits pour ... +sudo !! +# Equivaut à sudo rm -rf mondossier +ls +# Mais je voulais la version liste complète +!! -al +``` + +## Se déplacer rapidement dans l'arborescence + +la commande `cd` est basique et vous la connaissez surement, par contre il y a quelques astuces pour gagner du temps : +- `cd` sans paramètre ramène dans le dossier $HOME, ça équivaut à faire `cd ~` +- `cd -` ramène à l'emplacement précédent + +## Chercher une commande dans l'historique + +La commande `history` retrace toutes les commandes jouées sur la machine sous certaines conditions. + +Si vous avez plusieurs terminaux ouvert il récupère pas tout, en SSH c'est relatif à votre utilisateur et ça prend pas tout. Bref ce n'est pas parfait, mais ça peut vous permettre de retrouver une commande que vous voulez rejouer ou de voir ce qui s'est passé sur la machine. + +Exemple : Je ne retrouve plus la commande pour compiler la documentation `history | grep sphinx`. + +## Usurper www-data + +Sur un serveur des clients, pour s'éviter des problème de droits quand on veut lancer les moteurs par exemple, c'est plus pratique de le faire avec `www-data`, mais comme c'est l'utilisateur d'apache c'est pas si simple. Mais la commande `su` permet de le faire. + +```shell +sudo su - www-data -s /bin/bash +``` + +## Chainer des commandes + +Vous pouvez chainer des commandes en utilisant `&&` ou en les séparant par des `;` : + +```shell +# Permet de lister un sous-dossier et de revenir à la position précédente +cd sous-dossier/ && ls && cd .. +cd sous-dossier/; ls; cd .. +``` + +La syntaxe `&&` lancera les commandes les unes aprés les autres et ne jouera la commande suivante que si la commande en cours se termine en succés. Alors que la syntaxe utilisant `;` chainera les commandes sans tenir compte de l'état de la commande précédente. + +## Utiliser les sorties d'une commande + +Un exécutable qui affiche un résultat dans le terminal envoi du texte dans la sortie standard `stdout` ou dans la sortie d'erreur `stderr`. + +Il est possible de récupérer cette sortie pour la rediriger vers l'entrée standard `stdin` d'une autre commande en utilisant `|`, l'usage le plus courant est d'envoyer ça dans un `grep` pour chercher une chaine de caractère. + +```shell +# recherche dans un fichier texte +cat mon_fichier.txt | grep "Ma chaine dans le fichier" +# Exemple pour zipper certains fichier dans un sous-dossier +find . | egrep "2023-05|2023_05" | sudo zip -@ logs_2023-05.zip +``` + +Dans cette exemple, la commande `cat` lit un fichier et envoi son contenu dans stdout, avec le pipe on redirige stdout dans le stdin de la commande grep pour rechercher une chaine de caractère dans le fichier. + +Il est également possible de rediriger `stdout`et `stderr`, vers un fichier ou l'un vers l'autre en utilisant `>` ou `>>`. + +```shell +# écrit le stdout de la commande vers le fichier result.txt (le fichier sera vidé à chaque fois) +ls -al > result.txt +# écrit le stdout de la commande vers le fichier result.txt (le fichier ne sera pas vidé et on ajoutera à la fin) +ls -al >> result.txt +# Redirige stderr (descripteur 2) vers stdout (descripteur 1) lui même renvoyer dans le fichier txt +ls -al 2>&1 >> return.txt +# Isolation des erreur dans des fichiers différents +ls -al >return.txt 2>error.txt +``` diff --git a/source/exploitation/gtf.md b/source/exploitation/gtf.md new file mode 100644 index 0000000000000000000000000000000000000000..f3c2a3a08dfce5ac24c91b1c0e196ccc574eda07 --- /dev/null +++ b/source/exploitation/gtf.md @@ -0,0 +1,103 @@ +# Configuration additionel pour GTF + +Dans le cas des infogérances, Veremes prend en charge des configurations supplémentaires de façon à éviter des remontés systématique au support. + +Certains points sont à soumettre au client en amont de l'installation, intervention, car il devra protentiellement fournir des éléments ou confirmer qu'il ne souhaite pas qu'on fasse ces manipulations pour l'instant. + +Cette section considère que l'installation/mis eà jour a été effectué en suivant la documentation de GTF et que tout est déjà dans le même état qu'une application on-premise bien installée. + +## Création des moteurs FME et GTF souhaité par le client + + + +## Mise en place d'un certificat SSL fonctionnel + +Il faut pouvoir fournir un certificat valide à minima un let's encrypt. +Ce point est à valider avec le client qui peut s'en passer s'il le souhaite ou nous fournir son certificat s'il en a un. + +## Configuration du SMTP + +Si le client a déjà un service SMTP accessible depuis l'application alors il faut l'ajouter, sinon il faut lui chiffrer l'utilisation du service SES sur son compte et l'activer sur le serveur. + +L'activation du SMTP est à confirmer avec le client il peut aussi s'en passer. + +## Configuration des chemins vers les ressources partagées + +Il faut jouer ce script systématiquement : + +```sh +cd /var/www +sudo mkdir .Safe\ Software +sudo mkdir .fme +cd .Safe\ Software +sudo mkdir FME +cd /var/www/.fme +sudo mkdir Formats +sudo mkdir Transformers +cd /var/www +sudo chown -R www-data.www-data .Safe\ Software +sudo chmod 755 -R .Safe\ Software +sudo chown -R www-data.www-data .fme +sudo chmod 755 -R .fme +``` + +Ensuite il faut définir la configuration dans l'application comme suit : + + +Dans le cas d'un serveur Windows il suffit de se référer à ce qui est écrit dans le log d'un traitement FME, vous pouvez lancer [1Minute.fmw](http://documentation-dev.veremes.net/dev/fr/_static/exploitation/1minute.fmw) si besoin. + +## Configuration du template par défaut + +Par défaut lors de l'installation le template par défaut n'est pas le dernier c'est bien de définir le dernier et de fair eun coup de tri dans la liste. + + + +## Configuration du fuseau horaire + +Pour vérifier que c'est bien configuré il suffit de regarder la date de dernière connexion de votre compte, si c'est dans le futur alors il faut aller dans la configuration et passer le champ sur la valeur `UTC`. + + + +# Tests de fonctionnement + +Dans la logique il faudrait réaliser la quasi totalité de ces action avant et aprés une mise à jour pour vérifier la non regression de l'application. + +Si c'est lancé aprés ce sera déjà pas mal. + +## Vérification de la publication + +Ajout de [1Minute.fmw](http://documentation-dev.veremes.net/dev/fr/_static/exploitation/1minute.fmw) dans l'application. + +Il faut ensuite vérifier que le parser à bien réussi à génére run formulaire et extraire les métadonnées + +## Vérification du fonctionnement du moteur + +Faire la gestion des droit sur le projet précédemment ajouté, puis lancer une demande sur ce traitement. + +Si le traitement se lance (peu importe l'état résultat à cause du python) c'est ok. + +## Vérification de l'envoi de mail + +Suite à la demande il faut vérifier si un mail a bien été envoyé, si un mail est présent sur le compte il suffit d'aller vérifier sa boite mail, sinon un coup d'oeil dans le fichier notify.log fera l'affaire. + +## Vérification de la configuration des moteurs + +Il y a quelques configuration spécifique qui sont parfois perdues pendant les mises à jour. + +Il faut aller vérifier dans /var/www/gtf/vas/engine/**/conf/ si les fichier json n'ont pas de différences inquiétantes. + +Configuration debian pour les impressions/générations de mails par exemple. + +Un fois dans le dossier, c'est bien de jeter un oeil sur le jobs.json pour vérifier que tout ce qui doit être là y est : +- engine startOrder +- engine checkOrder +- engine startInstance +- engine stopInstance +- un runAutomations par période +- un wfRunTriggers par période +- engine wfRunIterationTasks +- exploitationService cleanFiles + +## Connexion base Oracle + +Si l'appli est connecté à une base oracle, il faudra réactiver l'extension dans le php.ini. diff --git a/source/exploitation/images/mail_template.png b/source/exploitation/images/mail_template.png new file mode 100644 index 0000000000000000000000000000000000000000..2c46d699dc35805bb03afd67d9e4f5afa6f5f353 Binary files /dev/null and b/source/exploitation/images/mail_template.png differ diff --git a/source/exploitation/images/shared_ressource_fme.png b/source/exploitation/images/shared_ressource_fme.png new file mode 100644 index 0000000000000000000000000000000000000000..8054f0417f2f7e5a69e0d59917593b19dc209447 Binary files /dev/null and b/source/exploitation/images/shared_ressource_fme.png differ diff --git a/source/exploitation/images/timezone_conf.png b/source/exploitation/images/timezone_conf.png new file mode 100644 index 0000000000000000000000000000000000000000..45c3ff0cff6dd74718e64d5509a0858ddc77cc6c Binary files /dev/null and b/source/exploitation/images/timezone_conf.png differ diff --git a/source/exploitation/index.rst b/source/exploitation/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..4d1a0bdcd9721f7d2c4ae8df970f82122cf12694 --- /dev/null +++ b/source/exploitation/index.rst @@ -0,0 +1,17 @@ +Documentation Veremes sur les prrocédures d'exploitation +============================================= + +.. image:: /images/Veremes_Black.svg + :width: 500 px + :align: center + :target: # + + +============================================= + +.. toctree:: + :maxdepth: 2 + :glob: + + infogerance.md + gtf.md diff --git a/source/exploitation/infogerance.md b/source/exploitation/infogerance.md new file mode 100644 index 0000000000000000000000000000000000000000..a26158973ac10ae43e60dfe757ec4860da106a4c --- /dev/null +++ b/source/exploitation/infogerance.md @@ -0,0 +1,3 @@ +# Configuration de l'OS + +Il est évident que toutes les préconisations en terme de sécurité sont appliquées sur les machines en infogérances (documentation encore en production) \ No newline at end of file diff --git a/source/index.rst b/source/index.rst index c916094e43107351c4ca67ad2320ff1c3a516c35..fb05915be60109614e79b6078eea83d6f93ee10c 100644 --- a/source/index.rst +++ b/source/index.rst @@ -18,4 +18,6 @@ Cette documentation sert de référence en ce qui concerne les outils et usages concept/index.rst tools/index.rst dev-vitis/index.rst + exploitation/index.rst +