Browse Source

First Jenkins build

pull/1/head
Michael COSTA 6 months ago
parent
commit
aa68636b65
17 changed files with 170 additions and 2366 deletions
  1. +5
    -3
      .gitignore
  2. +0
    -708
      CHANGELOG.md
  3. +4
    -4
      CONTRIBUTING.md
  4. +3
    -2
      Jenkinsfile
  5. +17
    -8
      Makefile
  6. +39
    -1550
      README.md
  7. +0
    -6
      mail/__init__.py
  8. BIN
      scrippy-mail.png
  9. +7
    -0
      scrippy_mail/__init__.py
  10. +5
    -0
      scrippy_mail/mail/__init__.py
  11. +5
    -7
      scrippy_mail/mail/mailer.py
  12. +32
    -35
      scrippy_mail/mail/popclient.py
  13. +20
    -19
      scrippy_mail/mail/spamassassin.py
  14. +4
    -22
      setup.cfg
  15. +2
    -2
      sonar-project.properties
  16. +0
    -0
      tests/__init__.py
  17. +27
    -0
      tests/test_mail.py

+ 5
- 3
.gitignore View File

@ -1,13 +1,15 @@
*un~
*.swp
*.pyc
*/__pycache__
**/__pycache__/
build/
dist/
infra.egg-info/
python_infra.egg-info/
scrippy_mail.egg-info/
test.py
populate_dir.py
.vscode/
venv/
.pytest_cache/
.idea
.coverage
junit_report.xml

+ 0
- 708
CHANGELOG.md View File

