Add home/end handlers, some minor fixes
This commit is contained in:
parent
450b30b196
commit
32013bdb8d
17
LICENSE
17
LICENSE
|
@ -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.
|
||||||
|
|
||||||
DWTW – an accomplished and eligible license for free text (including the software, documentation and artwork).
|
DWTWL – an accomplished and eligible license for free text, code and any other symbols (including the software, documentation and artwork).
|
||||||
|
|
||||||
The license does not contain "no warranty" clause. DWTW can be used in countries that do not legally acknowledge the transition to public domain.
|
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.
|
||||||
|
|
||||||
Summary:
|
Summary:
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
4
setup.py
4
setup.py
|
@ -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'],
|
||||||
|
|
||||||
|
|
37
sshch/sshch
37
sshch/sshch
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue