ssh-hull 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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>