@ -1,708 +0,0 @@
# Changelog
Fichier généré automatiquement par auto-changelog
## 1.1.52 (2021-01-20)
#### Fixes
* Makefile: Bad VERSION number
* Makefile: Bad VERSION number
* Makefile: Bad VERSION number
* bumpversion current_version
* Makefile: More targets
* Makefile: More targets
* Makefile: More targets
* Makefile: More targets
* Makefile: More targets
* Makefile
#### Others
* Makefile bumpversion and release targets
* Makefile bumpversion and release targets
Full set of changes: [`1.1.46...1.1.52`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.46...1.1.52)
## 1.1.46 (2020-12-29)
#### Fixes
* remote.ssh.exec_command should not show command unless --debug is used
Full set of changes: [`1.1.45...1.1.46`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.45...1.1.46)
## 1.1.45 (2020-12-29)
#### Fixes
* remote.ssh.exec_command should not show command unless --debug is used
Full set of changes: [`1.1.44...1.1.45`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.44...1.1.45)
## 1.1.44 (2020-12-09)
#### Fixes
* TERM is not defined on remote execution
Full set of changes: [`1.1.43...1.1.44`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.43...1.1.44)
## 1.1.43 (2020-12-09)
#### Fixes
* No more color in Jobscheduler + colors in log files
* No more color in Jobscheduler + colors in log files
* No more color in Jobscheduler + colors in log files
Full set of changes: [`1.1.42...1.1.43`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.42...1.1.43)
## 1.1.42 (2020-11-25)
#### Fixes
* SIN-15126
Full set of changes: [`1.1.41...1.1.42`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.41...1.1.42)
## 1.1.41 (2020-11-25)
#### Fixes
* SIN-15126
* SIN-15126
* SIN-15126
Full set of changes: [`1.1.40...1.1.41`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.40...1.1.41)
## 1.1.40 (2020-11-25)
#### Fixes
* SIN-15126
* SIN-15126
Full set of changes: [`1.1.39...1.1.40`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.39...1.1.40)
## 1.1.39 (2020-10-27)
#### Fixes
* (errorhandler): correction gestion du sys.exit
Full set of changes: [`1.1.38...1.1.39`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.38...1.1.39)
## 1.1.38 (2020-10-27)
#### New Features
* (history): en cas d'exception affiche le nom de l'exception dans le hist à la place de l'exit_code
* (error_handler): ajout gestion d'exception
#### Fixes
* commit only if repo is dirty
Full set of changes: [`1.1.37...1.1.38`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.37...1.1.38)
## 1.1.37 (2020-10-26)
#### Fixes
* infra.git: Utilisation de l objet Repo.git
* infra.git: Prise en charge des suppressions de fichiers
* infra.git: Prise en charge des suppressions de fichiers
* infra.git: Prise en charge des suppressions de fichiers
Full set of changes: [`1.1.36...1.1.37`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.36...1.1.37)
## 1.1.36 (2020-10-26)
#### Fixes
* api.validator global catch
* infra.api: There is NO Validator class
* infra.api: Validator is available from infra.api
* api: flake8 ready
Full set of changes: [`1.1.35...1.1.36`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.35...1.1.36)
## 1.1.35 (2020-10-23)
#### New Features
* Added multi_options support to infra.git
Full set of changes: [`1.1.34...1.1.35`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.34...1.1.35)
## 1.1.34 (2020-10-23)
#### New Features
* infra.git: Gestion des dépôts Git
Full set of changes: [`1.1.33...1.1.34`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.33...1.1.34)
## 1.1.33 (2020-10-20)
#### Fixes
* remote.ssh: Secure regexp match + unshadowing dir builtin
Full set of changes: [`1.1.32...1.1.33`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.32...1.1.33)
## 1.1.32 (2020-10-19)
#### Fixes
* Lower remote.ssh default verbosity
#### Others
* SIN-13730 test execution sur le master
Full set of changes: [`1.1.31...1.1.32`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.31...1.1.32)
## 1.1.31 (2020-10-19)
#### Fixes
* Le controle de la conf se fait dans tous les cas
Full set of changes: [`1.1.30...1.1.31`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.30...1.1.31)
## 1.1.30 (2020-10-19)
#### Fixes
* (remote): Ssh exec_command correction bug commande qui ne se termine pas
Full set of changes: [`1.1.29...1.1.30`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.29...1.1.30)
## 1.1.29 (2020-10-16)
#### Fixes
* (remote): Ssh exec_command correction bug commande qui ne se termine pas
Full set of changes: [`1.1.28...1.1.29`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.28...1.1.29)
## 1.1.28 (2020-10-13)
Full set of changes: [`1.1.27...1.1.28`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.27...1.1.28)
## 1.1.27 (2020-10-13)
#### Fixes
* remote.ftp.put_file remove remote_dir first char only if needed
Full set of changes: [`1.1.26...1.1.27`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.26...1.1.27)
## 1.1.26 (2020-10-13)
#### Fixes
* remote.ftp.put_file remove remote_dir first char only if needed
Full set of changes: [`1.1.25...1.1.26`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.25...1.1.26)
## 1.1.25 (2020-10-13)
#### Fixes
* remote.ftp prot_c fallback to prot p
Full set of changes: [`1.1.24...1.1.25`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.24...1.1.25)
## 1.1.24 (2020-10-13)
#### Fixes
* remote.ftp prot_c fallback to prot p
Full set of changes: [`1.1.23...1.1.24`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.23...1.1.24)
## 1.1.23 (2020-10-13)
#### Fixes
* remote.ftp prot_c fallback to prot p
Full set of changes: [`1.1.22...1.1.23`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.22...1.1.23)
## 1.1.22 (2020-10-12)
#### Fixes
* (remote): Ssh exec_command correction bug commande qui ne se termine pas
Full set of changes: [`1.1.21...1.1.22`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.21...1.1.22)
## 1.1.21 (2020-10-06)
#### New Features
* (ssh): exec_command accept maintenant l'ensemble des paramètres de la methode de paramiko
* (ssh): exec_command changement du retour stdin -> exit_code voir readme https://gitlab-infra.ref.gnc/python-infra/python-infra/blob/master/README.md\[#ex](https://gitlab-infra.ref.gnc/python-infra/python-infra/issues/ex)%C3%A9cuter-une-commande-sur-un-h%C3%B4te-distant
Full set of changes: [`1.1.20...1.1.21`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.20...1.1.21)
## 1.1.20 (2020-10-02)
#### New Features
* (remote): remote Ssh ajout de la method sftp_stat
Full set of changes: [`1.1.19...1.1.20`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.19...1.1.20)
## 1.1.19 (2020-10-01)
Full set of changes: [`1.1.18...1.1.19`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.18...1.1.19)
## 1.1.18 (2020-10-01)
#### Fixes
* Check authorized user before using PIDStack
#### Others
* remote/gncftp: clean lint
Full set of changes: [`1.1.17...1.1.18`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.17...1.1.18)
## 1.1.17 (2020-10-01)
Full set of changes: [`1.1.16...1.1.17`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.16...1.1.17)
## 1.1.16 (2020-10-01)
#### New Features
* ajout des 'with' sur les class Ssh, DB, SpamAssassinClient, Ftp, GncFtp
#### Others
* correction gestion des tags
* suppression de la notification des Merge Request [ci-skip]
Full set of changes: [`1.1.15...1.1.16`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.15...1.1.16)
## 1.1.15 (2020-09-21)
Full set of changes: [`1.1.14...1.1.15`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.14...1.1.15)
## 1.1.14 (2020-09-17)
#### Fixes
* _find_remote_files: exit_on_error
#### Others
* Avertissement de non-confidentialité
Full set of changes: [`1.1.13...1.1.14`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.13...1.1.14)
## 1.1.13 (2020-09-16)
Full set of changes: [`1.1.12...1.1.13`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.12...1.1.13)
## 1.1.12 (2020-09-14)
#### Fixes
* (context): correction erreur sur le context en utilisant les 2 options --nolog et --no-log-file
Full set of changes: [`1.1.11...1.1.12`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.11...1.1.12)
## 1.1.11 (2020-08-24)
Full set of changes: [`1.1.10...1.1.11`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.10...1.1.11)
## 1.1.10 (2020-08-24)
Full set of changes: [`1.1.9...1.1.10`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.9...1.1.10)
## 1.1.9 (2020-08-24)
#### Fixes
* security fix + sonar quality fixes
* Jinja2 autoescape == True by default
Full set of changes: [`1.1.8...1.1.9`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.8...1.1.9)
## 1.1.8 (2020-08-24)
#### New Features
* stack_file_path extension
Full set of changes: [`1.1.7...1.1.8`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.7...1.1.8)
## 1.1.7 (2020-08-24)
#### Fixes
* PermissionError handling on lockfile
Full set of changes: [`1.1.6...1.1.7`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.6...1.1.7)
## 1.1.6 (2020-08-21)
#### Refactorings
* Better filelock logging handling
Full set of changes: [`1.1.5...1.1.6`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.5...1.1.6)
## 1.1.5 (2020-08-21)
#### Refactorings
* Better filelock logging handling
Full set of changes: [`1.1.4...1.1.5`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.4...1.1.5)
## 1.1.4 (2020-08-20)
Full set of changes: [`1.1.3...1.1.4`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.3...1.1.4)
## 1.1.3 (2020-08-20)
#### New Features
* max_instance
Full set of changes: [`1.1.2...1.1.3`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.2...1.1.3)
## 1.1.2 (2020-08-17)
Full set of changes: [`1.1.1...1.1.2`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.1.1...1.1.2)
## 1.1.1 (2020-08-17)
#### Refactorings
* api.apiloader
Full set of changes: [`1.0.153...1.1.1`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.153...1.1.1)
## 1.0.153 (2020-08-13)
#### Others
* auto-changlog fix diff url
* upgrade auto-changelog 0.4.0 -> 0.5.1
Full set of changes: [`1.0.152...1.0.153`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.152...1.0.153)
## 1.0.152 (2020-08-10)
Full set of changes: [`1.0.151...1.0.152`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.151...1.0.152)
## 1.0.151 (2020-08-07)
#### Refactorings
* VWMareApi
Full set of changes: [`1.0.150...1.0.151`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.150...1.0.151)
## 1.0.150 (2020-08-03)
#### New Features
* api.Client ajout SSL verify
Full set of changes: [`1.0.149...1.0.150`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.149...1.0.150)
## 1.0.149 (2020-08-03)
#### Fixes
* api.Client response referenced before assignement
Full set of changes: [`1.0.148...1.0.149`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.148...1.0.149)
## 1.0.148 (2020-08-03)
#### Others
* fix project url in setup.cfg
Full set of changes: [`1.0.147...1.0.148`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.147...1.0.148)
## 1.0.147 (2020-08-03)
#### New Features
* infra.api.Client
#### Fixes
* Better README.md
* Typo in README.md
* better doc
* grammar in README.dm
#### Others
* updated module requirements + added requirements.txt
Full set of changes: [`1.0.145...1.0.147`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.145...1.0.147)
## 1.0.145 (2020-07-30)
#### Others
* clean Jenkinsfile
Full set of changes: [`1.0.144...1.0.145`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.144...1.0.145)
## 1.0.144 (2020-07-30)
#### New Features
* notifyMergeRequest
Full set of changes: [`1.0.143...1.0.144`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.143...1.0.144)
## 1.0.143 (2020-07-30)
#### Docs
* Correction de la doc d install
Full set of changes: [`1.0.142...1.0.143`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.142...1.0.143)
## 1.0.142 (2020-07-27)
#### Fixes
* remote.gncftp.close
Full set of changes: [`1.0.141...1.0.142`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.141...1.0.142)
## 1.0.141 (2020-07-27)
#### New Features
* infra.conf.Config.get_section
Full set of changes: [`1.0.140...1.0.141`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.140...1.0.141)
## 1.0.140 (2020-07-16)
#### Fixes
* README.md: Ajoute doc sur nolog
Full set of changes: [`1.0.139...1.0.140`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.139...1.0.140)
## 1.0.139 (2020-07-16)
#### Fixes
* README.md: Ajoute doc sur nolog
Full set of changes: [`1.0.138...1.0.139`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.138...1.0.139)
## 1.0.138 (2020-07-16)
#### Fixes
* infra.db: type == postgres
Full set of changes: [`1.0.137...1.0.138`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.137...1.0.138)
## 1.0.137 (2020-07-08)
Full set of changes: [`1.0.136...1.0.137`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.136...1.0.137)
## 1.0.136 (2020-07-08)
#### Fixes
* python3.4 argparse.ArgumentParser has no allow_abbrev argument
Full set of changes: [`1.0.135...1.0.136`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.135...1.0.136)
## 1.0.135 (2020-06-22)
#### New Features
* infra.remote.Ssh.sftp_list
Full set of changes: [`1.0.134...1.0.135`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.134...1.0.135)
## 1.0.134 (2020-06-22)
#### Fixes
* sftp_delete must open sftp connection first
Full set of changes: [`1.0.133...1.0.134`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.133...1.0.134)
## 1.0.133 (2020-06-22)
#### New Features
* infra.remote.Ssh.sftp_delete
Full set of changes: [`1.0.132...1.0.133`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.132...1.0.133)
## 1.0.132 (2020-06-19)
#### New Features
* Ajout de la classe Db_from_cc
Full set of changes: [`1.0.131...1.0.132`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.131...1.0.132)
## 1.0.131 (2020-06-19)
#### Refactorings
* infra.remote.ssh
Full set of changes: [`1.0.130...1.0.131`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.130...1.0.131)
## 1.0.130 (2020-06-12)
#### Fixes
* Db.execute default params
* Db.execute default params
Full set of changes: [`1.0.129...1.0.130`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.129...1.0.130)
## 1.0.129 (2020-06-12)
#### Fixes
* Db.execute default params
Full set of changes: [`1.0.128...1.0.129`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.128...1.0.129)
## 1.0.128 (2020-06-12)
#### Fixes
* Db.execute default params
Full set of changes: [`1.0.127...1.0.128`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.127...1.0.128)
## 1.0.127 (2020-06-12)
#### Fixes
* Db.execute default params
Full set of changes: [`1.0.126...1.0.127`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.126...1.0.127)
## 1.0.126 (2020-06-12)
#### Fixes
* Db.execute default params
Full set of changes: [`1.0.125...1.0.126`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.125...1.0.126)
## 1.0.125 (2020-06-12)
#### Fixes
* Db.execute default params
Full set of changes: [`1.0.124...1.0.125`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.124...1.0.125)
## 1.0.124 (2020-06-12)
#### Fixes
* Db.execute default params
Full set of changes: [`1.0.123...1.0.124`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.123...1.0.124)
## 1.0.123 (2020-06-12)
#### Fixes
* Db.execute for Oracle
Full set of changes: [`1.0.122...1.0.123`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.122...1.0.123)
## 1.0.122 (2020-06-12)
#### Others
* Updated Readme for Oracle support
Full set of changes: [`1.0.121...1.0.122`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.121...1.0.122)
## 1.0.121 (2020-06-12)
#### Others
* ajustement ordre bump2version tag auto-changelog
Full set of changes: [`1.0.120...1.0.121`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.120...1.0.121)
## 1.0.120 (2020-06-12)
#### Fixes
* Typo in Jenkinsfile
Full set of changes: [`1.0.119...1.0.120`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.119...1.0.120)
## 1.0.119 (2020-06-12)
#### Others
* end of test
Full set of changes: [`1.0.118...1.0.119`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.118...1.0.119)
## 1.0.118 (2020-06-12)
#### Fixes
* default db_type is pgsql
#### Others
* This is a test
Full set of changes: [`1.0.117...1.0.118`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.117...1.0.118)
## 1.0.117 (2020-06-04)
#### Others
* mise en place du changelog auto-généré
Full set of changes: [`1.0.116...1.0.117`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.116...1.0.117)
## 1.0.116 (2020-06-03)
#### Fixes
* (args): pour le type bool correction de la valeur par défaut de la valeur par defaut
Full set of changes: [`1.0.115...1.0.116`](https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/1.0.115...1.0.116)
## 1.0.115 (2020-05-29)
#### New Features
* add bumpversion
#### Fixes
* ajout du push increment version

