Skip to content

Commit 5658bfe

Browse files
authored
Merge pull request #1 from kiwicom/initial-version
Initial version
2 parents 4ecd7d7 + bfd85ac commit 5658bfe

28 files changed

+1152
-0
lines changed

.editorconfig

+253
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
[*]
2+
charset = utf-8
3+
end_of_line = lf
4+
indent_size = 4
5+
indent_style = space
6+
insert_final_newline = true
7+
max_line_length = 240
8+
tab_width = 4
9+
ij_continuation_indent_size = 8
10+
ij_formatter_off_tag = @formatter:off
11+
ij_formatter_on_tag = @formatter:on
12+
ij_formatter_tags_enabled = false
13+
ij_smart_tabs = false
14+
ij_wrap_on_typing = false
15+
16+
[*.latte]
17+
ij_latte_keep_blank_lines_in_code = 2
18+
ij_latte_spaces_around_assignment_operators = true
19+
20+
[{*.yml, *.yaml}]
21+
indent_size = 2
22+
ij_yaml_keep_indents_on_empty_lines = false
23+
ij_yaml_keep_line_breaks = true
24+
25+
[.editorconfig]
26+
ij_editorconfig_align_group_field_declarations = false
27+
ij_editorconfig_space_after_colon = false
28+
ij_editorconfig_space_after_comma = true
29+
ij_editorconfig_space_before_colon = false
30+
ij_editorconfig_space_before_comma = false
31+
ij_editorconfig_spaces_around_assignment_operators = true
32+
33+
[{*.bash, *.sh, *.zsh}]
34+
indent_size = 2
35+
tab_width = 2
36+
ij_shell_binary_ops_start_line = false
37+
ij_shell_keep_column_alignment_padding = false
38+
ij_shell_minify_program = false
39+
ij_shell_redirect_followed_by_space = false
40+
ij_shell_switch_cases_indented = false
41+
42+
[{*.ctp, *.hphp, *.inc, *.module, *.php, *.php4, *.php5, *.phpt, *.phtml}]
43+
ij_continuation_indent_size = 4
44+
ij_php_align_assignments = false
45+
ij_php_align_class_constants = false
46+
ij_php_align_group_field_declarations = false
47+
ij_php_align_inline_comments = false
48+
ij_php_align_key_value_pairs = false
49+
ij_php_align_match_arm_bodies = false
50+
ij_php_align_multiline_array_initializer_expression = false
51+
ij_php_align_multiline_binary_operation = false
52+
ij_php_align_multiline_chained_methods = false
53+
ij_php_align_multiline_extends_list = false
54+
ij_php_align_multiline_for = false
55+
ij_php_align_multiline_parameters = false
56+
ij_php_align_multiline_parameters_in_calls = false
57+
ij_php_align_multiline_ternary_operation = true
58+
ij_php_align_named_arguments = false
59+
ij_php_align_phpdoc_comments = false
60+
ij_php_align_phpdoc_param_names = false
61+
ij_php_anonymous_brace_style = end_of_line
62+
ij_php_api_weight = 28
63+
ij_php_array_initializer_new_line_after_left_brace = true
64+
ij_php_array_initializer_right_brace_on_new_line = true
65+
ij_php_array_initializer_wrap = on_every_item
66+
ij_php_assignment_wrap = off
67+
ij_php_attributes_wrap = off
68+
ij_php_author_weight = 28
69+
ij_php_binary_operation_sign_on_next_line = true
70+
ij_php_binary_operation_wrap = on_every_item
71+
ij_php_blank_lines_after_class_header = 0
72+
ij_php_blank_lines_after_function = 1
73+
ij_php_blank_lines_after_imports = 1
74+
ij_php_blank_lines_after_opening_tag = 0
75+
ij_php_blank_lines_after_package = 0
76+
ij_php_blank_lines_around_class = 1
77+
ij_php_blank_lines_around_constants = 0
78+
ij_php_blank_lines_around_field = 1
79+
ij_php_blank_lines_around_method = 1
80+
ij_php_blank_lines_before_class_end = 0
81+
ij_php_blank_lines_before_imports = 1
82+
ij_php_blank_lines_before_method_body = 0
83+
ij_php_blank_lines_before_package = 1
84+
ij_php_blank_lines_before_return_statement = 0
85+
ij_php_blank_lines_between_imports = 0
86+
ij_php_block_brace_style = end_of_line
87+
ij_php_call_parameters_new_line_after_left_paren = true
88+
ij_php_call_parameters_right_paren_on_new_line = true
89+
ij_php_call_parameters_wrap = on_every_item
90+
ij_php_catch_on_new_line = false
91+
ij_php_category_weight = 28
92+
ij_php_class_brace_style = next_line
93+
ij_php_comma_after_last_array_element = true
94+
ij_php_concat_spaces = true
95+
ij_php_copyright_weight = 28
96+
ij_php_deprecated_weight = 28
97+
ij_php_do_while_brace_force = never
98+
ij_php_else_if_style = combine
99+
ij_php_else_on_new_line = false
100+
ij_php_example_weight = 28
101+
ij_php_extends_keyword_wrap = off
102+
ij_php_extends_list_wrap = on_every_item
103+
ij_php_fields_default_visibility = private
104+
ij_php_filesource_weight = 28
105+
ij_php_finally_on_new_line = false
106+
ij_php_for_brace_force = never
107+
ij_php_for_statement_new_line_after_left_paren = false
108+
ij_php_for_statement_right_paren_on_new_line = false
109+
ij_php_for_statement_wrap = off
110+
ij_php_force_short_declaration_array_style = true
111+
ij_php_global_weight = 28
112+
ij_php_group_use_wrap = on_every_item
113+
ij_php_if_brace_force = never
114+
ij_php_if_lparen_on_next_line = true
115+
ij_php_if_rparen_on_next_line = true
116+
ij_php_ignore_weight = 28
117+
ij_php_import_sorting = alphabetic
118+
ij_php_indent_break_from_case = true
119+
ij_php_indent_case_from_switch = true
120+
ij_php_indent_code_in_php_tags = false
121+
ij_php_internal_weight = 28
122+
ij_php_keep_blank_lines_after_lbrace = 2
123+
ij_php_keep_blank_lines_before_right_brace = 2
124+
ij_php_keep_blank_lines_in_code = 2
125+
ij_php_keep_blank_lines_in_declarations = 2
126+
ij_php_keep_control_statement_in_one_line = false
127+
ij_php_keep_first_column_comment = false
128+
ij_php_keep_indents_on_empty_lines = false
129+
ij_php_keep_line_breaks = true
130+
ij_php_keep_rparen_and_lbrace_on_one_line = true
131+
ij_php_keep_simple_classes_in_one_line = true
132+
ij_php_keep_simple_methods_in_one_line = false
133+
ij_php_lambda_brace_style = end_of_line
134+
ij_php_license_weight = 28
135+
ij_php_line_comment_add_space = false
136+
ij_php_line_comment_at_first_column = true
137+
ij_php_link_weight = 28
138+
ij_php_lower_case_boolean_const = true
139+
ij_php_lower_case_keywords = true
140+
ij_php_lower_case_null_const = true
141+
ij_php_method_brace_style = next_line
142+
ij_php_method_call_chain_wrap = on_every_item
143+
ij_php_method_parameters_new_line_after_left_paren = true
144+
ij_php_method_parameters_right_paren_on_new_line = true
145+
ij_php_method_parameters_wrap = on_every_item
146+
ij_php_method_weight = 28
147+
ij_php_modifier_list_wrap = false
148+
ij_php_multiline_chained_calls_semicolon_on_new_line = false
149+
ij_php_namespace_brace_style = 1
150+
ij_php_new_line_after_php_opening_tag = false
151+
ij_php_null_type_position = in_the_end
152+
ij_php_package_weight = 28
153+
ij_php_param_weight = 0
154+
ij_php_parentheses_expression_new_line_after_left_paren = false
155+
ij_php_parentheses_expression_right_paren_on_new_line = false
156+
ij_php_phpdoc_blank_line_before_tags = true
157+
ij_php_phpdoc_blank_lines_around_parameters = true
158+
ij_php_phpdoc_keep_blank_lines = true
159+
ij_php_phpdoc_param_spaces_between_name_and_description = 1
160+
ij_php_phpdoc_param_spaces_between_tag_and_type = 1
161+
ij_php_phpdoc_param_spaces_between_type_and_name = 1
162+
ij_php_phpdoc_use_fqcn = false
163+
ij_php_phpdoc_wrap_long_lines = false
164+
ij_php_place_assignment_sign_on_next_line = false
165+
ij_php_place_parens_for_constructor = 0
166+
ij_php_property_read_weight = 28
167+
ij_php_property_weight = 28
168+
ij_php_property_write_weight = 28
169+
ij_php_return_type_on_new_line = false
170+
ij_php_return_weight = 1
171+
ij_php_see_weight = 28
172+
ij_php_since_weight = 28
173+
ij_php_sort_phpdoc_elements = true
174+
ij_php_space_after_colon = true
175+
ij_php_space_after_colon_in_enum_backed_type = true
176+
ij_php_space_after_colon_in_named_argument = true
177+
ij_php_space_after_colon_in_return_type = true
178+
ij_php_space_after_comma = true
179+
ij_php_space_after_for_semicolon = true
180+
ij_php_space_after_quest = true
181+
ij_php_space_after_type_cast = true
182+
ij_php_space_after_unary_not = false
183+
ij_php_space_before_array_initializer_left_brace = false
184+
ij_php_space_before_catch_keyword = true
185+
ij_php_space_before_catch_left_brace = true
186+
ij_php_space_before_catch_parentheses = true
187+
ij_php_space_before_class_left_brace = true
188+
ij_php_space_before_closure_left_parenthesis = true
189+
ij_php_space_before_colon = true
190+
ij_php_space_before_colon_in_return_type = false
191+
ij_php_space_before_comma = false
192+
ij_php_space_before_do_left_brace = true
193+
ij_php_space_before_else_keyword = true
194+
ij_php_space_before_else_left_brace = true
195+
ij_php_space_before_finally_keyword = true
196+
ij_php_space_before_finally_left_brace = true
197+
ij_php_space_before_for_left_brace = true
198+
ij_php_space_before_for_parentheses = true
199+
ij_php_space_before_for_semicolon = false
200+
ij_php_space_before_if_left_brace = true
201+
ij_php_space_before_if_parentheses = true
202+
ij_php_space_before_method_call_parentheses = false
203+
ij_php_space_before_method_left_brace = true
204+
ij_php_space_before_method_parentheses = false
205+
ij_php_space_before_quest = true
206+
ij_php_space_before_short_closure_left_parenthesis = true
207+
ij_php_space_before_switch_left_brace = true
208+
ij_php_space_before_switch_parentheses = true
209+
ij_php_space_before_try_left_brace = true
210+
ij_php_space_before_unary_not = false
211+
ij_php_space_before_while_keyword = true
212+
ij_php_space_before_while_left_brace = true
213+
ij_php_space_before_while_parentheses = true
214+
ij_php_space_between_ternary_quest_and_colon = false
215+
ij_php_spaces_around_additive_operators = true
216+
ij_php_spaces_around_arrow = false
217+
ij_php_spaces_around_assignment_in_declare = false
218+
ij_php_spaces_around_assignment_operators = true
219+
ij_php_spaces_around_bitwise_operators = true
220+
ij_php_spaces_around_equality_operators = true
221+
ij_php_spaces_around_logical_operators = true
222+
ij_php_spaces_around_multiplicative_operators = true
223+
ij_php_spaces_around_null_coalesce_operator = true
224+
ij_php_spaces_around_relational_operators = true
225+
ij_php_spaces_around_shift_operators = true
226+
ij_php_spaces_around_unary_operator = false
227+
ij_php_spaces_around_var_within_brackets = false
228+
ij_php_spaces_within_array_initializer_braces = false
229+
ij_php_spaces_within_brackets = false
230+
ij_php_spaces_within_catch_parentheses = false
231+
ij_php_spaces_within_for_parentheses = false
232+
ij_php_spaces_within_if_parentheses = false
233+
ij_php_spaces_within_method_call_parentheses = false
234+
ij_php_spaces_within_method_parentheses = false
235+
ij_php_spaces_within_parentheses = false
236+
ij_php_spaces_within_short_echo_tags = true
237+
ij_php_spaces_within_switch_parentheses = false
238+
ij_php_spaces_within_while_parentheses = false
239+
ij_php_special_else_if_treatment = false
240+
ij_php_subpackage_weight = 28
241+
ij_php_ternary_operation_signs_on_next_line = true
242+
ij_php_ternary_operation_wrap = on_every_item
243+
ij_php_throws_weight = 2
244+
ij_php_todo_weight = 28
245+
ij_php_unknown_tag_weight = 28
246+
ij_php_upper_case_boolean_const = false
247+
ij_php_upper_case_null_const = false
248+
ij_php_uses_weight = 28
249+
ij_php_var_weight = 28
250+
ij_php_variable_naming_style = mixed
251+
ij_php_version_weight = 28
252+
ij_php_while_brace_force = never
253+
ij_php_while_on_new_line = false

