Files
WPIQ/wo/cli/plugins/secure.py

139 lines
5.4 KiB
Python
Raw Normal View History

2019-09-04 20:36:15 +02:00
import getpass
import random
import string
2018-11-13 21:55:59 +01:00
from cement.core import handler, hook
2019-09-04 20:36:15 +02:00
from cement.core.controller import CementBaseController, expose
2018-11-13 21:55:59 +01:00
from wo.core.git import WOGit
2019-09-04 20:36:15 +02:00
from wo.core.logging import Log
2018-11-13 21:55:59 +01:00
from wo.core.services import WOService
2019-09-04 20:36:15 +02:00
from wo.core.shellexec import WOShellExec
from wo.core.variables import WOVariables
2018-11-13 21:55:59 +01:00
def wo_secure_hook(app):
pass
class WOSecureController(CementBaseController):
class Meta:
label = 'secure'
stacked_on = 'base'
stacked_type = 'nested'
description = ('Secure command secure auth, ip and port')
arguments = [
(['--auth'],
dict(help='secure auth', action='store_true')),
(['--port'],
dict(help='secure port', action='store_true')),
(['--ip'],
dict(help='secure ip', action='store_true')),
(['user_input'],
dict(help='user input', nargs='?', default=None)),
(['user_pass'],
dict(help='user pass', nargs='?', default=None))]
usage = "wo secure [options]"
@expose(hide=True)
def default(self):
2019-08-07 02:45:26 +02:00
pargs = self.app.pargs
if pargs.auth:
2019-03-19 16:58:35 +01:00
self.secure_auth()
2019-08-07 02:45:26 +02:00
if pargs.port:
2019-03-19 16:58:35 +01:00
self.secure_port()
2019-08-07 02:45:26 +02:00
if pargs.ip:
2019-03-19 16:58:35 +01:00
self.secure_ip()
2018-11-13 21:55:59 +01:00
@expose(hide=True)
def secure_auth(self):
"""This function secures authentication"""
2019-08-07 02:45:26 +02:00
pargs = self.app.pargs
2018-11-13 21:55:59 +01:00
passwd = ''.join([random.choice
2019-03-19 16:58:35 +01:00
(string.ascii_letters + string.digits)
2019-04-23 19:03:42 +02:00
for n in range(24)])
2019-08-07 02:45:26 +02:00
if not pargs.user_input:
2018-11-13 21:55:59 +01:00
username = input("Provide HTTP authentication user "
"name [{0}] :".format(WOVariables.wo_user))
2019-08-07 02:45:26 +02:00
pargs.user_input = username
2018-11-13 21:55:59 +01:00
if username == "":
2019-08-07 02:45:26 +02:00
pargs.user_input = WOVariables.wo_user
if not pargs.user_pass:
2018-11-13 21:55:59 +01:00
password = getpass.getpass("Provide HTTP authentication "
"password [{0}] :".format(passwd))
2019-08-07 02:45:26 +02:00
pargs.user_pass = password
2018-11-13 21:55:59 +01:00
if password == "":
2019-08-07 02:45:26 +02:00
pargs.user_pass = passwd
2018-11-13 21:55:59 +01:00
Log.debug(self, "printf username:"
"$(openssl passwd -crypt "
"password 2> /dev/null)\n\""
"> /etc/nginx/htpasswd-wo 2>/dev/null")
WOShellExec.cmd_exec(self, "printf \"{username}:"
"$(openssl passwd -crypt "
"{password} 2> /dev/null)\n\""
"> /etc/nginx/htpasswd-wo 2>/dev/null"
2019-08-07 02:45:26 +02:00
.format(username=pargs.user_input,
password=pargs.user_pass),
2018-11-13 21:55:59 +01:00
log=False)
WOGit.add(self, ["/etc/nginx"],
msg="Adding changed secure auth into Git")
@expose(hide=True)
def secure_port(self):
"""This function Secures port"""
2019-08-07 02:45:26 +02:00
pargs = self.app.pargs
if pargs.user_input:
while not pargs.user_input.isdigit():
2018-11-13 21:55:59 +01:00
Log.info(self, "Please enter a valid port number ")
2019-08-07 02:45:26 +02:00
pargs.user_input = input("WordOps "
2019-09-05 11:47:04 +02:00
"admin port [22222]:")
2019-08-07 02:45:26 +02:00
if not pargs.user_input:
2018-11-13 21:55:59 +01:00
port = input("WordOps admin port [22222]:")
if port == "":
2019-08-07 02:45:26 +02:00
pargs.user_input = 22222
2019-09-05 11:47:04 +02:00
while (not port.isdigit()) and (port != "") and (not port < 65556):
2018-11-13 21:55:59 +01:00
Log.info(self, "Please Enter valid port number :")
port = input("WordOps admin port [22222]:")
2019-08-07 02:45:26 +02:00
pargs.user_input = port
2019-04-23 19:03:42 +02:00
WOShellExec.cmd_exec(self, "sed -i \"s/listen.*/listen "
"{port} default_server ssl http2;/\" "
"/etc/nginx/sites-available/22222"
2019-08-07 02:45:26 +02:00
.format(port=pargs.user_input))
2018-11-13 21:55:59 +01:00
WOGit.add(self, ["/etc/nginx"],
msg="Adding changed secure port into Git")
if not WOService.reload_service(self, 'nginx'):
Log.error(self, "service nginx reload failed. "
"check issues with `nginx -t` command")
Log.info(self, "Successfully port changed {port}"
2019-08-07 02:45:26 +02:00
.format(port=pargs.user_input))
2018-11-13 21:55:59 +01:00
@expose(hide=True)
def secure_ip(self):
"""IP whitelisting"""
2019-08-07 02:45:26 +02:00
pargs = self.app.pargs
if not pargs.user_input:
2018-11-13 21:55:59 +01:00
ip = input("Enter the comma separated IP addresses "
"to white list [127.0.0.1]:")
2019-08-07 02:45:26 +02:00
pargs.user_input = ip
2018-11-13 21:55:59 +01:00
try:
2019-08-07 02:45:26 +02:00
user_ip = pargs.user_input.split(',')
2018-11-13 21:55:59 +01:00
except Exception as e:
2019-07-29 15:08:49 +02:00
Log.debug(self, "{0}".format(e))
2018-11-13 21:55:59 +01:00
user_ip = ['127.0.0.1']
for ip_addr in user_ip:
if not ("exist_ip_address "+ip_addr in open('/etc/nginx/common/'
2019-03-19 16:58:35 +01:00
'acl.conf').read()):
2018-11-13 21:55:59 +01:00
WOShellExec.cmd_exec(self, "sed -i "
"\"/deny/i allow {whitelist_address}\;\""
" /etc/nginx/common/acl.conf"
.format(whitelist_address=ip_addr))
WOGit.add(self, ["/etc/nginx"],
msg="Adding changed secure ip into Git")
Log.info(self, "Successfully added IP address in acl.conf file")
def load(app):
handler.register(WOSecureController)
hook.register('post_argument_parsing', wo_secure_hook)