diff options
| -rw-r--r-- | data/templates/pptp/chap-secrets.tmpl | 6 | ||||
| -rw-r--r-- | data/templates/pptp/pptp.config.tmpl | 87 | ||||
| -rwxr-xr-x | src/conf_mode/vpn-pptp.py | 151 | 
3 files changed, 117 insertions, 127 deletions
| diff --git a/data/templates/pptp/chap-secrets.tmpl b/data/templates/pptp/chap-secrets.tmpl new file mode 100644 index 000000000..6bfa2d64e --- /dev/null +++ b/data/templates/pptp/chap-secrets.tmpl @@ -0,0 +1,6 @@ +# username  server  password  acceptable local IP addresses +{% for user in authentication['local-users'] %} +{% if authentication['local-users'][user]['state'] == 'enabled' %} +{{user}}\t*\t{{authentication['local-users'][user]['passwd']}}\t{{authentication['local-users'][user]['ip']}} +{% endif %} +{% endfor %} diff --git a/data/templates/pptp/pptp.config.tmpl b/data/templates/pptp/pptp.config.tmpl new file mode 100644 index 000000000..2596507af --- /dev/null +++ b/data/templates/pptp/pptp.config.tmpl @@ -0,0 +1,87 @@ + +### generated by accel_pptp.py ### +[modules] +log_syslog +pptp +ippool +chap-secrets +{% if authentication['auth_proto'] %} +{{ authentication['auth_proto'] }} +{% else %} +auth_mschap_v2 +{% endif %} +{% if authentication['mode'] == 'radius' %} +radius +{% endif -%} + +[core] +thread-count={{thread_cnt}} + +[log] +syslog=accel-pptp,daemon +copy=1 +level=5 + +{% if dns %} +[dns] +{% if dns[0] %} +dns1={{dns[0]}} +{% endif %} +{% if dns[1] %} +dns2={{dns[1]}} +{% endif %} +{% endif %} + +{% if wins %} +[wins] +{% if wins[0] %} +wins1={{wins[0]}} +{% endif %} +{% if wins[1] %} +wins2={{wins[1]}} +{% endif %} +{% endif %} + +[pptp] +ifname=pptp%d +{% if outside_addr %} +bind={{outside_addr}} +{% endif %} +verbose=1 +ppp-max-mtu={{mtu}} +mppe={{authentication['mppe']}} +echo-interval=10 +echo-failure=3 + + +[client-ip-range] +0.0.0.0/0 + +[ip-pool] +tunnel={{client_ip_pool}} +gw-ip-address={{gw_ip}} + +{% if authentication['mode'] == 'local' %} +[chap-secrets] +chap-secrets=/etc/accel-ppp/pptp/chap-secrets +{% endif %} + +[ppp] +verbose=5 +check-ip=1 +single-session=replace + +{% if authentication['mode'] == 'radius' %} +[radius] +{% for rsrv in authentication['radiussrv']: %} +server={{rsrv}},{{authentication['radiussrv'][rsrv]['secret']}},\ +req-limit={{authentication['radiussrv'][rsrv]['req-limit']}},\ +fail-time={{authentication['radiussrv'][rsrv]['fail-time']}} +{% endfor %} +timeout=30 +acct-timeout=30 +max-try=3 +{%endif %} + +[cli] +tcp=127.0.0.1:2003 diff --git a/src/conf_mode/vpn-pptp.py b/src/conf_mode/vpn-pptp.py index 355adf715..b1204a505 100755 --- a/src/conf_mode/vpn-pptp.py +++ b/src/conf_mode/vpn-pptp.py @@ -1,6 +1,6 @@  #!/usr/bin/env python3  # -# Copyright (C) 2018 VyOS maintainers and contributors +# Copyright (C) 2018-2020 VyOS maintainers and contributors  #  # This program is free software; you can redistribute it and/or modify  # it under the terms of the GNU General Public License version 2 or later as @@ -13,19 +13,18 @@  #  # You should have received a copy of the GNU General Public License  # along with this program.  If not, see <http://www.gnu.org/licenses/>. -# -# -import sys  import os  import re  import subprocess -import jinja2 -import socket -import time -import syslog as sl + +from jinja2 import FileSystemLoader, Environment +from socket import socket, AF_INET, SOCK_STREAM +from sys import exit +from time import sleep  from vyos.config import Config +from vyos.defaults import directories as vyos_data_dir  from vyos import ConfigError  pidfile = r'/var/run/accel_pptp.pid' @@ -36,117 +35,16 @@ pptp_conf = pptp_cnf_dir + '/pptp.config'  # config path creation  if not os.path.exists(pptp_cnf_dir):      os.makedirs(pptp_cnf_dir) -    sl.syslog(sl.LOG_NOTICE, pptp_cnf_dir + " created") - -pptp_config = ''' -### generated by accel_pptp.py ### -[modules] -log_syslog -pptp -ippool -chap-secrets -{% if authentication['auth_proto'] %} -{{ authentication['auth_proto'] }} -{% else %} -auth_mschap_v2 -{% endif %} -{% if authentication['mode'] == 'radius' %} -radius -{% endif -%} - -[core] -thread-count={{thread_cnt}} - -[log] -syslog=accel-pptp,daemon -copy=1 -level=5 - -{% if dns %} -[dns] -{% if dns[0] %} -dns1={{dns[0]}} -{% endif %} -{% if dns[1] %} -dns2={{dns[1]}} -{% endif %} -{% endif %} - -{% if wins %} -[wins] -{% if wins[0] %} -wins1={{wins[0]}} -{% endif %} -{% if wins[1] %} -wins2={{wins[1]}} -{% endif %} -{% endif %} - -[pptp] -ifname=pptp%d -{% if outside_addr %} -bind={{outside_addr}} -{% endif %} -verbose=1 -ppp-max-mtu={{mtu}} -mppe={{authentication['mppe']}} -echo-interval=10 -echo-failure=3 - - -[client-ip-range] -0.0.0.0/0 - -[ip-pool] -tunnel={{client_ip_pool}} -gw-ip-address={{gw_ip}} - -{% if authentication['mode'] == 'local' %} -[chap-secrets] -chap-secrets=/etc/accel-ppp/pptp/chap-secrets -{% endif %} - -[ppp] -verbose=5 -check-ip=1 -single-session=replace - -{% if authentication['mode'] == 'radius' %} -[radius] -{% for rsrv in authentication['radiussrv']: %} -server={{rsrv}},{{authentication['radiussrv'][rsrv]['secret']}},\ -req-limit={{authentication['radiussrv'][rsrv]['req-limit']}},\ -fail-time={{authentication['radiussrv'][rsrv]['fail-time']}} -{% endfor %} -timeout=30 -acct-timeout=30 -max-try=3 -{%endif %} - -[cli] -tcp=127.0.0.1:2003 -''' - -# pptp chap secrets -chap_secrets_conf = ''' -# username  server  password  acceptable local IP addresses -{% for user in authentication['local-users'] %} -{% if authentication['local-users'][user]['state'] == 'enabled' %} -{{user}}\t*\t{{authentication['local-users'][user]['passwd']}}\t{{authentication['local-users'][user]['ip']}} -{% endif %} -{% endfor %} -''' -  def _chk_con():      cnt = 0 -    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +    s = socket(AF_INET, SOCK_STREAM)      while True:          try:              s.connect(("127.0.0.1", 2003))              break          except ConnectionRefusedError: -            time.sleep(0.5) +            sleep(0.5)              cnt += 1              if cnt == 100:                  raise("failed to start pptp server") @@ -154,16 +52,6 @@ def _chk_con():  # chap_secrets file if auth mode local - -def _write_chap_secrets(c): -    tmpl = jinja2.Template(chap_secrets_conf, trim_blocks=True) -    chap_secrets_txt = tmpl.render(c) -    old_umask = os.umask(0o077) -    open(chap_secrets, 'w').write(chap_secrets_txt) -    os.umask(old_umask) -    sl.syslog(sl.LOG_NOTICE, chap_secrets + ' written') - -  def _accel_cmd(cmd=''):      if not cmd:          return None @@ -326,6 +214,11 @@ def generate(c):      if c == None:          return None +    # Prepare Jinja2 template loader from files +    tmpl_path = os.path.join(vyos_data_dir['data'], 'templates', 'pptp') +    fs_loader = FileSystemLoader(tmpl_path) +    env = Environment(loader=fs_loader, trim_blocks=True) +      # accel-cmd reload doesn't work so any change results in a restart of the daemon      try:          if os.cpu_count() == 1: @@ -338,12 +231,18 @@ def generate(c):          else:              c['thread_cnt'] = int(os.cpu_count()/2) -    tmpl = jinja2.Template(pptp_config, trim_blocks=True) +    tmpl = env.get_template('pptp.config.tmpl')      config_text = tmpl.render(c) -    open(pptp_conf, 'w').write(config_text) +    with open(pptp_conf, 'w') as f: +        f.write(config_text)      if c['authentication']['local-users']: -        _write_chap_secrets(c) +        tmpl = env.get_template('chap-secrets.tmpl') +        chap_secrets_txt = tmpl.render(c) +        old_umask = os.umask(0o077) +        with open(chap_secrets, 'w') as f: +            f.write(chap_secrets_txt) +        os.umask(old_umask)      return c @@ -366,8 +265,6 @@ def apply(c):      else:          # if gw ip changes, only restart doesn't work          _accel_cmd('restart') -        sl.syslog(sl.LOG_NOTICE, "reloading config via daemon restart") -  if __name__ == '__main__':      try: @@ -377,4 +274,4 @@ if __name__ == '__main__':          apply(c)      except ConfigError as e:          print(e) -        sys.exit(1) +        exit(1) | 
