diff --git a/bin/preinstall_cleanup.sh b/bin/preinstall_cleanup.sh index 526621c417ade76dd902d57492d3d970a6895c8c..70c9f522351773f4f578b2374840ee587c5ee0ac 100755 --- a/bin/preinstall_cleanup.sh +++ b/bin/preinstall_cleanup.sh @@ -17,6 +17,7 @@ # # ---------------------------------------------------------------------- # 2013-11-06 axel.hahn@iml.unibe.ch +# 2022-11-25 axel.hahn@unibe.ch do not check json in target dir; shellfixes # ====================================================================== # ---------------------------------------------------------------------- @@ -41,8 +42,8 @@ echo if [ $# -lt 2 ]; then - echo Syntax is - echo `basename $0` [webroot] [tgz-archive] [[deleteflag]] + echo "Syntax is" + echo "$( basename $0 ) [webroot] [tgz-archive] [[deleteflag]]" exit 1 fi @@ -58,10 +59,12 @@ # see #2235 - for nodejs apps the target dir is different # ls -ld $prjdir/public_html/ || ls -ld $prjdir/public/ || exit 2 # echo $prjdir | fgrep "/www/" || exit 2 - ls -l $prjdir/*.json || exit 2 + + # skip this - aum spider has no json + # ls -l $prjdir/*.json || exit 2 # check tgz - file $tgz | fgrep "gzip compressed" || exit 3 + file $tgz | grep -F "gzip compressed" || exit 3 # ---------------------------------------------------------------------- # MAIN @@ -97,9 +100,9 @@ bDelete=1 testfile=$delfile if [ ! -d $delfile ]; then - testfile=`dirname $delfile` + testfile=$( dirname $delfile ) fi - echo $testfile | fgrep -f $filelist >/dev/null + echo $testfile | grep -F -f $filelist >/dev/null if [ $? -eq 0 ]; then echo KEEP: $delfile else diff --git a/deploy_app.sh b/deploy_app.sh index 808436f4193eb6d3d459545e5f8fac5d18faa887..6ae3e67c623ae71a97ae18011810689d5ebc4a62 100755 --- a/deploy_app.sh +++ b/deploy_app.sh @@ -12,6 +12,7 @@ # 2021-11-01 v0.6 <axel.hahn@iml.unibe.ch> save config diffs # 2021-11-02 v0.7 <axel.hahn@iml.unibe.ch> delete logs keping N files # 2022-11-24 v0.8 <axel.hahn@iml.unibe.ch> tar -xzf without dot as 2nd param +# 2022-11-25 v0.9 <axel.hahn@iml.unibe.ch> support custom phase + file per project # ====================================================================== @@ -20,6 +21,7 @@ # ---------------------------------------------------------------------- cd $( dirname $0 ) selfdir=$( /bin/pwd ) +_version=0.9 tmpdir=/var/tmp/imldeployment_packages logdir=/var/log/imldeployment-client @@ -74,9 +76,17 @@ function setprofile(){ fi echo "OK, profile [${profile}] was set." - downloadfile="${tmpdir}/${IMLCI_PROJECT}.tgz" - downloadtmp="${tmpdir}/${IMLCI_PROJECT}.tgz.tmp" - cfgdiff="${tmpdir}/${IMLCI_PROJECT}_cfgdiff.txt" + local localfile + if [ -n "$IMLCI_FILE" ]; then + localfile="${IMLCI_PROJECT}__${IMLCI_FILE}" + else + IMLCI_FILE="${IMLCI_PROJECT}.tgz" + localfile="${IMLCI_FILE}" + fi + + downloadfile="${tmpdir}/${localfile}" + downloadtmp="${tmpdir}/${localfile}.tmp" + cfgdiff="${tmpdir}/${localfile}_cfgdiff.txt" test -f "${cfgdiff}" && rm -f "${cfgdiff}" } @@ -132,6 +142,7 @@ function run_task(){ function deploy(){ + local dlparams skipmessage="SKIP: no newer download file. You can use parameter -f to force reinstall." # ---------------------------------------------------------------------- @@ -140,9 +151,17 @@ function deploy(){ # ---------------------------------------------------------------------- - header "Download ${IMLCI_PROJECT}.tgz" + header "Download ${IML} ${IMLCI_PROJECT}.tgz" typeset -i local isupdate=$defaultupdate - ${selfdir}/bin/getfile.sh -f ${IMLCI_PROJECT}.tgz -o ${downloadtmp} + + # getfile.sh reads phase from its cfg file - we need to add it as parameter + test -n "${IMLCI_PHASE}" && dlparams="$dlparams -e ${IMLCI_PHASE}" + + # set the filename to fetch + test -n "$IMLCI_FILE" || dlparams="$dlparams -f ${IMLCI_PROJECT}.tgz" + test -n "$IMLCI_FILE" && dlparams="$dlparams -f $IMLCI_FILE" + + ${selfdir}/bin/getfile.sh ${dlparams} -o ${downloadtmp} if [ $? -ne 0 ]; then echo Download failed. echo Repeating request with debug param -d to get the error... @@ -301,28 +320,32 @@ cd $( dirname $0 ) action="deploy" typeset -i defaultupdate=0 -echo -echo -echo "<<<<<<<<<<##########| IML - DEPLOYMENT SCRIPT |##########>>>>>>>>>>" -echo +echo "_______________________________________________________________________________ + + IML - DEPLOYMENT CLIENT + DOCS: https://os-docs.iml.unibe.ch/imldeployment-client/ _____ +_________________________________________________________________________/ v$_version +" + while getopts 'hfl' arg; do case ${arg} in h) - echo "HELP" - echo "Load one or more profiles profile to deploy an application." - echo "If the download file is not newer then it does not extract files and does not" - echo "run pre and post hooks - it updates the config files only and sets the owner." + echo "HELP:" + echo " Loads one or more profiles profile to deploy an application." + echo " If the download file is not newer then it does not extract files and does not" + echo " Optionally it cleans up the target directory." + echo " Runs pre and post hooks - it updates the config files only and sets the owner." echo - echo "Syntax:" + echo "SYNTAX:" echo " $( basename $0 ) [OPTION] [PROFILE(S)]" echo - echo "Optioms:" + echo "OPTIONS:" echo " -h | show this help and exit" echo " -f | force full installation even if the download file is not newer" echo " -l | list exiting profile names" echo - echo "Profile(s):" + echo "PROFILE(S):" echo " Set one or more valid profile names. By default it loops over all profiles." echo " This prameter limits the execution to the given profiles." echo " Use option -l to get a list of profiles." diff --git a/docs/10_Introduction/10_Requirements.md b/docs/10_Introduction/10_Requirements.md new file mode 100644 index 0000000000000000000000000000000000000000..990e2a7246d13f5bfafaf419c64ed8ff2e52fc09 --- /dev/null +++ b/docs/10_Introduction/10_Requirements.md @@ -0,0 +1,14 @@ +## Requirements + +A few Linux standard tools are required. It should run on any GNU Linux. + +* Bash +* Curl +* sed + +Tested environments: + +* CentOS +* Debian +* Manjaro +* Ubuntu diff --git a/docs/10_Introduction/20_Features.md b/docs/10_Introduction/20_Features.md new file mode 100644 index 0000000000000000000000000000000000000000..e56a473462133e7028042d6b571ce15cd16802a6 --- /dev/null +++ b/docs/10_Introduction/20_Features.md @@ -0,0 +1,10 @@ +## Features + +* Secure download from CI package server using shared secret +* detect a changed download to run an upgrade or just apply rules for configs +* Extraction to target dir +* Cleanup: delete all files in target dir that are not included in the software package +* Create (config) files by inserting strings into placeholders +* Several hooks to allow custom actions, eg. restart a service un changes +* Handle multiple applications on a machine (aka profiles) +* Writes a logfile per execution and application (and to stdout) diff --git a/docs/30_How_does_it_work.md b/docs/10_Introduction/30_How_does_it_work.md similarity index 100% rename from docs/30_How_does_it_work.md rename to docs/10_Introduction/30_How_does_it_work.md diff --git a/docs/10_Introduction/_index.md b/docs/10_Introduction/_index.md new file mode 100644 index 0000000000000000000000000000000000000000..93f576d92592a43e91b1fd640b8445f69621ea42 --- /dev/null +++ b/docs/10_Introduction/_index.md @@ -0,0 +1,42 @@ +# IML deployment client + +This client is a set of bash scripts to deploy a package that was built on th IML CI server. + +```mermaid +graph LR + + %% ----- STYLING + style CIserver fill:none,stroke:#aaa,stroke-dasharray: 3 5 + style DeployClient fill:#8e8,stroke:#4a3,stroke-width:2px + + %% ----- GRAPH + subgraph CIserver + CI(CI<br>deployment<br>web gui) --> |Build| PkgDir + PkgDir[Package<br>dir] + end + + PkgDir --> |rsync| Pkg1 + PkgDir --> |rsync| Pkg2 + PkgDir --> |rsync| Pkg3 + + Pkg1(CI package<br>server 1) --> |secure<br>download| DeployClient + Pkg2(CI package<br>server N) + Pkg3(Puppet master) + + subgraph Appserver + DeployClient --> |installs| ApplicationA(Application A) + DeployClient --> |installs| ApplicationB(Application B) + end + +``` + +You need to put the files to the appliation servers. The task of the deployment client are: + +* fetch software with a secure download +* extract the packages +* generates configs by replacing variables in templates + +This project is related to + +* CI deployment web gui <https://git-repo.iml.unibe.ch/iml-open-source/imldeployment> - it builds the software packages +* CI package server <https://git-repo.iml.unibe.ch/iml-open-source/ci-pkg> - a sattelite with all build packages diff --git a/docs/10_Installation.md b/docs/20_Installation.md similarity index 100% rename from docs/10_Installation.md rename to docs/20_Installation.md diff --git a/docs/20_Configuration.md b/docs/30_Configuration.md similarity index 100% rename from docs/20_Configuration.md rename to docs/30_Configuration.md diff --git a/docs/40_Usage.md b/docs/40_Usage.md index 506f428e5a5656f4eb8d5970837f0b6fd6079200..aad84a9bae1a46d40b7ccb9855673ca6cbb5189b 100644 --- a/docs/40_Usage.md +++ b/docs/40_Usage.md @@ -7,24 +7,27 @@ This is the main deployment script. ```txt ./deploy_app.sh -h +_______________________________________________________________________________ + IML - DEPLOYMENT CLIENT + DOCS: https://os-docs.iml.unibe.ch/imldeployment-client/ _____ +_________________________________________________________________________/ v0.9 -<<<<<<<<<<##########| IML - DEPLOYMENT SCRIPT |##########>>>>>>>>>> +HELP: + Loads one or more profiles profile to deploy an application. + If the download file is not newer then it does not extract files and does not + Optionally it cleans up the target directory. + Runs pre and post hooks - it updates the config files only and sets the owner. -HELP -Load one or more profiles profile to deploy an application. -If the download file is not newer then it does not extract files and does not -run pre and post hooks - it updates the config files only and sets the owner. - -Syntax: +SYNTAX: deploy_app.sh [OPTION] [PROFILE(S)] -Optioms: +OPTIONS: -h | show this help and exit -f | force full installation even if the download file is not newer -l | list exiting profile names -Profile(s): +PROFILE(S): Set one or more valid profile names. By default it loops over all profiles. This prameter limits the execution to the given profiles. Use option -l to get a list of profiles. diff --git a/docs/_index.md b/docs/_index.md index 534b246e2f79d41341adbfa1cf7bde974b69a2a3..e037f34b728969a950c57f3c45da40ba19937fab 100644 --- a/docs/_index.md +++ b/docs/_index.md @@ -1,64 +1,10 @@ -# IML deployment client - -This client is a set of bash scripts to deploy a package that was built on th IML CI server. -It handles a secure download, extracts the package, generates configs. - -```mermaid -graph LR - CI(CI<br>deployment<br>web gui) --> |Build| PkgDir - PkgDir[Package<br>dir] - - PkgDir --> |rsync| Pkg1 - PkgDir --> |rsync| Pkg2 - PkgDir --> |rsync| Pkg3 - - Pkg1(CI package<br>server 1) --> |secure<br>download| DeployClient - Pkg2(CI package<br>server N) - Pkg3(Puppet master) - - subgraph Appserver - DeployClient --> |installs| ApplicationA(Application A) - DeployClient --> |installs| ApplicationB(Application B) - end - -``` - - -This project is related to - -* CI deployment web gui <https://git-repo.iml.unibe.ch/iml-open-source/imldeployment> -* CI package server <https://git-repo.iml.unibe.ch/iml-open-source/ci-pkg> - -## License - -GNU GPL 3.0 - -## Source - -URL: <https://git-repo.iml.unibe.ch/iml-open-source/imldeployment-client/> - -## Requirements - -A few Linux standard tools are required. It should run on any GNU Linux. - -* Bash -* Curl -* sed - -Tested environments: - -* CentOS -* Debian -* Manjaro -* Ubuntu - -## Features - -* Secure download from CI package server using shared secret -* detect a changed download to run an upgrade or just apply rules for configs -* Extraction to target dir -* Cleanup: delete all files in target dir that are not included in the software package -* Create (config) files by inserting strings into placeholders -* Several hooks to allow custom actions, eg. restart a service un changes -* Handle multiple applications on a machine (aka profiles) -* Writes a logfile per execution and application (and to stdout) +<html> +<div class="hero"> + <h2>Welcome</h2> + a set of bash scripts to deploy a package that was built on th IML CI server +</div> +</html> + +📄 Source: <https://git-repo.iml.unibe.ch/iml-open-source/imldeployment-client/> \ +📜 GNU GPL 3.0 \ +📗 Docs: <https://os-docs.iml.unibe.ch/imldeployment-client/> \ No newline at end of file diff --git a/docs/config.json b/docs/config.json index 82afde3caaffa51694ec8425021b89d26fda573f..11dd14bba370e09b3ffbd002d10fd2bd55ce8a69 100644 --- a/docs/config.json +++ b/docs/config.json @@ -17,7 +17,8 @@ "basepath": "https://git-repo.iml.unibe.ch/iml-open-source/imldeployment-client/tree/master/docs" }, "links": { - "Git Repo": "https://git-repo.iml.unibe.ch/iml-open-source/imldeployment-client/" + "Git Repo": "https://git-repo.iml.unibe.ch/iml-open-source/imldeployment-client/", + "IML Opensource": "https://os-docs.iml.unibe.ch/" }, "theme": "daux-blue", "search": true diff --git a/docs/style.css b/docs/style.css index 1ceb0eb44395361387353e278a5dff3fe935324c..188bab04914a8e0fb556392dffae7b695cd590ce 100644 --- a/docs/style.css +++ b/docs/style.css @@ -1,176 +1,266 @@ /* - patch css elements of daux.io blue theme - version 2022-04-22 - + version 2022-11-22 */ - - -/* ---------- vars ---------- */ - -:root{ - - /* background colors */ - --bg:none; - --bg-body: #fff; - --bg-navlinkactive:#f4f4f4; - --bg-navlinkactive: linear-gradient(-90deg,rgba(0,0,0,0), rgba(40,60,80,0.05) 30%); - --bg-pre:#f8f8f8; - --bg-toc: #fff; - - /* foreground colors */ - --color: #234; - --navlinkactive:#f33; - --title: #aaa; - - --link:#12a; - --toclink:rgba(40,60,80,0.8); - - --h1: rgba(40,60,80,0.8); - --h1-bottom: 1px solid rgba(40,60,80,0.1); - --h2: rgba(40,60,80,0.5); - --h3: rgba(40,60,80,0.3); - +:root { + /* Axels Overrides */ + --link-color: #37a; + --brand-color: var(--color-secondary); + --brand-background: var(--body-background); + --hr-color: none; + --search-field-background: none; + --search-field-border-color: none; + --sidebar-background: var(--body-background); + --sidebar-border-color: none; + --sidebar-link-active-background: #e8f4f6; + --sidebar-link-active-background: #eee; + /* Axels custom values */ + --axel_bg-toc: var(--body-background); + --axel_bg-toc-head: #f8f8f8; + --axel_brand-background: none; + --axel_brand-pre-background: rgb(255, 0, 51); + ; + --axel_brand-pre-background-hover: rgb(255, 0, 51); + ; + --axel_h1_header: none; + --axel_h1: #345; + --axel_h1-bg: none; + --axel_h1-bottom: 3px solid none; + --axel_h2: #27a; + --axel_h2-bg: #fafafa; + --axel_h2-bottom: 2px solid #8ce; + --axel_h2-hero-bottom: 2px solid #912; + --axel_h3: #838; + --axel_h3-bottom: 1px solid #ddd; + --axel_hero_bg: #f8f8f8; + --axel_nav-bg: #fcfcfc; + --axel_nav-buttomborder: #ddd; + --axel_pre-background: #f8f8f8; + --axel-th-background: #d0e0e8; + --axel-article-nav-border-top: 0px dotted #ddd; } -/* ---------- tags ---------- */ +.dark { + /* Axels Overrides */ + --color-text: #c0c0c0; + --link-color: #6bd; + --brand-color: var(--color-text); + --brand-background: var(--body-background); + --hr-color: none; + --code-tag-background-color_: #bcc; + --search-field-background: none; + --search-field-border-color: none; + --sidebar-background: var(--body-background); + --sidebar-border-color: none; + --sidebar-link-active-background: #333; + /* Axels custom values */ + --axel_bg-toc: var(--body-background); + --axel_bg-toc-head: #333; + --axel_brand-background: none; + --axel_brand-pre-background: rgb(255, 0, 51); + ; + --axel_brand-pre-background-hover: rgb(255, 0, 51); + ; + --axel_h1_header: none; + --axel_h1: #777; + --axel_h1-bg: none; + --axel_h1-bottom: none; + --axel_h2: #27a; + --axel_h2-bg: #282828; + --axel_h2-bottom: 2px solid #256; + --axel_h2-hero-bottom: 2px solid #712; + --axel_h3: #838; + --axel_h3-bottom: 1px solid #333; + --axel_hero_bg: #242424; + --axel_nav-bg: #242424; + --axel_nav-buttomborder: #555; + --axel_pre-background: #bcc; + --axel-th-background: #203038; + --axel-article-nav-border-top: 0px dotted #234; +} +/* ---------- left side ---------- */ a.Brand::before { - background: rgb(255,0,51); - color: #fff; + background: var(--axel_brand-pre-background); + color: #fff; font-family: arial; - font-weight: bold; - padding: 0.5em 0.3em; - content: 'IML'; + font-weight: bold; + padding: 0.5em 0.3em; + content: 'IML'; margin-right: 0.4em; + float: left; } -body, *{color: var(--color);} -body{background: var(--bg-body);} - - -a{color: var(--link);} -a:hover{opacity: 0.7;} - -h1>a{ color:var(--title);} -_h1:nth-child(1){position: fixed; background: var(--bg); box-shadow: 0 0 1em #ccc; padding: 0 1em} -h1:nth-child(1)>a{ color:var(--navlinkactive); } - -.s-content h1{color: var(--h1); font-size: 200%; font-weight:bold; margin-top: 2em; border-bottom: var(--h1-bottom);} -.s-content h2{color: var(--h2); font-size: 160%; } -.s-content h3{color: var(--h3); font-size: 140%; } -.s-content h4{margin: 0; font-size: 100%; text-align: center; background-color: rgba(0,0,0,0.05);padding: 0.3em;} - -.s-content pre{ - background: var(--bg-pre); +a.Brand:hover::before { + background: var(--axel_brand-pre-background-hover); } -/* ---------- classes ---------- */ - -.required{color:#a42;} -.optional{color:#888;} +a.Brand { + background: var(--axel_brand-background); + font-size: 200%; + height: 4em; +} +/* ---------- page header: breadcrumb ---------- */ +.Page__header { + border: none; +} -/* ----- top left */ -.Brand, -.Columns__left { - background: var(--bg); - border-right: 0px solid #e7e7e9; - color: var(--color); +.Page__header a { + color: var(--axel_h1_header); } -.Brand{font-size: 200%; - background_: linear-gradient(-10deg,#fff 50%, #ddd); - background: var(--bg); + +.Page__header h1 { + font-size: 1.3em; } -.Columns__right__content { - background: var(--bg); + +/* ---------- page content ---------- */ +.s-content { + padding-top: 1em; } -/* ----- Navi left */ +.s-content h1 { + background: var(--axel_h1-bg); + color: var(--axel_h1); + font-size: 200%; + font-weight: bold; + margin-bottom: 2em; + margin-top: 2em; + border-bottom: var(--axel_h1-bottom); +} -.Nav a:hover{ - background: none; - color: var(--navlinkactive) !important; +.s-content h2 { + background: var(--axel_h2-bg); + color: var(--axel_h2); + font-size: 180%; + font-weight: bold; + margin-top: 4em; + border-bottom: var(--axel_h2-bottom); } -.Nav__item--active { - border-right_: 0.3em solid var(--navlinkactive); +h1:first-of-type { + margin-top: 0em; } -.Nav__item--active > a{ - background: var(--bg-navlinkactive); - color: var(--navlinkactive); + +h2:first-of-type { + margin-top: 0em; } -.Nav .Nav .Nav__item--active a { - color: var(--navlinkactive); + +.s-content h3 { + background: var(--axel_h3-bg); + color: var(--axel_h3); + font-size: 150%; + font-weight: bold; + margin-top: 3em; + border-bottom: var(--axel_h3-bottom); } -.Nav .Nav .Nav__item a { - opacity: 1; + +.s-content h4 { + margin: 0; + font-size: 100%; + text-align: center; + background-color: rgba(0, 0, 0, 0.05); + padding: 0.3em; } -.Nav__item--open > a { - background-color: var(--bg); + +.s-content pre { + background: var(--axel_pre-background); } -.Nav a[href*="__Welcome"]{ - background: url("/icons/house.png") no-repeat 10px 4px ; - padding-left: 40px; +/* FIX smaller fnt size in tables */ +.s-content table { + font-size: 1em; } -.Nav a[href*="__How_does_it_work"]{ - background: url("/icons/light-bulb.png") no-repeat 10px 4px ; - padding-left: 40px; + +.s-content table th { + background: var(--axel-th-background); } +.s-content h3 code { + border: none; + background: none; +} +article nav { + border-top: var(--axel-article-nav-border-top); + margin: 8em 0 5em; +} +.Pager li>a { + padding: 1em 2em; +} /* ---------- classes ---------- */ +.required { + color: #a42; +} -/* FIX smaller fnt size in tables */ -.s-content table { - font-size: 1em; +.optional { + color: #888; +} + +div.hero { + background: var(--axel_hero_bg); + border-radius: 2em; + padding: 5em 2em; + text-align: center; + margin-bottom: 1.5em; } +div.hero h2 { + color: var(--color-text); + background: none; + border-bottom: var(--axel_h2-hero-bottom); + font-size: 300%; + margin: 0 0 2em; +} -/* TOC */ -@media(min-width:1700px){ - .TableOfContentsContainer{ +/* ---------- TOC ---------- */ +@media(min-width:1700px) { + .TableOfContentsContainer { position: fixed; right: 2em; top: 1em; } } -.TableOfContentsContainer{ - border-top-left-radius: 1em; - background-color: var(--bg-toc); - border-left: 2px solid rgba(0,0,0,0.05); - padding: 0em; +.TableOfContentsContainer { + background-color: var(--axel_bg-toc); + padding: 0.5em; } -.TableOfContentsContainer__content { - border: none; - font-size: 0.5em; +.s-content .TableOfContentsContainer h4 { + background-color: var(--axel_bg-toc-head); + border-top-left-radius: 1em; + font-size: 1.1em; + margin: 0; + padding: 0; +} +.TableOfContentsContainer__content { + border-width: 1px; + font-size: 0.5em; } -ul.TableOfContents ul{ - list-style-type: none; + +ul.TableOfContents ul { + list-style-type: none; padding-left: 1em; } -.TableOfContentsContainer a{ color:var(--toclink);} -.TableOfContentsContainer__content > .TableOfContents > li + li { - border-top: none; -} -.TableOfContentsContainer__content > .TableOfContents > li { - border-bottom: 1px dashed #ddd; -} +/* ----- Icons on links --- */ -/* pager - prev .. next */ -.s-content{ - margin-bottom: 6em; +.EditOn a::before{ + content: '✏️ '; } -.Pager{ - border-top: 1px dashed #aaa; margin: 0; padding: 1em; + +.Links a[href^="https://github.com/"]::before { + content: '🌐 '; } -.Pager a{ - color:var(--navlinkactive); + +.Links a[href^="https://git-repo.iml.unibe.ch/"]::before { + content: '🌐 '; } + +.Links a[href^="https://os-docs.iml.unibe.ch"]::before { + content: '📗 '; +} \ No newline at end of file