+ 4
- 4
CONTRIBUTING.md View File

@ -1,8 +1,8 @@
## Environnement de dev
```sh
python3 -m venv socle-infra-venv
source socle-infra-venv/bin/activate
python3 -m venv scrippy-mail
source scrippy-mail/bin/activate
pip install -e .
```
@ -24,7 +24,7 @@ pip install -e .
# Conventions
## Commits
Le projet utilise la lib https://github.com/Michael-F-Bryan/auto-changelog pour générer automatiquement le fichier `CHANGELOG.md`
Le projet utilise la lib https://mailhub.com/Michael-F-Bryan/auto-changelog pour générer automatiquement le fichier `CHANGELOG.md`
Pour cela, les messages de commits doivent respecter la spécification [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)
@ -57,7 +57,7 @@ Les scopes correspondent aux noms des modules jusqu'au deuxième niveau.
**Sans caratères speciaux !**
**exemple :** `infra.remote.ftp`, `infra.remote.ssh`, `infra.remote`, `infra.db`, `infra.mail.mailer`, etc...
**exemple :** `scrippy-remote.remote.ftp`, `scrippy-remote.remote.ssh`, `scrippy-remote.remote`, `scrippy-db.db`, `scrippy-mail.mail.mailer`, etc...
### Breaking change
Pour les breaking changes ajouter `!` avant le `: <description>`


