Parcourir la source

Merge remote-tracking branch 'origin/master' into polymorphic_configuration

Fabs il y a 10 ans
Parent
commit
c3c2c53d98

+ 20 - 5
coin/members/templates/members/detail.html

@@ -7,11 +7,26 @@
         <div class="panel">
             <h3>Me joindre</h3>
             <table>
-                <tr><td><span class="label">Prénom - Nom</span></td><td>{{member.first_name}} {{member.last_name}}</td></tr>
-                <tr><td><span class="label">Adresse</span></td><td>{{member.address}}<br />{{member.postal_code}} {{member.city}}</td></tr>
-                <tr><td><span class="label">Email</span></td><td>{{member.email}}</td></tr>
-                <tr><td><span class="label">Téléphone fixe</span></td><td>{{member.home_phone_number}}</td></tr>
-                <tr><td><span class="label">Téléphone mobile</span></td><td>{{member.mobile_phone_number}}</td></tr>
+                <tr>
+                    <td class="center"><span class="label">Prénom - Nom</span></td>
+                    <td>{{member.first_name}} {{member.last_name}}</td>
+                </tr>
+                <tr>
+                    <td class="center"><span class="label">Adresse</span></td>
+                    <td>{{member.address}}<br />{{member.postal_code}} {{member.city}}</td>
+                </tr>
+                <tr>
+                    <td class="center"><span class="label">Email</span></td>
+                    <td>{{member.email}}</td>
+                </tr>
+                <tr>
+                    <td class="center"><span class="label">Téléphone fixe</span></td>
+                    <td>{{member.home_phone_number}}</td>
+                </tr>
+                <tr>
+                    <td class="center"><span class="label">Téléphone mobile</span></td>
+                    <td>{{member.mobile_phone_number}}</td>
+                </tr>
             </table>
         </div>
     </div>

+ 25 - 0
coin/static/css/illyse.css

@@ -160,3 +160,28 @@ table.invoice-table td.total {
 #payment_howto p {
     font-size:0.7rem;
 }
+
+/* Modifs pour les infos */
+td.center {
+    text-align: center;
+}
+span.italic {
+    font-style: italic;
+}
+.button {
+    border-radius: 5px;
+    padding: 0.2em 0.5em 0.4em 0.5em;
+    margin-bottom: auto;
+    font-size: 0.9em;
+}
+.boolviewer input {
+    display: none;
+}
+.boolviewer input:checked+span:before {
+    color: #008800;
+    content: "✔ ";
+}
+.boolviewer input:not(:checked)+span:before {
+    color: #FF0000;
+    content: "✗ ";
+}

+ 54 - 16
coin/vpn/templates/vpn/vpn.html

@@ -1,22 +1,60 @@
 {% extends "base.html" %}
 
 {% block content %}
-<h2>VPN details</h2>
+<div class="row">
+    <h2>Configuration du VPN</h2>
+    
+    <div class="large-6 columns">
+        <div class="panel">
+            <h3>Statut</h3>
+            <table class="full-width">
+                <tr>
+                    <td class="center"><span class="label">Identifiant</span></td>
+                    <td>{{object.login}}</td>
+                </tr>
+                <tr>
+                    <td class="center" colspan="2">
+                        <a class="button" href="{% url 'vpn:generate_password' object.pk %}">Générer un nouveau mot de passe</a>
+                    </td>
+                </tr>
+                {% if object.comment %}<tr>
+                    {% if object.comment|length < 24 %}<td class="center"><span class="label">Commentaire</span></td>
+                    <td>{% else %}<td colspan="2">{% endif %}{{object.comment}}</td>
+                </tr>{% endif %}
+                <tr>
+                    <td class="center boolviewer" colspan="2">
+                        <input type="checkbox" disabled="disabled"{% if object.activated %} checked="checked"{% endif %} />
+                        <span>{% if object.activated %}Ce VPN est actif{% else %}Ce VPN est inactif{% endif %}</span>
+                    </td>
+                </tr>
+            </table>
+        </div>
+    </div>
 
-<ul>
-  <li>Login: {{ object.login }}</li>
-  <li>Password: <a href="{% url 'vpn:generate_password' object.pk %}">Generate new password</a></li>
-  <li>Activated: {{ object.activated }}</li>
-  <li>Comment: {{ object.comment }}</li>
-  <li>IPv4 endpoint: {{ object.ipv4_endpoint }}</li>
-  <li>IPv6 endpoint: {{ object.ipv6_endpoint }}</li>
-</ul>
-
-<p>IP subnets attributed to this VPN:</p>
-<ul>
-  {% for subnet in object.administrative_subscription.ip_subnet.all %}
-  <li>{{ subnet }}</li>
-  {% endfor %}
-</ul>
+    <div class="large-6 columns">
+        <div class="panel">
+            <h3>Adresses IP</h3>
+            <table class="full-width">
+                <tr>
+                    <td class="center"><span class="label">Sous-réseaux</span></td>
+                    <td>
+                        {% if object.ipv4_endpoint or object.ipv6_endpoint %}<ul>
+                            {% for subnet in object.administrative_subscription.ip_subnet.all %}<li>{{ subnet }}</li>{% endfor %}
+                        </ul>{% else %}<span class="italic">Aucune adresse</span>{% endif %}
+                    </td>
+                </tr>
+                <tr>
+                    <td class="center"><span class="label">Sorties</span></td>
+                    <td>
+                        {% if object.ipv4_endpoint or object.ipv6_endpoint %}<ul>
+                            {% if object.ipv4_endpoint %}<li>{{ object.ipv4_endpoint }}</li>{% endif %}
+                            {% if object.ipv6_endpoint %}<li>{{ object.ipv6_endpoint }}</li>{% endif %}
+                        </ul>{% else %}<span class="italic">Aucune adresse</span>{% endif %}
+                    </td>
+                </tr>
+            </table>
+        </div>
+    </div>
+</div>
 
 {% endblock %}

