Add home/end handlers, some minor fixes

This commit is contained in:
ivan 2018-04-22 15:02:36 +03:00
parent 450b30b196
commit 32013bdb8d
4 changed files with 38 additions and 30 deletions

21
LICENSE
View File

@ -4,27 +4,26 @@ sshch is released under the DWTW license
This program is free software; you can redistribute it and/or modify it under the terms of the Do What Thou Wilt License. This program is free software; you can redistribute it and/or modify it under the terms of the Do What Thou Wilt License.
DO WHAT THAU WILT Boundless Public License
DO WHAT THOU WILT
TO PUBLIC LICENSE TO PUBLIC LICENSE
Version 2.5 Version 2.55
Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it in full or in part is allowed without any restrictions.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. Do what thou wilt shall be the whole of the Law. 0. Do what thou wilt shall be the whole of the Law.
Anyone is allowed to copy and distribute the copies of this license agreement in whole or in part, as well as modify it without any other limitations. DWTWL a license with a single requirement: DO WHAT THOU WILT
DWTW a license with a single requirement: DO WHAT THOU WILT The license provides more freedom than any other one (such as GPL or BSD) and does not require saving the license text on copying.
The license provides more freedom than any other one (such as GPL or BSD) and does not require saving the license text on copying. DWTWL an accomplished and eligible license for free text, code and any other symbols (including the software, documentation and artwork).
DWTW an accomplished and eligible license for free text (including the software, documentation and artwork). The license does not contain a "no warranty" clause. DWTWL can be used in countries that do not legally acknowledge the transition to public domain.
The license does not contain "no warranty" clause. DWTW can be used in countries that do not legally acknowledge the transition to public domain. Summary:
Summary: An author-creator gives their source code to the world for free, without becoming distracted by worldly thinking regarding how and why the others will use it.
An author-creator gives his or her source code to the world for free, without becoming distracted by worldly thinking regarding how and why the others will use it.

View File

