From 7c0c59a187347bd369b60eba8dbe67e6e37f7f72 Mon Sep 17 00:00:00 2001 From: Timo Makinen Date: Mon, 20 May 2019 23:10:54 +0300 Subject: [PATCH] add web server support to mirror role --- roles/mirror/base/files/mirror.xslt | 83 +++++ roles/mirror/base/files/static/icons.css | 307 ++++++++++++++++++ roles/mirror/base/files/static/icons/7z.png | Bin 0 -> 185 bytes roles/mirror/base/files/static/icons/avi.png | Bin 0 -> 606 bytes roles/mirror/base/files/static/icons/bash.png | Bin 0 -> 520 bytes roles/mirror/base/files/static/icons/bin.png | Bin 0 -> 891 bytes roles/mirror/base/files/static/icons/bmp.png | Bin 0 -> 206 bytes roles/mirror/base/files/static/icons/bz2.png | Bin 0 -> 807 bytes .../mirror/base/files/static/icons/c-lang.png | Bin 0 -> 551 bytes .../base/files/static/icons/changelog.png | Bin 0 -> 748 bytes roles/mirror/base/files/static/icons/chm.png | Bin 0 -> 662 bytes .../base/files/static/icons/copying.png | Bin 0 -> 593 bytes roles/mirror/base/files/static/icons/cpp.png | Bin 0 -> 930 bytes roles/mirror/base/files/static/icons/css.png | Bin 0 -> 731 bytes roles/mirror/base/files/static/icons/csv.png | Bin 0 -> 1072 bytes roles/mirror/base/files/static/icons/deb.png | Bin 0 -> 653 bytes roles/mirror/base/files/static/icons/djvu.png | Bin 0 -> 212 bytes roles/mirror/base/files/static/icons/doc.png | Bin 0 -> 777 bytes .../mirror/base/files/static/icons/empty.png | Bin 0 -> 688 bytes roles/mirror/base/files/static/icons/epub.png | Bin 0 -> 3362 bytes roles/mirror/base/files/static/icons/flac.png | Bin 0 -> 910 bytes roles/mirror/base/files/static/icons/flv.png | Bin 0 -> 474 bytes .../mirror/base/files/static/icons/folder.png | Bin 0 -> 537 bytes roles/mirror/base/files/static/icons/gif.png | Bin 0 -> 262 bytes .../base/files/static/icons/go-lang.png | Bin 0 -> 543 bytes .../mirror/base/files/static/icons/header.png | Bin 0 -> 528 bytes roles/mirror/base/files/static/icons/html.png | Bin 0 -> 883 bytes roles/mirror/base/files/static/icons/ico.png | Bin 0 -> 487 bytes roles/mirror/base/files/static/icons/ini.png | Bin 0 -> 878 bytes .../base/files/static/icons/install.png | Bin 0 -> 646 bytes roles/mirror/base/files/static/icons/iso.png | Bin 0 -> 673 bytes roles/mirror/base/files/static/icons/java.png | Bin 0 -> 756 bytes .../base/files/static/icons/javascript.png | Bin 0 -> 606 bytes roles/mirror/base/files/static/icons/jpg.png | Bin 0 -> 282 bytes roles/mirror/base/files/static/icons/json.png | Bin 0 -> 435 bytes roles/mirror/base/files/static/icons/less.png | Bin 0 -> 593 bytes .../base/files/static/icons/license.png | Bin 0 -> 764 bytes roles/mirror/base/files/static/icons/lock.png | Bin 0 -> 749 bytes .../mirror/base/files/static/icons/lock2.png | Bin 0 -> 756 bytes .../mirror/base/files/static/icons/lock3.png | Bin 0 -> 496 bytes roles/mirror/base/files/static/icons/lua.png | Bin 0 -> 923 bytes roles/mirror/base/files/static/icons/mkv.png | Bin 0 -> 739 bytes roles/mirror/base/files/static/icons/mobi.png | Bin 0 -> 784 bytes roles/mirror/base/files/static/icons/mov.png | Bin 0 -> 690 bytes roles/mirror/base/files/static/icons/mp3.png | Bin 0 -> 991 bytes roles/mirror/base/files/static/icons/mp4.png | Bin 0 -> 285 bytes roles/mirror/base/files/static/icons/nfo.png | Bin 0 -> 355 bytes roles/mirror/base/files/static/icons/nim.png | Bin 0 -> 420 bytes roles/mirror/base/files/static/icons/none.png | Bin 0 -> 342 bytes roles/mirror/base/files/static/icons/pdf.png | Bin 0 -> 470 bytes roles/mirror/base/files/static/icons/perl.png | Bin 0 -> 932 bytes roles/mirror/base/files/static/icons/php.png | Bin 0 -> 249 bytes roles/mirror/base/files/static/icons/png.png | Bin 0 -> 210 bytes roles/mirror/base/files/static/icons/psd.png | Bin 0 -> 735 bytes .../mirror/base/files/static/icons/python.png | Bin 0 -> 695 bytes roles/mirror/base/files/static/icons/rar.png | Bin 0 -> 497 bytes .../mirror/base/files/static/icons/readme.png | Bin 0 -> 423 bytes roles/mirror/base/files/static/icons/reg.png | Bin 0 -> 233 bytes roles/mirror/base/files/static/icons/rp.png | Bin 0 -> 840 bytes roles/mirror/base/files/static/icons/rpm.png | Bin 0 -> 660 bytes roles/mirror/base/files/static/icons/rtf.png | Bin 0 -> 211 bytes roles/mirror/base/files/static/icons/ruby.png | Bin 0 -> 925 bytes roles/mirror/base/files/static/icons/rust.png | Bin 0 -> 474 bytes roles/mirror/base/files/static/icons/sql.png | Bin 0 -> 492 bytes .../mirror/base/files/static/icons/sqlite.png | Bin 0 -> 883 bytes roles/mirror/base/files/static/icons/tar.png | Bin 0 -> 288 bytes roles/mirror/base/files/static/icons/text.png | Bin 0 -> 246 bytes roles/mirror/base/files/static/icons/tgz.png | Bin 0 -> 853 bytes roles/mirror/base/files/static/icons/txt.png | Bin 0 -> 246 bytes roles/mirror/base/files/static/icons/wav.png | Bin 0 -> 364 bytes roles/mirror/base/files/static/icons/xml.png | Bin 0 -> 400 bytes roles/mirror/base/files/static/icons/yaml.png | Bin 0 -> 461 bytes roles/mirror/base/files/static/icons/zip.png | Bin 0 -> 375 bytes roles/mirror/base/files/static/index.html | 0 roles/mirror/base/files/static/logo.png | Bin 0 -> 5705 bytes roles/mirror/base/files/static/mirror.css | 84 +++++ roles/mirror/base/meta/main.yml | 4 + roles/mirror/base/tasks/main.yml | 25 ++ roles/mirror/base/templates/mirror.conf.j2 | 6 + roles/mirror/sync/tasks/main.yml | 8 + 80 files changed, 517 insertions(+) create mode 100644 roles/mirror/base/files/mirror.xslt create mode 100644 roles/mirror/base/files/static/icons.css create mode 100644 roles/mirror/base/files/static/icons/7z.png create mode 100644 roles/mirror/base/files/static/icons/avi.png create mode 100644 roles/mirror/base/files/static/icons/bash.png create mode 100644 roles/mirror/base/files/static/icons/bin.png create mode 100644 roles/mirror/base/files/static/icons/bmp.png create mode 100644 roles/mirror/base/files/static/icons/bz2.png create mode 100644 roles/mirror/base/files/static/icons/c-lang.png create mode 100644 roles/mirror/base/files/static/icons/changelog.png create mode 100644 roles/mirror/base/files/static/icons/chm.png create mode 100644 roles/mirror/base/files/static/icons/copying.png create mode 100644 roles/mirror/base/files/static/icons/cpp.png create mode 100644 roles/mirror/base/files/static/icons/css.png create mode 100644 roles/mirror/base/files/static/icons/csv.png create mode 100644 roles/mirror/base/files/static/icons/deb.png create mode 100644 roles/mirror/base/files/static/icons/djvu.png create mode 100644 roles/mirror/base/files/static/icons/doc.png create mode 100644 roles/mirror/base/files/static/icons/empty.png create mode 100644 roles/mirror/base/files/static/icons/epub.png create mode 100644 roles/mirror/base/files/static/icons/flac.png create mode 100644 roles/mirror/base/files/static/icons/flv.png create mode 100644 roles/mirror/base/files/static/icons/folder.png create mode 100644 roles/mirror/base/files/static/icons/gif.png create mode 100644 roles/mirror/base/files/static/icons/go-lang.png create mode 100644 roles/mirror/base/files/static/icons/header.png create mode 100644 roles/mirror/base/files/static/icons/html.png create mode 100644 roles/mirror/base/files/static/icons/ico.png create mode 100644 roles/mirror/base/files/static/icons/ini.png create mode 100644 roles/mirror/base/files/static/icons/install.png create mode 100644 roles/mirror/base/files/static/icons/iso.png create mode 100644 roles/mirror/base/files/static/icons/java.png create mode 100644 roles/mirror/base/files/static/icons/javascript.png create mode 100644 roles/mirror/base/files/static/icons/jpg.png create mode 100644 roles/mirror/base/files/static/icons/json.png create mode 100644 roles/mirror/base/files/static/icons/less.png create mode 100644 roles/mirror/base/files/static/icons/license.png create mode 100644 roles/mirror/base/files/static/icons/lock.png create mode 100644 roles/mirror/base/files/static/icons/lock2.png create mode 100644 roles/mirror/base/files/static/icons/lock3.png create mode 100644 roles/mirror/base/files/static/icons/lua.png create mode 100644 roles/mirror/base/files/static/icons/mkv.png create mode 100644 roles/mirror/base/files/static/icons/mobi.png create mode 100644 roles/mirror/base/files/static/icons/mov.png create mode 100644 roles/mirror/base/files/static/icons/mp3.png create mode 100644 roles/mirror/base/files/static/icons/mp4.png create mode 100644 roles/mirror/base/files/static/icons/nfo.png create mode 100644 roles/mirror/base/files/static/icons/nim.png create mode 100644 roles/mirror/base/files/static/icons/none.png create mode 100644 roles/mirror/base/files/static/icons/pdf.png create mode 100644 roles/mirror/base/files/static/icons/perl.png create mode 100644 roles/mirror/base/files/static/icons/php.png create mode 100644 roles/mirror/base/files/static/icons/png.png create mode 100644 roles/mirror/base/files/static/icons/psd.png create mode 100644 roles/mirror/base/files/static/icons/python.png create mode 100644 roles/mirror/base/files/static/icons/rar.png create mode 100644 roles/mirror/base/files/static/icons/readme.png create mode 100644 roles/mirror/base/files/static/icons/reg.png create mode 100644 roles/mirror/base/files/static/icons/rp.png create mode 100644 roles/mirror/base/files/static/icons/rpm.png create mode 100644 roles/mirror/base/files/static/icons/rtf.png create mode 100644 roles/mirror/base/files/static/icons/ruby.png create mode 100644 roles/mirror/base/files/static/icons/rust.png create mode 100644 roles/mirror/base/files/static/icons/sql.png create mode 100644 roles/mirror/base/files/static/icons/sqlite.png create mode 100644 roles/mirror/base/files/static/icons/tar.png create mode 100644 roles/mirror/base/files/static/icons/text.png create mode 100644 roles/mirror/base/files/static/icons/tgz.png create mode 100644 roles/mirror/base/files/static/icons/txt.png create mode 100644 roles/mirror/base/files/static/icons/wav.png create mode 100644 roles/mirror/base/files/static/icons/xml.png create mode 100644 roles/mirror/base/files/static/icons/yaml.png create mode 100644 roles/mirror/base/files/static/icons/zip.png create mode 100644 roles/mirror/base/files/static/index.html create mode 100644 roles/mirror/base/files/static/logo.png create mode 100644 roles/mirror/base/files/static/mirror.css create mode 100644 roles/mirror/base/meta/main.yml create mode 100644 roles/mirror/base/templates/mirror.conf.j2 diff --git a/roles/mirror/base/files/mirror.xslt b/roles/mirror/base/files/mirror.xslt new file mode 100644 index 0000000..d9b4a96 --- /dev/null +++ b/roles/mirror/base/files/mirror.xslt @@ -0,0 +1,83 @@ + + + + + + + + + + B + K + M + G + + + + + + + + + + + + / + + - + Directory + + + + + + + + + File + + + + + + + mirrors.foo.sh - <xsl:value-of select="$path" /> + + + + + + + +
+

