New release mechanism.
[monikop.git] / doc / fake-pokinom-screenshot.pl
blob2c52977496500576d25811882607485f4ca63cb3
1 #! /usr/bin/perl
2 #use strict;
3 #use warnings;
4 use File::Basename;
5 use File::Rsync;
6 use Thread 'async';
7 use threads::shared;
8 use Curses;
10 my @pokinom_banner = (
11 " _/_/_/ _/_/ _/ _/ _/_/_/ _/ _/ _/_/ _/ _/",
12 " _/ _/ _/ _/ _/ _/ _/ _/_/ _/ _/ _/ _/_/ _/_/ ",
13 " _/_/_/ _/ _/ _/_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ ",
14 " _/ _/ _/ _/ _/ _/ _/ _/_/ _/ _/ _/ _/ ",
15 "_/ _/_/ _/ _/ _/_/_/ _/ _/ _/_/ _/ _/ ",
18 my $version = "v0.0.1";
20 # Debug mode:
21 # 0 = clean UI; 1 = lots of scrolling junk; anything else = both (pipe to file)
22 my $debug = 0;
25 sub act_on_keypress {
26 my ($pressed_key) = @_;
27 if ($pressed_key eq 267) { qx($shut_down_action); }
28 elsif ($pressed_key eq 273) { # F9
29 $shut_down_when_done = $shut_down_when_done ? 0 : 1; }
32 my %being_deleted_thread;
33 my %rsync_worker_thread;
34 my $display_thread;
36 $ENV{USER} = $rsync_username if ($rsync_username);
37 $ENV{RSYNC_PASSWORD} = $rsync_password if ($rsync_password);
39 $SIG{TERM} = sub {
40 $display_thread->kill('TERM')->join;
41 die "Caught signal $_[0]";
44 # Preparations done; sleeves up!
46 # Make sure we have dirs to put our logs in:
47 ## map {
48 ## my ($filename, $directory) = fileparse $_;
49 ## qx(mkdir -p $directory);
50 ## } ( $rsync_log_prefix, $interrupted_prefix );
51 ##
52 ## # Find usable (i.e. mounted) sources
53 ## my @raw_mount_points = grep (s/\S+ on (.*) type .*/$1/, qx/mount/);
54 ## chomp @raw_mount_points;
55 ## my @sources = intersection @raw_mount_points, @usable_mount_points;
56 ## debug_print "SOURCES:\n";
57 ## debug_print @sources;
58 @sources = (
59 '/media/disk_1',
60 '/media/disk_2',
61 '/media/disk_3',
62 '/media/disk_4',
63 '/media/disk_5',
64 '/media/disk_6',
65 '/media/disk_7',
68 # Turn a path into a legal perl identifier:
69 sub make_key_from_path {
70 my $path = shift;
71 ($path) =~ s/\/?(.*)\/?/$1/g;
72 ($path) =~ s/\W/_/g;
73 $path;
76 map {
77 $source_roots{make_key_from_path $_} = $_
78 } @sources;
80 %speeds = (
81 'media_disk_1' => '15.20MB/s',
82 'media_disk_2' => '10.02MB/',
83 'media_disk_3' => '-',
84 'media_disk_4' => '242.73kB/s',
85 'media_disk_5' => '6.78MB/s',
86 'media_disk_6' => '-',
87 'media_disk_7' => '-',
90 %done = (
91 'media_disk_1' => 0,
92 'media_disk_2' => 0,
93 'media_disk_3' => 1,
94 'media_disk_4' => 0,
95 'media_disk_5' => 0,
96 'media_disk_6' => 0,
97 'media_disk_7' => 1,
100 %progress_ratios = (
101 'media_disk_1' => '951/2300',
102 'media_disk_2' => '217/352',
103 'media_disk_3' => 'Done',
104 'media_disk_4' => '16/223',
105 'media_disk_5' => '1854/1929',
106 'media_disk_6' => 'Wait',
107 'media_disk_7' => 'Done',
111 unless ($debug == 1) {
112 # Talk to the user.
113 $display_thread = async {
114 $SIG{TERM} = sub {
115 endwin(); # Leave a usable terminal.
116 threads->exit()
119 my $redraw_window_count = 0;
120 initscr();
121 cbreak();
122 noecho();
123 curs_set(0);
124 my $window_top = newwin(24 - 8, 79, 0, 0);
125 my $window_center = newwin(5, 79, 24 - 8, 0);
126 my $window_bottom = newwin(3, 79, 24 - 3, 0);
127 $window_bottom->keypad(1);
128 $window_bottom->nodelay(1);
129 start_color;
130 init_pair 1, COLOR_MAGENTA, COLOR_BLACK;
131 init_pair 2, COLOR_RED, COLOR_BLACK;
132 init_pair 3, COLOR_CYAN, COLOR_BLACK;
133 init_pair 4, COLOR_YELLOW, COLOR_BLACK;
134 my $MAGENTA = COLOR_PAIR(1);
135 my $RED = COLOR_PAIR(2);
136 my $CYAN = COLOR_PAIR(3);
137 my $YELLOW = COLOR_PAIR(4);
138 while (1) {
139 $window_top->attron($CYAN);
140 $window_top->box(0,0);
141 $window_top->addstr(0, 30, " P r o g r e s s ");
142 $window_top->attroff($CYAN);
143 $window_top->addstr(15, 1, "$version");
144 my $sources_format = "%-25s%-18s%-8s";
145 $window_top->attron(A_BOLD);
146 $window_top->addstr(1, 12,
147 sprintf ($sources_format,
148 "Source Medium", "Speed", "To Do"));
149 $window_top->attroff(A_BOLD);
150 my $line_number = 2;
151 map {
152 my $source = $_;
153 $window_top->attron($CYAN);
154 $window_top->attron($RED) if $done{$source};
155 $window_top->
156 addstr($line_number, 12,
157 sprintf($sources_format,
158 substr($source_roots{$source}, 0, 24),
159 substr($speeds{$source}, 0, 17),
160 substr($progress_ratios{$source}, -8, 8)));
161 ++ $line_number;
162 $window_top->addstr($line_number, 1,
163 sprintf($sources_format, "", "", "", ""));
164 $window_top->attroff($RED);
165 $window_top->attroff($CYAN);
166 } sort (keys %source_roots);
167 $line_number = 0;
168 map {
169 $window_center->addstr($line_number, 2, $_);
170 ++ $line_number;
171 } @pokinom_banner;
172 $window_center->move(0, 0);
174 $window_bottom->box(0,0);
175 $window_bottom->attron(A_BOLD);
176 $window_bottom->
177 addstr(1, 3,
178 sprintf ("[F3]: Turn off now.%54s",
179 $shut_down_when_done ? "Turning off when done. [F9]: Stay on."
180 : "Staying on. [F9]: Turn off when done."));
181 $window_bottom->attroff(A_BOLD);
183 $window_top->noutrefresh();
184 $window_bottom->noutrefresh();
185 $window_center->noutrefresh(); # Last window gets the cursor.
186 sleep 2;
187 if (++ $redraw_window_count > 5) {
188 $redraw_window_count = 0;
189 redrawwin();
191 doupdate();
192 act_on_keypress($window_bottom->getch());
193 if (! grep(/0/, values %done) && $shut_down_when_done) {
194 qx ($shut_down_action);
197 endwin();
201 sleep;