@ -1,6 +1,6 @@
SSH connection manager with curses interface SSH connection manager with curses interface
====== ======
sshch is released under DWTWL 2.5 license sshch is released under DWTWL 2.55 license
### Screenshot ### Screenshot
![sshch](https://raw.githubusercontent.com/zlaxy/sshch/master/sshch_screenshot.png) ![sshch](https://raw.githubusercontent.com/zlaxy/sshch/master/sshch_screenshot.png)
### Installing ### Installing
@ -22,8 +22,8 @@ To run command line help:
``` ```
sshch -h sshch -h
``` ```
**If you want to use unsafe 'password' feature you must install 'sshpass' first.** **Additional Features**
- If you want to use unsafe 'password' feature you must install 'sshpass' first.
- If you want to use bash autocompletion function with sshch, copy autocompletion script to /etc/bash_completion.d/: - If you want to use bash autocompletion function with sshch, copy autocompletion script to /etc/bash_completion.d/:
``` ```
sudo cp sshch_bash_completion.sh /etc/bash_completion.d/sshch sudo cp sshch_bash_completion.sh /etc/bash_completion.d/sshch

View File

@ -9,8 +9,8 @@ def main():
author='zlaxy', author='zlaxy',
url='https://github.com/zlaxy/sshch/', url='https://github.com/zlaxy/sshch/',
description='Ssh connection manager', description='Ssh connection manager',
license='DWTWL 2.5', license='DWTWL 2.55',
version='0.995', version='0.997',
py_modules=['sshch'], py_modules=['sshch'],
scripts=['sshch/sshch'], scripts=['sshch/sshch'],

View File

@ -20,15 +20,14 @@ import curses
from curses import textpad, panel from curses import textpad, panel
# https://github.com/zlaxy/sshch # https://github.com/zlaxy/sshch
version = "0.995" version = "0.997"
# path to conf file, default: ~/.config/sshch.conf # path to conf file, default: ~/.config/sshch.conf
conf_file = path.expanduser("~") + '/.config/sshch.conf' conf_file = path.expanduser("~") + '/.config/sshch.conf'
# expand groups by default # expand groups by default
expand_default = False expand_default = True
def AddNewAlias(alias): def AddNewAlias(alias):
alias = alias.split()[0].strip()
if not conf.has_section(alias): if not conf.has_section(alias):
conf.add_section(alias) conf.add_section(alias)
conf.write(open(conf_file, "w")) conf.write(open(conf_file, "w"))
@ -90,6 +89,7 @@ def HoldConnection(alias):
def CMDAdd(alias): def CMDAdd(alias):
alias = alias.split()[0].strip()
result = AddNewAlias(alias) result = AddNewAlias(alias)
if result == True: if result == True:
prompt_add = ("".join(["Enter connection string for new alias ", prompt_add = ("".join(["Enter connection string for new alias ",
@ -103,6 +103,7 @@ def CMDAdd(alias):
def CMDGroup(group): def CMDGroup(group):
group = group.split()[0].strip()
result = AddNewAlias(group) result = AddNewAlias(group)
if result == True: if result == True:
prompt_add = ("".join(["Enter aliases for new group ", prompt_add = ("".join(["Enter aliases for new group ",
@ -374,7 +375,7 @@ def CMDOptions():
help="add new group for aliases") help="add new group for aliases")
opts.add_option('-c', '--command', action="store", type="string", opts.add_option('-c', '--command', action="store", type="string",
dest="command", metavar="command", default=False, dest="command", metavar="command", default=False,
help="execute command for executing aliases or group") help="execute command for aliases or group")
opts.add_option('-k', '--keep', action="store", type="string", opts.add_option('-k', '--keep', action="store", type="string",
dest="keep", metavar="alias", default=False, dest="keep", metavar="alias", default=False,
help="hold connection with specified alias") help="hold connection with specified alias")
@ -409,8 +410,8 @@ def CMDOptions():
def CursesMain(): def CursesMain():
help_screen = ("".join([" Press:\n", help_screen = ("".join([" Press:\n",
" 'z'/'x' or arrows - navigation\n", " 'z'/'x' or arrows - navigation\n",
" 'a'/'F2' - add new alias\n", " 'a'/'F2' - add new alias (without spaces)\n",
" 'g'/'F5' - add new group\n", " 'g'/'F5' - add new group (spaces will be stripped)\n",
" 'e'/'F4' - edit existing alias/group\n", " 'e'/'F4' - edit existing alias/group\n",
" 'p'/'F6' - set alias's password for sshpass [UNSAFE]\n", " 'p'/'F6' - set alias's password for sshpass [UNSAFE]\n",
" 'space'/'insert' - select\n", " 'space'/'insert' - select\n",
@ -488,18 +489,19 @@ def CursesMain():
(height // 2) - 1, 4, "Enter new alias:", "", (height // 2) - 1, 4, "Enter new alias:", "",
normal_text, highlight_text) normal_text, highlight_text)
add_alias = new_alias_textpad.edit(CursesTextpadConfirm) add_alias = new_alias_textpad.edit(CursesTextpadConfirm)
if not add_alias.rstrip() == "": add_alias = add_alias.split()[0].strip()
add_result = AddNewAlias(add_alias.rstrip()) if not add_alias == "":
add_result = AddNewAlias(add_alias)
if add_result == True: if add_result == True:
add_string = "" add_string = ""
while add_string.rstrip() == "": while add_string == "":
string_textpad = CursesTextpad(screen, 3, string_textpad = CursesTextpad(screen, 3,
width - 8, (height // 2) - 1, 4, width - 8, (height // 2) - 1, 4,
"Enter full execution string:", "Enter full execution string:",
"ssh ", normal_text, highlight_text) "ssh ", normal_text, highlight_text)
add_string = string_textpad.edit( add_string = string_textpad.edit(
CursesTextpadConfirm) CursesTextpadConfirm)
SetAliasString(add_alias.rstrip(), SetAliasString(add_alias,
add_string.replace("\n", "").rstrip()) add_string.replace("\n", "").rstrip())
strings = GetTreeList(False, expanded) strings = GetTreeList(False, expanded)
stringsfull = GetTreeList(True, expanded) stringsfull = GetTreeList(True, expanded)
@ -520,8 +522,9 @@ def CursesMain():
(height // 2) - 1, 4, "Enter group name (without spaces):", "", (height // 2) - 1, 4, "Enter group name (without spaces):", "",
normal_text, highlight_text) normal_text, highlight_text)
add_group = new_group_textpad.edit(CursesTextpadConfirm) add_group = new_group_textpad.edit(CursesTextpadConfirm)
if not add_group.rstrip() == "": add_group = add_group.split()[0].strip()
add_result = AddNewAlias(add_group.rstrip()) if not add_group == "":
add_result = AddNewAlias(add_group)
if add_result == True: if add_result == True:
add_string = "" add_string = ""
while add_string.rstrip() == "": while add_string.rstrip() == "":
@ -531,9 +534,9 @@ def CursesMain():
"", normal_text, highlight_text) "", normal_text, highlight_text)
add_string = string_textpad.edit( add_string = string_textpad.edit(
CursesTextpadConfirm) CursesTextpadConfirm)
SetGroupString(add_group.rstrip(), SetGroupString(add_group,
add_string.replace("\n", "").rstrip()) add_string.replace("\n", "").rstrip())
expanded.append(add_group.rstrip()) expanded.append(add_group)
strings = GetTreeList(False, expanded) strings = GetTreeList(False, expanded)
stringsfull = GetTreeList(True, expanded) stringsfull = GetTreeList(True, expanded)
row_num = len(strings) row_num = len(strings)
@ -744,6 +747,12 @@ def CursesMain():
if page < pages: if page < pages:
page = page + 1 page = page + 1
position = (1 + (max_row * (page - 1))) position = (1 + (max_row * (page - 1)))
if key_pressed == curses.KEY_HOME:
page = 1
position = 1
if key_pressed == curses.KEY_END:
page = pages
position = row_num
box.erase() box.erase()
screen.border(0) screen.border(0)
box.border(0) box.border(0)