Updated help menu for new argument system, adjusted exit codes

Former-commit-id: 4c326eb4668fcdb2cacc7b86d800a4f941c4630c [formerly a068d19aeb]
Former-commit-id: ed67ead67fc4a23eb11df52a7627d79a09835589
This commit is contained in:
2023-02-21 16:58:29 -05:00
parent 1d969cc1f1
commit 39dbc1c83d
3 changed files with 37 additions and 39 deletions
+19 -21
View File
@@ -1,8 +1,8 @@
.TH sshyp 1 "14 December 2022" "v1.3.0" "sshyp man page" .TH sshyp 1 "21 February 2023" "v1.4.0" "sshyp man page"
.SH NAME .SH NAME
sshyp \- A very simple self-hosted, synchronized password manager for UNIX(-like) systems. Alternative to (and compatible with) pass/password-store. sshyp \- A very simple self-hosted, synchronized password manager for UNIX(-like) systems. Alternative to (and compatible with) pass/password-store.
.SH SYNOPSIS .SH SYNOPSIS
Client Usage: sshyp [option [flag] [<entry name>]] | [/<entry name>] Client Usage: sshyp [/<entry name>] [option [flag]]
Server Usage: sshyp [option [flag] [<device id>]] Server Usage: sshyp [option [flag] [<device id>]]
.SH DESCRIPTION .SH DESCRIPTION
@@ -18,22 +18,22 @@ Reading an existing entry saved as ~/.local/share/sshyp/development/github.gpg:
sshyp /development/github sshyp /development/github
Copying the password of an existing entry saved as ~/.local/share/sshyp/financial/bank.gpg: Copying the password of an existing entry saved as ~/.local/share/sshyp/financial/bank.gpg:
sshyp copy -p /financial/bank sshyp /financial/bank copy -p
Editing the username of an existing entry saved as ~/.local/share/sshyp/game.gpg: Editing the username of an existing entry saved as ~/.local/share/sshyp/game.gpg:
sshyp edit -u game sshyp /game edit -u
Making a new entry saved as ~/.local/share/sshyp/school/university.gpg using the built-in password generator: Making a new entry saved as ~/.local/share/sshyp/school/university.gpg using the built-in password generator:
sshyp gen /school/university sshyp /school/university gen
Creating a note-only entry saved as ~/.local/share/sshyp/notes/testNote.gpg: Creating a note-only entry saved as ~/.local/share/sshyp/notes/test note.gpg:
sshyp add -n /notes/testNote sshyp /notes/test\ note add -n
Manually syncing entries with the server: Manually syncing entries with the server:
sshyp sync sshyp sync
Removing an existing folder saved as ~/.local/share/sshyp/social: Removing an existing folder saved as ~/.local/share/sshyp/social:
sshyp shear social/ sshyp /social/ shear
.SH EXAMPLES (SERVER) .SH EXAMPLES (SERVER)
Setting up the quick-unlock whitelist: Setting up the quick-unlock whitelist:
sshyp whitelist setup sshyp whitelist setup
@@ -41,21 +41,21 @@ Setting up the quick-unlock whitelist:
Checking the quick-unlock whitelist status of all registered client devices: Checking the quick-unlock whitelist status of all registered client devices:
sshyp whitelist list sshyp whitelist list
Adding a device with the id "laptop-im|lAoa;&;r&o:ez((g/Dz;EVb.nO_" to the quick-unlock whitelist: Adding a device with the id 'laptop-im|lAoa;&;r&o:ez((g/Dz;EVb.nO_' to the quick-unlock whitelist:
sshyp whitelist add 'laptop-im|lAoa;&;r&o:ez((g/Dz;EVb.nO_' sshyp whitelist add 'laptop-im|lAoa;&;r&o:ez((g/Dz;EVb.nO_'
Removing a device with the id "laptop-im|lAoa;&;r&o:ez((g/Dz;EVb.nO_" from the quick-unlock whitelist: Removing a device with the id 'laptop-im|lAoa;&;r&o:ez((g/Dz;EVb.nO_' from the quick-unlock whitelist:
sshyp whitelist del 'laptop-im|lAoa;&;r&o:ez((g/Dz;EVb.nO_' sshyp whitelist del 'laptop-im|lAoa;&;r&o:ez((g/Dz;EVb.nO_'
.SH OPTIONS (CLIENT) .SH OPTIONS (CLIENT)
help/--help/-h bring up the help menu help/-h bring up the help menu
version/-v display sshyp version info version/-v display sshyp version info
tweak configure sshyp tweak configure sshyp
add add an entry add add an entry
gen generate a new password gen generate a new password
edit edit an existing entry edit edit an existing entry
copy copy details of an entry to your clipboard copy copy details of an entry to your clipboard
shear/-rm delete an existing entry shear delete an existing entry
sync/-s manually sync the entry directory via sshync sync manually sync the entry directory via sshync
.SH FLAGS (CLIENT) .SH FLAGS (CLIENT)
add: add:
password/-p add a password entry password/-p add a password entry
@@ -78,7 +78,7 @@ copy:
gen: gen:
update/-u generate a password for an existing entry update/-u generate a password for an existing entry
.SH OPTIONS (SERVER) .SH OPTIONS (SERVER)
help/--help/-h bring up this menu help/-h bring up this menu
version/-v display sshyp version info version/-v display sshyp version info
tweak configure sshyp tweak configure sshyp
whitelist manage the quick-unlock whitelist whitelist manage the quick-unlock whitelist
@@ -113,16 +113,14 @@ Please note that the server setup intentionally does not allow the reading of en
.SH EXIT CODES .SH EXIT CODES
0 - no error 0 - no error
1 - argument error 1 - configuration error
2 - configuration error 2 - data not found error
3 - data not found error 3 - data already exists error
4 - data already exists error 4 - decryption/encryption error
5 - decryption/encryption error 5 - server connection error
6 - server connection error
.SH AUTHOR .SH AUTHOR
Randall Winkhart (https://github.com/rwinkhart) Randall Winkhart (https://github.com/rwinkhart)
+2 -2
View File
@@ -68,7 +68,7 @@ def remote_list_fetch(_user_data): # captures and returns all necessary data fr
except CalledProcessError: except CalledProcessError:
print('\n\u001b[38;5;9merror: failed to connect to the remote server\u001b[0m\n') print('\n\u001b[38;5;9merror: failed to connect to the remote server\u001b[0m\n')
_remote_data = '' _remote_data = ''
s_exit(6) s_exit(5)
_deletion_database = _remote_data[0].strip().splitlines() _deletion_database = _remote_data[0].strip().splitlines()
_folder_database = _remote_data[1].strip().splitlines() _folder_database = _remote_data[1].strip().splitlines()
_titles_mods = _remote_data[2].strip().splitlines() _titles_mods = _remote_data[2].strip().splitlines()
@@ -119,7 +119,7 @@ def get_profile(_profile_dir): # returns a list of data read from a sshync job
except (FileNotFoundError, IndexError): except (FileNotFoundError, IndexError):
print('\n\u001b[38;5;9merror: the profile does not exist or is corrupted\u001b[0m\n') print('\n\u001b[38;5;9merror: the profile does not exist or is corrupted\u001b[0m\n')
_profile_data = None _profile_data = None
s_exit(3) s_exit(2)
_user = _profile_data[0].rstrip() _user = _profile_data[0].rstrip()
_ip = _profile_data[1].rstrip() _ip = _profile_data[1].rstrip()
_port = _profile_data[2].rstrip() _port = _profile_data[2].rstrip()
+16 -16
View File
@@ -168,10 +168,10 @@ def decrypt(_entry_dir, _shm_folder, _shm_entry, _quick_pass,
run(['gpg', '-qd', '--output'] + _output_target, stderr=DEVNULL, check=True) run(['gpg', '-qd', '--output'] + _output_target, stderr=DEVNULL, check=True)
except CalledProcessError: except CalledProcessError:
print('\n\u001b[38;5;9merror: could not decrypt - ensure the correct gpg key is present\u001b[0m\n') print('\n\u001b[38;5;9merror: could not decrypt - ensure the correct gpg key is present\u001b[0m\n')
s_exit(5) s_exit(4)
else: else:
print('\n\u001b[38;5;9merror: could not decrypt - ensure the correct gpg key is present\u001b[0m\n') print('\n\u001b[38;5;9merror: could not decrypt - ensure the correct gpg key is present\u001b[0m\n')
s_exit(5) s_exit(4)
def determine_decrypt(_entry_dir, _shm_folder, _shm_entry): def determine_decrypt(_entry_dir, _shm_folder, _shm_entry):
@@ -414,8 +414,8 @@ def print_info(): # prints help text based on argument
print('\n\u001b[1msshyp copyright (c) 2021-2023 randall winkhart\u001b[0m\n') print('\n\u001b[1msshyp copyright (c) 2021-2023 randall winkhart\u001b[0m\n')
print("this is free software, and you are welcome to redistribute it under certain conditions;\nthis program " print("this is free software, and you are welcome to redistribute it under certain conditions;\nthis program "
"comes with absolutely no warranty;\ntype 'sshyp license' for details") "comes with absolutely no warranty;\ntype 'sshyp license' for details")
if device_type == 'client': # TODO update for re-order (also man page) if device_type == 'client':
print('\n\u001b[1musage:\u001b[0m sshyp [option [flag] [<entry name>]] | [/<entry name>]\n') print('\n\u001b[1musage:\u001b[0m sshyp [/<entry name>] [option [flag]]\n')
print('\u001b[1moptions:\u001b[0m') print('\u001b[1moptions:\u001b[0m')
print('help/-h bring up this menu') print('help/-h bring up this menu')
print('version/-v display sshyp version info') print('version/-v display sshyp version info')
@@ -465,7 +465,7 @@ def no_arg(): # displays a list of entries and gives an option to select one fo
_entry_name = entry_name_fetch('entry to read: ') _entry_name = entry_name_fetch('entry to read: ')
if not Path(f"{directory}{_entry_name}.gpg").exists(): if not Path(f"{directory}{_entry_name}.gpg").exists():
print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n") # TODO display with starting '/' in ALL errors print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n") # TODO display with starting '/' in ALL errors
s_exit(3) s_exit(2)
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
determine_decrypt(directory + _entry_name, _shm_folder, _shm_entry) determine_decrypt(directory + _entry_name, _shm_folder, _shm_entry)
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}") entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
@@ -475,7 +475,7 @@ def no_arg(): # displays a list of entries and gives an option to select one fo
def read_shortcut(): # shortcut to quickly read an entry def read_shortcut(): # shortcut to quickly read an entry
if not Path(f"{directory}{arguments[0].replace('/', '', 1)}.gpg").exists(): if not Path(f"{directory}{arguments[0].replace('/', '', 1)}.gpg").exists():
print(f"\n\u001b[38;5;9merror: entry ({arguments[0].replace('/', '', 1)}) does not exist\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry ({arguments[0].replace('/', '', 1)}) does not exist\u001b[0m\n")
s_exit(3) s_exit(2)
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
determine_decrypt(directory + arguments[0].replace('/', '', 1), _shm_folder, _shm_entry) determine_decrypt(directory + arguments[0].replace('/', '', 1), _shm_folder, _shm_entry)
entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}") entry_reader(f"{tmp_dir}{_shm_folder}/{_shm_entry}")
@@ -586,7 +586,7 @@ def whitelist_manage(): # adds or removes quick-unlock whitelisted device ids
whitelist_list() whitelist_list()
else: else:
print(f"\n\u001b[38;5;9merror: device id ({_device_id}) is not registered\u001b[0m\n") print(f"\n\u001b[38;5;9merror: device id ({_device_id}) is not registered\u001b[0m\n")
s_exit(2) s_exit(1)
elif Path(expanduser(f"~/.config/sshyp/whitelist/{_device_id}")).is_file(): elif Path(expanduser(f"~/.config/sshyp/whitelist/{_device_id}")).is_file():
remove(expanduser(f"~/.config/sshyp/whitelist/{_device_id}")) remove(expanduser(f"~/.config/sshyp/whitelist/{_device_id}"))
@@ -601,7 +601,7 @@ def add_entry(): # adds a new entry
_entry_name = entry_name_fetch() _entry_name = entry_name_fetch()
if Path(f"{directory}{_entry_name}.gpg").is_file(): if Path(f"{directory}{_entry_name}.gpg").is_file():
print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) already exists\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) already exists\u001b[0m\n")
s_exit(4) s_exit(3)
if arguments[arg_start_p] == 'note' or arguments[arg_start_p] == '-n': # note entry if arguments[arg_start_p] == 'note' or arguments[arg_start_p] == '-n': # note entry
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
run([editor, f"{tmp_dir}{_shm_folder}/{_shm_entry}-n"]) run([editor, f"{tmp_dir}{_shm_folder}/{_shm_entry}-n"])
@@ -645,11 +645,11 @@ def rename(): # renames an entry or folder
_entry_name = entry_name_fetch() _entry_name = entry_name_fetch()
if not Path(f"{directory}{_entry_name}.gpg").is_file() and not Path(f"{directory}{_entry_name}").is_dir(): if not Path(f"{directory}{_entry_name}.gpg").is_file() and not Path(f"{directory}{_entry_name}").is_dir():
print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n")
s_exit(3) s_exit(2)
_new_name = entry_name_fetch('new name: ') _new_name = entry_name_fetch('new name: ')
if Path(f"{directory}{_new_name}.gpg").is_file() or Path(f"{directory}{_new_name}").is_dir(): if Path(f"{directory}{_new_name}.gpg").is_file() or Path(f"{directory}{_new_name}").is_dir():
print(f"\n\u001b[38;5;9merror: ({_new_name}) already exists\u001b[0m\n") print(f"\n\u001b[38;5;9merror: ({_new_name}) already exists\u001b[0m\n")
s_exit(4) s_exit(3)
if _entry_name.endswith('/'): if _entry_name.endswith('/'):
if not ssh_error: if not ssh_error:
Path(f"{directory}{_new_name}").mkdir(mode=0o700, parents=True, exist_ok=True) Path(f"{directory}{_new_name}").mkdir(mode=0o700, parents=True, exist_ok=True)
@@ -676,7 +676,7 @@ def edit(): # edits the contents of an entry
_entry_name = entry_name_fetch() _entry_name = entry_name_fetch()
if not Path(f"{directory}{_entry_name}.gpg").is_file(): if not Path(f"{directory}{_entry_name}.gpg").is_file():
print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n")
s_exit(3) s_exit(2)
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
determine_decrypt(directory + _entry_name, _shm_folder, _shm_entry) determine_decrypt(directory + _entry_name, _shm_folder, _shm_entry)
if arguments[arg_start_p] == 'username' or arguments[arg_start_p] == '-u': if arguments[arg_start_p] == 'username' or arguments[arg_start_p] == '-u':
@@ -706,11 +706,11 @@ def gen(): # generates a password for a new or an existing entry
_entry_name = entry_name_fetch() _entry_name = entry_name_fetch()
if (arg_count > 2) and not Path(f"{directory}{_entry_name}.gpg").is_file(): if (arg_count > 2) and not Path(f"{directory}{_entry_name}.gpg").is_file():
print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n")
s_exit(3) s_exit(2)
if arg_count < 2 or (arg_start == 1 and arg_count < 3): if arg_count < 2 or (arg_start == 1 and arg_count < 3):
if Path(f"{directory}{_entry_name}.gpg").is_file(): if Path(f"{directory}{_entry_name}.gpg").is_file():
print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) already exists\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) already exists\u001b[0m\n")
s_exit(4) s_exit(3)
_username = str(input('username: ')) _username = str(input('username: '))
_password = pass_gen() _password = pass_gen()
_url = str(input('url: ')) _url = str(input('url: '))
@@ -742,7 +742,7 @@ def copy_data(): # copies a specified field of an entry to the clipboard
_entry_name = entry_name_fetch() _entry_name = entry_name_fetch()
if not Path(f"{directory}{_entry_name}.gpg").is_file(): if not Path(f"{directory}{_entry_name}.gpg").is_file():
print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n") print(f"\n\u001b[38;5;9merror: entry ({_entry_name}) does not exist\u001b[0m\n")
s_exit(3) s_exit(2)
_shm_folder, _shm_entry = shm_gen() _shm_folder, _shm_entry = shm_gen()
determine_decrypt(directory + _entry_name, _shm_folder, _shm_entry) determine_decrypt(directory + _entry_name, _shm_folder, _shm_entry)
_copy_line, _index = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines(), 0 _copy_line, _index = open(f"{tmp_dir}{_shm_folder}/{_shm_entry}", 'r').readlines(), 0
@@ -826,7 +826,7 @@ if __name__ == "__main__":
print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') print('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
print("not all necessary configuration files are present - please run 'sshyp tweak'") print("not all necessary configuration files are present - please run 'sshyp tweak'")
print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n') print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n')
s_exit(2) s_exit(1)
else: else:
success_flag = 1 success_flag = 1
tweak() tweak()
@@ -842,7 +842,7 @@ if __name__ == "__main__":
copy_data() copy_data()
except IndexError: except IndexError:
print(f"\n\u001b[38;5;9merror: field does not exist in entry\u001b[0m\n") print(f"\n\u001b[38;5;9merror: field does not exist in entry\u001b[0m\n")
s_exit(3) s_exit(2)
elif arguments[arg_start] == 'add': elif arguments[arg_start] == 'add':
if arguments[arg_start_p] == 'note' or arguments[arg_start_p] == '-n' or arguments[arg_start_p] == \ if arguments[arg_start_p] == 'note' or arguments[arg_start_p] == '-n' or arguments[arg_start_p] == \
'password' or arguments[arg_start_p] == '-p': 'password' or arguments[arg_start_p] == '-p':