Page Menu
Home
VyOS Platform
Search
Configure Global Search
Log In
Files
F118310199
vpn_sstp.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
vpn_sstp.py
View Options
#!/usr/bin/env python3
#
# 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
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# 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
os
from
sys
import
exit
from
vyos.config
import
Config
from
vyos.configdict
import
get_accel_dict
from
vyos.configverify
import
verify_accel_ppp_base_service
from
vyos.pki
import
wrap_certificate
from
vyos.pki
import
wrap_private_key
from
vyos.template
import
render
from
vyos.util
import
call
from
vyos.util
import
dict_search
from
vyos
import
ConfigError
from
vyos
import
airbag
airbag
.
enable
()
cfg_dir
=
'/run/accel-pppd'
sstp_conf
=
'/run/accel-pppd/sstp.conf'
sstp_chap_secrets
=
'/run/accel-pppd/sstp.chap-secrets'
def
get_config
(
config
=
None
):
if
config
:
conf
=
config
else
:
conf
=
Config
()
base
=
[
'vpn'
,
'sstp'
]
if
not
conf
.
exists
(
base
):
return
None
# retrieve common dictionary keys
sstp
=
get_accel_dict
(
conf
,
base
,
sstp_chap_secrets
)
if
sstp
:
sstp
[
'pki'
]
=
conf
.
get_config_dict
([
'pki'
],
key_mangling
=
(
'-'
,
'_'
),
get_first_key
=
True
,
no_tag_node_value_mangle
=
True
)
return
sstp
def
verify
(
sstp
):
if
not
sstp
:
return
None
verify_accel_ppp_base_service
(
sstp
)
if
'client_ip_pool'
not
in
sstp
and
'client_ipv6_pool'
not
in
sstp
:
raise
ConfigError
(
'Client IP subnet required'
)
#
# SSL certificate checks
#
if
not
sstp
[
'pki'
]:
raise
ConfigError
(
'PKI is not configured'
)
if
'ssl'
not
in
sstp
:
raise
ConfigError
(
'SSL missing on SSTP config'
)
ssl
=
sstp
[
'ssl'
]
if
'ca_certificate'
not
in
ssl
:
raise
ConfigError
(
'SSL CA certificate missing on SSTP config'
)
if
'certificate'
not
in
ssl
:
raise
ConfigError
(
'SSL certificate missing on SSTP config'
)
cert_name
=
ssl
[
'certificate'
]
if
ssl
[
'ca_certificate'
]
not
in
sstp
[
'pki'
][
'ca'
]:
raise
ConfigError
(
'Invalid CA certificate on SSTP config'
)
if
cert_name
not
in
sstp
[
'pki'
][
'certificate'
]:
raise
ConfigError
(
'Invalid certificate on SSTP config'
)
pki_cert
=
sstp
[
'pki'
][
'certificate'
][
cert_name
]
if
'private'
not
in
pki_cert
or
'key'
not
in
pki_cert
[
'private'
]:
raise
ConfigError
(
'Missing private key for certificate on SSTP config'
)
if
'password_protected'
in
pki_cert
[
'private'
]:
raise
ConfigError
(
'Encrypted private key is not supported on SSTP config'
)
def
generate
(
sstp
):
if
not
sstp
:
return
None
cert_file_path
=
os
.
path
.
join
(
cfg_dir
,
'sstp-cert.pem'
)
cert_key_path
=
os
.
path
.
join
(
cfg_dir
,
'sstp-cert.key'
)
ca_cert_file_path
=
os
.
path
.
join
(
cfg_dir
,
'sstp-ca.pem'
)
cert_name
=
sstp
[
'ssl'
][
'certificate'
]
pki_cert
=
sstp
[
'pki'
][
'certificate'
][
cert_name
]
with
open
(
cert_file_path
,
'w'
)
as
f
:
f
.
write
(
wrap_certificate
(
pki_cert
[
'certificate'
]))
with
open
(
cert_key_path
,
'w'
)
as
f
:
f
.
write
(
wrap_private_key
(
pki_cert
[
'private'
][
'key'
]))
ca_cert_name
=
sstp
[
'ssl'
][
'ca_certificate'
]
pki_ca
=
sstp
[
'pki'
][
'ca'
][
ca_cert_name
]
with
open
(
ca_cert_file_path
,
'w'
)
as
f
:
f
.
write
(
wrap_certificate
(
pki_ca
[
'certificate'
]))
# accel-cmd reload doesn't work so any change results in a restart of the daemon
render
(
sstp_conf
,
'accel-ppp/sstp.config.tmpl'
,
sstp
)
if
dict_search
(
'authentication.mode'
,
sstp
)
==
'local'
:
render
(
sstp_chap_secrets
,
'accel-ppp/chap-secrets.config_dict.tmpl'
,
sstp
,
permission
=
0
o640
)
else
:
if
os
.
path
.
exists
(
sstp_chap_secrets
):
os
.
unlink
(
sstp_chap_secrets
)
return
sstp
def
apply
(
sstp
):
if
not
sstp
:
call
(
'systemctl stop accel-ppp@sstp.service'
)
for
file
in
[
sstp_chap_secrets
,
sstp_conf
]:
if
os
.
path
.
exists
(
file
):
os
.
unlink
(
file
)
return
None
call
(
'systemctl restart accel-ppp@sstp.service'
)
if
__name__
==
'__main__'
:
try
:
c
=
get_config
()
verify
(
c
)
generate
(
c
)
apply
(
c
)
except
ConfigError
as
e
:
print
(
e
)
exit
(
1
)
File Metadata
Details
Attached
Mime Type
text/x-script.python
Expires
Sat, Oct 17, 12:56 AM (1 d, 5 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4360502
Default Alt Text
vpn_sstp.py (4 KB)
Attached To
Mode
rVYOSONEX vyos-1x
Attached
Detach File
Event Timeline
Log In to Comment