migrate.pl 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. #!/usr/bin/perl
  2. #Migrate tCMS1 data to tCMS2 flat file data model
  3. use strict;
  4. use warnings;
  5. use JSON::MaybeXS;
  6. use File::Slurper();
  7. use HTML::Parser;
  8. use UUID::Tiny ':std';
  9. use File::Copy;
  10. use DateTime;
  11. #Edit this to be whatever you need it to be
  12. my $docroot = "/var/www/teodesian.net/doc";
  13. my $dir = "/var/www/teodesian.net/doc/microblog/";
  14. opendir(my $dh, $dir) or die;
  15. my @days = grep { !/^\./ } readdir $dh;
  16. closedir $dh;
  17. my $ring = JSON::MaybeXS->new();
  18. foreach my $day (@days) {
  19. opendir(my $dht, "$dir/$day") or die;
  20. my @times = grep { !/^\./ } readdir $dht;
  21. closedir $dht;
  22. my ($month,$date,$year) = split(/\./,$day);
  23. foreach my $time (@times) {
  24. my ($hour, $min, $sec) = split(/:/,$time);
  25. my $data;
  26. my $file = "$dir/$day/$time";
  27. print "Migrate $file\n";
  28. eval {
  29. my $content = File::Slurper::read_text($file);
  30. $data = $ring->decode($content);
  31. $data = json_remap($data);
  32. };
  33. $data = html_post($file) unless $data;
  34. my $dt = DateTime->new(
  35. year => $year + 2000,
  36. month => $month,
  37. day => $date,
  38. hour => $hour,
  39. minute => $min,
  40. second => $sec,
  41. );
  42. $data->{created} = $dt->epoch();
  43. $data->{id} = $data->{created};
  44. $data->{tags} = ['public','news'];
  45. $data->{version} = 0;
  46. open(my $fh, '>', "data/files/$data->{created}") or die;
  47. print $fh encode_json([$data]);
  48. close $fh;
  49. }
  50. }
  51. # Migrate blog posts
  52. $dir = "$docroot/blog";
  53. opendir(my $bh, $dir) or die;
  54. my @blogs = grep { -f "$dir/$_" } readdir $bh;
  55. closedir $bh;
  56. my $offset = 0;
  57. foreach my $post ( sort {
  58. my $anum = $a =~ m/^(\d*)-/;
  59. my $bnum = $b =~ m/^(\d*)-/;
  60. $b <=> $a
  61. } @blogs) {
  62. my $postname = $post;
  63. $postname =~ s/^\d*-//g;
  64. $postname =~ s/\.post$//g;
  65. my $content = File::Slurper::read_text("$dir/$post");
  66. my $data = {
  67. title => $postname,
  68. data => $content,
  69. tags => ['blog','public'],
  70. };
  71. my (undef, undef, undef, undef, $uid, undef, undef, undef, undef, $ctime) = stat("$dir/$post");
  72. my $user = lc(getpwuid($uid));
  73. $user = scalar(grep { $user eq $_ } qw{/sbin/nologin www-data}) ? 'nobody' : $user;
  74. $data->{user} = $user;
  75. $ctime += $offset;
  76. $data->{created} = $ctime;
  77. $data->{id} = $ctime;
  78. $data->{href} = "/blog/$ctime";
  79. $data->{version} = 0;
  80. print "Migrate blog post '$post'\n";
  81. open(my $fh, '>', "data/files/$data->{created}") or die;
  82. print $fh encode_json([$data]);
  83. close $fh;
  84. $offset--;
  85. }
  86. exit 0;
  87. my $vdir = "$docroot/fileshare/video";
  88. opendir(my $vh, $vdir) or die;
  89. my @vidyas = grep { -f "$vdir/$_" && $_ =~ m/\.m4v$/ } readdir $vh;
  90. closedir $vh;
  91. foreach my $vid ( @vidyas ) {
  92. my $postname = $vid;
  93. $postname =~ s/_/ /g;
  94. $postname =~ s/\.mv4$//g;
  95. my $data = {
  96. title => $postname,
  97. data => "Description forthcoming",
  98. tags => ['video','public'],
  99. preview => "/img/sys/testpattern.jpg",
  100. };
  101. my (undef, undef, undef, undef, $uid, undef, undef, undef, undef, $ctime) = stat("$vdir/$vid");
  102. my $user = lc(getpwuid($uid));
  103. $user = scalar(grep { $user eq $_ } qw{/sbin/nologin www-data}) ? 'nobody' : $user;
  104. $data->{user} = $user;
  105. $data->{created} = $ctime;
  106. $data->{id} = $ctime;
  107. $data->{href} = "/assets/$ctime-$vid";
  108. $data->{version} = 0;
  109. #Copy over the video
  110. File::Copy::copy("$vdir/$vid","www/assets/$ctime-$vid");
  111. print "Migrate video '$vid'\n";
  112. open(my $fh, '>', "data/files/$data->{created}") or die;
  113. print $fh encode_json([$data]);
  114. close $fh;
  115. }
  116. sub json_remap {
  117. my $json = shift;
  118. return {
  119. preview => $json->{"image"},
  120. data => $json->{"comment"},
  121. user => lc($json->{"poster"}),
  122. title => $json->{"title"},
  123. audio_href => $json->{"audio"},
  124. href => $json->{"url"},
  125. video_href => $json->{"video"},
  126. };
  127. }
  128. sub html_post {
  129. my $file = shift;
  130. my $is_first_link=1;
  131. my $data = { data => '', href => '' };
  132. my $p = HTML::Parser->new(
  133. handlers => [
  134. start => [
  135. sub {
  136. my ($self,$attr,$text,$tagname) = @_;
  137. if ( $tagname eq 'a' && $is_first_link) {
  138. $data->{href} = $attr->{href};
  139. return;
  140. }
  141. return if $is_first_link;
  142. return if $tagname eq 'hr';
  143. $data->{data} .= $text;
  144. },
  145. 'self, attr, text,tagname'
  146. ],
  147. text => [
  148. sub {
  149. my ($self,$attr,$text,$tagname) = @_;
  150. if ($is_first_link) {
  151. $data->{title} .= $text;
  152. return;
  153. }
  154. $data->{data} .= $text;
  155. },
  156. 'self, attr, text,tagname'
  157. ],
  158. end => [
  159. sub {
  160. my ($self,$attr,$text,$tagname) = @_;
  161. if ( $tagname eq 'a' && $is_first_link) {
  162. $is_first_link=0;
  163. return;
  164. }
  165. return if $is_first_link;
  166. $data->{data} .= $text;
  167. },
  168. 'self, attr, text,tagname'
  169. ],
  170. ],
  171. );
  172. $p->parse_file($file);
  173. #Get the user name from ownership
  174. my (undef, undef, undef, undef, $uid, undef, undef, undef, undef, $ctime) = stat($file);
  175. my $user = lc(getpwuid($uid));
  176. $user = scalar(grep { $user eq $_ } qw{/sbin/nologin www-data}) ? 'nobody' : $user;
  177. $data->{user} = $user;
  178. $data->{created} = $ctime;
  179. return $data;
  180. }