Index of

+ + + + + + + + + + + +
NameLast ModifiedSizeType
Parent Directory
+
+ + + +
+
diff --git a/roles/mirror/base/files/static/icons.css b/roles/mirror/base/files/static/icons.css new file mode 100644 index 0000000..b8f187f --- /dev/null +++ b/roles/mirror/base/files/static/icons.css @@ -0,0 +1,307 @@ + +#content a[href]:before { + content: url(icons/none.png); +} +#content a[href$="/"]:before { + content: url(icons/folder.png); +} + + +/** Checksums **/ + +#content a[href~="MD5"]:before, +#content a[href~="SHA1"]:before, +#content a[href~="SHA256"]:before { + content: url(icons/lock.png); +} + +#content a[href$=".md5"]:before, +#content a[href$=".sha1"]:before, +#content a[href$=".sha256"]:before { + content: url(icons/lock2.png); +} + +#content a[href$=".pgp"]:before, +#content a[href$=".asc"]:before, +#content a[href$=".sig"]:before { + content: url(icons/lock3.png); +} + + +/** Compressed **/ + +#content a[href$=".7z"]:before { + content: url(icons/7z.png); +} + +#content a[href$=".bin"]:before, +#content a[href$=".cue"]:before { + content: url(icons/bin.png); +} + +#content a[href$=".deb"]:before { + content: url(icons/deb.png); +} + +#content a[href$=".iso"]:before { + content: url(icons/iso.png); +} + +#content a[href$=".rar"]:before { + content: url(icons/rar.png); +} + +#content a[href$=".rpm"]:before { + content: url(icons/rpm.png); +} + +#content a[href$=".tar"]:before, +#content a[href$=".tar.gz"]:before { + content: url(icons/tar.png); +} + +#content a[href$=".tgz"]:before { + content: url(icons/tgz.png); +} + +#content a[href$=".zip"]:before { + content: url(icons/zip.png); +} + +#content a[href$=".bz2"]:before { + content: url(icons/bz2.png); +} + + +/** Data Storage **/ + +#content a[href$=".csv"]:before { + content: url(icons/csv.png); +} + +#content a[href$=".ini"]:before { + content: url(icons/ini.png); +} + +#content a[href$=".json"]:before { + content: url(icons/json.png); +} + +#content a[href$=".sql"]:before { + content: url(icons/sql.png); +} + +#content a[href$=".sqlite"]:before { + content: url(icons/sqlite.png); +} + +#content a[href$=".reg"]:before { + content: url(icons/reg.png); +} + +#content a[href$=".xml"]:before { + content: url(icons/xml.png); +} + +#content a[href$=".yaml"]:before, +#content a[href$=".yml"]:before { + content: url(icons/yaml.png); +} + + +/** Documents **/ + +#content a[href$=".chm"]:before { + content: url(icons/chm.png); +} + +#content a[href$=".djvu"]:before { + content: url(icons/djvu.png); +} + +#content a[href$=".mobi"]:before { + content: url(icons/mobi.png); +} + +#content a[href$=".pdf"]:before { + content: url(icons/pdf.png); +} + +#content a[href$=".txt"]:before { + content: url(icons/text.png); +} + +#content a[href$=".rtf"]:before { + content: url(icons/rtf.png); +} + +#content a[href$=".doc"]:before { + content: url(icons/doc.png); +} + +#content a[href$=".epub"]:before { + content: url(icons/epub.png); +} + + +/** Information **/ + +#content a[href~="README"]:before { + content: url(icons/readme.png); +} + +#content a[href~="CHANGELOG"]:before { + content: url(icons/changelog.png); +} + +#content a[href~="INSTALL"]:before { + content: url(icons/install.png); +} + +#content a[href~="LICENSE"]:before { + content: url(icons/license.png); +} + +#content a[href~="COPYING"]:before { + content: url(icons/copying.png); +} + +#content a[href$=".nfo"]:before, +#content a[href$=".diz"]:before { + content: url(icons/nfo.png); +} + + +/** Media Files **/ + +#content a[href$=".flac"]:before { + content: url(icons/flac.png); +} + +#content a[href$=".mp3"]:before { + content: url(icons/mp3.png); +} + +#content a[href$=".wav"]:before { + content: url(icons/wav.png); +} + +#content a[href$=".bmp"]:before { + content: url(icons/bmp.png); +} + +#content a[href$=".gif"]:before { + content: url(icons/gif.png); +} + +#content a[href$=".jpg"]:before, +#content a[href$=".jpeg"]:before { + content: url(icons/jpg.png); +} + +#content a[href$=".png"]:before { + content: url(icons/png.png); +} + +#content a[href$=".psd"]:before { + content: url(icons/psd.png); +} + +#content a[href$=".ra"]:before, +#content a[href$=".rv"]:before { + content: url(icons/rp.png); +} + +#content a[href$=".avi"]:before { + content: url(icons/avi.png); +} + +#content a[href$=".flv"]:before { + content: url(icons/flv.png); +} + +#content a[href$=".mkv"]:before { + content: url(icons/mkv.png); +} + +#content a[href$=".mov"]:before { + content: url(icons/mov.png); +} + +#content a[href$=".mp4"]:before { + content: url(icons/mp4.png); +} + + +/** Source Code **/ + +#content a[href$=".sh"]:before { + content: url(icons/bash.png); +} + +#content a[href$=".cpp"]:before { + content: url(icons/cpp.png); +} + +#content a[href$=".h"]:before { + content: url(icons/header.png); +} + +#content a[href$=".c"]:before { + content: url(icons/c-lang.png); +} + +#content a[href$=".go"]:before { + content: url(icons/go-lang.png); +} + +#content a[href$=".html"]:before, +#content a[href$=".htm"]:before { + content: url(icons/html.png); +} + +#content a[href$=".java"]:before, +#content a[href$=".class"]:before { + content: url(icons/java.png); +} + +#content a[href$=".lua"]:before { + content: url(icons/lua.png); +} + +#content a[href$=".nim"]:before { + content: url(icons/nim.png); +} + +#content a[href$=".js"]:before { + content: url(icons/javascript.png); +} + +#content a[href$=".php"]:before { + content: url(icons/php.png); +} + +#content a[href$=".pl"]:before { + content: url(icons/perl.png); +} + +#content a[href$=".py"]:before { + content: url(icons/python.png); +} + +#content a[href$=".rb"]:before { + content: url(icons/ruby.png); +} + +#content a[href$=".rs"]:before, +#content a[href$=".rlib"]:before { + content: url(icons/rust.png); +} + +#content a[href$=".css"]:before { + content: url(icons/css.png); +} + +#content a[href$=".less"]:before { + content: url(icons/less.png); +} diff --git a/roles/mirror/base/files/static/icons/7z.png b/roles/mirror/base/files/static/icons/7z.png new file mode 100644 index 0000000000000000000000000000000000000000..1548f691f1660da33beedc82be38b921e5233a01 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|uK)jk05bpo|KG9v|1uzp zu_VYZn8D%MjWm#o0*}aI1_o|n5N2eUHAey{$X?><>&kwgosGpbP0l+XkKVc0W+ literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/avi.png b/roles/mirror/base/files/static/icons/avi.png new file mode 100644 index 0000000000000000000000000000000000000000..aec7160ed30e77a3e5c201580ad98a8f2368d429 GIT binary patch literal 606 zcmV-k0-^nhP)@@Ct0>^(KOp!wK)YD2|it95T$L0@9BB?5CB>z7oT<2mAABLvCo3T zv*VoAJ|W?|h|q9k`MS6PwIq`}ac2tx^370-GWc-=Pn-4Hp-)~ohdoefbjG-VvMME8 zXR`i$>lw#@dlVXd`=m^vTp2U)=v>M^M|}Z4TAJXtHsOs@jE85o9gG=hKFqrJRX~^$ z5+YK9KcCRJf0-&KpytGe#MVPJ;=4cy3kfq)LQq05q|=uNr#2@27bv}3v-L&MQH)(* zi{K?Tri$6{m#l$Kl7U+l_fr=IJaxx7)#b%Ev~5;&_c_tuV}rA|8y1@#YTYZyN~Je- zf=!%%0;3x4&hhgJ)9OO*TubKwto=inmxy{{jNl zDT;Sl1bt>Qda82JYp8>xqXm5y0~`hwI_24DOizYs7hzDezV;8`o4F)0EMGP9nNP4B zAh=Hw#&QTg-V*!}CLnZ?;LRqO_7dK63Bj@z-U-|7q$m(Fi?>HA36XL_sDR+hC-`}U zKpr6|AWVu0!OMhjA>o&TFk4HQab8P{0<*0d7=8Q=*6G|Z=EfHnqb sX8>DjMHDccX61He5#p(X$KnB?-@FB^`63q}3jhEB07*qoM6N<$f^sqn_5c6? literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/bash.png b/roles/mirror/base/files/static/icons/bash.png new file mode 100644 index 0000000000000000000000000000000000000000..961d3a42d7e1bfc352d1429499b54e527af76e65 GIT binary patch literal 520 zcmV+j0{8uiP)13@nFJ2eYoQSw>+sGdtqgM0UGDo8^ ztSlu#L_COHDwh$B#o7Xt%H==@0Hq`d!1UA<1_t_Zc7B0+z5XM>Q!)&YQh~r=%qPZ2 zM-h!gu)Cjw);a`GQU$uJDTELZQsMHdh@HJ0h6V?*mP(=<`scf!q5BY-P4#j6puPhmql70KnM9WavFYfTNSsmi_!fGGzJ@(Bn9$ zRw}+A=pwYYoPj&n?T!7OxBc9wyf5IDY{)i@697O%R*_0000< KMNUMnLSTa3^w-t^ literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/bin.png b/roles/mirror/base/files/static/icons/bin.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e6f0037d4da2860fb86576f7f52d91d0312360 GIT binary patch literal 891 zcmV->1BCpEP)-ObF7 zS(9kGkyT60rZL%Sd-bAiAw+T!p{Jfa6hTT(rKAJ`dKQEhq2NW(TQCMZw5i5k8WMI< ziP<(9O-zj7rrAv<`)A&p@%MspFGlb6wI$@D; zkMR4zz`)X8du^}4#KgpRoLj$jcI8?u%Y+?gFu6n^C8Q82J$<@Uuh)MZ92~sHbs&2>>Kl@#uf{kfr`p(ax*Qp#Vtyq5Ea zT5LR?n!)yF6(ZCSf*~TZ!DFzP4#pU|yStIg<<1i4isI^Y$eNtp${*>}*Jtk|k`bDk zjexsIB!Gk!B5vDgO*y*)QUtVj@pAd)SA|0HHWNZzIQD5Kw)*N3B3r^XHsFdCWLq1^ z9r4iB*@3j@QnC!9xrMsF2EXzI{l^dM#QmPrbS9B%!Rw6%VkrxDO(NwvFftlS^K(!& z%49NV-|s;9O9&e42$~yk+&qYTRz;BIhJ@vCm}whETMBJGpJQ%rPUVW;-d+?61!$C- z|N1}pZ`ZJ0sX)k32^>`s$e1qR+5$|sz@2^I@g!=s+OBs6wU>d!)_NJzY*LLFl8s#f z$%7zR)iu7~qDr$Eg>D_B+J?yI^O&BVMi_?Z>+8eX!gEwN=)c&2FcdigahFsC56b18 z{)Cl*W~RZ+b~J>BwvG-Q{3J_8z>DW^vHWZWNyK3ZAF(7ywNg_NJWw_G_0Q>obXvcF zmCS%^arkwC^8ZyVzIcP#(k7m*3eW;^99NQb uqRlHhcCDDCRR2iGJ~&UiEa~UOS}BvKVv~<%8J__f$l&Sf=d#Wzp$PzwLO|01 literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/bz2.png b/roles/mirror/base/files/static/icons/bz2.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7a26088bf724d5818f5884fd02d579222ad5c5 GIT binary patch literal 807 zcmV+?1K9kDP)WdK)YWFR&mMrC3kGB7bSATcpIH8naiHy|xAH83#JOQ-z+000McNliru z-2w&>HzH)7>rDUv010qNS#tmY9(Vu%9(V!Es{5nLi zh_Yv{->P1?boJ$Yxmd0HJyZ`lFr=r^2~l)y@&5C-RjLACzk2?lT&k=TSOSF+aSy-0 zzQvD7Fm|Lezg+P^Es8K6fbayr_F6bSa}+!Z&(qu2&bcLgze)YILSzUKd4xJX?;7w# zg3X;>cqD}1Xkn>3iS_LOCrUQ4c1F%n3gHETElG{4Kp0 z%}<-gqgHcol`b8dx?CulIsrIHR%IxAV@fZOZl&vloB4;&-rc`*@9`!TperHr^5Pj@ z;2-&KLy2|jXf0)l8N3MCm55p!}|FQYWX&`XLM2q;hZB* z2KsO#tr`dZ6wL+cX+X|(_igz!!wQrJ@|~OQ2&SRO0o9T_<|o8N4DM@ylXLslAU+6C zbQ#c#IGAl>APZr++!(+#85*r1t-!XNgxS%^$p>7{f(5G`!!QY4*M`kl+RP!qa!osm49A;%P9H#BcG46L$fN8XuksnZXc6HZ*;w(CW69*5o$oA71k#_wxQ-l{YuCNSD22G%QMo81<59o l$Ydf3q}NZni{*-bg+EWbV&g%mqp|=1002ovPDHLkV1kc6T`>Rv literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/c-lang.png b/roles/mirror/base/files/static/icons/c-lang.png new file mode 100644 index 0000000000000000000000000000000000000000..32e5e171c62ec12def9230775dc3aee85b219d14 GIT binary patch literal 551 zcmV+?0@(eDP) z_4W4l_V@Sq-{0Tz^78%t{qOSm%gf93^z`rV@ALEX>gww8@$ur~;_&eBm$&NC+49}! z_=&3LW|ZCO>FH{j-(is6)ZO!UqU4LS>VvE2 z#nA7WyX=Ur=#;qZ=jZ3<=H~3|?1!Ar>+9?9@%e_X=+oQt$=C3wzw3yh6E$bhoIwWmf(xA=$)?4e5dA)v+2df#f`J+rMv8;y6Sp}nk0KiE^K~xyiP0i_6!Y~kq;b}r` zOIrjK1zeCF1Q&K(K~PAVbngFhn6w`8{r5d5a{>U@vHmS{0;X6hOp^OlwDK&=3bQ5b z)f3Uk1?T>0fXv%u0A3njv(YnW_RySZC|2L{%g-|rG{ z$cl-P=->hx6#}NAmbP5myY~I>{qOhtLMa7Y{qE64eE#g}(xpY)TeQ8l?;Upi4EuP3 zj9qNwYy4OP^j-JLi)W5q`snr30AQZ_=_2*h-J^Uqwd^<9gC_@m_YruehOwSPa9@O%#PST ztn>RnbQXoQ3&2p_*N2(YI zkrMO}==(rnxsJAW59QQs0L07JZk*~;x_q%%{cN7dr3j%I4jC^oS!R20 zp-X8Kpw211iFbazd*AM1?Vu^zTr_Qvx?Y!ieJR$aQy;v2#^ddUoYEFRo!j>1ci(tn z{K@;T0)Sj-bCEg}zP!0%dBFa`LT=k_fI7GB{l`yczPWYR>anra$&%HTk?G3F@#Ue> zFdEg-dzaUZYPNRv<+lA7pzgcw+uL{UoxOeM-g%tFNu0n5OqYg(!P3&eWMyo1vh4Ri e9{q`*0R9JiiaRV3rbYDt0000_a{+`50q4SUaeFnN*x7+v1Wm=Cqii21yo|ONd76*EaVom}JY>pA z$<c37_`EhKqK zPo4v3+qV6b|17`>s!g~y*z=rK@16Ng-hb{qLY(L~LbrH(CR5lJ4s z_a0Ra$+m*=c1Au>(65*?X2v_ wIZwysR1=@wRSQ()xex!p)|s~=hra?008r=c;u%{t9smFU07*qoM6N<$g5lpS+W-In literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/copying.png b/roles/mirror/base/files/static/icons/copying.png new file mode 100644 index 0000000000000000000000000000000000000000..a61ec134324c862aeb41cd9e4c43bf9167af17f4 GIT binary patch literal 593 zcmV-X0jJ0s@#c!`CXF{bxYYha;0^sl*3zsYxr8L$P+o8Qk^bX_y6uO$+mqEuDxg*oODQ@>5{d3> z%Y%n&izW!2Ktl8WYT8;kw#MS0d7Mm9z-W3ssC{oit==*@lK=AauOVxX&{`0wYCJ0BF+rQ^(8%VfC9>e@!c3DZ+xyKq+pHF|AD4?5OC<+-aBuhBt8< z_kd|@oFFf(zh^hLr=wJY?nWdv_>nX+ODBr(>Pr)XP?}4WwkG!PtX#&Gk4`PEKYx3; zxe7Z6KY=bQ?)X4aV%Gw3;la+{XfsXu7ewZLxpZ=(HL@?V62zS2Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyb~ z5;`{%(6f2~00SaPL_t(I%LT!0XjOF_!13?@oc}%d?B2W0J-3`tTd-AvAd~1#ghtX6 z#3CBO=#?cuw}tz93(Heo>-SkW6qe2^}m2Ff_W2$bnoeHPN^L zwjhv@KF8APsd41_IgWnxHs{WNEm;X1t9;Thl6StiEQ`Onocwl`*zF^+WvU?*N~1Gj zJ=JLK^U9m2sdPCUd;b&#px3sLeFr|Ja56@RhFM&JC`g!pa*Ur=QtqE9p{34%U*o>1 zJv@4Rim1_M;pHP#iVzk)UXrev^KvN=Nkrte6RUFSyT7F^BGt!EOOT1AlFN-)WaQ!3 zB@~fMw=&uL)UzUX1LwkW%7c@_Xbm=6OB|lr#;);hrk*&8Erz*w<~YBvJ4`-(64Nuz z=>B*4_1X%Z;fDy-0M4D+DjRv33b3Q-=FfVK(XoE6e)%f4`VT*!o#*b`I$S>U3|<(r z^w~jn4eX$A{THg)7S8TH(_Hy$nKRemf`2=+@114efw!nd_cTF->gS-_`GlrI1BaU& zw}Lyi_o%`c`u&0=hRv`-mUhtzQ$&@(^)ObEqy~#7%`Ha2K?@LqfvZ>lBM)8b&6u_= zh^2`!h9C%NG#a#8O!2q*;rE)Yi%-4&1j0rHl=Sok%go&W#<07*qoM6N<$ Eg5@u(@Bjb+ literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/css.png b/roles/mirror/base/files/static/icons/css.png new file mode 100644 index 0000000000000000000000000000000000000000..af6513d7ebb75fde80364268503f62f9a6d9406b GIT binary patch literal 731 zcmV<10wn#3P)qFP4u8K)dNZ|Kw2n8P-zXYSg?v>lZGbP-S?g|vu$m?=p--mX5M_?%&bb-P=F#_Z>5U+tbo*ipHYK@tO%RHz*iNx|xGtzh2# z1d;cnKEoC^*se90SbPf-GkzE~8C=s+!FDX1V36Ch4KoXvizJ!2>0ljJq`(li1wYbB z3=;5h%!EgML)=@><5LhHUxH`-BWz!KaGb#}Z%wk@b;r-GI29lX^-JKMC#N|xWh3y3 z%U;;ku!Z|4aC>(nRMl_Ago-QBsRGN&B1x8+iHznjIX=G3zPZR(=(ym4z(5pi3|>H>zpEaG24~oITCi;fQ_0ll z^J`%yI)CpN1a3$9e)eV?mrOvC&Z~!=7HkFDncgGHwXqB~ZFcd8qzB34!vMY)A6dAs zt**m*#sXunyD1orjrr24j5B{c&b$G~sfv6#k|JMg?SY_{--U-y1Ip{&#}69}9gH#^ zbX_m}%9Ne@CSNENhR&1iTFEYu{IYByKFUJn>zV`&!}2~N&@_iAFM2USVlk1MufQn? zuux}nnr!kf%$p_4#ue05yQ_QqZ%n09s~$Z6T<1*sXACj4&gO3c1^^t&;&yX(^(p`W N002ovPDHLkV1g?9M6Lh; literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/csv.png b/roles/mirror/base/files/static/icons/csv.png new file mode 100644 index 0000000000000000000000000000000000000000..78fb37271593e45d02a639d2ae2db28ac07312d0 GIT binary patch literal 1072 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2>S zXAoxG@waFJkRe&(8c`CQpH@mmtT}V`<;yxP!S(UQAlP< zPAWrkahXC%YDI~&>m4Sbj08x=v9u&3zlg!DC^4@pvp73ZA-EtvuQ)X)Lt5P)s3sSr z#wE2lxhS)sBr`vcp|m))SivTvq@=(~Uq7v+K(90}Q#Z9JCowNQHBT=kRllG#Nx!J5 zDpkJ(D3lLo>SiYA=jj%wmO#aTPRvP6%1PBv%>|OV#rj351^GoKdc|ewb_xuKdL95R z76)1ET$Gv!vQ;4@GdGpNt2C!l!N|bCGPqlCfPS;4WSq$o3~ z6r@ErI0G0cjyajxsR~fnCWB2YOHIzt%?0`q6h`_vnaQa@?-uJPRq7Te>Kp4B=*Klj z?O|YGD)n@646*2)I@#AFBv7Jle(}4##!kr^mwOg3OA}e*wBv-3u%fu4(5}e~P?o&+voY$7*rXahAvGN-KxHOZ(P3LvV29=S<4>ke%r9^FSBCeq4)kS%7Xnn z%76Y#zbkN+{mY!z-8T+@-5qYo(|p#!!M6V5?G@QUx850<`-abo_`UDgiPeI)tZsW8 z5ngj{z0vde$+eYpr}c^bdH?6gW5b-=P8=(T$5h=#rBMf21x2ELOW6dE#Tshnl;(tI*+@7k}rZS(jH|CPxs6`7i@J#+q?b3)U z8YaaS*O%7I{Ao$cuyj>*RiCzO+7hNdIc-LTPsU!Jm72E{=O!3*+!nz}Y;X^!{Ojk(d06Y|b&(h=orPe1bS{h$4Rm`*W?-=Fj? Sd^s?AGkCiCxvXPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iON4 z7CIe#?h4WX000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0005#Nkl6Bl z9zpmEF2P-_m>$-g`|KPxVhk0@jDa5?JdTRRrOUlf5`%FbT!a(Y0&%Tfxi31B8QDem z$hN5p8C_*H&SD|ng`hK&*T9fF9Qb3T z#E765%?J_`!#&!EC{2CPkakv=5|8jO%;ChNSo^kHAFihI!bFJlFKhB}dQ3F>RDXS9 zWUgH}k0Knx>b(1BE4w@`u67K+D%(BLJx76pZsQmq;uLPAR$dSyFN>=kK~4H}8(z)3 njrHU(oF+M@xPn%U;tu=k&=G$`TcS zs}oKeQw5hqc3JyU>RmI_-LkhXmiBDspS9rd)5 literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/doc.png b/roles/mirror/base/files/static/icons/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..834cdfaf48a509ca51d93250fb28dd12e5ea0a13 GIT binary patch literal 777 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 literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/flac.png b/roles/mirror/base/files/static/icons/flac.png new file mode 100644 index 0000000000000000000000000000000000000000..7f4d9733be9b3c59d15ac287c49d0983287bcdbd GIT binary patch literal 910 zcmV;919AL`P)Cew|M%~|fZ6~4{rms-@8AD_{`~p>>({UUKY#uNi(kHc`M`ea|1;<+s55ZOvoI{XypCb#`NIsX3~UUXY#b1Is5hYM{{sXNh5tc5qZj}XKuo{@LUF-AARicV42BXq z42=I68H|NZ7z))28E(G6%`oBcGzR8>%-~ppc?TeXm|zUBW~d>5{{CT56;fsp=NDl( z|LH7)shR;ptzjv{zfXS{-hKZ7jABLxnAZUUhy~_!m;fgWC&TaGe}J|#G3fGZGaPw* zjN$QdP%@bhpn zaQ?f+z;KU~;q;T!48~H1V6VZ$3Q7Y65X1l=Vgv@x!AA!ezKUOAc*QTyaQV|4h94|% z82_GApily!pzLf$im9P@RRiigRQz1!zBL247={`VtD`K4TGY9 zDuaW81B0l5Aj6lRpBXqfIKUb?IXS@?n9-O30*K|@xpUtwEG#&H83kzaUj{A~4u)Wb zK(MzM82>Z;`1zgT{*w1dF$Tc82|tP07*qoM6N<$f;T&+K>z>% literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/flv.png b/roles/mirror/base/files/static/icons/flv.png new file mode 100644 index 0000000000000000000000000000000000000000..358f459be8f9a55d3c641f993513c94938fda61d GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ za0`Jjg0`COpXF=`z`$r znL2VGbmh}gakbKxKluIhZH||hX1MJZS;@CfVCSQr@Rm8&yEU&UKVSK=E~4&PdfB(; z#HYCyZ|p72-&fi%Y%Q92HC^D$4T;Sq-L3iB+arGT8hW2PxPYs1*8k;~B;>ao+_&Ty zgW$pH{*I96Q~rPLX6E~H{q=5+bD4Qp86H*^RDF$`C2*kcxVd4z<{c~d<59ajgIaH2 zTygD+?<6<24dJS1<|+p*?MQxPqT2h|Em>S6MEd9U;+CCS*KTR)ta)0w_u1hYrx+iZ ztd0F=(B?E%A$;kEX^$+P%-a9`x9R=J(_vp74%GQq#9VxN$mF!%waYq>w_acTW!_w^ zPeQJzJyJeNu#~uD(o_6v4xQO~llhEsc64oeYpABtZ`OkAED=hH`+oof Om%-E3&t;ucLK6U`zsMW_ literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/folder.png b/roles/mirror/base/files/static/icons/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..784e8fa48234f4f64b6922a6758f254ee0ca08ec GIT binary patch literal 537 zcmV+!0_OdRP)x(K@^6+>g^d@v4;gkbWsEoXE%32*i1tcpTNXd5CcIl)ECgqz|2rE6EW}s7R?kl za1q`0GCkMruC6-2LANtwVlsgzsp4?{@7$`KBv!G66>Vie3h?3OmEEkjwdLG0PgLVi z`!N((f$A@n17Ldj#`};0I3@iHJ5M{#IZz|UIYRm4(!uV7eYIYIwQf&}_2J~}>pQ^n z6o8--^T(=hkBNQ_k{-_GWE;FMW7!p}f{NG3nHZ{D5<3d8&tLh%a4AqqnjMkr3m&fkMdECD3N5}Unig5wy40;>lo4j~k+e}v)` zR6)J8Mk*u=SpB`p6o)7j?S0T@9?bz#m@l>gc*zk__|*!FMcHwP!gwLJvS~9c0px8E zWvL>4nJa0`PlBg3pY5H=O_WSH?YJUPPa|y4w92N*%G83Tdi|K|*dzyEUX*7@Qm!vlypK h{hQ7IR{PZ()?x++ChtE}nSk~%c)I$ztaD0e0sw%~P~HFl literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/go-lang.png b/roles/mirror/base/files/static/icons/go-lang.png new file mode 100644 index 0000000000000000000000000000000000000000..fe1d1e5164ad29bb310dffe6edecb50f65fbc7b7 GIT binary patch literal 543 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 literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/iso.png b/roles/mirror/base/files/static/icons/iso.png new file mode 100644 index 0000000000000000000000000000000000000000..ef4322357cbc34e0b5eeed34f9fdf553a1de2ee7 GIT binary patch literal 673 zcmV;S0$%-zP)fk+XBT$+GFLor|=G~7Z=&Bd_^zJLLP z{dbOmhNM(Q`mp7h`OloWYysF>=iU40Tf#?V356IC6~fPKul?5pw+W80zw#nVEgemD zincj})E^?AZGqXAKHDz@mch}3iwfqB3rPo#(gwa141DiTF(xO6U^eE%d{-hX0gf3o z8{W?(@4ZV6pRS)EXbxQZMi1!D!oC#YJOO&yAsn%9V=twmsxF*P_%ZxvD(XXc8T9DS zr0103x=g@fvEJ!1y5C7b$Hz+ryB7+I5>V>_sj5lWnV>%bWD?LRmBAb^h}fbg923Y3 zqK41OM-q_X|0W}n)p3}pGlwoCoNU0Ppf+VweFB8`9D=Abd!7lXx6+7Cma$90A4ue; zVKQTfc(bHa=}i!!qJ}b>M^UnvkNQWze=dVN?ZJ22Mf(14f#NRkt=PP(cyuKepkb#y3Gz>xmDvuMC zIuoRtGlX&@?9*%nGA0rvwq8W9jW)GLrXJl50KN-ci9ozQ$MNkH;k<IV|^+8goU4jB6C^%Mg5h>3Q7RCr>7r_DEKw7k44$|vUmJAm;${=2wBT`(Pek9N? z+*$Z3+nYyu(=ufrbdbTWW%|!LE6aD^rgi=em@XcV9q^{200000NkvXX Hu0mjf|3D;c literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/java.png b/roles/mirror/base/files/static/icons/java.png new file mode 100644 index 0000000000000000000000000000000000000000..c9255d75979bca128757cbffe7d386d98ce530a3 GIT binary patch literal 756 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zK-vS0-A-oPfdtD69Mgd`SU*F|v9*U87?@-|T^vI!PS2g>n=KqD(sq8X_007tYMqnI zvTkL}Qrot1EsK4?BJPV^V!C>N*qgfZ?)=vNB_7k!!Evcqx==YpT*x&hMbR+nvf5>{ z`Il4FjEmowhB{6@^dfTJ=TCd|_1P5;+&N-Ve5aS2N#n@lY-5}Lf7}I*B9o1~CawQz z$DQ=;cue?|qtAEVX}{``^0Q4N?ksahqwt;Jt5@0EK7Lu6nI{tZbz^J5ULFIUCu@r5 zd{LRYDt6kEJ8njiQ35TU^;#1dHoV`KTgI8`(Q>9$(5R33L7{iM;UVQGCnThoJvZGX zabJJuyKaYu6%$Pl{d)N`clUp`oy=>GM%;XAvHMl!(gG!6UtN*+3{KX4S7rJbdTxGh zeRS)Ww%6Z-oiB~ke_ja^5?U^HyXw}VF1?bhcgEfWbZ<=Ktdfl?bxOJ-gU%$t(YxjJu)Nu$Bez^0{sa=aypD{W- zFj!W$KJwsnl%PP%GlzVi8-QxkveoS-3nq}-Z$b!gg=_d$XE;-Od+CLFbJqYFxWct@&XhMx%nxXX_Y_?24=b-Jzxz6CRQdE Zx(22|4XeLh-wV{h;OXk;vd$@?2>|#xM`Hj0 literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/javascript.png b/roles/mirror/base/files/static/icons/javascript.png new file mode 100644 index 0000000000000000000000000000000000000000..a0f57be3ffe9b71af3cc1e01d7894887e62ad509 GIT binary patch literal 606 zcmV-k0-^nhP);2@?b!MC;bUIm_HzU(csmh2DM^p!C38f zKW2C8?9{DM$FB!on0aTO_kHG>8L8cFV;rVwo>x`%fv)QqjYj?^0|byH>1_}MRrM$G zB~8=r*Xwok`+d}EwaIe1{0lir5_CG91L;`J8d#Qfg>}8xXf#kNmGC#DyfoBr>T z<7C^m@ju`S*jZOu0qVN0%*K4daU6)`3l*e@qKGz|O<7SCK7V}S6<#lYL}lI5RDC>-DDo^$)Q9qr(S}?)fUf01(X&iw0nu*#H0l07*qoM6N<$g6rxM`2YX_ literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/jpg.png b/roles/mirror/base/files/static/icons/jpg.png new file mode 100644 index 0000000000000000000000000000000000000000..5c6abb8aded9470da1dc77ad98299df5289fb765 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!PKj$oiE~kEVo7FxowgHgeZxCM%)W=@p>FdgVk&Q>hgr{=yY$u=) zXMsm#F#`j)5C}6~x?A@LD9DoT=;GwuP#i2Lq*T&B{P#YPlFak=0u zp9^CNigx0k2Q0uh!})f078{U65Cj151wbD_i2o}A@Rwu-03hiT!=fm*Wm!5A;Y+J1 z3XaF)D*z_|6v+d?d0Cb&%QEiw`+9A+TW&TRuGedd2v@5WCzDAHX|{GQA~eR(T1#UL zjWOKqc1+WhNs>@RnCCgOEMpwUR{&0e7U0%7R|l%90!fGnthMO%dI!S@!|?mFfhnc@ zP@$B9a}HW-bUGcRX^N_(t@VNTz&dso#lHaj1aN_OX!v!2KevmS z^2PHws+03LLff}<%lij>`rI3;_RjM-!sv2}(dG2OHzD4K-Q%HZx7PmoHK~_^?}3B> ze$V6RqS>;CG-2L1B{pAv_!hpM4sdg~m<5g3II`AWYpsv|b+m>m=Um?Hc7Ft|=R9~r daeV>+$srfjZ0005-NklF~f+w3+kpD3xpy{3ThD+-H2C- zjwIMB@nzXqo6d9G&N=@sih&e^=(6YT13#XN9}oOvl+8QqJF0wMr2O;2%P0LEMGL-6 zC1p*h7bzt!*LsrQk~o|Wv_&0<(?LAar4%h_z0f7cCqCn^^73gqMWAsvgOL#e2djy^ z8$-{`b`~v|h)qk6yOaZ``pD+hzy5)!4fQZNl|ULg($L9i3uMwMv}^`Uo$P#?^!F4C z^XcC#4IP`)xdK%PFmh;%7X3HRu(i^SX-W1pcN2Zy&CFaHRS5PS@8M(QdcpNAy$Ca} z0}{hnqPb}o`CN|LP$%)p1Q$;>Vw#fH_B&JuuTZn2e3|Vw3!9nKKuV;sM45Xns(?$U zn|MDSV=ywz*oQa|`p%*2dG;T>Oxv}41vi|yiZJsUQd+FCTf7!r1ACX*SH2EqqyMN3AFgAYuYyO<-m3{Z|Jhwlr6escgfO-?OQW_nC`_aSHcfbSbPUnOvVM4s~AzfcCAv zD}xq#xU^~jz*yK6S;7<{LAn6|0_R_prZZahB}qqG%M0^b%L{YA+3YNV4LI{8OizQU z2!W=spDU6+K?W3f7yvkTt&WQXo@`%m*a>uQE7&pmLA1fcf(VL~&k&NdlmsaW03d{I zIBQ4#P@h@Y_;jkX7naSWBnU|`6scaR6hv~^4**soeoJeGIj1^zI|2Jgv_6&5=YrE= z9{`B>kY6eVMf8RNfWN*&OO43Osvh0|17Val*~id~dLA69BxbE?yK%$XX)GCL&KPA@@3AZ?J8vo9X<7MD3WL z=sVW>)x*uKp`e|tv9>?g+k#9o0pTxd@;_sq{kwlU;^VvV*?BV8P@}BoaZTQUROpWV6|-M`|^n&)=+8tHo3*<<$NU zU`%V~ZF;?hBSYsjJ6%JzV}E(D{pOLqQklliUf9um_tGl-wty`y*p?eYNW56P>X@1s zZs7KrRZKtmV7Lqj^5Fgr7_`LjhdJK@ltF&O`j7?*NUM$KvmNGz)3WjM?V$vHlPT0AFyF?kLE<#HZabCSW3-oa*6;Z zrXD`Ulwd<^2glP%1Y1Kc1Ij%DU^=ME(jKf6APNlA$Uu;J4bVilQHSWX5uJ$9Zsp4M z0%!@LvyTxz=Z6stxlichODIY+yNGt%RM;m`>H4LOKLFs9Y%b5aUN|2|{0Zw|<_~i} fmXz*V19AKYaD7YWqkl*Ir50)a_H zK~y-)ZIDY#lwlOd|Iah;%sUs+Ni0*-Or%VWE=1uff)>$M2>K8~Q3&m#O&KkURz~C^ zh!!pS3_&N=K!jr^LTvuD?`2L}xEBi+F zja65x7XVz}5>PCZMxlTYAKyQnxIA&Mp>_ZEom<1Z_w-$CE4L0c?&!vZES0p*AXp3L zH)|6n@q9j)hgM#(vHt&pna4O1*l&Zzr0DQpoq6`KrQH|-8G&(xZ}nHleSaJ48DDU?d9)KT0uiYX@#X~AAY-YaHfK;(oAsp)Z4ZV z7nHZ1O#1iksq2g>Id@ix7&tKyNgfUH9rJ6ICk1jyw) zTPQfn`Ob+bFexwr%m8N{$U2ZG5D{cFqzMq!S9Px7Yipq#N3f;}GRq*l25Z;A6oYJv zB+)QwhiU>iJ6H47N;aR}Q5Kcx3}Uc~L0*Ea7lY_;%))R|Kuen*6dO)`^Lc^lQdv1gN+G0000{dYl literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/lock3.png b/roles/mirror/base/files/static/icons/lock3.png new file mode 100644 index 0000000000000000000000000000000000000000..88a445f14797181e5c0ff898563641d44ffe6fc0 GIT binary patch literal 496 zcmVzPKmSRMb~i_(-?(wt@Lo>c$npO%=I#9trA#>Uy& z+W)sv-GV~@y;lFtXmN3I%F4=XYis|xRMMhw({()mu}yMxbpN0{$!RtJzFE6ZtH?DiHV8tiZa`OLeY&)|Hfed z$!7oav;X0b|JHo}`@{dkT>t8%|FBA;J`0+hoc^XlL30^b00001bW%=J06^y0W&i*H z0b)x>L;#2d9Y_EG010qNS#tmY3ljhU3ljkVnw%H_000McNliru-vfk5ON6pf$p?3(n$~L7t&b|uE)UbfSaGjauCSl?VMv^zLG+E@@joC zOa@166}Ri1&+HD$DS!l^0{A6^5ChZz8Nf7TkVn`*+dKPVK+Yf@MA)zr%fM00U|Ai6 mp`r|hL$zcePTpM;5up!wxDp0*}aIAgut#{9f$KfJQTTx;TbtoG-n&U;9X*#DR~~cT2m3FOudt zzGz8~*vzFWY|5%fPP`GTZ#b#3)Q9I^)9Dl?&E|(X)AKAkOP*iqJbe6v=>6Th&Tp>0 z_x}0IpN_lDU&r07v7Ylqg(GX_{eHXbWxSqRr*4N|x-u-DgIYqvZwmkM#)%mq&iT$RfQhYQ6cJ2jz>;^Y#8~mS2)xKI2dePb)A`R7+eV zN>UO_QmvAUQh^kMk%6I+uA!l>p;3sTnU#r!m65Twfq|8Q0eACd9~2F_`6-!cmAExj z-OK&})ZhlPp*TOSq&%@GmBBMNF+J5cF+DRmTft1vT+dwBOaW}Afw``sr9z;gnLpLgRSFv&28BbftL6P}q;k^xfURI*7Fs6-M;iEn0Z zYDr~5Dg)S6`o(4G``;J%p_$_w0#wCdXl!a^Zfs#`U_4Jx_cBn4Fp@dJnN>g)dX}c% zPELO7g+2kLQ;?)XgFG41GILUaL7*R6oLW?@pO{mn?~+=Unv-9UTBM(zS)yN%nOu^e zmzk`eSX`W1QVeoSvA(IHsbQ)?vW1DIQL3q-fpM~drCDN{g+(GzIK@0UMGvT|{S>!3 P&^`uFS3j3^P6_G$Pd)0ltf5e&YhnWvk7c>zU^S{oO8Z2>f++!XYc(R zrPPa;-~2_e(mK0l zw@jx~ep^kbn+k19bXk1y7qWt3x96u{9(j0pplKRR2;oCjRo`o^nH|=-1GPol5@p5= zM)_fIR7N3kM^#m%ls=dkQ5Dzy9%rwjNy?bXk6(V5H<6&N)&_AGOx6{{@fk VbEjPP6gB_=002ovPDHLkV1im-P$mEX literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/mobi.png b/roles/mirror/base/files/static/icons/mobi.png new file mode 100644 index 0000000000000000000000000000000000000000..a8265acdf7bb658060d9c3e17fabc1b047e31dc3 GIT binary patch literal 784 zcmV+r1MmEaP)h)EznMQX{|zG|lx1XOWWy0639raJV6cSes1J-RM9+1z z3dl)N*2L&2S(f!refHuh#UI3}9K$!iXw#MgDq=AcB#@4l3MM+bIuMHwyI{^3Ls|bO z9`eDq3Sc&n)^sEiPedj{EEXe<{}d0C!8ymp^B1rX*@N-mUh#Yptfl8}yTti*&e`EV zgPa~qmZKJooDSRLhh^KaizfVaVe}nugd~E8>mzjyU=k!*fn^rpRe~l%SXEb$O8&skaIH{^ik*)y}6&N5#YzuguzBkBLnX+63XAXjP$mI;Ynw-Jh*bVV*SuFpYbTRMaS26Wv5yg^KNx+(- z{mHPTM^w8OzEZ}Wyv}N1>c7ysQ^EAy3Y6UkQD2x7T#>M}W}qghAWKyU)P&&)Hy`_y z&K6GERwU8ZTO@K2hWLZWi6oR5CE?dPuh!%6uG!1=U`Nj+!F$F=K798NNpaeV6=-QGbxo7z< z5D2)5Pfa`$+qr3h1_uX;Y_VmG+|roXHJdpb=XeBL{1#(;6H{&c7GMD8T5Z77qS+20Y;J&(8~Qt%^zgbpPOQ6a$RQ9xPzt5P)e0TKMnG z_cynW0$B{4B5Ky`Y|JK>s;rEs@BU`^{Q2|3Go7*ta066B7x@Zl`fY-0{`BF_?wFg) zLg7x8vMCZY39LWuuE(bI{KG%S-IsqeyuZEE59A%N0cJIC4>K|`+kkBTaA&Xo&1J!G z%_4dcf=Yf8KxH!eA5X9yZ z*J0F2J9G*d8zw-5?>yPx;`HoD?_=GJngt*=kM`6Xp&Ic1{)CH@4Z#NR$e6Qe zC+)lk)cpO?o?7P@$EQ32iR)&b=;spEKo}sT>Cdkkx)7@u_!R6o{{Q>^_w%FUzhPo# zweLW#0(;@k`ZOVEAieL9qvn=EJ9&h3vov zs07dR71j=dM}2 Y0f3niSW|BLng9R*07*qoM6N<$f_Z>TJ^%m! literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/mp3.png b/roles/mirror/base/files/static/icons/mp3.png new file mode 100644 index 0000000000000000000000000000000000000000..2e90119c67eb7666653396feb3d5014c7a35ecdd GIT binary patch literal 991 zcmV<510ei~P);bT5C^VkKc-B2^YS}@8W&)JkQnp5Ike# z^5i6iA}ej<#^eNNNWw}Bjz1UV5|ymqr}ns=>cm7k_rXJNq5qCHOx7DqckbG~uk!eZ z+w-^W$Wch-y#^bxxg!yqJ0x@mqF`wm_)-C8C#NuHGBYsNhMok_NFYbQsQ3_&!A&BO-N(8w-KH;xdMQmMW=b>6rr^e4_aLvYh- ztWM_QWj8_HO+Csrso0{BA$OAiS*Zeug*4tiV*vmD#S`~_yL5pZd;d^<`!^q)wtDAa z7e!#Eedu;(B5!PK^z!vb7;bnz9EuTMnmmPyQWOG#AYN@4!`TYTqCHqqL|R)LdTTzd z+V5DLfgs`mPqvI(?giwh99wv$(Z{b$`Mv9{H}~!Fvs|uJB%(G+2==u9g8`iqHJ{g3 zldsOT-TbIp`2keL;iYvoQxLhd>cTY#jbeN)5 z#Tv}mIT-rKai`6K+t+7*B|MrIcKmSBpndPK#utpDqwjBcvobN`;4pe?0<$fd7#^k2 zF}#95WLptZ2#|Jf9J)_z@C=x0*ZzP~snqXY>ACjpHccL{s(A{1)Kg*h*c6OswqR<) z4}*h;`^zq@KK3G~EE!&#es#RLrSM5W9CdN=_K%xRw`c>>Ji2et0#_h{1LYY|X9(dk zKSGd`AhKDG`2-Gb_dF)g)t%_?{prI0T}X0zO~Jf#X;<=#B60IN|l;{{R9{gs&fvjF$ia N002ovPDHLkV1ffD*Jc0! literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/mp4.png b/roles/mirror/base/files/static/icons/mp4.png new file mode 100644 index 0000000000000000000000000000000000000000..f13c8e0220f822bb007f875b49e9b4684950336c GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X_ItWGhE&{2`t$$4eY1bXGh;TR1JkBnUMk_hR?(hn(|l3? ze%-Hre&yAy7j+CSPl)~a?=SlrGcGQ!gcYeyg?u7^{(k4zKDJEkFsnlP-=CkwS93cQ zx$Jy!{{H?5!$3U-#!Sz`Jq!ESOk=$nGQp)N>}PS(BK|avHtuIWZzmjCZmGKak>x)F z2DU4AfAeolV#`nv;%VMr|6fR!Eh72h_4W1hOV8@32JNEBCu>Zh;1LseiKY!u;1t7R_ z;r@;L_aEGU00b|9=>2;j`tbe(2z~hQ1Bm|r|M7q3Ilp+IJ&Ywme!&b5&u*jvIh+L^ zk;M!Q+`=Ht$S`Y;1W=H@#M9T6{XRP@BPT1D25%=&sKL|4F+}2W=(&qxO$s~>iDs8t zI0U_WHLiTGKT$TL=*9lq+hct=6up}!|DHJc|At+jVh%@48ABbrP8aKJ$k*Jrtk9y7 zZ$esr_6)|VVyCVS{`=Ck3=R%o7@`c9_|Fi$8@pQjuz7-CsqW$G#22^P8s((k^nN?r j+9f{1elx5D}|*k0V@R8jFQH#(6b-gy)(0 zsVTCBr#MCar=AvPEASDI@t`%?cYGUK_df2m{4*R*;4|)2fioPSk3nXBt@Y;6!wWnq z>`8I;@UBR+nW<6C-Vo~-r`O5M0j6*l8?9?U!!CBqZe*jdQ<*uKsNfg8#mk6zjazt# zmCC<~h;>}z0{f0MGfh0&pD7|b*sLyH{H)Y%{J=gwWaibir#wm`VzTb^>qgAD-}yJ`Pr=G<`q)VT O0000C#5QQ<|d}62BjvZR2H60wE-%6;pyTSA|c6o&@eC9QG)Hj&ExYL zO&oVL^)+cM^qd@ApywS>pwx0H@RDN}hq;7mU-SKczYQ-hnrr=;iDAQMZQ+*g=YOM= z!QlMQEn7FbaD->uKAYgo_j9)W&$$zS*W9}m(ey0q$&7l-XEWO0Y(9M=SnhLbwy;d>@~SY$Ku*0xPvIOQeV1x7u_z-2-X>_74(yfh7C znXL|3GZ+d2`3re2hs?MK_I`%CnxUp|NQ;`^!Wec?*Gu^|LOAo`1}9M;Q#mf|KKt**eWZEny%yS z|LF1m#ohnh>;L)t|JLUJ^Z5Vso}cfXqv*!U^Ny42>-6-nwC<^?-Rl47>-F<)aqipS zqp-x$J58_K z6zF~PSdUgamH@5R>PKfWVp0*}aIAgut#{9f$KfJSq9x;TbtoX@?uU;9X*%<+%y#YQp97xP$& zsip2(a^mXDzrv@oCL2ZMxGnu7F+)eCyCr3UrNB8pGe#gSD@Y+{^<+JF5^7Re; zcaH^5(YU{G(Sr-Up3Beed3@5GKsFTTr6z=9>zXNmtu!## zHMCR+G&EDlC@Cqh($_C9FW1WisRm-8YQ6lT^i3bw`+z1&fJ_X@D9uf>vU15!F3nBN zE3vW)04gnJFkJqBw?3L0u$@*`8L64+86^xxM&|QwJOm~l25}^FplZT1Q%W*GN}NhI zi2{{KA}R6B%uOw+EJ$SlyGp;fEPem`0zWi!d_#b$7z~X~jm(WLEDbHwAAIcrDiK05 zCpfbzmBCcc)Z5AFm*7=vplk|~Y-o@tLt17|Dli1}LyJ?3iuDt7s`On_%Tjal3sQ^p z(=$u-3o?^S^7As2^%IMWQ%j0LPAS$mH8eF$HAuEFu{26GH8e0zHn22HOtY{^G&M}K aFiK3*1FE|Dk7qm3J_b)$KbLh*2~7aGH$`>; literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/php.png b/roles/mirror/base/files/static/icons/php.png new file mode 100644 index 0000000000000000000000000000000000000000..d66010f4ca85e106b1984304628aa59a29ce7ed0 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlt*SqRha=;mn}WkPvksM}Qls`hqS4hXM~{1H+*L2?vHm3t5E* f0~>aTPBw;FR~VH}?OK)qw35No)z4*}Q$iB}36MpF literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/png.png b/roles/mirror/base/files/static/icons/png.png new file mode 100644 index 0000000000000000000000000000000000000000..22f1e3c84359323f447f9ce958b1da80a42602e3 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bO)b$qcKBEe1H-@n|A1n} zE6=6^DaMi@zhDN3XE)M-9L@rd$YKTtZeb8+WSBKa0w~B{;_2(kexIFi#}JO|zC8y885B8~KW|{jX3$m$d2pfLx4rA!+idkl23;`*DdG3wi(2|L3{s5^ yG?yI`F+BBhsJ1P?}qQiYuK zq{Wlyts*5RiXKwinkY&s*3_u|p>5ctX|kK$x6ZuX#0CT%_A#@w-}lYD+4mI3aljUP zHyQuAupGvJSew5&apvUF9*(tYlF7%89Kx>F<~p!K%h~k)m)G$x0Fd(htIC$a;Z!0ef13sDo2BJ5d&{Fk{b zUZiHj8duXBcHre#9hu~~1nvy=z~CyDz~WSl2m+0rr;$s=Wp(U71>d%idRtW))Z;dT%lo}##dJPG8|ai|v}Fh&Pl0^7`6*KZ!wAK zi$F<-*45FH82|J=Y^<)(pRnNw=MR{k8p)~V9q*gK*-#*%RPVy0r(;fccNgUyG-xWc zEhPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOD~ z5jY_RGbdgE00K8jL_t(I%Vm>KNL4`;hrfH@vv+$Uln|xSCTLTOHmzE;5FTwpDtJ)a zz)exE-2_34AR^i+ZCXeh7m*-F5k*FrmbSHs%rX_!{PXUec{69`w(#D(>Vd<+%=bIz zH_V)XUD5sE?K5ebbKaSDu}#Dnq^Y!3`tis9>wSO*T+WBP3wS3NNBU~*PAtw^yjZ+< zQ5yK0z%d{y@_Pz6YdL>s7$6Y^hI$}5GUX?Ns>+iCUiRP z7h|*&%kQa?wQA%pYzqpaf*4?WM!x_ygY0K@07rplx^QhGhnE)r4wbx0x11<&3V?63 z=F8ch)p6iQ88E;iumPmSZif%JIwIgKh$T3)*ab8ImGLVf;IoYtVAb11Z&@wm>96=S z)!B&hojbAPoik&f)Lp;=N!HK;X~5oyfJ49$pbcorTyADv dm$H!t;2#0MumAjv0Ga>*002ovPDHLkV1gIiH5UK? literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/rar.png b/roles/mirror/base/files/static/icons/rar.png new file mode 100644 index 0000000000000000000000000000000000000000..3e956257e12fdfe0383542d5af6fd09b6879fdde GIT binary patch literal 497 zcmV=(LXh$__c*_dI0{~PIeh2b`<`?non- zM1h*lF%#q3+$>t$k5U-e?RGUffFzAUj&EF7dGQ0De1(C?`rTn@nS;9_xHb)SL8y5J zQsPQyAf9K+z(iH;Fmmy6RF4pMAgaE^6v+&vszVvb`TEQ<6C65&tk#|XU~=<2UBBOP z``0X2e!k|?`UGWbV>nhvIkEf@`O?er(x{2)9A|K=f?zOG==35Tp55iI)kg6tl1-$( nOc@kZXI6ZI*l{|Y2WIde)<)-$_c-`u00000NkvXXu0mjfTp8sA literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/readme.png b/roles/mirror/base/files/static/icons/readme.png new file mode 100644 index 0000000000000000000000000000000000000000..84f9b30d391910e8f1ea25acf90d1752653c261e GIT binary patch literal 423 zcmV;Y0a*TtP)fy1~ud*;l#L)CQ+-(V7k z;kt>&$b3)Jv}NzjX0xfwvK&RsZMa6)E$RFH4m3@}?RF!)UaxSuT;O~@!|8N_BuNMn z^Z6XoG&OwRUw18_0D__@I2;b}dM3CQ1c5wbAw^MOzuz0K>%wZaT2Asj?~4U>F7@NrK&OXE=@nod7zBKCkSU R8NmPm002ovPDHLkV1nBhyk7tS literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/reg.png b/roles/mirror/base/files/static/icons/reg.png new file mode 100644 index 0000000000000000000000000000000000000000..156afcd4d15c086694ff90292142c326aaec04be GIT binary patch literal 233 zcmV64KZYDf~Kwm)?DvuG8N6x|^JW(ETwcRU|;PwK>>{I({C z2^Ii{I6jRca+oAFx18I@lBUjG1vp!%>pvu*Z{ew(^VhwhQH(|!fKoLy0LJPTW5#U~ jODR)Ps@{rvax^Y!@l^YHWY^!D@f@$>cV^zifX@c8iR@ACEZ@$c~P@$T{T?(y~Z?&+S35=<4R>=IiX`;^5}$-RJM)=HTY!-Ra`p=;Pem-1)6BKh>&MH>&&tNZ$<4IK+RDVh$;83J z!pOhE!@$DBy~4k_y~Cfw+NZ$RwY|fdzuvXF!;Ze-x3;;iwY`VE=&H8ErM1e3yy2~~ zww1QljknaLvcRXUvXQaRf3@F^tHy<@&WNbVgQ(ALs@#XA!-A#9i>0}ip|g~sv45n> zi=w=fo~whNw0EGxi<_!{nz)OWqlT5Ncb2nQo6}jF&wrAnc9gJtlB;);s!^EEd5xfM zkF0r&pL>j=e2kt`l*Lt&!f=hHX^yaGimG0TwO5R}T#33ljLmX_l{<>bKZ(X(fudZ0 zrBi{fR)48ff2>S_v`>GwVSJ%Sg0oV5sYQOaUw4=|eYh}sw>x*OGI+KzcehV(jwW`r zL2#fla<)=zhe2+aCv&ztYndZ(wMS=*AZ@QFY^gG5mn~(cGh~!UUxh7XmLFxL8)Tp| zT#6oFp)y*E9!`8FMRE~5dKNo#04-zyBv!2>qg?<100DGTPE!Ct=GbNc0004EOGiWi zhy@);00009a7bBm000XU000XU0RWnu7ytkO2XskIMF-yp1{DYzm!Xw^0002bNklho literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/rpm.png b/roles/mirror/base/files/static/icons/rpm.png new file mode 100644 index 0000000000000000000000000000000000000000..64699ac0c7120a604b6483d9ad619b7b5c55c2c3 GIT binary patch literal 660 zcmV;F0&D$=P)K~y-6m61P4TTv9oe|f#{CLzTKP5p;fBGOT(PPUtAJ2>bN z3hkEBRqEv6ltqMgNmt2|cCd5{S^E$&1QlMK5(q+Yu)LvANa%a_<#Z@{G+Imj;BXI| zd%o{G=OmiV=5u4r!EiWS;SR7Y%Tr3dO}MV><#M^@>FH@K%lfb8;c&>+)fE>P7cCV8 z!E!d6B?yAM7$BR?(r&kxRTM=;Q8ZTUcDuN)OTXV|NJRhlk|zd4QNW zl}eF%`GTMKGkhz&;=%iOB%eJc3`49aiVzXDwzf#8)2ywnAtHYby}HW1xjBB6KOiFG zBUGzZ=I7^Q)!Xp!%V%UTKtz6zFe2F7+XG;Gdz=0JeR8=R>+9>x%*;?Km6)BK04FWU}Kp&dx7k_+PkE38Rt#0000{XE)7O>#K06z$x+tfL z@MoZqi>HfY2*>s0goFfUMm7bH5*8+QHa0Os0|p}&#{)bw6{Uc{Bf=#@P%CK(hoE3s sOP7SEqhwc8LYpB6gCtL;!UP6}^J@HurDD_!f#xxIy85}Sb4q9e09>gv1^@s6 literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/ruby.png b/roles/mirror/base/files/static/icons/ruby.png new file mode 100644 index 0000000000000000000000000000000000000000..f07f59ae7126020b70d6ba94ebf2b552f499473e GIT binary patch literal 925 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 JPDHLkV1jp6kD~wp literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/tar.png b/roles/mirror/base/files/static/icons/tar.png new file mode 100644 index 0000000000000000000000000000000000000000..3c16e8ce957d7171d80db911e5d6463b64b4fed1 GIT binary patch literal 288 zcmV+*0pI?KP)jJpJKwE(;jn$>wSwuohwi(G?7xiNsdn(hk@Luv|J|zQvw*vZRhwuvw1G~lcSOXH zTK4JPvV2IOfnw#qneg!N=;-L;t#;I)Z28ik?9;i+mtw9PUv>Zh0D(zFK~xx(WsgY? z!ypg@!C@z!Fy3v<|G$}@i-qLkP*74IQ0mPVWBdVVllL6G_Y$BuBitu$%sfEnEekV_ zV=09pBb)0Buy5i^Ld`i7QGu$2R#QsE#87P#atMKOK$b8i_mCzD&OSH^WX*#mgyqw* mD5ck-W7TRubjPv3{{9E^lL$48lZo*F0000fln&o?pdHemhcXVe2JbiikP?ns}--{Pc&lYZp(&pZMwrVHGVTY^29r=@6 tFMr%{-z~7E-u%UP!`S^>8Qa{>$lsED@KX0&x;)US44$rjF6*2UngDaJW1Rp1 literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/tgz.png b/roles/mirror/base/files/static/icons/tgz.png new file mode 100644 index 0000000000000000000000000000000000000000..da3c2a2d74bab159ba0f65d7db601768258afcb2 GIT binary patch literal 853 zcmV-b1FHOqP)5TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwesYV1_!F=3OaRVHl(>=`%&{x*s30c}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOEuYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/txt.png b/roles/mirror/base/files/static/icons/txt.png new file mode 100644 index 0000000000000000000000000000000000000000..0f20740fae1845b466131d2766e73e9ae914fa63 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UASkfJR9T^zbpD<_bdI{t+l?3?( zGyIR9sI(QxoA2r37$R{w^xQ$NCI^9r#QXmhpIuX3#9`AC;?d|CD7#5%QT9ZU)LrlL zj19KFTK0GQ-x-qE64|6@%doYEELp&GrbXc7V=r-y#wF8?YL87x4`}*kyZw6JOjC^q z)yz{p@;>fln&o?pdHemhcXVe2JbiikP?ns}--{Pc&lYZp(&pZMwrVHGVTY^29r=@6 tFMr%{-z~7E-u%UP!`S^>8Qa{>$lsED@KX0&x;)US44$rjF6*2UngDaJW1Rp1 literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/wav.png b/roles/mirror/base/files/static/icons/wav.png new file mode 100644 index 0000000000000000000000000000000000000000..eb33f79cd4dcfe7076376a681f0edb4880650558 GIT binary patch literal 364 zcmV-y0h9iTP)FM$D@$BsE@bK{R^78BJ>+0(2;^N|=p`idq zwUw2Xot>Szxw!#x&<|n5AZf%gebTnJw$07WK8xBVZ_5l+ys)saexTFH-0tM-@x036 zN}1uSzT1PQ)n1s{mbKkkkktrx(?W#Mr^o1muHZ3o#lzC%iIHyS0001&NklvsEHo6^#hqNKxrN0geBSD&ymX5;VV@@I+g-alp#L-bW39=%)YKTr@NHC1O$40SN zT|35@0mJ!tuO07QbK;yE&_!{^F1|EqG0O-I(u>uP@DhZCj1(U|6b**rmPQT$0000< KMNUMnLSTYwFS-T* literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/xml.png b/roles/mirror/base/files/static/icons/xml.png new file mode 100644 index 0000000000000000000000000000000000000000..4480a63854677d93de8205f305b1d96a26519e92 GIT binary patch literal 400 zcmV;B0dM|^P) zGPAQgZzeN4iX@a$0B{AM3!sJ5hyc8iEC2u`%ZovlW!pT@y@>ET$+C>o>GT0WAAlx# zL@>Hq9{NTA_C_ef*?3*Myu7j`O+}0b=g#Ct>L|gF$V2+ z8*v00004f25XXP--Ni(a7>THr3bqQ`308gwJ2_1uXv%<<`VAB;L^N0=8f>ipyOca&{z~D~MU^4?|x7@c7D!*=HNuucOGNe;hbpAXz7@Z}sTx>;rIS{^;5J z@4s(St*N$yKo;FWck%LA@43kJwa??{gAsfIGD-Lkk3*!fu3v%N_{7w7JyRd`Usjv82X?9e1VG@pM^iGH&uX3f=hz0t}+R51uhCM8RiyVses*;TV;(3 z@S#jb;m2}EcMzp?sR4W_M{r3vcV|rne0$L;AwhLeAjW{PY(3X^fVGG*cn#1W2EP2< zqwf00000NkvXXu0mjf Dxn9+^ literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/icons/zip.png b/roles/mirror/base/files/static/icons/zip.png new file mode 100644 index 0000000000000000000000000000000000000000..91dfd0d8f67d12316c4b3f00e8d89ae82cc7ee88 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}U4T!BE0Asg;|4I*0OU0^8~}nl z2bP`sz+kylCT_1~%eBpo(mPre_V=hCouqquhVhx1CYKjj-&yJMY_s3{J>fr&Cj38> z{{Kq;{|D7`4!xdx=Kud^jsIV_{{KGl|NohXAN)V|=>MrF|Ia@AfAPittFQjwc=P|> z`~Uy{f6rbSwGC)HV@Z%-FoVOh8)-leXMsm#F#`j)FbFd;%$g$s6l5>)^mS#w&(6lm zsLegQw+1Lw@9E+gB5~RG+-;#l3OueCZQ57#eivJFqx%1Uc3T07SpO9N8JvO7j#lgu z_1IQAb9rIGyb^ZNbBB&CslC!w;re3M-8~z2C~SG2As3kHR`Kfg9l>QHv+msyI40sZ zcc&7Mrc89P;}3(258a)(W@=C0q<_%bdh5BFEdS36Rd-3CQy4s5 L{an^LB{Ts5%Uz}o literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/index.html b/roles/mirror/base/files/static/index.html new file mode 100644 index 0000000..e69de29 diff --git a/roles/mirror/base/files/static/logo.png b/roles/mirror/base/files/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b38372c0e2407846ebe45ebe91f57b545d7f2a24 GIT binary patch literal 5705 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 literal 0 HcmV?d00001 diff --git a/roles/mirror/base/files/static/mirror.css b/roles/mirror/base/files/static/mirror.css new file mode 100644 index 0000000..ad73357 --- /dev/null +++ b/roles/mirror/base/files/static/mirror.css @@ -0,0 +1,84 @@ + +body { + margin: 0; + font-family: Arial,sans-serif; + color: #172B4D; + position: absolute; + left: 0px; + right: 0px; + background: #f2f2f2; +} + +#navbar { + padding-top: 15px; + background-color: #000; +} + +.mirrorlist-button { + background-color: #000; + color: #fff; + padding: 16px; + font-size: 16px; + border: none; + cursor: pointer; +} +.mirrorlist { + position: absolute; + top: 10px; + right: 100px; + display: inline-block; + float: right; +} +.mirrorlist-content { + display: none; + position: absolute; + background-color: #f9f9f9; + min-width: 160px; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + padding: 12px 16px; + z-index: 1; +} +.mirrorlist-content a { + display: block; + padding: 10px 10px; +} +.mirrorlist:hover .mirrorlist-content { + display: block; +} + +.hide { + display: none; +} + +// directory listings +#content { + margin: 50px; +} + +h1 { + font-size: 20px; + padding: 0px 50px; +} + +table { + padding: 0px 50px; +} + +a { + text-decoration: none; + color: #172b4d; +} + +a:hover { + text-decoration: underline; +} + +td, th { + padding: 5px 60px; + padding-left: 0; + text-align: left; +} + +hr { + border: 1px solid #172b4d; +} diff --git a/roles/mirror/base/meta/main.yml b/roles/mirror/base/meta/main.yml new file mode 100644 index 0000000..0b17fa3 --- /dev/null +++ b/roles/mirror/base/meta/main.yml @@ -0,0 +1,4 @@ +--- + +dependencies: + - {role: nginx/server} diff --git a/roles/mirror/base/tasks/main.yml b/roles/mirror/base/tasks/main.yml index 198abff..ffc723b 100644 --- a/roles/mirror/base/tasks/main.yml +++ b/roles/mirror/base/tasks/main.yml @@ -85,3 +85,28 @@ minute: 10 job: "find /var/log/sync-mirrors/ -xdev -type f -mtime +30 -name '*.log' -execdir rm {} \\+" user: mirror + +- name: copy static web content + synchronize: + dest: "/srv/web/{{ inventory_hostname }}/" + delete: yes + recursive: yes + src: static + +- name: install nginx xslt config + copy: + dest: /etc/nginx/mirror.xslt + src: mirror.xslt + mode: 0644 + owner: root + group: root + notify: restart nginx + +- name: create nginx mirror config + template: + dest: "/etc/nginx/conf.d/{{ inventory_hostname }}/mirror.conf" + src: mirror.conf.j2 + mode: 0644 + owner: root + group: root + notify: restart nginx diff --git a/roles/mirror/base/templates/mirror.conf.j2 b/roles/mirror/base/templates/mirror.conf.j2 new file mode 100644 index 0000000..7c9718c --- /dev/null +++ b/roles/mirror/base/templates/mirror.conf.j2 @@ -0,0 +1,6 @@ + +location / { + autoindex on; + autoindex_format xml; + xslt_stylesheet /etc/nginx/mirror.xslt path="$uri"; +} diff --git a/roles/mirror/sync/tasks/main.yml b/roles/mirror/sync/tasks/main.yml index 639d431..b852bdc 100644 --- a/roles/mirror/sync/tasks/main.yml +++ b/roles/mirror/sync/tasks/main.yml @@ -15,3 +15,11 @@ mode: 0755 owner: mirror group: mirror + +- name: link target directory to web + file: + path: "/srv/web/{{ inventory_hostname }}/{{ label }}" + src: "/srv/mirrors/{{ label }}" + state: link + owner: mirror + group: mirror