diff options
author | nicolargo <nicolashennion@gmail.com> | 2016-03-04 10:57:15 +0100 |
---|---|---|
committer | nicolargo <nicolashennion@gmail.com> | 2016-03-04 10:57:15 +0100 |
commit | 40d05a7a71810ef851586f816a1a090659aba946 (patch) | |
tree | 30aca045e37970e8f896e5cd9db771718f756ceb | |
parent | 5497ae125f7eafb19db6c2f61bb523fb0da3c3ab (diff) |
Change username for server and web server authentication (issue #693)
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | glances/client.py | 2 | ||||
-rw-r--r-- | glances/main.py | 42 | ||||
-rw-r--r-- | glances/password.py | 13 |
4 files changed, 40 insertions, 18 deletions
@@ -11,6 +11,7 @@ Enhancements and new features: * New folders' monitoring plugins (issue #721) * Use wildcard (regexp) to the hide configuration option for network, diskio and fs sections (issue #799 ) * Command line arguments are now take into account in the WebUI (#789 from @notFloran) + * Change username for server and web server authentication (issue #693) * Add an option to disable top menu (issue #766) * Add IOps in the DiskIO plugin (issue #763) * Add hide configuration key for FS Plugin (issue #736) diff --git a/glances/client.py b/glances/client.py index 6e714f77..2dc33bed 100644 --- a/glances/client.py +++ b/glances/client.py @@ -114,7 +114,7 @@ class GlancesClient(object): # Other errors msg = "Connection to server failed" if err.errcode == 401: - msg += " (Bad password)" + msg += " (Bad username/password)" else: msg += " ({0} {1})".format(err.errcode, err.errmsg) self.log_and_exit(msg) diff --git a/glances/main.py b/glances/main.py index ca8eeeee..2f7a6c45 100644 --- a/glances/main.py +++ b/glances/main.py @@ -24,6 +24,7 @@ import os import sys import tempfile +from glances.compat import input from glances.config import Config from glances.globals import appname, LINUX, WINDOWS, psutil_version, version from glances.logger import logger @@ -174,6 +175,8 @@ Start the client browser (browser mode):\n\ help='define the client/server TCP port [default: {0}]'.format(self.server_port)) parser.add_argument('-B', '--bind', default='0.0.0.0', dest='bind_address', help='bind server to the given IPv4/IPv6 address or hostname') + parser.add_argument('--username', action='store_true', default=False, dest='username_prompt', + help='define a client/server username') parser.add_argument('--password', action='store_true', default=False, dest='password_prompt', help='define a client/server password') parser.add_argument('--snmp-community', default='public', dest='snmp_community', @@ -252,21 +255,37 @@ Start the client browser (browser mode):\n\ args.process_short_name = True # Server or client login/password - args.username = self.username + if args.username_prompt: + # Every username needs a password + args.password_prompt = True + # Prompt username + if args.server: + args.username = self.__get_username(description='Define the Glances server username: ') + elif args.webserver: + args.username = self.__get_username(description='Define the Glances webserver username: ') + elif args.client: + args.username = self.__get_username(description='Enter the Glances server username: ') + else: + # Default user name is 'glances' + args.username = self.username + if args.password_prompt: # Interactive or file password if args.server: args.password = self.__get_password( - description='Define the password for the Glances server', - confirm=True) + description='Define the Glances server password ({} username): '.format(args.username), + confirm=True, + username=args.username) elif args.webserver: args.password = self.__get_password( - description='Define the password for the Glances web server\nUser name: glances', - confirm=True) + description='Define the Glances webserver password ({} username): '.format(args.username), + confirm=True, + username=args.username) elif args.client: args.password = self.__get_password( - description='Enter the Glances server password', - clear=True) + description='Enter the Glances server password({} username): '.format(args.username), + clear=True, + username=args.username) else: # Default is no password args.password = self.password @@ -324,14 +343,19 @@ Start the client browser (browser mode):\n\ return args - def __get_password(self, description='', confirm=False, clear=False): + def __get_username(self, description=''): + """Read a username from the command line. + """ + return input(description) + + def __get_password(self, description='', confirm=False, clear=False, username='glances'): """Read a password from the command line. - if confirm = True, with confirmation - if clear = True, plain (clear password) """ from glances.password import GlancesPassword - password = GlancesPassword() + password = GlancesPassword(username=username) return password.get_password(description, confirm, clear) def is_standalone(self): diff --git a/glances/password.py b/glances/password.py index becd469b..54e2600a 100644 --- a/glances/password.py +++ b/glances/password.py @@ -35,9 +35,10 @@ class GlancesPassword(object): """This class contains all the methods relating to password.""" - def __init__(self): + def __init__(self, username='glances'): + self.username = username self.password_path = self.get_password_path() - self.password_filename = 'glances.pwd' + self.password_filename = self.username + '.pwd' self.password_filepath = os.path.join(self.password_path, self.password_filename) def get_password_path(self): @@ -102,13 +103,9 @@ class GlancesPassword(object): logger.info("Read password from file {0}".format(self.password_filepath)) password = self.load_password() else: - # Else enter the password from the command line - if description != '': - print(description) - # password_sha256 is the plain SHA-256 password # password_hashed is the salt + SHA-256 password - password_sha256 = self.sha256_hash(getpass.getpass('Password: ')) + password_sha256 = self.sha256_hash(getpass.getpass(description)) password_hashed = self.hash_password(password_sha256) if confirm: # password_confirm is the clear password (only used to compare) @@ -144,7 +141,7 @@ class GlancesPassword(object): return # Create/overwrite the password file - with open(self.password_filepath, 'w') as file_pwd: + with open(self.password_filepath, 'wb') as file_pwd: file_pwd.write(hashed_password) def load_password(self): |