.gitignore

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
*.lock
2+
package.xml
3+
/vendor
4+
.idea
5+
.php_cs.cache
6+
.phpunit.result.cache
7+
.loopbind.json

README.md

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# Loopbind
2+
3+
🛠️️ CLI tool to easily bind localhost network interface with additional IP and ensure matching record in /etc/hosts.
4+
5+
This is a helper tool to be installed via `composer global` to machines where the localhost deployment process of
6+
Docker composition (via `docker-compose.yaml`) is prepared in a way that it binds the ports on IP from localhost subnet block and multiple of such
7+
compositions should be allowed to run in parallel (differentiated by the IP).
8+
9+
Practically speaking this tool ensures that the localhost network interface (`lo0` on OS X) will also have another IP from localhost subnet block
10+
(for example `127.0.0.2`) and there will entry in `/etc/hosts` for particular domain routing to that IP (for example `127.0.0.2 example.test`).
11+
12+
Supported platforms:
13+
14+
| Platform | Support |
15+
|----------|--------|
16+
| OS X ||
17+
| Linux ||
18+
| Windows ||
19+
20+
Required underlying utilities:
21+
* `sudo`
22+
* `ifconfig`
23+
* `sed`
24+
25+
## Installation
26+
27+
Run
28+
```bash
29+
composer global require kiwicom/loopbind
30+
```
31+
32+
Then if you have composer bin directory on the `PATH` you can use it by calling `loopbind` in the CLI.
33+
34+
## Usage
35+
36+
In the project root define a file named `.loopbind.json` with following content:
37+
```json
38+
{
39+
"localIPAlias": "127.11.23.1",
40+
"hostname": "foobar.test"
41+
}
42+
```
43+
44+
Then in this directory you can run `loopbind apply` to run commands to ensure the binding.
45+
Also, you can run `loopbind unapply` to remove it.
46+
47+
The commands are idempotent so repeated apply/unapply does nothing (and the apply command does not even need to run the command again).
48+
49+
Please note, that the config is expected to be in the current working directory.
50+
51+
## Development
52+
53+
This projects uses following coding standard:
54+
* PHPCS
55+
* PHPStan analysis (`composer stan`)
56+
* PHPUnit tests. (`composer unit`)
57+
58+
However, due to the expected side effects (changing the computer configuration after run) and application of KISS only a subset
59+
of functionality is tested automatically. Hence, testing of:
60+
- `ApplyCommand`
61+
- `UnapplyCommand`
62+
63+
should be done manually.

