Commit f3c17011 authored by Daniel Stan's avatar Daniel Stan

Merge branch 'master' into doc

Conflicts:
	testing.sh
parents 0bcd2de6 ee688f8d
......@@ -140,7 +140,7 @@ if __name__ == "__main__":
#print ".forward non-accessible : %s" % e
pass
except IndexError as e:
print "Home existant mais pas d'adhérent ldap : %s" % e
print "Home %s existant mais pas d'adhérent ldap : %s" % (uid, e)
a_imprimer = []
a_verifier = []
......@@ -180,7 +180,7 @@ if __name__ == "__main__":
print " * Recherche de %s ..." % adresse
# Est-ce un .forward ?
if addresse in forwards.iterkeys():
if adresse in forwards.iterkeys():
res = ldap.search(u"uid=%s" % forwards[adresse], mode='rw')
if len(res) == 0:
print "*** Erreur : aucun résultat pour uid=%s" % forwards[adresse]
......
#!/bin/bash
# oneliner destiné à être symlinké depuis /usr/bin/irc
# pour que tout le monde puisse facilement utiliser
# WeeChat dans un screen
screen -rd IRC || screen -S IRC weechat
......@@ -702,17 +702,6 @@ accueil_route = {
'zamok.crans.org',
],
},
'138.231.136.67' : {
'tcp' : [
'80',
'443',
],
'hosts' : [
'www.crans.org',
'wiki.crans.org',
'wifi.crans.org',
],
},
'138.231.136.98' : {
'tcp' : [
'20',
......@@ -729,7 +718,7 @@ accueil_route = {
'ftp.crans.org',
],
},
'138.231.136.130' : {
'138.231.136.145' : {
'tcp' : [
'80',
'443',
......@@ -737,17 +726,13 @@ accueil_route = {
'hosts' : [
'intranet2.crans.org',
'intranet.crans.org',
],
},
'138.231.136.18' : {
'tcp' : [
'80',
'443',
],
'hosts' : [
'cas.crans.org',
'login.crans.org',
'auth.crans.org',
'wifi.crans.org',
'ftps.crans.org',
'www.crans.org',
'wiki.crans.org',
],
},
'213.154.225.236' : {
......
......@@ -59,6 +59,7 @@ zones_direct = [
'clubs.ens-cachan.fr',
'adm.crans.org',
'crans.eu',
'crans.fr',
'wifi.crans.eu',
'tv.crans.org',
'ap.crans.org',
......@@ -84,6 +85,7 @@ zones_dnssec = [
zone_alias = {
'crans.org' : [
'crans.eu',
'crans.fr',
],
}
......
......@@ -17,7 +17,7 @@ decouvert = 0.
## Variables de prix (tout est exprimé en centimes)
#: Coût de l'imprimante
#: Coût de l'imprimante rabbatu sur 600k impressions
#:
#: Donc ammortissement
amm = 2.16
......
config_template = """# This is an example of the kind of things you can do in a configuration file.
# All flags used by the client can be configured here. Run Let's Encrypt with
# "--help" to learn more about the available options.
# Use a 4096 bit RSA key instead of 2048
rsa-key-size = 4096
# Always use the staging/testing server
# server = https://acme-staging.api.letsencrypt.org/directory
# server = https://acme-v01.api.letsencrypt.org/directory
# Uncomment and update to register with the specified e-mail address
email = root@crans.org
# Uncomment to use a text interface instead of ncurses
text = True
# Uncomment to use the standalone authenticator on port 443
# authenticator = standalone
# standalone-supported-challenges = tls-sni-01
# Uncomment to use the webroot authenticator. Replace webroot-path with the
# path to the public_html / webroot folder being served by your web server.
authenticator = %(authenticator)s
webroot-path = /usr/share/nginx/html/
standalone-supported-challenges = http-01
domains = %(domains)s
"""
......@@ -6,10 +6,98 @@
#### Conf nginx des proxy gérées à la main
non_sites_auto = [u"discourse.crans.org", u"impression.crans.org", u"factures.crans.org", u"accounts.crans.org", u"intranet2.crans.org"]
non_sites_auto = {
u"discourse.crans.org",
}
max_upload = {
u"intranet.crans.org" : "160M",
u"owncloud.crans.org" : "10G",
}
#: Redirection "host": "url"
sites_redirect = {
"impression.crans.org": "https://intranet.crans.org/impressions",
"factures.crans.org": "https://intranet.crans.org/factures",
"accounts.crans.org": "https://intranet.crans.org/compte",
"intranet2.crans.org": "https://intranet.crans.org",
"autostatus.crans.org": "https://www.crans.org/CransNounous/AutoStatus",
"wikipedia.crans.org": "https://wiki.crans.org",
"crans.org": "https://www.crans.org",
"install-party.ens-cachan.fr": "https://install-party.crans.org",
"www.install-party.ens-cachan.fr": "https://install-party.crans.org",
"adopteunpingouin.crans.org": "https://install-party.crans.org",
"i-p.crans.org": "https://install-party.crans.org",
"hostnames-a-m.crans.org": "https://proxy.crans.org",
"hostnames-n-z.crans.org": "https://proxy.crans.org",
"task.crans.org": "https://phabricator.crans.org",
}
def server_name_to_cert_name(serveur):
"""
A un nom de domain, on associe le certificat correspondant.
Retourne None si le certificat n'est pas trouvé.
"""
if serveur.endswith(".ens-cachan.fr") or serveur == "ens-cachan.fr":
return "crans.ens-cachan.fr"
elif serveur.endswith(".crans.org") or serveur == "crans.org":
if serveur[0] <= 'm' and serveur != "hostnames-n-z.crans.org":
return "hostnames-a-m.crans.org"
else:
return "hostnames-n-z.crans.org"
elif serveur.endswith(".crans.fr") or serveur == "crans.fr":
if serveur[0] <= 'm' and serveur != "hostnames-n-z.crans.fr":
return "hostnames-a-m.crans.fr"
else:
return "hostnames-n-z.crans.fr"
elif serveur.endswith(".crans.eu") or serveur == "crans.eu":
if serveur[0] <= 'm' and serveur != "hostnames-n-z.crans.eu":
return "hostnames-a-m.crans.eu"
else:
return "hostnames-n-z.crans.eu"
site_template = """server {
server_name %(serveur)s;
include "snippets/proxy-common.conf";
return 302 https://$host$request_uri;
}
server {
include "snippets/proxy-common-ssl.conf";
server_name %(serveur)s;
ssl_certificate /etc/letsencrypt/live/%(cert_name)s/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/%(cert_name)s/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/%(cert_name)s/chain.pem;
%(max_body_size)s
location / {
proxy_redirect off;
proxy_pass http://%(proxy_pass)s;
proxy_set_header Host %(serveur)s;
proxy_set_header P-Real-IP $remote_addr;
}
}
"""
site_redirect_template = """server {
server_name %(serveur)s;
include "snippets/proxy-common.conf";
return 302 %(redirect)s$request_uri;
}
server {
include "snippets/proxy-common-ssl.conf";
server_name %(serveur)s;
ssl_certificate /etc/letsencrypt/live/%(cert_name)s/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/%(cert_name)s/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/%(cert_name)s/chain.pem;
return 302 %(redirect)s$request_uri;
}
"""
......@@ -6,7 +6,7 @@ SAP_MCAST_PORT = 9875
SAP_FILE_TXT = "/usr/scripts/var/tv/sap.txt"
SAP_FILE_PIC = "/usr/scripts/var/tv/sap.pickel"
BASE_IMAGE_URL = "http://tv.crans.org/images/"
BASE_IMAGE_URL = "https://tv.crans.org/images/"
IMAGE_SUFFIX = ".jpg"
SMALL_IMAGE_SUFFIX = "_petites.jpg"
This diff is collapsed.
......@@ -27,8 +27,8 @@ hostname = gethostname().split(".")[0]
class dydhcp:
def __init__(self, server):
self.dhcp_omapi_keyname = secrets.get('dhcp_omapi_keyname')
self.dhcp_omapi_key = secrets.get('dhcp_omapi_keys')[server]
self.dhcp_omapi_keyname = str(secrets.get('dhcp_omapi_keyname'))
self.dhcp_omapi_key = str(secrets.get('dhcp_omapi_keys')[server])
self.server = server.lower()
def add_host(self, ip, mac,name=None):
......
......@@ -27,6 +27,7 @@ class firewall(base.firewall_routeur):
'limitation_debit' : self.limitation_debit,
'limit_ssh_connexion' : self.limit_ssh_connexion,
'tunnel_6in4' : self.tunnel_6in4,
'challenge_letsencrypt': self.challenge_letsencrypt,
})
self.use_ipset.extend([self.blacklist_soft, self.blacklist_upload, self.reseaux_non_routable])
......@@ -43,7 +44,7 @@ class firewall(base.firewall_routeur):
})
# Portail captif/blacklist soft: ipset des gens ayant cliqué pour continuer à naviguer
self.ipset['confirmation'] = base.Ipset("CONFIRMATION", "hash:ip", "")
self.ipset['confirmation'] = base.Ipset("CONFIRMATION", "hash:ip", "timeout 3600")
# Ouvertures de ports temporaires
self.ipset['ip_port_tmp'] = base.Ipset("IP-PORT-TMP", "hash:ip,port", "timeout 3600")
......@@ -130,6 +131,7 @@ class firewall(base.firewall_routeur):
chain = 'PREROUTING'
self.add(table, chain, '-j %s' % self.ssh_on_https(table))
self.add(table, chain, '-j %s' % self.challenge_letsencrypt(table))
self.add(table, chain, '-j %s' % self.connexion_secours(table))
self.add(table, chain, '-j %s' % self.blacklist_soft(table))
self.add(table, chain, '-j %s' % self.blacklist_hard(table))
......@@ -284,6 +286,26 @@ class firewall(base.firewall_routeur):
self.apply(table, chain)
return chain
def challenge_letsencrypt(self, table=None, apply=False):
"""PNAT des request de challenge letsencrypt vers bakdaur ou frontdaurk"""
chain = "CHALLENGE-LESENCRYPT"
if table == 'nat':
pretty_print(table, chain)
bakdaur = self.conn.search(u"host=bakdaur.crans.org")[0]
frontdaur = self.conn.search(u"host=frontdaur.crans.org")[0]
self.add(table, chain, '-m condition ! --condition challenge-letsencrypt -j RETURN')
for net in (base.config.NETs['serveurs'] + base.config.NETs['wifi-serveurs']):
self.add(table, chain, '-p tcp -d %s --dport 80 -m condition --condition challenge-letsencrypt-bakdaur -j DNAT --to-destination %s:81' % (net, bakdaur['ipHostNumber'][0]))
self.add(table, chain, '-p tcp -d %s --dport 80 -m condition ! --condition challenge-letsencrypt-bakdaur -j DNAT --to-destination %s:81' % (net, frontdaur['ipHostNumber'][0]))
print OK
if apply:
self.apply(table, chain)
return chain
def connexion_appartement(self, table=None, apply=False):
"""PNAT les appartements derrière appartement.crans.org"""
chain = 'CONNEXION-APPARTEMENT'
......
......@@ -16,26 +16,17 @@ WGETOPT="-4"
OWN_IP="$1"
/etc/init.d/nfs-kernel-server stop
# Définitions spécifiques au Sys Rescue CD
SYSRCCD_ARCHS=""
SYSRCCD_FTP="http://ftp.crans.org/pub/distributions/linux/systemrescuecd"
# Définitions spécifiques à Debian
DEBIAN_DISTS="squeeze wheezy jessie"
DEBIAN_DISTS="wheezy jessie"
DEBIAN_ARCHS="i386 amd64"
DEBIAN_FTP="ftp://ftp.crans.org/debian/dists"
#Image debian custom avec plus de drivers : http://kmuto.jp/debian/d-i/
DEBIAN_BACKPORT_DISTS=""
DEBIAN_BACKPORT_ARCHS="i386 amd64"
DEBIAN_BACKPORT_FTP="ftp://cdimage.debian.org/cdimage/unofficial/backports/"
# Définitions spécifiques à Ubuntu
UBUNTU_DISTS="precise trusty vivid wily"
UBUNTU_DISTS="trusty vivid wily"
UBUNTU_ARCHS="i386 amd64"
UBUNTU_FTP="ftp://ftp.crans.org/ubuntu/dists"
UBUNTU_LIVE="12.04 14.04 15.04 15.10"
UBUNTU_LIVE="14.04 15.04 15.10"
# il faut modifier le nfs (ajouter la sortie de export_ubuntu_live
# à /etc/exports) et mettre les images dans $ISODIR/ubuntu/ puis
# les monter dans $TFTPROOT/livecd/ubuntu/$dist-$arch avec
......@@ -45,11 +36,6 @@ UBUNTU_LIVE="12.04 14.04 15.04 15.10"
UBUNTU_LIVE_TYPE="ubuntu xubuntu kubuntu"
UBUNTU_LIVE_ARCHS="i386 amd64"
# Définitions spécifiques à Mandriva
MANDRIVA_DISTS=""
MANDRIVA_ARCHS="i586 x86_64"
MANDRIVA_FTP="ftp://ftp.free.fr/mirrors/ftp.mandriva.com/MandrivaLinux/official"
# Définitions spécifiques à CentOS
CENTOS_DISTS="6.5 6.6"
CENTOS_ARCHS="i386 x86_64"
......@@ -59,23 +45,3 @@ CENTOS_FTP="ftp://mirror.in2p3.fr/pub/linux/CentOS"
FEDORA_DISTS="23"
FEDORA_ARCHS="i386 x86_64"
FEDORA_FTP="ftp://ftp.free.fr/mirrors/fedora.redhat.com/fedora/linux/"
#
## Définitions spécifiques à OpenSuse
#OPENSUSE_DISTS="12.2 12.3 13.1 13.2"
#OPENSUSE_ARCHS="i386 x86_64"
#OPENSUSE_FTP="ftp://ftp.free.fr/mirrors/ftp.opensuse.org/opensuse/distribution/"
# Définitions spécifiques à FreeBSD
FREEBSD_DISTS=""
FREEBSD_ARCHS="i386 amd64"
FREEBSD_FTP="ftp://ftp.fr.freebsd.org/pub/FreeBSD/"
# Définition spécifiques à NetBSD
#~ NETBSD_DIST="5.1 6.0"
#~ NETBSD_ARCHS="i386 amd64"
#~ NETBSD_FTP="ftp://iso.fr.netbsd.org/pub/NetBSD"
# Définitions spécifiques à OpenBSD
OPENBSD_DIST=""
OPENBSD_ARCHS="i386 amd64"
OPENBSD_FTP="ftp://ftp.crans.org/pub/OpenBSD"
#!/bin/bash
mount charybde.adm:/var/lib/tftpboot/ /var/lib/tftpboot/
for i in /var/lib/tftpboot/livecd/ubuntu/*; do mount charybde:$i $i; done
/etc/init.d/tftpd-hpa restart
This diff is collapsed.
......@@ -325,7 +325,7 @@ def check_conf_ldap(hostname):
if port.bornes and port.vlan_member('adherent') == V_NO:
th_nb_vlans += 1
if th_nb_vlans != pr_nb_vlans:
print(" Wrong vlan number (%d,%d)" % (th_nb_vlans, pr_nb_vlans))
print(" Wrong vlan count (%d instead of %d)" % (pr_nb_vlans, th_nb_vlans))
print(port.seen_vlans)
print(list( vname for vname in ENABLED_VLANS if port.vlan_member(vname) != V_NO ))
......@@ -351,7 +351,7 @@ def check_conf_ldap(hostname):
pr_prise = bat.lower() + '%d%02d' % (sw_num, port.num)
if th_prises_set and pr_prise not in th_prises_set:
print(" Aucune machine de chbre. Candidats: %r" % th_prises_set)
else:
# Check machine sur prise (si pas uplink)
machines = []
for mac in set(port.seen_macs):
res = ldap.search(u'macAddress=%s' % mac)
......
......@@ -12,7 +12,7 @@ import lc_ldap.crans_utils as crans_utils
SEND=('--do-it' in sys.argv)
ldap_filter=u"(&(finConnexion>=%(date)s)(aid=*)(!(chbre=????)))" % {'date': crans_utils.to_generalized_time_format(time.time())}
#ldap_filter=u"(uid=detraz)"
#ldap_filter=u"(uid=oudin)"
conn = lc_ldap.shortcuts.lc_ldap_readonly()
dest = conn.search(ldap_filter, sizelimit=2000)
......@@ -24,7 +24,8 @@ with mail.ServerConnection() as smtp:
for adh in dest:
print "Envoi du mail à %s" % adh.dn
if SEND:
smtp.send_template('all_coupure', {'adh': adh, 'From': From})
smtp.send_template('all_coupure', {'adh': adh, 'From': From,
'lang_info': "English version below"})
cprint(" Envoyé !")
else:
cprint(" (simulé)")
......
#!/bin/bash /usr/scripts/python.sh
# -*- mode: python; coding: utf-8 -*-
# Auteur : Rémi Oudin
# Licence : GPLv3
# Date : 11/03/2016
import sys
from gestion.affich_tools import cprint
from gestion import mail
import time
import lc_ldap.shortcuts
import lc_ldap.crans_utils as crans_utils
import argparse
def mail_sender(template, From, ldap_filter, recipientfile=None):
"""
Récupère les mails dans le ``recipientfile`` ou, à défaut, ceux retournés
par une recherche avec ``ldap_filter`` et leur envoie le mail
depuis l'adresse ``From``.
Utilise le ``template`` passé en argument.
"""
global conn
mailaddrs = set()
print From
if recipientfile:
# On a fournit un fichier de destinataires
with open(recipientfile) as f:
mailaddrs = set([l.strip() for l in f.readlines() if l.strip() != ""])
else:
# Récupère les mails des adhérents donnés par le filtre.
for adh in conn.search(ldap_filter, sizelimit=2000):
mailaddrs.add(adh.get_mail())
echecs = []
if PREV:
print "Envoi simulé"
print "%d destinataires (Ctrl + C pour annuler l'envoi)" %len(mailaddrs)
raw_input("Envoyer ? (Ret pour envoyer)")
with mail.ServerConnection() as conn_smtp:
for To in mailaddrs:
cprint(u"Envoi du mail à %s" % To)
mailtxt = mail.generate(
template,
{'To' : To,
'From' : From,
'lang_info' : 'English version below',
}).as_string()
if PREV:
print mailtxt
try:
if SEND:
conn_smtp.sendmail(From, (To,), mailtxt)
cprint(" Envoyé !")
else:
cprint(" (simulé)")
except:
print sys.exc_info()[:2]
cprint(u"Erreur lors de l'envoi à %s " % To, "rouge")
echecs.append(To)
if echecs:
print "\nIl y a eu des erreurs :"
print echecs
print "\n Pensez à générer des notifications de mail invalide !"
sys.exit(1)
if __name__ == "__main__":
# Ouvre une connection à la base LDAP
conn = lc_ldap.shortcuts.lc_ldap_readonly()
# Le filtre à appliquer pour la recherche
ldap_filter = u'(&(finAdhesion>=%(date)s)(aid=*))' %\
{'date': crans_utils.to_generalized_time_format(time.time())}
# Attention si à True, envoie effectivement le mail
SEND = False
# Si à True, affiche une prévision du mail
PREV = False
# Filtre par défaut
parser = argparse.ArgumentParser(
description="Mail all générique. Prend un template en argument.",
add_help=True
)
parser.add_argument(
"-f", "--recipientfile",
help="Un fichier contenant une adresse mail par ligne. Override le filtre LDAP",
action="store"
)
parser.add_argument(
"-t", "--template",
help="Un template de mail. Fournir le chemin du dossier principal du mail, relatif à "
+ mail.template_path,
action="store"
)
parser.add_argument(
"-s", "--sender",
help="Spécifier un expéditeur particulier. Par défaut respbats@crans.org",
action="store",
default="respbats@crans.org"
)
exclusive = parser.add_mutually_exclusive_group()
exclusive.add_argument(
"--doit",
help="Lance effectivement le mail",
action="store_true"
)
exclusive.add_argument(
"-p", "--prev",
help="Prévisualise le mail à envoyer",
action="store_true"
)
args = parser.parse_args()
if args.doit:
SEND = True
if args.prev:
PREV = True
mail_sender(args.template, args.sender, ldap_filter, args.recipientfile)
sys.exit(0)
[Crans] Coupure du réseau le 20 Février 2016
[Crans] Incidents du week-end et Install Party le 12 mars
Dear member,
Due to operating errors on Friday, March 4th and Saturday, March 5th, the services
provided by the Crans and the Internet connection were seriously disturbed.
We apologise for every inconvenience, and are keenly aware how much this might have disturbed you.
Whenever the connection seems flawed, don't forget to check out:
- The webpage Crans Incidents: https://wiki.crans.org/CransIncidents
- The news: http://news.crans.org
- Discourse: http://discourse.crans.org
Furthermore, we would like to remind you that the Install Party will take place on
Saturday, March 12th, in partnership with the ENS. If you want to install Linux
on your computer, or attend to conferences on the Free World,
you can meet us in the Pavillon des Jardins, from 9 a.m. to 7 p.m.
The Breakfast will be relocated there, and a buffet will be served for lunch.
For more information, you can check http://www.install-party.ens-cachan.fr/
Sincerely,
--
The active members of Crans
Chers adhérents,
Une maintenance importante sur le réseau est programmée samedi 20 février prochain, à partir de
10 heures. Elle durera toute la journée.
Suite à des erreurs de manipulations le vendredi 4 mars et le samedi 5 mars,
les services proposés par le Crans et la connexion internet ont été fortement perturbés.
Il s'agit d'effectuer une opération de maintenance critique sur la baie de stockage.
Nous nous excusons pour ces perturbations, et nous avons conscience d'à quel
point elles ont pu vous poser problème.
Nous nous efforcerons de maintenir au moins un accès internet filaire durant l'intervention, dans la
mesure du possible. Tous les autres services du Crans seront interrompus.
Lorsque la connexion vous paraît perturbée, n'oubliez pas de consulter :
- La page Crans Incidents : https://wiki.crans.org/CransIncidents
- Les news : http://news.crans.org
- Discourse : http://discourse.crans.org
Par ailleurs, nous vous rappelons que le samedi 12 mars a lieu l'Install
Party du Crans en partenariat avec l'ENS. Si vous voulez installer Linux sur
votre ordinateur, ou assister à des conférences sur le monde du libre,
rendez-vous au Pavillon des Jardins de 9h à 19h !
Le Petit Déj y sera délocalisé, et un buffet est prévu à midi.
Pour plus d'informations, vous pouvez consulter le site http://www.install-party.ens-cachan.fr/
Cordialement,
--
Les membres actifs de l'association Crans
Les membres actifs du Crans
Envoyé si le tpe n'est pas branché au 2B. Appelé par un cron à des horaires
où il est censé s'y trouver.
L'imprimante thermique a disparu !
Bonjour,
Ce mail automatique signale l'absence de l'imprimante thermique à la kfet.
Elle devrait normalement s'y trouver. Si elle a été débranchée, merci de la
rebrancher.
L'état de connectivité de l'imprimante est disponible sur la page d'autostatus :
http://autostatus.crans.org
--
whokfet
......@@ -186,9 +186,13 @@ class ACLChecker(object):
name.split('_', 1)[0] in ['radius', 'dhcp', 'ldap']:
return True
if user == 'www-data' and in_group('intranet2-server') and \
name == 'django_secret_key':
return True
if user == 'www-data' and in_group('intranet2-service'):
logger.debug('ici: %s' % name.split('_', 1)[0])
if name.split('_', 1)[0] in [ 'comnpay', 'dhcp', 'digicode', 'intranet',
'ldap', 'validation', 'django']:
return True
if name.split('-', 1)[0] in ['trigger', 'icecast']:
return True
if user == 'www-data' and in_group('portail-captif') and \
name.startswith('ldap_readonly_'):
......
......@@ -48,6 +48,12 @@ def missing_tpe():
mail = generate('missing_tpe', {'to': dst})
actually_sendmail('respbats@crans.org', [dst], mail)
def missing_printer():
"""ENvoie un mail si l'imprimante thermique est absente"""
dst = 'respbats@crans.org'
mail = generate('missing_printer', {'to': dst})
actually_sendmail('respbats@crans.org', [dst], mail)
def pretty_name(item):
"""Affiche un joli nom pour un objet ldap (adh ou machine)"""
v = ""
......@@ -150,7 +156,10 @@ class WhosThere(object):
if mach not in detected_mach:
mach_manq.append(mach)
if warn:
missing_tpe()
if 'tpe' in warn and 'terminal.crans.org' in mach_manq:
missing_tpe()
if 'printer' in warn and 'oison.crans.org' in mach_manq:
missing_printer()
return mach_manq
......@@ -325,6 +334,8 @@ if __name__ == '__main__':
}
if '--warn-tpe' in sys.argv:
warn=['tpe']
if '--warn-printer' in sys.argv:
warn=['printer']
if '--all' in sys.argv:
cur_user = os.getenv("SUDO_USER") or os.getenv("USER")
if cur_user:
......
......@@ -4,6 +4,15 @@
import subprocess
import sys
# TODO
# La couleur
# le recto/verso - recto
# mode paysage ?
# choix format papier
# mode sauce (première page manuelle)
DEBUG = True
DEFAULT_BAC = 7
PUNCH_DRV2PCL_OPTS = {
......@@ -16,40 +25,97 @@ PUNCH_DRV2PCL_OPTS = {
}
STAPLE_DRV2PCL_OPTS = {
"TopLeft": "LEFT_1PT_ANGLED",
"TopRight": "RIGHT_1PT_ANGLED",
"Left": "LEFT_2PT",
"Right": "RIGHT_2PT",
"1StapleLeftAngled": "LEFT_1PT_ANGLED",
"1StapleRightAngled": "RIGHT_1PT_ANGLED",
"2StaplesLeft": "LEFT_2PT",
"2StaplesRight": "RIGHT_2PT",
"2StaplesTop": "TOP_2PT", # à vérifier
}
# Commande ghostscript de conversion en PCL
params = ['gs', '-dNOPAUSE', '-dBATCH', '-sDEVICE=pxlmono',
#'-sPAPERSIZE=A4',
'-dDuplex=true',
'-dMediaPosition=%d' % DEFAULT_BAC,
'-sOutputFile=%stdout%',
'-sstdout=/dev/null',
'-f', # To be continued
]
def tweak(source, dest, **opt_):
"""Tweak un fichier pcl (source est un descripteur de fichier en lecture)
en rajoutant les options PJL nécessaires, et en modifiant le PCL
pour que les deux premières pages (première feuille) soient prises depuis
un autre bac"""