litestream_rails 0.2.0 → 0.4.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.
- checksums.yaml +4 -4
- data/app/controllers/litestream_rails/restorations_controller.rb +17 -0
- data/app/views/layouts/litestream_rails/_style.html +45 -0
- data/app/views/layouts/litestream_rails/application.html.erb +2 -2
- data/app/views/litestream_rails/processes/show.html.erb +30 -15
- data/config/routes.rb +1 -0
- data/lib/litestream_rails/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07b007b5c9d51aa745ff55bee9692c8136b65ee58bd9ec7fe9268d1023a9f191
|
4
|
+
data.tar.gz: 6f87be36ebf727ae6ceba9da5568d213d1c147f358bac76d350875c442c64e8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5100418dc719c6e28cf1e8e8ca238487167859541035a176845897773320a3c46c1eddd3c2cfb4a4dc2daee6e7674cce68f1acd9f84a9b9eb460ad8110b356aa
|
7
|
+
data.tar.gz: c52838111d8e0bce68c9b94843c48147c58b1ab11bb16f3b11ffb898f5dbad439812c722c16f8b6abce937ad76ec655c9890d8150c6e14cc816ee495a161f184
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module LitestreamRails
|
2
|
+
class RestorationsController < ApplicationController
|
3
|
+
# POST /restorations
|
4
|
+
def create
|
5
|
+
database = params[:database].remove("[ROOT]/")
|
6
|
+
dir, file = File.split(database)
|
7
|
+
ext = File.extname(file)
|
8
|
+
base = File.basename(file, ext)
|
9
|
+
now = Time.now.utc.strftime("%Y%m%d%H%M%S")
|
10
|
+
backup = File.join(dir, "#{base}-#{now}#{ext}")
|
11
|
+
|
12
|
+
Litestream::Commands.restore(database, async: false, **{"-o" => backup})
|
13
|
+
|
14
|
+
redirect_to root_path, notice: "Restored to <code>#{backup}</code>."
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -544,6 +544,9 @@
|
|
544
544
|
.inline-flex {
|
545
545
|
display: inline-flex;
|
546
546
|
}
|
547
|
+
.inline-block {
|
548
|
+
display: inline-block;
|
549
|
+
}
|
547
550
|
.table {
|
548
551
|
display: table;
|
549
552
|
}
|
@@ -621,16 +624,35 @@
|
|
621
624
|
.rounded-md {
|
622
625
|
border-radius: 0.375rem;
|
623
626
|
}
|
627
|
+
.rounded-lg {
|
628
|
+
border-radius: 0.5rem;
|
629
|
+
}
|
624
630
|
.border-b {
|
625
631
|
border-bottom-width: 1px;
|
626
632
|
}
|
627
633
|
.border-t {
|
628
634
|
border-top-width: 1px;
|
629
635
|
}
|
636
|
+
.bg-green-50 {
|
637
|
+
--tw-bg-opacity: 1;
|
638
|
+
background-color: rgb(240 253 244 / var(--tw-bg-opacity));
|
639
|
+
}
|
640
|
+
.bg-red-50 {
|
641
|
+
--tw-bg-opacity: 1;
|
642
|
+
background-color: rgb(254 242 242 / var(--tw-bg-opacity));
|
643
|
+
}
|
630
644
|
.bg-green-100 {
|
631
645
|
--tw-bg-opacity: 1;
|
632
646
|
background-color: rgb(220 252 231 / var(--tw-bg-opacity));
|
633
647
|
}
|
648
|
+
.bg-red-100 {
|
649
|
+
--tw-bg-opacity: 1;
|
650
|
+
background-color: rgb(254 226 226 / var(--tw-bg-opacity));
|
651
|
+
}
|
652
|
+
.bg-yellow-100 {
|
653
|
+
--tw-bg-opacity: 1;
|
654
|
+
background-color: rgb(254 249 195 / var(--tw-bg-opacity));
|
655
|
+
}
|
634
656
|
.bg-slate-800 {
|
635
657
|
--tw-bg-opacity: 1;
|
636
658
|
background-color: rgb(30 41 59 / var(--tw-bg-opacity));
|
@@ -650,6 +672,10 @@
|
|
650
672
|
padding-left: 0.625rem;
|
651
673
|
padding-right: 0.625rem;
|
652
674
|
}
|
675
|
+
.px-3 {
|
676
|
+
padding-left: 0.75rem;
|
677
|
+
padding-right: 0.75rem;
|
678
|
+
}
|
653
679
|
.py-1 {
|
654
680
|
padding-top: 0.25rem;
|
655
681
|
padding-bottom: 0.25rem;
|
@@ -694,12 +720,23 @@
|
|
694
720
|
font-size: 0.875rem;
|
695
721
|
line-height: 1.25rem;
|
696
722
|
}
|
723
|
+
.font-medium {
|
724
|
+
font-weight: 500;
|
725
|
+
}
|
697
726
|
.font-bold {
|
698
727
|
font-weight: 700;
|
699
728
|
}
|
700
729
|
.font-semibold {
|
701
730
|
font-weight: 600;
|
702
731
|
}
|
732
|
+
.text-green-500 {
|
733
|
+
--tw-text-opacity: 1;
|
734
|
+
color: rgb(34 197 94 / var(--tw-text-opacity));
|
735
|
+
}
|
736
|
+
.text-red-500 {
|
737
|
+
--tw-text-opacity: 1;
|
738
|
+
color: rgb(239 68 68 / var(--tw-text-opacity));
|
739
|
+
}
|
703
740
|
.text-blue-500 {
|
704
741
|
--tw-text-opacity: 1;
|
705
742
|
color: rgb(59 130 246 / var(--tw-text-opacity));
|
@@ -712,6 +749,14 @@
|
|
712
749
|
--tw-text-opacity: 1;
|
713
750
|
color: rgb(22 101 52 / var(--tw-text-opacity));
|
714
751
|
}
|
752
|
+
.text-red-800 {
|
753
|
+
--tw-text-opacity: 1;
|
754
|
+
color: rgb(153 27 27 / var(--tw-text-opacity));
|
755
|
+
}
|
756
|
+
.text-yellow-800 {
|
757
|
+
--tw-text-opacity: 1;
|
758
|
+
color: rgb(133 77 14 / var(--tw-text-opacity));
|
759
|
+
}
|
715
760
|
.text-white {
|
716
761
|
--tw-text-opacity: 1;
|
717
762
|
color: rgb(255 255 255 / var(--tw-text-opacity));
|
@@ -24,7 +24,7 @@
|
|
24
24
|
<p id="notice"
|
25
25
|
class="py-2 px-3 bg-green-50 text-green-500 font-medium rounded-lg inline-block"
|
26
26
|
data-controller="fade">
|
27
|
-
<%= notice %>
|
27
|
+
<%= notice.html_safe %>
|
28
28
|
</p>
|
29
29
|
<% end %>
|
30
30
|
|
@@ -32,7 +32,7 @@
|
|
32
32
|
<p id="alert"
|
33
33
|
class="py-2 px-3 bg-red-50 text-red-500 font-medium rounded-lg inline-block"
|
34
34
|
data-controller="fade">
|
35
|
-
<%= alert %>
|
35
|
+
<%= alert.html_safe %>
|
36
36
|
</p>
|
37
37
|
<% end %>
|
38
38
|
</div>
|
@@ -2,24 +2,39 @@
|
|
2
2
|
<div class="flex items-center justify-between">
|
3
3
|
<h1 class="flex items-baseline gap-2 text-2xl font-bold">
|
4
4
|
Litestream
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
|
6
|
+
<% if @process[:status] == "sleeping" %>
|
7
|
+
<small class="inline-flex rounded-full px-2 text-sm font-semibold bg-yellow-100 text-yellow-800">
|
8
|
+
<%= @process[:status] %>
|
9
|
+
</small>
|
10
|
+
<% elsif @process[:status] %>
|
11
|
+
<small class="inline-flex rounded-full px-2 text-sm font-semibold bg-green-100 text-green-800">
|
12
|
+
<%= @process[:status] %>
|
13
|
+
</small>
|
14
|
+
<% else %>
|
15
|
+
<small class="inline-flex rounded-full px-2 text-sm font-semibold bg-red-100 text-red-800">
|
16
|
+
not running
|
17
|
+
</small>
|
18
|
+
<% end %>
|
8
19
|
</h1>
|
9
20
|
|
10
|
-
|
11
|
-
|
12
|
-
|
21
|
+
<% if @process[:status] %>
|
22
|
+
<small class="text-base">
|
23
|
+
#<code><%= @process[:pid] %></code>
|
24
|
+
</small>
|
25
|
+
<% end %>
|
13
26
|
</div>
|
14
27
|
|
15
|
-
|
16
|
-
<
|
17
|
-
|
18
|
-
<
|
19
|
-
<
|
20
|
-
|
21
|
-
|
22
|
-
|
28
|
+
<% if @process[:status] %>
|
29
|
+
<dl class="grid grid-cols-[fit-content(100%)_1fr] gap-x-4">
|
30
|
+
<dt class="font-bold">Started at</dt>
|
31
|
+
<dd class="">
|
32
|
+
<abbr title="<%= @process[:started] %>" class="underline decoration-dashed decoration-gray-500 cursor-help">
|
33
|
+
<time datetime="<%= @process[:started] %>"><%= @process[:started].to_formatted_s(:db) %></time>
|
34
|
+
</abbr>
|
35
|
+
</dd>
|
36
|
+
</dl>
|
37
|
+
<% end %>
|
23
38
|
</section>
|
24
39
|
<br>
|
25
40
|
<br>
|
@@ -37,7 +52,7 @@
|
|
37
52
|
<h2 class="text-lg font-bold">
|
38
53
|
<code><%= database['path'] %></code>
|
39
54
|
</h2>
|
40
|
-
|
55
|
+
<%= button_to "Restore", restorations_path, class: "rounded-md bg-slate-800 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-slate-700", params: { database: database['path'] } %>
|
41
56
|
</div>
|
42
57
|
|
43
58
|
<br />
|
data/config/routes.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: litestream_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen Margheim
|
@@ -91,6 +91,7 @@ files:
|
|
91
91
|
- Rakefile
|
92
92
|
- app/controllers/litestream_rails/application_controller.rb
|
93
93
|
- app/controllers/litestream_rails/processes_controller.rb
|
94
|
+
- app/controllers/litestream_rails/restorations_controller.rb
|
94
95
|
- app/views/layouts/litestream_rails/_style.html
|
95
96
|
- app/views/layouts/litestream_rails/application.html.erb
|
96
97
|
- app/views/litestream_rails/processes/show.html.erb
|