Compare commits
26 Commits
v0.0.10-ge
...
v.0.1.6-ge
Author | SHA1 | Date | |
---|---|---|---|
d7115b7ffb | |||
66c8cdf08e | |||
c06fca73e5 | |||
ec5ced5f1e | |||
2125919329 | |||
62e1e0435b | |||
167dce745b | |||
6caa30b4be | |||
3b392f1f69 | |||
1fb8100c32 | |||
367408b5fe | |||
5aa0c87fdc | |||
c5e8cf8b5b | |||
8a910ca493 | |||
676d26a64d | |||
0510ef607d | |||
74bc3f71c4 | |||
1bd5ffafa9 | |||
f6dfa00f97 | |||
f921870fe6 | |||
f8fcb95601 | |||
163d690e81 | |||
d1d177dd38 | |||
a6be4fc26b | |||
727d25a1af | |||
bcbd0ae9ef |
68
automate.sh
68
automate.sh
@ -11,52 +11,24 @@ export https_proxy="http://10.121.38.1:8080/"
|
||||
echo "Voulez-vous récupérer les fichiers du dépôt ou effectuer un push sur le dépôt ? [1 = Pull, 2 = Push]"
|
||||
read answer
|
||||
|
||||
echo "Quelle branche est concernée ? [1 = main, 2 = test]"
|
||||
read branch
|
||||
|
||||
if [ $branch == 1 ] ; then
|
||||
if [ $answer == 1 ] ; then
|
||||
git checkout main
|
||||
echo "Récupération des fichiers à jour, branche main..."
|
||||
git pull -q origin main
|
||||
else
|
||||
git checkout main
|
||||
echo "Ajout des fichiers au Gitea..."
|
||||
sleep 1
|
||||
git add .
|
||||
echo "Commit en cours..."
|
||||
sleep 1
|
||||
git commit
|
||||
echo "Entrez la version du tag:"
|
||||
read tag
|
||||
git tag $tag
|
||||
echo "Push des fichiers au Gitea, branche main..."
|
||||
sleep 1
|
||||
git push -q origin main --tag
|
||||
fi
|
||||
|
||||
elif [ $branch == 2 ] ; then
|
||||
if [ $answer == 1 ] ; then
|
||||
git checkout test
|
||||
echo "Récupération des fichiers à jour dans la branche test..."
|
||||
git pull -q origin test
|
||||
else
|
||||
git checkout test
|
||||
echo "Ajout des fichiers au Gitea, branche test..."
|
||||
sleep 1
|
||||
git add .
|
||||
echo "Commit en cours..."
|
||||
sleep 1
|
||||
git commit
|
||||
echo "Entrez la version du tag:"
|
||||
read tag
|
||||
git tag $tag
|
||||
echo "Push des fichiers au Gitea, branche test..."
|
||||
sleep 1
|
||||
git push -q origin test --tag
|
||||
fi
|
||||
|
||||
if [ $answer == 1 ] ; then
|
||||
git checkout main
|
||||
echo "Récupération des fichiers à jour, branche main..."
|
||||
git pull -q origin main
|
||||
echo "Fichiers à jour récupérés."
|
||||
else
|
||||
echo "Choisissez une branche et une option valide. Veuillez relancer le script"
|
||||
|
||||
fi
|
||||
git checkout main
|
||||
echo "Ajout des fichiers au Gitea..."
|
||||
sleep 1
|
||||
git add .
|
||||
echo "Commit en cours..."
|
||||
sleep 1
|
||||
git commit
|
||||
git tag -l "v.*"
|
||||
echo "Entrez la version du tag:"
|
||||
read tag
|
||||
git tag $tag
|
||||
echo "Push des fichiers au Gitea, branche main..."
|
||||
sleep 1
|
||||
git push -q origin main --tag
|
||||
fi
|
||||
|
1
bts_annee_2/cyber2/vpn-ipsec/README.md
Normal file
1
bts_annee_2/cyber2/vpn-ipsec/README.md
Normal file
@ -0,0 +1 @@
|
||||
Dossier avec les fichiers de configuration du tunnel IPsec fait en TP, ainsi que les IPs et tables de routage.
|
1
bts_annee_2/cyber2/vpn-ipsec/gw1/README.md
Normal file
1
bts_annee_2/cyber2/vpn-ipsec/gw1/README.md
Normal file
@ -0,0 +1 @@
|
||||
Il faut renommer le fichier ipsec-gw1.conf en ipsec.conf et le placer dans /etc/ .
|
18
bts_annee_2/cyber2/vpn-ipsec/gw1/config_ip_gw1
Normal file
18
bts_annee_2/cyber2/vpn-ipsec/gw1/config_ip_gw1
Normal file
@ -0,0 +1,18 @@
|
||||
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
|
||||
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
||||
inet 127.0.0.1/8 scope host lo
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 ::1/128 scope host noprefixroute
|
||||
valid_lft forever preferred_lft forever
|
||||
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
|
||||
link/ether 08:00:27:71:ec:44 brd ff:ff:ff:ff:ff:ff
|
||||
inet 192.168.1.1/24 brd 192.168.1.255 scope global enp0s3
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::a00:27ff:fe71:ec44/64 scope link
|
||||
valid_lft forever preferred_lft forever
|
||||
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
|
||||
link/ether 08:00:27:c2:6d:0b brd ff:ff:ff:ff:ff:ff
|
||||
inet 10.0.0.1/24 brd 10.0.0.255 scope global enp0s8
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::a00:27ff:fec2:6d0b/64 scope link
|
||||
valid_lft forever preferred_lft forever
|
23
bts_annee_2/cyber2/vpn-ipsec/gw1/ipsec-gw1.conf
Normal file
23
bts_annee_2/cyber2/vpn-ipsec/gw1/ipsec-gw1.conf
Normal file
@ -0,0 +1,23 @@
|
||||
config setup
|
||||
charondebug="all"
|
||||
uniqueids=yes
|
||||
strictcrlpolicy=no
|
||||
conn %default
|
||||
conn tunnel #
|
||||
left=10.0.0.1
|
||||
leftsubnet=192.168.1.0/24
|
||||
right=10.0.0.2
|
||||
rightsubnet=192.168.2.0/24
|
||||
ike=aes256-sha2_256-modp1024!
|
||||
esp=aes256-sha2_256!
|
||||
keyingtries=0
|
||||
ikelifetime=1h
|
||||
lifetime=8h
|
||||
dpddelay=30
|
||||
dpdtimeout=120
|
||||
dpdaction=restart
|
||||
authby=secret
|
||||
auto=start
|
||||
keyexchange=ikev2
|
||||
type=tunnel
|
||||
|
3
bts_annee_2/cyber2/vpn-ipsec/gw1/table_routage_gw1
Normal file
3
bts_annee_2/cyber2/vpn-ipsec/gw1/table_routage_gw1
Normal file
@ -0,0 +1,3 @@
|
||||
10.0.0.0/24 dev enp0s8 proto kernel scope link src 10.0.0.1
|
||||
192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.1
|
||||
192.168.2.0/24 via 192.168.1.1 dev enp0s3
|
1
bts_annee_2/cyber2/vpn-ipsec/gw2/README.md
Normal file
1
bts_annee_2/cyber2/vpn-ipsec/gw2/README.md
Normal file
@ -0,0 +1 @@
|
||||
Il faut renommer le fichier ipsec-gw2.conf en ipsec.conf et le placer dans /etc/ .
|
18
bts_annee_2/cyber2/vpn-ipsec/gw2/config_ip_gw2
Normal file
18
bts_annee_2/cyber2/vpn-ipsec/gw2/config_ip_gw2
Normal file
@ -0,0 +1,18 @@
|
||||
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
|
||||
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
||||
inet 127.0.0.1/8 scope host lo
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 ::1/128 scope host noprefixroute
|
||||
valid_lft forever preferred_lft forever
|
||||
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
|
||||
link/ether 08:00:27:35:ba:6d brd ff:ff:ff:ff:ff:ff
|
||||
inet 192.168.2.1/24 brd 192.168.2.255 scope global enp0s3
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::a00:27ff:fe35:ba6d/64 scope link
|
||||
valid_lft forever preferred_lft forever
|
||||
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
|
||||
link/ether 08:00:27:ea:8b:77 brd ff:ff:ff:ff:ff:ff
|
||||
inet 10.0.0.2/24 brd 10.0.0.255 scope global enp0s8
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::a00:27ff:feea:8b77/64 scope link
|
||||
valid_lft forever preferred_lft forever
|
23
bts_annee_2/cyber2/vpn-ipsec/gw2/ipsec-gw2.conf
Normal file
23
bts_annee_2/cyber2/vpn-ipsec/gw2/ipsec-gw2.conf
Normal file
@ -0,0 +1,23 @@
|
||||
config setup
|
||||
charondebug="all"
|
||||
uniqueids=yes
|
||||
strictcrlpolicy=no
|
||||
conn %default
|
||||
conn tunnel #
|
||||
left=10.0.0.2
|
||||
leftsubnet=192.168.2.0/24
|
||||
right=10.0.0.1
|
||||
rightsubnet=192.168.1.0/24
|
||||
ike=aes256-sha2_256-modp1024!
|
||||
esp=aes256-sha2_256!
|
||||
keyingtries=0
|
||||
ikelifetime=1h
|
||||
lifetime=8h
|
||||
dpddelay=30
|
||||
dpdtimeout=120
|
||||
dpdaction=restart
|
||||
authby=secret
|
||||
auto=start
|
||||
keyexchange=ikev2
|
||||
type=tunnel
|
||||
|
2
bts_annee_2/cyber2/vpn-ipsec/gw2/table_routage_gw2
Normal file
2
bts_annee_2/cyber2/vpn-ipsec/gw2/table_routage_gw2
Normal file
@ -0,0 +1,2 @@
|
||||
10.0.0.0/24 dev enp0s8 proto kernel scope link src 10.0.0.2
|
||||
192.168.2.0/24 dev enp0s3 proto kernel scope link src 192.168.2.1
|
@ -1,2 +1,2 @@
|
||||
Dépôt de seconde année de SISR.
|
||||
Chaque dossier porte le numéro de la séance associée.
|
||||
Chaque dossier porte le nom du sujet associé.
|
||||
|
2
bts_annee_2/sisr2/ansible/README.md
Normal file
2
bts_annee_2/sisr2/ansible/README.md
Normal file
@ -0,0 +1,2 @@
|
||||
Fichier hosts utilisé pour ansible lors du TP de la séance 16.
|
||||
Sont inclus les fichiers idempotents .yml d'ansible que j'ai fait, ainsi que le dossier avec tous les playbooks pour le DokuWiki.
|
1
bts_annee_2/sisr2/ansible/dokuw/README.md
Normal file
1
bts_annee_2/sisr2/ansible/dokuw/README.md
Normal file
@ -0,0 +1 @@
|
||||
Dossier des playbooks DokuWiki.
|
6
bts_annee_2/sisr2/ansible/dokuw/hosts
Normal file
6
bts_annee_2/sisr2/ansible/dokuw/hosts
Normal file
@ -0,0 +1,6 @@
|
||||
[adm]
|
||||
infra
|
||||
|
||||
[web]
|
||||
web1
|
||||
web2
|
4
bts_annee_2/sisr2/ansible/dokuw/local.yml
Normal file
4
bts_annee_2/sisr2/ansible/dokuw/local.yml
Normal file
@ -0,0 +1,4 @@
|
||||
- hosts: web
|
||||
roles:
|
||||
- web
|
||||
- doku
|
51
bts_annee_2/sisr2/ansible/dokuw/main_doku.yml
Normal file
51
bts_annee_2/sisr2/ansible/dokuw/main_doku.yml
Normal file
@ -0,0 +1,51 @@
|
||||
- name: 1. Récupération du tar.gz du DokuWiki
|
||||
get_url:
|
||||
url: http://depl/store/dokuwiki-stable.tgz
|
||||
dest: /tmp
|
||||
|
||||
- name: 2. Extraction de l'archive
|
||||
unarchive:
|
||||
src: /tmp/dokuwiki-stable.tgz
|
||||
dest: /var/www/html
|
||||
remote_src: yes
|
||||
|
||||
- name: 3. Status des dossiers du Wiki
|
||||
stat:
|
||||
path: /var/www/html/dokuwiki-2024-02-06b
|
||||
register: rept_stat
|
||||
|
||||
- name: 4. On renomme les dossiers
|
||||
command: mv /var/www/html/dokuwiki-2024-02-06b /var/www/html/doku
|
||||
when: rept_stat.stat.exists
|
||||
|
||||
- name: 5. Changement des droits sur la racine
|
||||
file:
|
||||
path: /var/www/html/doku
|
||||
owner: root
|
||||
group: root
|
||||
|
||||
- name: 6. Changement des droits sur le dossier data
|
||||
file:
|
||||
path: /var/www/html/doku/data
|
||||
owner: www-data
|
||||
group: www-data
|
||||
recurse: true
|
||||
|
||||
- name: 7. Changement des droits sur le dossier conf
|
||||
file:
|
||||
path: /var/www/html/doku/conf
|
||||
owner: www-data
|
||||
group: www-data
|
||||
recurse: true
|
||||
|
||||
- name: 8. Changement des droits sur le dossier lib
|
||||
file:
|
||||
path: /var/www/html/doku/lib
|
||||
owner: www-data
|
||||
group: www-data
|
||||
recurse: true
|
||||
|
||||
- name: 9. Redémarre Apache2
|
||||
service:
|
||||
name: apache2
|
||||
state: restarted
|
10
bts_annee_2/sisr2/ansible/dokuw/main_web.yml
Normal file
10
bts_annee_2/sisr2/ansible/dokuw/main_web.yml
Normal file
@ -0,0 +1,10 @@
|
||||
- name: 1. Installe les paquets requis pour le DokuWiki
|
||||
apt:
|
||||
name: "{{ item }}"
|
||||
state: present
|
||||
with_items:
|
||||
- apache2
|
||||
- php
|
||||
- php-mbstring
|
||||
- php-gd
|
||||
- php-xml
|
6
bts_annee_2/sisr2/ansible/hosts
Normal file
6
bts_annee_2/sisr2/ansible/hosts
Normal file
@ -0,0 +1,6 @@
|
||||
[adm]
|
||||
infra
|
||||
|
||||
[web]
|
||||
web1
|
||||
web2
|
32
bts_annee_2/sisr2/ansible/squid.yml
Normal file
32
bts_annee_2/sisr2/ansible/squid.yml
Normal file
@ -0,0 +1,32 @@
|
||||
# squid.yml
|
||||
---
|
||||
- hosts: adm
|
||||
vars:
|
||||
- proxy_port: 8080
|
||||
- proxy_mem: 128
|
||||
- proxy_localnet: "192.168.0.0/24"
|
||||
|
||||
tasks:
|
||||
- name: 1. Installe le proxy Squid sur la machine Infra.
|
||||
apt:
|
||||
name: squid
|
||||
state: present
|
||||
|
||||
# Uncomment this on FIRST RUN, comment afterwards !
|
||||
# - name: 2. Récupère le fichier squid.conf.
|
||||
# ansible.builtin.fetch:
|
||||
# src: /etc/squid/squid.conf
|
||||
# dest: squid.conf.j2
|
||||
# flat: yes
|
||||
|
||||
- name: 3. Envoie squid.conf
|
||||
template:
|
||||
src: squid.conf.j2
|
||||
dest: /etc/squid/squid.conf
|
||||
notify: Restart squid
|
||||
|
||||
handlers:
|
||||
- name: Restart squid
|
||||
service:
|
||||
name: squid
|
||||
state: restarted
|
35
bts_annee_2/sisr2/ansible/syslog-cli.yml
Normal file
35
bts_annee_2/sisr2/ansible/syslog-cli.yml
Normal file
@ -0,0 +1,35 @@
|
||||
# syslog-cli.yml
|
||||
---
|
||||
- hosts: web
|
||||
tasks:
|
||||
- name: 1. Installe le paquet rsyslog.
|
||||
apt:
|
||||
name: rsyslog
|
||||
state: present
|
||||
|
||||
- name: 2. Ajoute la ligne pour forwarder les logs rsyslog au bon endroit.
|
||||
lineinfile:
|
||||
path: /etc/rsyslog.conf
|
||||
line: '*.* @192.168.0.37:514'
|
||||
create: yes
|
||||
notify: Restart rsyslog
|
||||
|
||||
- name: 3. Forward les logs journald vers syslog.
|
||||
replace:
|
||||
path: /etc/systemd/journald.conf
|
||||
regexp: '^#ForwardToSyslog=yes'
|
||||
replace: 'ForwardToSyslog=yes'
|
||||
notify: Restart journald
|
||||
|
||||
handlers:
|
||||
- name: Restart rsyslog
|
||||
service:
|
||||
name: rsyslog
|
||||
state: restarted
|
||||
|
||||
- name: Restart journald
|
||||
service:
|
||||
name: systemd-journald
|
||||
state: restarted
|
||||
|
||||
|
30
bts_annee_2/sisr2/ansible/syslog.yml
Normal file
30
bts_annee_2/sisr2/ansible/syslog.yml
Normal file
@ -0,0 +1,30 @@
|
||||
# syslog.yml
|
||||
---
|
||||
- hosts: adm
|
||||
tasks:
|
||||
- name: 1. Installe le paquet rsyslog.
|
||||
apt:
|
||||
name: rsyslog
|
||||
state: present
|
||||
|
||||
- name: 2. Active le module UDP sur le serveur syslog.
|
||||
replace:
|
||||
path: /etc/rsyslog.conf
|
||||
regexp: '^#module\(load="imudp"\)'
|
||||
replace: 'module(load="imudp")'
|
||||
notify: Restart rsyslog
|
||||
|
||||
- name: 3. Active l'écoute sur le port UDP 514.
|
||||
replace:
|
||||
path: /etc/rsyslog.conf
|
||||
regexp: '^#input\(type="imudp" port="514"\)'
|
||||
replace: 'input(type="imudp" port="514")'
|
||||
notify: Restart rsyslog
|
||||
|
||||
handlers:
|
||||
- name: Restart rsyslog
|
||||
service:
|
||||
name: rsyslog
|
||||
state: restarted
|
||||
|
||||
|
21
bts_annee_2/sisr2/ansible/web.yml
Normal file
21
bts_annee_2/sisr2/ansible/web.yml
Normal file
@ -0,0 +1,21 @@
|
||||
# playbook.yml
|
||||
---
|
||||
- hosts: web
|
||||
tasks:
|
||||
- name: 1. installe Apache
|
||||
apt:
|
||||
name: apache2
|
||||
state: present
|
||||
- name: 2. installe PHP pour Apache
|
||||
apt:
|
||||
name: php
|
||||
state: present
|
||||
- name: 3. installe php-mbstring
|
||||
apt:
|
||||
name: php-mbstring
|
||||
state: present
|
||||
- name: 4. installe index.html
|
||||
copy:
|
||||
src: index.html
|
||||
dest: /var/www/html/index.html
|
||||
mode: 0664
|
2
bts_annee_2/sisr2/python/README.md
Normal file
2
bts_annee_2/sisr2/python/README.md
Normal file
@ -0,0 +1,2 @@
|
||||
Dépôt des fichiers Python faits lors de la séance du 3 Octobre, le matin.
|
||||
Le fichier users.txt est celui utilisé pour la création des comptes, pour l'exercice 4.
|
26
bts_annee_2/sisr2/python/createusers.py
Normal file
26
bts_annee_2/sisr2/python/createusers.py
Normal file
@ -0,0 +1,26 @@
|
||||
#!/usr/bin/python3
|
||||
import os
|
||||
import sys
|
||||
def create_user(login, full_name):
|
||||
try:
|
||||
os.system(f'sudo useradd -m -c "{full_name}" {login}')
|
||||
print(f"Utilisateur {login} créé avec succès.")
|
||||
except Exception as e:
|
||||
print(f"Erreur lors de la création de l'utilisateur {login}: {e}")
|
||||
def main(filename):
|
||||
try:
|
||||
with open(filename, 'r') as file:
|
||||
for line in file:
|
||||
line = line.strip()
|
||||
if line:
|
||||
login, full_name = line.split(':')
|
||||
create_user(login.strip(), full_name.strip())
|
||||
except FileNotFoundError:
|
||||
print(f"Le fichier {filename} n'a pas été trouvé.")
|
||||
except Exception as e:
|
||||
print(f"Erreur lors de la lecture du fichier {filename}: {e}")
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) != 2:
|
||||
print("Usage: python creatusr.py <nom_du_fichier>")
|
||||
else:
|
||||
main(sys.argv[1])
|
18
bts_annee_2/sisr2/python/occurences.py
Normal file
18
bts_annee_2/sisr2/python/occurences.py
Normal file
@ -0,0 +1,18 @@
|
||||
#!/usr/bin/python3
|
||||
# Demander à l'utilisateur de saisir une phrase
|
||||
phrase = input("Entrez une phrase : ")
|
||||
# Convertir la phrase en liste de mots
|
||||
mots = phrase.split()
|
||||
# Crée un dictionnaire pour stocker les occurrences des mots
|
||||
occurrences = {}
|
||||
# Compter les occurrences de chaque mot
|
||||
for mot in mots:
|
||||
if mot in occurrences:
|
||||
occurrences[mot] += 1
|
||||
else:
|
||||
occurrences[mot] = 1
|
||||
# Afficher les mots et leurs occurrences
|
||||
print("Occurrences des mots :")
|
||||
for mot, count in occurrences.items():
|
||||
print(f"{mot} : {count}"
|
||||
|
6
bts_annee_2/sisr2/python/perimetre.py
Normal file
6
bts_annee_2/sisr2/python/perimetre.py
Normal file
@ -0,0 +1,6 @@
|
||||
#!/usr/bin/python3
|
||||
# Récupération de la valeur du rayon
|
||||
rayon=int(input("Quel est le rayon du cercle ? "))
|
||||
# Calcul et affichage
|
||||
perim=(2*3.141592*rayon)
|
||||
print("Le périmètre vaut:",perim)
|
31
bts_annee_2/sisr2/python/tableau.py
Normal file
31
bts_annee_2/sisr2/python/tableau.py
Normal file
@ -0,0 +1,31 @@
|
||||
#!/usr/bin/python3
|
||||
# Les variables:
|
||||
tableau=[]
|
||||
i=0
|
||||
avg=0
|
||||
# Boucle while pour l'input et le remplissage du tableau
|
||||
while i < 4:
|
||||
x=int(input("Entrez un chiffre : "))
|
||||
tableau.append(x)
|
||||
x=0
|
||||
i=i+1
|
||||
# Fin de la boucle while, déclaration de variables pour la suite
|
||||
mini=tableau[0]
|
||||
maxi=tableau[0]
|
||||
# Boucle for pour obtenir les valeurs minimales et maximales
|
||||
for y in range (i):
|
||||
if tableau[y] > maxi:
|
||||
maxi=tableau[y]
|
||||
if tableau[y] < mini:
|
||||
mini=tableau[y]
|
||||
avg=avg+tableau[y]
|
||||
# Affichage de chaque élément du tableau
|
||||
print(tableau[y])
|
||||
# Calcul de la moyenne
|
||||
avg=avg/i
|
||||
# Affichage final
|
||||
print("La plus grande valeur du tableau est: ",maxi)
|
||||
print("La plus petite valeur du tableau est: ",mini)
|
||||
print("La moyenne du tableau final est: ",avg)
|
||||
|
||||
# On aurait pu faire ça 100x plus vite, mais faut se compliquer la vie.
|
5
bts_annee_2/sisr2/python/users.txt
Normal file
5
bts_annee_2/sisr2/python/users.txt
Normal file
@ -0,0 +1,5 @@
|
||||
adupont:Albert Dupont
|
||||
jduroy:Jeannette Duroy
|
||||
gemorine:Guillaume Emorine
|
||||
jpauchet:Jarod Pauchet
|
||||
ngenret:Nathan Genret
|
Reference in New Issue
Block a user