bin/loopbind

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#!/usr/bin/env php
2+
<?php declare(strict_types=1);
3+
4+
use Contributte\Console\Application;
5+
use Kiwicom\Loopbind\Commands\ApplyCommand;
6+
use Kiwicom\Loopbind\Commands\UnapplyCommand;
7+
use Kiwicom\Loopbind\Constants\ExitCodes;
8+
use Kiwicom\Loopbind\Helpers\PlatformHelpers;
9+
10+
$autoloaders = [
11+
__DIR__ . '/../vendor/autoload.php',
12+
__DIR__ . '/../../../autoload.php',
13+
];
14+
foreach ($autoloaders as $autoloader) {
15+
if (is_file($autoloader)) {
16+
require_once $autoloader;
17+
break;
18+
}
19+
}
20+
21+
if (!PlatformHelpers::isOSX() && !PlatformHelpers::isLinux()) {
22+
echo "This tool is currently only supporting OS X and Linux.\n";
23+
exit(ExitCodes::UNSUPPORTED_PLATFORM);
24+
}
25+
26+
$app = new Application();
27+
$app->setCatchExceptions(true);
28+
$app->setName('Loopbind');
29+
$app->addCommands([
30+
new ApplyCommand(null),
31+
new UnapplyCommand(null)
32+
]);
33+
exit($app->run());

0 commit comments

Comments
 (0)