ssh-hull 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +44 -0
  3. data/.gitignore +27 -0
  4. data/.rubocop.yml +62 -0
  5. data/.tool-versions +1 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile.lock +142 -0
  8. data/LICENSE +19 -0
  9. data/README.md +12 -0
  10. data/Rakefile +7 -0
  11. data/bin/bundle +114 -0
  12. data/bin/rake +29 -0
  13. data/bin/rspec +29 -0
  14. data/bin/rubocop +29 -0
  15. data/bomb +12 -0
  16. data/config/locales/en.yml +71 -0
  17. data/config/locales/fr.yml +71 -0
  18. data/exe/ssh-hull +12 -0
  19. data/exe/ssh-tunnel +1 -0
  20. data/lib/ssh-hull/cli.rb +113 -0
  21. data/lib/ssh-hull/logger.rb +6 -0
  22. data/lib/ssh-hull/ui/application.rb +47 -0
  23. data/lib/ssh-hull/ui/forms/application_form.rb +69 -0
  24. data/lib/ssh-hull/ui/forms/host_form.rb +27 -0
  25. data/lib/ssh-hull/ui/forms/tunnel_form.rb +31 -0
  26. data/lib/ssh-hull/ui/helpers/application_window_helper.rb +233 -0
  27. data/lib/ssh-hull/ui/helpers/common/form_helper.rb +169 -0
  28. data/lib/ssh-hull/ui/helpers/common/minimize_helper.rb +46 -0
  29. data/lib/ssh-hull/ui/helpers/common/modal_helper.rb +43 -0
  30. data/lib/ssh-hull/ui/helpers/common/toolbar_helper.rb +106 -0
  31. data/lib/ssh-hull/ui/helpers/common/translation_helper.rb +18 -0
  32. data/lib/ssh-hull/ui/helpers/common/tree_view_helper.rb +40 -0
  33. data/lib/ssh-hull/ui/helpers/host_window_helper.rb +230 -0
  34. data/lib/ssh-hull/ui/helpers/tunnel_window_helper.rb +96 -0
  35. data/lib/ssh-hull/ui/models/config.rb +82 -0
  36. data/lib/ssh-hull/ui/models/host.rb +90 -0
  37. data/lib/ssh-hull/ui/models/tunnel.rb +118 -0
  38. data/lib/ssh-hull/ui/status_icon.rb +45 -0
  39. data/lib/ssh-hull/ui/windows/about_window.rb +32 -0
  40. data/lib/ssh-hull/ui/windows/application_window.rb +42 -0
  41. data/lib/ssh-hull/ui/windows/hosts/delete_window.rb +56 -0
  42. data/lib/ssh-hull/ui/windows/hosts/edit_window.rb +39 -0
  43. data/lib/ssh-hull/ui/windows/hosts/new_window.rb +45 -0
  44. data/lib/ssh-hull/ui/windows/tunnels/delete_window.rb +57 -0
  45. data/lib/ssh-hull/ui/windows/tunnels/edit_window.rb +39 -0
  46. data/lib/ssh-hull/ui/windows/tunnels/new_window.rb +45 -0
  47. data/lib/ssh-hull/version.rb +17 -0
  48. data/lib/ssh-tunnel.rb +94 -0
  49. data/resources/gresources.xml +13 -0
  50. data/resources/ui/about_window.glade +48 -0
  51. data/resources/ui/application_window.glade +196 -0
  52. data/resources/ui/hosts/delete_window.glade +74 -0
  53. data/resources/ui/hosts/edit_window.glade +331 -0
  54. data/resources/ui/hosts/new_window.glade +328 -0
  55. data/resources/ui/tunnels/delete_window.glade +73 -0
  56. data/resources/ui/tunnels/edit_window.glade +305 -0
  57. data/resources/ui/tunnels/new_window.glade +305 -0
  58. data/snap/snapcraft.yaml +48 -0
  59. data/spec/factories/host.rb +22 -0
  60. data/spec/factories/tunnel.rb +16 -0
  61. data/spec/spec_helper.rb +31 -0
  62. data/spec/ssh_tunnel/ui/forms/host_form_spec.rb +103 -0
  63. data/spec/ssh_tunnel/ui/forms/tunnel_form_spec.rb +132 -0
  64. data/spec/ssh_tunnel/ui/models/host_spec.rb +116 -0
  65. data/spec/ssh_tunnel/ui/models/tunnel_spec.rb +43 -0
  66. data/spec/ssh_tunnel_spec.rb +45 -0
  67. data/ssh-hull.gemspec +38 -0
  68. metadata +320 -0
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SSHTunnel
4
+ module UI
5
+ module Windows
6
+ module Tunnels
7
+ class EditWindow < Gtk::Window
8
+
9
+ # Register the class in the GLib world
10
+ type_register
11
+
12
+ class << self
13
+
14
+ def init
15
+ # Set the template from the resources binary
16
+ set_template resource: '/com/ungtb10d/ssh-hull/ui/tunnels/edit_window.glade'
17
+ super
18
+ end
19
+
20
+ end
21
+
22
+ include SSHTunnel::UI::Helpers::TunnelWindowHelper
23
+
24
+
25
+ def initialize(application, window, tunnel)
26
+ super
27
+
28
+ # Set window title
29
+ set_title t('window.tunnel.edit', tunnel: @tunnel.name)
30
+
31
+ # Fills input fields
32
+ restore_form_values(@tunnel)
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SSHTunnel
4
+ module UI
5
+ module Windows
6
+ module Tunnels
7
+ class NewWindow < Gtk::Window
8
+
9
+ # Register the class in the GLib world
10
+ type_register
11
+
12
+ class << self
13
+
14
+ def init
15
+ # Set the template from the resources binary
16
+ set_template resource: '/com/ungtb10d/ssh-hull/ui/tunnels/new_window.glade'
17
+ super
18
+ end
19
+
20
+ end
21
+
22
+ include SSHTunnel::UI::Helpers::TunnelWindowHelper
23
+
24
+
25
+ def initialize(application, window, tunnel)
26
+ super
27
+
28
+ # Set window title
29
+ set_title t('window.tunnel.new')
30
+ end
31
+
32
+
33
+ private
34
+
35
+
36
+ def save_and_reload_view
37
+ @host.add_tunnel(@tunnel)
38
+ super
39
+ end
40
+
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SSHTunnel
4
+
5
+ def self.gem_version
6
+ Gem::Version.new VERSION::STRING
7
+ end
8
+
9
+ module VERSION
10
+ MAJOR = 1
11
+ MINOR = 0
12
+ TINY = 0
13
+ PRE = nil
14
+
15
+ STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
16
+ end
17
+ end
data/lib/ssh-tunnel.rb ADDED
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Require Gtk3 first. If it fails nothing works.
4
+ begin
5
+ require 'gtk3'
6
+ rescue GObjectIntrospection::RepositoryError::TypelibNotFound => _e
7
+ puts GObjectIntrospection::Repository.search_path
8
+ puts %x(ls -hal /usr/lib/x86_64-linux-gnu/girepository-1.0)
9
+ puts %x(ls -hal /usr/lib/girepository-1.0)
10
+ puts %x(ls -hal /usr/lib)
11
+ puts %x(ls -hal /)
12
+ require 'gtk3'
13
+ end
14
+
15
+ # Require other libs
16
+ require 'fileutils'
17
+ require 'json'
18
+ require 'yaml'
19
+ require 'singleton'
20
+ require 'optparse'
21
+ require 'tmpdir'
22
+ require 'securerandom'
23
+ require 'logger'
24
+
25
+ require 'i18n'
26
+ require 'i18n/backend/fallbacks'
27
+
28
+ require 'subprocess'
29
+
30
+ require 'active_model'
31
+ require 'active_support/concern'
32
+ require 'active_support/core_ext/hash'
33
+ require 'active_support/core_ext/string'
34
+ require 'ruby2_keywords'
35
+
36
+ require 'zeitwerk'
37
+ loader = Zeitwerk::Loader.for_gem
38
+ loader.inflector.inflect 'ssh-hull' => 'SSHTunnel'
39
+ loader.inflector.inflect 'ui' => 'UI'
40
+ loader.inflector.inflect 'cli' => 'CLI'
41
+ loader.setup
42
+
43
+ module SSHTunnel
44
+
45
+ ROOT_PATH = Pathname.new File.expand_path('..', __dir__)
46
+
47
+ def self.root_path
48
+ ROOT_PATH
49
+ end
50
+
51
+
52
+ def self.resources_path
53
+ @resources_path ||= root_path.join('resources')
54
+ end
55
+
56
+
57
+ def self.resources_xml
58
+ @resources_xml ||= resources_path.join('gresources.xml')
59
+ end
60
+
61
+
62
+ def self.resources_bin
63
+ @resources_bin ||= Pathname.new(Dir.tmpdir).join('gresources.bin')
64
+ end
65
+
66
+
67
+ def self.locales_path
68
+ root_path.join('config', 'locales', '*.yml')
69
+ end
70
+
71
+
72
+ def self.current_locale
73
+ Gtk.default_language.to_s.split('-').first.to_sym
74
+ end
75
+
76
+
77
+ def self.load_config(file)
78
+ @config = SSHTunnel::UI::Models::Config.new(file)
79
+ end
80
+
81
+
82
+ def self.config
83
+ @config
84
+ end
85
+
86
+
87
+ def self.logger
88
+ @logger ||= SSHTunnel::Logger.new($stdout, level: Logger::INFO)
89
+ end
90
+
91
+ end
92
+
93
+ # Eager load application
94
+ loader.eager_load
@@ -0,0 +1,13 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <gresources>
3
+ <gresource prefix="/com/ungtb10d/ssh-hull">
4
+ <file preprocess="xml-stripblanks">ui/application_window.glade</file>
5
+ <file preprocess="xml-stripblanks">ui/about_window.glade</file>
6
+ <file preprocess="xml-stripblanks">ui/hosts/new_window.glade</file>
7
+ <file preprocess="xml-stripblanks">ui/hosts/edit_window.glade</file>
8
+ <file preprocess="xml-stripblanks">ui/hosts/delete_window.glade</file>
9
+ <file preprocess="xml-stripblanks">ui/tunnels/new_window.glade</file>
10
+ <file preprocess="xml-stripblanks">ui/tunnels/edit_window.glade</file>
11
+ <file preprocess="xml-stripblanks">ui/tunnels/delete_window.glade</file>
12
+ </gresource>
13
+ </gresources>
@@ -0,0 +1,48 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Generated with glade 3.38.2 -->
3
+ <interface>
4
+ <requires lib="gtk+" version="3.18"/>
5
+ <template class="SSHTunnelUIWindowsAboutWindow" parent="GtkAboutDialog">
6
+ <property name="visible">True</property>
7
+ <property name="can-focus">False</property>
8
+ <property name="modal">True</property>
9
+ <property name="window-position">center</property>
10
+ <property name="type-hint">dialog</property>
11
+ <property name="gravity">center</property>
12
+ <property name="program-name">SSH Tunnel</property>
13
+ <property name="website">https://github.com/ungtb10d/ssh-hull</property>
14
+ <property name="website-label" translatable="yes">https://github.com/ungtb10d/ssh-hull</property>
15
+ <property name="authors">Anders Pippi Tednes &lt;theblckswan@protonmail.com&gt;</property>
16
+ <property name="logo-icon-name">network-idle</property>
17
+ <property name="license-type">mit-x11</property>
18
+ <child internal-child="vbox">
19
+ <object class="GtkBox">
20
+ <property name="visible">True</property>
21
+ <property name="can-focus">False</property>
22
+ <property name="orientation">vertical</property>
23
+ <property name="spacing">2</property>
24
+ <child internal-child="action_area">
25
+ <object class="GtkButtonBox">
26
+ <property name="visible">True</property>
27
+ <property name="can-focus">False</property>
28
+ <property name="layout-style">end</property>
29
+ <child>
30
+ <placeholder/>
31
+ </child>
32
+ <child>
33
+ <placeholder/>
34
+ </child>
35
+ </object>
36
+ <packing>
37
+ <property name="expand">False</property>
38
+ <property name="fill">False</property>
39
+ <property name="position">0</property>
40
+ </packing>
41
+ </child>
42
+ <child>
43
+ <placeholder/>
44
+ </child>
45
+ </object>
46
+ </child>
47
+ </template>
48
+ </interface>
@@ -0,0 +1,196 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Generated with glade 3.38.2 -->
3
+ <interface>
4
+ <requires lib="gtk+" version="3.18"/>
5
+ <template class="SSHTunnelUIWindowsApplicationWindow" parent="GtkApplicationWindow">
6
+ <property name="visible">True</property>
7
+ <property name="can-focus">False</property>
8
+ <property name="has-focus">True</property>
9
+ <property name="window-position">center</property>
10
+ <property name="default-width">1200</property>
11
+ <property name="default-height">600</property>
12
+ <property name="icon-name">network-idle</property>
13
+ <property name="gravity">center</property>
14
+ <child>
15
+ <object class="GtkBox" id="main_box">
16
+ <property name="visible">True</property>
17
+ <property name="can-focus">False</property>
18
+ <property name="orientation">vertical</property>
19
+ <child>
20
+ <object class="GtkMenuBar" id="menu_bar">
21
+ <property name="visible">True</property>
22
+ <property name="can-focus">False</property>
23
+ <child>
24
+ <object class="GtkMenuItem">
25
+ <property name="visible">True</property>
26
+ <property name="can-focus">False</property>
27
+ <property name="label" translatable="yes">File</property>
28
+ <property name="use-underline">True</property>
29
+ <child type="submenu">
30
+ <object class="GtkMenu">
31
+ <property name="visible">True</property>
32
+ <property name="can-focus">False</property>
33
+ <child>
34
+ <object class="GtkImageMenuItem" id="menu_quit">
35
+ <property name="label">gtk-quit</property>
36
+ <property name="visible">True</property>
37
+ <property name="can-focus">False</property>
38
+ <property name="use-underline">True</property>
39
+ <property name="use-stock">True</property>
40
+ </object>
41
+ </child>
42
+ </object>
43
+ </child>
44
+ </object>
45
+ </child>
46
+ <child>
47
+ <object class="GtkMenuItem">
48
+ <property name="visible">True</property>
49
+ <property name="can-focus">False</property>
50
+ <property name="label" translatable="yes">Help</property>
51
+ <property name="use-underline">True</property>
52
+ <child type="submenu">
53
+ <object class="GtkMenu">
54
+ <property name="visible">True</property>
55
+ <property name="can-focus">False</property>
56
+ <child>
57
+ <object class="GtkImageMenuItem" id="menu_about">
58
+ <property name="label">gtk-about</property>
59
+ <property name="visible">True</property>
60
+ <property name="can-focus">False</property>
61
+ <property name="use-underline">True</property>
62
+ <property name="use-stock">True</property>
63
+ </object>
64
+ </child>
65
+ </object>
66
+ </child>
67
+ </object>
68
+ </child>
69
+ </object>
70
+ <packing>
71
+ <property name="expand">False</property>
72
+ <property name="fill">True</property>
73
+ <property name="position">0</property>
74
+ </packing>
75
+ </child>
76
+ <child>
77
+ <object class="GtkToolbar" id="tool_bar">
78
+ <property name="visible">True</property>
79
+ <property name="can-focus">False</property>
80
+ <child>
81
+ <object class="GtkToolButton" id="button_add">
82
+ <property name="visible">True</property>
83
+ <property name="can-focus">False</property>
84
+ <property name="tooltip-text" translatable="yes">Add Tunnel</property>
85
+ <property name="stock-id">gtk-add</property>
86
+ </object>
87
+ <packing>
88
+ <property name="expand">False</property>
89
+ <property name="homogeneous">True</property>
90
+ </packing>
91
+ </child>
92
+ <child>
93
+ <object class="GtkToolButton" id="button_edit">
94
+ <property name="visible">True</property>
95
+ <property name="can-focus">False</property>
96
+ <property name="tooltip-text" translatable="yes">Edit Tunnel</property>
97
+ <property name="stock-id">gtk-edit</property>
98
+ </object>
99
+ <packing>
100
+ <property name="expand">False</property>
101
+ <property name="homogeneous">True</property>
102
+ </packing>
103
+ </child>
104
+ <child>
105
+ <object class="GtkToolButton" id="button_remove">
106
+ <property name="visible">True</property>
107
+ <property name="can-focus">False</property>
108
+ <property name="tooltip-text" translatable="yes">Remove Tunnel</property>
109
+ <property name="stock-id">gtk-remove</property>
110
+ </object>
111
+ <packing>
112
+ <property name="expand">False</property>
113
+ <property name="homogeneous">True</property>
114
+ </packing>
115
+ </child>
116
+ <child>
117
+ <object class="GtkSeparatorToolItem" id="separator1">
118
+ <property name="visible">True</property>
119
+ <property name="can-focus">False</property>
120
+ </object>
121
+ <packing>
122
+ <property name="expand">False</property>
123
+ <property name="homogeneous">False</property>
124
+ </packing>
125
+ </child>
126
+ <child>
127
+ <object class="GtkToolButton" id="button_start">
128
+ <property name="visible">True</property>
129
+ <property name="can-focus">False</property>
130
+ <property name="tooltip-text" translatable="yes">Start Tunnel</property>
131
+ <property name="stock-id">gtk-go-up</property>
132
+ </object>
133
+ <packing>
134
+ <property name="expand">False</property>
135
+ <property name="homogeneous">True</property>
136
+ </packing>
137
+ </child>
138
+ <child>
139
+ <object class="GtkToolButton" id="button_stop">
140
+ <property name="visible">True</property>
141
+ <property name="can-focus">False</property>
142
+ <property name="tooltip-text" translatable="yes">Stop Tunnel</property>
143
+ <property name="stock-id">gtk-go-down</property>
144
+ </object>
145
+ <packing>
146
+ <property name="expand">False</property>
147
+ <property name="homogeneous">True</property>
148
+ </packing>
149
+ </child>
150
+ <child>
151
+ <object class="GtkSeparatorToolItem" id="separator2">
152
+ <property name="visible">True</property>
153
+ <property name="can-focus">False</property>
154
+ </object>
155
+ <packing>
156
+ <property name="expand">False</property>
157
+ <property name="homogeneous">False</property>
158
+ </packing>
159
+ </child>
160
+ </object>
161
+ <packing>
162
+ <property name="expand">False</property>
163
+ <property name="fill">True</property>
164
+ <property name="position">1</property>
165
+ </packing>
166
+ </child>
167
+ <child>
168
+ <object class="GtkScrolledWindow" id="hosts_scrolled_window">
169
+ <property name="visible">True</property>
170
+ <property name="can-focus">True</property>
171
+ <property name="shadow-type">in</property>
172
+ <child>
173
+ <placeholder/>
174
+ </child>
175
+ </object>
176
+ <packing>
177
+ <property name="expand">True</property>
178
+ <property name="fill">True</property>
179
+ <property name="position">2</property>
180
+ </packing>
181
+ </child>
182
+ <child>
183
+ <object class="GtkStatusbar" id="status_bar">
184
+ <property name="visible">True</property>
185
+ <property name="can-focus">False</property>
186
+ </object>
187
+ <packing>
188
+ <property name="expand">False</property>
189
+ <property name="fill">False</property>
190
+ <property name="position">3</property>
191
+ </packing>
192
+ </child>
193
+ </object>
194
+ </child>
195
+ </template>
196
+ </interface>
@@ -0,0 +1,74 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Generated with glade 3.38.2 -->
3
+ <interface>
4
+ <requires lib="gtk+" version="3.18"/>
5
+ <template class="SSHTunnelUIWindowsHostsDeleteWindow" parent="GtkWindow">
6
+ <property name="visible">True</property>
7
+ <property name="can-focus">False</property>
8
+ <property name="resizable">False</property>
9
+ <property name="modal">True</property>
10
+ <property name="window-position">center</property>
11
+ <property name="default-width">350</property>
12
+ <property name="default-height">100</property>
13
+ <property name="type-hint">dialog</property>
14
+ <property name="skip-taskbar-hint">True</property>
15
+ <property name="gravity">center</property>
16
+ <child>
17
+ <object class="GtkBox">
18
+ <property name="visible">True</property>
19
+ <property name="can-focus">False</property>
20
+ <property name="orientation">vertical</property>
21
+ <child>
22
+ <object class="GtkLabel" id="label_confirm">
23
+ <property name="visible">True</property>
24
+ <property name="can-focus">False</property>
25
+ <property name="vexpand">True</property>
26
+ <property name="label" translatable="yes">Are you sure?</property>
27
+ </object>
28
+ <packing>
29
+ <property name="expand">True</property>
30
+ <property name="fill">True</property>
31
+ <property name="position">0</property>
32
+ </packing>
33
+ </child>
34
+ <child>
35
+ <object class="GtkActionBar">
36
+ <property name="visible">True</property>
37
+ <property name="can-focus">False</property>
38
+ <child>
39
+ <object class="GtkButton" id="button_cancel">
40
+ <property name="label">gtk-cancel</property>
41
+ <property name="visible">True</property>
42
+ <property name="can-focus">True</property>
43
+ <property name="receives-default">True</property>
44
+ <property name="use-stock">True</property>
45
+ </object>
46
+ <packing>
47
+ <property name="pack-type">end</property>
48
+ <property name="position">0</property>
49
+ </packing>
50
+ </child>
51
+ <child>
52
+ <object class="GtkButton" id="button_submit">
53
+ <property name="label">gtk-apply</property>
54
+ <property name="visible">True</property>
55
+ <property name="can-focus">True</property>
56
+ <property name="receives-default">True</property>
57
+ <property name="use-stock">True</property>
58
+ </object>
59
+ <packing>
60
+ <property name="pack-type">end</property>
61
+ <property name="position">0</property>
62
+ </packing>
63
+ </child>
64
+ </object>
65
+ <packing>
66
+ <property name="expand">False</property>
67
+ <property name="fill">True</property>
68
+ <property name="position">1</property>
69
+ </packing>
70
+ </child>
71
+ </object>
72
+ </child>
73
+ </template>
74
+ </interface>