+ 3
- 2
Jenkinsfile View File

@ -39,7 +39,7 @@ pipeline {
withPythonEnv('python3') {
sh "pip install --upgrade pip"
sh "python -m pip install .[dev]"
sh "python3 -m pytest --cov=scrippy_mail --junitxml=./junit_report.xml"
}
}
}
@ -71,7 +71,7 @@ pipeline {
withPythonEnv('python3') {
sh "bump2version patch"
String version = getAppVersion()
sh "auto-changelog -v ${version} --issue-url https://gitlab-infra.ref.gnc/python-infra/python-infra/issues/{id} --starting-commit dbd7aa41a423126f5ede4e7c1c8436ca02ce022a -d 'Fichier généré automatiquement par auto-changelog' --diff-url https://gitlab-infra.ref.gnc/python-infra/python-infra/compare/{previous}...{current}"
sh "auto-changelog -v ${version} --issue-url https://gitlab-infra.ref.gnc/scrippy/scrippy-mail/issues/{id} --starting-commit 2062da5ba9a4b09f4f4741d0fbe8f8c9e8d002d5 -d 'Fichier généré automatiquement par auto-changelog' --diff-url https://gitlab-infra.ref.gnc/scrippy/scrippy-mail/compare/{previous}...{current}"
sh "git add setup.cfg .bumpversion.cfg CHANGELOG.md"
sh "git commit -m 'increment version and update changelog [ci-skip]'"
sh "git tag ${version}"
@ -94,6 +94,7 @@ pipeline {
post {
always {
junit allowEmptyResults: true, testResults: 'junit_report.xml'
commentMergeRequest()
cleanWs()
}


+ 17
- 8
Makefile View File

@ -1,7 +1,7 @@
VERSION=$(shell python3 ./setup.py --version)
.RECIPEPREFIX +=
.PHONY: install uninstall all distclean bumpversion autochangelog tag dist push release
.PHONY: install uninstall all distclean test bumpversion autochangelog tag dist push release
all: | uninstall install distclean
@ -9,10 +9,19 @@ install:
sudo python3 ./setup.py build install
uninstall:
sudo pip3 uninstall -y python-infra
sudo pip3 uninstall -y scrippy-mail
distclean:
sudo rm -Rf ./build ./dist ./python_infra.egg-info
sudo rm -Rf ./build \
./dist \
./scrippy_mail.egg-info \
./scrippy_mail/__pycache__ \
./tests/__pycache__ \
./junit_report.xml \
./.coverage
test:
python3 -m pytest --cov=scrippy_mail --junitxml=./junit_report.xml
bumpversion:
bump2version patch
@ -20,10 +29,10 @@ bumpversion:
autochangelog:
VERSION=$(shell python3 ./setup.py --version)
auto-changelog -v "${VERSION}" \
--issue-url https://git.mcos.nc/issues/{id} \
--starting-commit dbd7aa41a423126f5ede4e7c1c8436ca02ce022a \
-d 'Fichier généré automatiquement par auto-changelog' \
--diff-url https://git.mcos.nc/python/infra/src/tag/{current}
--issue-url https://git.mcos.nc/scrippy/scrippy-mail/issues/{id} \
--starting-commit db01dd653eb82699c995cc258b9557046670422d \
-d 'Fichier généré automatiquement par auto-changelog' \
--diff-url https://git.mcos.nc/scrippy/scrippy-mail/src/tag/{current}
tag:
VERSION=$(shell python3 ./setup.py --version)
@ -38,4 +47,4 @@ push:
git push origin
git push --tags
release: | distclean bumpversion autochangelog tag dist push
release: | distclean build install test bumpversion autochangelog tag dist push

+ 39
- 1550
README.md
File diff suppressed because it is too large
View File


+ 0
- 6
mail/__init__.py View File

@ -1,6 +0,0 @@
#!/usr/bin/env python3
from infra.mail.mailer import Mailer
from infra.mail.popclient import PopClient
from infra.mail.popclient import PopException
from infra.mail.spamassassin import SpamAssassinClient

BIN
scrippy-mail.png View File

Before After
Width: 532  |  Height: 334  |  Size: 24 KiB

+ 7
- 0
scrippy_mail/__init__.py View File

@ -0,0 +1,7 @@
class ScrippyMailError(Exception):
"""Classe d'erreur spécifique."""
def __init__(self, message):
"""Initialise l'instance."""
self.message = message
super().__init__(self.message)

+ 5
- 0
scrippy_mail/mail/__init__.py View File

@ -0,0 +1,5 @@
#!/usr/bin/env python3
from scrippy_mail.mail.mailer import Mailer
from scrippy_mail.mail.popclient import PopClient
from scrippy_mail.mail.spamassassin import SpamAssassinClient

mail/mailer.py → scrippy_mail/mail/mailer.py View File

@ -12,13 +12,14 @@ _DEFAULT_CIPHERS = ('ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+
'!eNULL:!MD5'
)
class Mailer:
"""
L'objet Mailer est une interface simplifiée vers la bibliothèque "smtplib" permettant l'envoi de courriels
répondant aux RFC en vigeur.
L'objet Mailer est une interface simplifiée vers la bibliothèque smtplib permettant l'envoi de courriels répondant aux RFC en vigeur.
Par défaut la classe Mailer utilise la machine locale et le port 25 comme serveur SMTP.
"""
def __init__(self, host='localhost', port=25, user=None, password=None, starttls=False, timeout=60):
self.host = host
self.port = port
@ -28,9 +29,7 @@ class Mailer:
self.timeout = timeout
def send(self, subject, body, to_addrs, from_addr):
"""
La méthode "Mailer.send()" se charge d'envoyer le courriel dont les paramètres sont passés en arguments.
"""
"""Envoie le courriel dont les paramètres sont passés en arguments."""
if not isinstance(to_addrs, tuple):
to_addrs = (to_addrs,)
tz = "{}00".format(datetime.now().astimezone().tzinfo)
@ -86,8 +85,7 @@ class Mailer:
return False
return True
except (smtplib.SMTPHeloError, smtplib.SMTPAuthenticationError, smtplib.SMTPNotSupportedError,
smtplib.SMTPRecipientsRefused, smtplib.SMTPHeloError, smtplib.SMTPSenderRefused,
smtplib.SMTPDataError, smtplib.SMTPException, RuntimeError) as e:
smtplib.SMTPRecipientsRefused, smtplib.SMTPSenderRefused, smtplib.SMTPDataError, smtplib.SMTPException, RuntimeError) as e:
logging.error("[{}] {}".format(e.__class__.__name__, e))
return False
except Exception as e:

mail/popclient.py → scrippy_mail/mail/popclient.py View File

@ -1,35 +1,28 @@
#!/usr/bin/env python3
import sys
"""Le module scrippy_mail.mail.PopClient est une implémentation basique du protocole POP3."""
import time
import socket
import logging
from io import BytesIO
from scrippy_mail import ScrippyMailError
class PopException(Exception):
"""
Classe d'erreur spécifique à la gestion des erreurs POP
"""
def __init__(self, message):
super().__init__(message)
class PopClient:
"""
L'objet PopClient implémente une partie du protocle POP3 (RFC 1939):
"""L'objet PopClient implémente une partie du protocle POP3 (RFC 1939).
https://tools.ietf.org/html/rfc1939
Par défaut le serveur POP3 utilisé est la machine locale '127.0.0.1'.
"""
def __init__(self, host='127.0.0.1', port=110, timeout=2):
"""Initialise le client."""
self.host = host
self.port = port
self.timeout = timeout
self.socket = None
def connect(self):
"""
Se connecte sur le serveur distant.
"""
"""Se connecte sur le serveur distant."""
logging.info("[+] Connexion au serveur de courriels {}:{}".format(self.host, self.port))
logging.info(" '-> {}:{}".format(self.host, self.port))
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@ -39,23 +32,25 @@ class PopClient:
self._recv_data()
except Exception as e:
logging.critical(" '-> Erreur lors de la connexion")
sys.exit(1)
raise ScrippyMailError("Erreur lors de la connexion: [{}] {}".format(e.__class__.name, str(e)))
def _send_data(self, data):
"""
Envoie au serveur distant et via le socket les données passées en argument.
Cette méthode est à usage interne et ne devrait pas etre utilisée directement.
"""
try:
self.socket.sendall(data)
logging.debug("Sent: {}".format(data))
except Exception as e:
logging.critical("Erreur lors de la communication avec le serveur de courriels: []: {}".format(e.__class__.__name__, str(e)))
raise e
logging.critical("Erreur lors de la communication avec le serveur de courriels: [{}]: {}".format(e.__class__.__name__, str(e)))
raise ScrippyMailError("Erreur lors de la communication avec le serveur de courriels: [{}] {}".format(e.__class__.name, str(e)))
def _recv_data(self, bufsize=8192):
"""
Reçoit les données envoyées par le serveur distant au travers du socket.
Cette méthode est à usage interne et ne devrait pas etre utilisée directement.
"""
data = b''
@ -67,19 +62,20 @@ class PopClient:
data += packet
except Exception as e:
# On recommence jusqu'à expiration du timeout
logging.debug("{}/{}".format(time.time()-start, self.timeout))
logging.debug("{}/{}".format(time.time() - start, self.timeout))
logging.debug("[{}]: {}".format(e.__class__.__name__, str(e)))
pass
logging.debug("Received: {}".format(data))
return data
except Exception as e:
logging.critical("Erreur lors de la communication avec le serveur de courriels: []: {}".format(e.__class__.__name__, str(e)))
raise e
logging.critical("Erreur lors de la communication avec le serveur de courriels: [{}]: {}".format(e.__class__.__name__, str(e)))
raise ScrippyMailError("Erreur lors de la communication avec le serveur de courriels: [{}] {}".format(e.__class__.name, str(e)))
def authenticate(self, username, password):
"""
Permet l'authentification de l'utilisateur avec les identifiants 'username' et 'passsword' passés en argument.
Sort en erreur (sys.exit(1)) si l'authentification échoue.
Authentification de l'utilisateur.
Lève une erreur ScrippyMailError si l'authentification n'est réussie.
"""
logging.info("[+] Auhentification")
logging.debug(" '-> {}:{}".format(username, password))
@ -89,18 +85,19 @@ class PopClient:
resp = self._recv_data()
if resp[:3] != b'+OK':
logging.critical(" '-> Erreur lors de l'authentification: {}".format(resp))
sys.exit(1)
raise ScrippyMailError("Erreur lors de l'authentification: {}".format(resp))
buffer = BytesIO()
buffer.write(b'PASS %s\r\n' % password.encode())
self._send_data(buffer.getvalue())
resp = self._recv_data()
if resp[:3] != b'+OK':
raise PopException("Erreur lors de l'authentification: {}".format(resp))
raise ScrippyMailError("Erreur lors de l'authentification: {}".format(resp))
def stat(self):
"""
Récupère le nombre de messages disponibles dans la boite de l'utilisateur.
Sort en erreur (sys.exit(1)) si l'authentification échoue.
Lève une erreur ScrippyMailError si l'authentification échoue.
"""
logging.info("[+] Recuperation du nombres de courriels disponibles")
buffer = BytesIO()
@ -108,13 +105,14 @@ class PopClient:
self._send_data(buffer.getvalue())
resp = self._recv_data()
if resp[:3] != b'+OK':
raise PopException("Erreur lors de la recuperation du nombre de courriels: {}".format(resp))
raise ScrippyMailError("Erreur lors de la recuperation du nombre de courriels: {}".format(resp))
return resp
def retr(self, num):
"""
Récupère le contenu du courriel dont le numéro est passé en argument.
Sort en erreur (sys.exit(1)) si l'authentification échoue.
Lève une erreur ScrippyMailError si l'authentification échoue.
"""
logging.info("[+] Recuperation du courriel")
logging.debug(" '-> No: {}".format(num))
@ -123,14 +121,15 @@ class PopClient:
self._send_data(buffer.getvalue())
resp = self._recv_data()
if resp[:3] != b'+OK':
raise PopException("Erreur lors de la recuperation du courriel: {}".format(resp))
raise ScrippyMailError("Erreur lors de la recuperation du courriel: {}".format(resp))
# On ne renvoie que le mail (sans le code de réponse du serveur)
return resp.split(b'\r\n', 1)[1]
def dele(self, num):
"""
Supprime le contenu du courriel dont le numéro est passé en argument.
Sort en erreur (sys.exit(1)) si l'authentification échoue.
Lève une erreur ScrippyMailError si l'authentification échoue.
"""
logging.info("[+] Suppression du courriel")
logging.debug(" '-> No: {}".format(num))
@ -139,15 +138,13 @@ class PopClient:
self._send_data(buffer.getvalue())
resp = self._recv_data()
if resp[:3] != b'+OK':
raise PopException("Erreur lors de la suppression du courriel: {}".format(resp))
raise ScrippyMailError("Erreur lors de la suppression du courriel: {}".format(resp))
return resp
def quit(self):
"""
Se deconnecte du serveur distant.
"""
def bye(self):
"""Se déconnecte du serveur distant."""
logging.info("[+] Deconnexion du serveur de courriels")
buffer = BytesIO()
buffer.write(b'QUIT\r\n')
self._send_data(buffer.getvalue())
self.socket.shutdown(socket.SHUT_WR)
self.socket.shutdown(socket.SHUT_WR)

mail/spamassassin.py → scrippy_mail/mail/spamassassin.py View File

@ -1,35 +1,38 @@
#!/usr/bin/env python3
"""Le module scrippy_mail.mail.SpamAssassin est une implémentation basique de Spamassassin."""
import time
import socket
import logging
from io import BytesIO
from scrippy_mail import ScrippyMailError
class SpamAssassinClient:
"""
L'objet SpamAssassinClient implémente une partie du protocole SpamAssassin:
https://svn.apache.org/repos/asf/spamassassin/trunk/spamd/PROTOCOL
Implémentaton d'une partie du protocole SpamAssassin.
https://svn.apache.org/repos/asf/spamassassin/trunk/spamd/PROTOCOL
Par défaut le serveur SpamAssassin utilisé est la machine locale '127.0.0.1'.
"""
def __init__(self, host='127.0.0.1', port=783, timeout=2):
"""Initialise le client."""
self.host = host
self.port = port
self.timeout = timeout
self.socket = None
def __enter__(self):
"""Point d'entrée."""
self.connect()
return self
def __exit__(self, type_err, value, traceback):
"""Point de sortie."""
del type_err, value, traceback
self.close()
def connect(self):
"""
Permet la connexion au serveur SpamAssassin défini au moment de l'instanciation.
"""
"""Se connecte au serveur SpamAssassin défini au moment de l'instanciation."""
logging.info("[+] Connexion au serveur SpamAssassin")
logging.info(" '-> {}:{}".format(self.host, self.port))
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@ -37,18 +40,15 @@ class SpamAssassinClient:
self.socket.connect((self.host, self.port))
def close(self):
"""
Ferme la connexion au serveur SpamAssassin.
"""
"""Ferme la connexion au serveur SpamAssassin."""
logging.info("[+] Deconnexion du serveur SpamAssassin")
self.socket.shutdown(socket.SHUT_WR)
self.socket.close()
def _send_data(self, data):
"""
Envoie un message (au sens protocole d'échange SpamaAssassin) au serveur SpamaAssassin défini lors de l'instanciation de l'objet.
Cette méthode est utilisée par toutes les méthodes ayant besoin de communiquer avec le serveur SpamAssassin.
"""Envoie un message (au sens protocole d'échange SpamaAssassin) au serveur SpamaAssassin.
Cette méthode est utilisée par toutes les méthodes ayant besoin de communiquer avec le serveur SpamAssassin.
https://svn.apache.org/repos/asf/spamassassin/trunk/spamd/PROTOCOL
"""
try:
@ -56,8 +56,7 @@ class SpamAssassinClient:
logging.debug("Sent: {}".format(data))
except Exception as e:
logging.error("Erreur lors de l'envoi du message vers SpamAssassin: [{}]: {}".format(e.__class__.__name__, str(e)))
# on renvoie l'erreur au niveau supérieur
raise e
raise ScrippyMailError("Erreur lors de l'envoi du message vers SpamAssassin: [{}] {}".format(e.__class__.name, str(e)))
def _recv_data(self, bufsize=8192):
data = b''
@ -68,7 +67,7 @@ class SpamAssassinClient:
data += packet
except Exception as e:
# On recommence jusqu'à expiration du timeout
logging.debug("{}/{}".format(time.time()-start, self.timeout))
logging.debug("{}/{}".format(time.time() - start, self.timeout))
logging.debug("[{}]: {}".format(e.__class__.__name__, str(e)))
pass
logging.debug("Received: {}".format(data))
@ -90,15 +89,17 @@ class SpamAssassinClient:
buffer.write(mail.encode())
logging.debug(str(buffer.getvalue()))
self._send_data(buffer.getvalue())
# On a besoin de récupérer les données même si on ne s'en sert pas
resp = self._recv_data()
except Exception as e:
logging.error("Erreur lors de l'apprentissage: [{}]: {}".format(e.__class__.__name__, str(e)))
# on renvoie l'erreur au niveau supérieur
raise e
raise ScrippyMailError("Erreur lors de l'apprentissage: [{}] {}".format(e.__class__.name, str(e)))
def check_spam(self, mail):
"""
Vérifie le courriel passé en argument.
Renvoie True sie le courriel est considéré comme un spam et fasle dans le cas contraire.
Le résultat et le score sont inscrits dans le log de debug.
"""
@ -121,8 +122,8 @@ class SpamAssassinClient:
return result
# Si on arrive ici, c'est qu'une erreur est survenue
# On renvoie l'exception pour qu'elle soit attrapée plus bas.
# Touche pas à ça p'tit con©
raise Exception("{}".format(data))
except Exception as e:
logging.error("Erreur lors de la verification: [{}]: {}".format(e.__class__.__name__, str(e)))
# on renvoie l'erreur au niveau supérieur
raise e
raise ScrippyMailError("Erreur lors de la verification: [{}]: {}".format(e.__class__.name, str(e)))

+ 4
- 22
setup.cfg View File

@ -4,9 +4,9 @@ classifiers =
Programming Language :: Python :: 3
License :: WTFPL
Operating System :: POSIX :: Linux
url = https://gitlab-infra.ref.gnc/puppet/python-infra
url = https://gitlab-infra.ref.gnc/scrippy/scrippy_mail
description = "Socle de fonctions utilisées dans les scripts python de gestion d'infrastructure."
name = python-infra
name = scrippy_mail
long_description = file: README.md
long_description_content_type = text/markdown
author = Michael Costa, Florent Chevalier
@ -15,25 +15,6 @@ author_email = michael.costa@mcos.nc, florent.chevalier@gouv.nc
[options]
packages = find:
install_requires =
GitPython>=2.1.15
psycopg2-binary>=2.8.3
markupsafe>=1.1.1
pycparser>=2.19
paramiko>=2.6.0
argcomplete>=1.10.0
bcrypt>=3.1.7
coloredlogs>=10.0
pytz>=2019.3
pynacl>=1.3.0
cryptography>=2.7
six>=1.12.0
jinja2>=2.10.3
asn1crypto>=1.0.1
prettytable>=0.7.2
cffi>=1.12.3
humanfriendly>=4.18
sqlparse>=0.3.0
filelock>=3.0.12
[options.extras_require]
dev =
@ -49,12 +30,13 @@ dev =
pep8-naming>=0.8.2
flake8-tabs==2.1.0
pytest==5.2.1
pytest-cov>=2.8.1
bump2version==0.5.11
auto-changelog==0.5.1
[flake8]
ignore = E111
exclude = .git,__pycache__,build,dist, thot-cli-venv
exclude = .git,__pycache__,build,dist
max-line-length = 160
use-flake8-tabs = true
tab-width = 2


+ 2
- 2
sonar-project.properties View File

@ -1,5 +1,5 @@
sonar.projectName=python-infra
sonar.gitlab.project_id=puppet/python-infra
sonar.projectName=scrippy_git
sonar.gitlab.project_id=scrippy/scrippy_mail
sonar.gitlab.url=https://gitlab-infra.ref.gnc


+ 0
- 0
tests/__init__.py View File


+ 27
- 0
tests/test_mail.py View File

@ -0,0 +1,27 @@
"""Test scrippy_mail."""
from scrippy_mail import mail
MAIL_HOST = "localhost"
MAIL_PORT = 25
MAIL_TLS = False
MAIL_FROM = "no-reply@gouv.nc"
MAIL_TO = " basd@gouv.nc"
MAIL_SUBJECT = "Rapport d'erreur"
MAIL_BODY = """Bonjour Harry Fink
Vous recevez cet e-mail car vous faites partie des administrateurs fonctionnels de l'application Dead Parrot.
L'exécution du script s'est terminé avec l'erreur suivante:
- It's not pinin’! It's passed on! This parrot is no more!
--
Cordialement.
Luiggi Vercotty
"""
def test_send_mail():
"""Test envoi de mail."""
mailer = mail.Mailer(host=MAIL_HOST, port=MAIL_PORT, starttls=MAIL_TLS)
to_addrs = (MAIL_TO,)
if mailer.send(MAIL_SUBJECT, MAIL_BODY, to_addrs, MAIL_FROM):
print("Courriel envoyé avec succès")

Loading…
Cancel
Save