+ 38 - 0
contrib/accounting

@@ -0,0 +1,38 @@
+#! /bin/sh
+### BEGIN INIT INFO
+# Provides:          accounting
+# Required-Start:    $network $remote_fs $syslog
+# Required-Stop:     $network $remote_fs $syslog
+# Should-Start:      network-manager
+# Should-Stop:       network-manager
+# X-Start-Before:    openvpn
+# X-Interactive:     true
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Accounting daemon for Openvpn VPN service
+# Description: This script will start the accounting script for OpenVPN
+### END INIT INFO
+
+PATH=/sbin:/bin
+
+. /lib/lsb/init-functions
+
+case "$1" in
+  start)
+    /usr/bin/python2 /etc/openvpn/vpn_acct.py -s graphite-dev.illyse.org /var/run/openvpn/acct vpn1
+    ;;
+  restart|reload|force-reload)
+    shift
+    $0 stop ${@}
+    sleep 1
+    $0 start ${@}
+    ;;
+  stop)
+    kill `cat /var/run/vpn_acct.pid`
+    rm -f /var/run/vpn_acct.pid
+    ;;
+  *)
+    echo "Usage: $0 start|stop|restart" >&2
+    exit 3
+    ;;
+esac

+ 12 - 8
contrib/vpn_acct.py

@@ -11,8 +11,8 @@ sock = socket.socket()
 last_timestamp = 0
 
 def logging(message, level = syslog.LOG_INFO):
-    #GLOP#syslog.syslog(level, message)
-    print message
+    syslog.syslog(level, message)
+    #print message
 
 
 def read_vpn_acct_file(filename):
@@ -34,8 +34,8 @@ def read_vpn_acct_file(filename):
         # format: username ip qos uptxbytes downrxbytes
         if len(d) == 5:
             metrics.extend([
-                ( 'vpn1.%s.upxtbytes'   % d[0], (tstamp, int(d[3])) ),
-                ( 'vpn1.%s.downrxbytes' % d[0], (tstamp, int(d[4])) ),
+                ( '%s.%s.uptxbytes'   % (options.prefix, d[0]), (tstamp, int(d[3])) ),
+                ( '%s.%s.downrxbytes' % (options.prefix, d[0]), (tstamp, int(d[4])) ),
             ])
     return tstamp, metrics
 
@@ -47,7 +47,6 @@ def send_to_carbon(metrics):
     header = struct.pack("!L", len(payload))
     message = header + payload
     sock.sendall(message)
-    #GLOP#print metrics
     
 
 def process_vpn_file(filename, old_tstamp = 0):
@@ -84,7 +83,11 @@ def handle_old_vpn_files(directory, old_tstamp):
 
 class VPNAcctHandler(pyinotify.ProcessEvent):
 
+    def process_IN_MOVED_TO(self, event):
+        self.handle_file(event)
     def process_IN_CLOSE_WRITE(self, event):
+        self.handle_file(event)
+    def handle_file(self, event):
         logging("Event detected for file %s..." % (event.pathname, ), syslog.LOG_DEBUG)
 
         if last_timestamp > 0:
@@ -104,6 +107,7 @@ if __name__ == '__main__':
         formatter_class=argparse.ArgumentDefaultsHelpFormatter)
 
     parser.add_argument('directory', help='directory to watch')
+    parser.add_argument('prefix', help='prefix for Graphite metrics')
     parser.add_argument('-t', '--timestamp', dest='tstamp', type=int, default=0, help='Timestamp to recover data from')
     parser.add_argument('-s', '--server', dest='server', default='localhost', help='Carbon daemon address')
     parser.add_argument('-p', '--port', dest='port', type=int, default=2004, help='Carbon daemon port')
@@ -140,14 +144,14 @@ if __name__ == '__main__':
                 last_timestamp = 0
 
     # https://github.com/seb-m/pyinotify/blob/master/python2/examples/daemon.py
-    logging("Starting to watch %s directory..." % (options.directory))
+    logging("Starting to watch %s directory..." % (options.directory, ))
     wm = pyinotify.WatchManager()
     handler = VPNAcctHandler()
     notifier = pyinotify.Notifier(wm, handler)
-    wm.add_watch(options.directory, pyinotify.IN_CLOSE_WRITE)
+    wm.add_watch(options.directory, pyinotify.IN_CLOSE_WRITE|pyinotify.IN_MOVED_TO)
 
     try:
-        notifier.loop(daemonize=False, callback=on_loop, pid_file='/tmp/pyinotify.pid', stdout='/tmp/pyinotify.log') #GLOP#
+        notifier.loop(daemonize=True, callback=on_loop, pid_file='/var/run/pyinotify.pid', stdout='/var/log/pyinotify.log')
     except pyinotify.NotifierError, err:
         print >> sys.stderr, err