├── .dockerignore ├── Dockerfile ├── LICENSE ├── README.md ├── images ├── avatar.png ├── background-admin3-optimized.png ├── background-admin3.png ├── background-m.png ├── background.jpg ├── favicon.ico ├── imdb.png ├── logo.png ├── nowshowing-color.png ├── nowshowing-icon.png ├── nowshowing-icon2.png ├── nowshowing-iconx100.png ├── nowshowing-white.png ├── nowshowing.png ├── nowshowing250x250.png ├── ns_v2_menu.png ├── ns_v2_stats.png ├── ns_v2_title.png ├── plex.png ├── stats-web-grid.png ├── stats-web-table.png └── youtube.png ├── root ├── etc │ ├── cont-init.d │ │ ├── 10-set-uidgid │ │ └── 20-setup │ ├── fix-attrs.d │ │ └── 10-apply-perms │ ├── lighttpd │ │ ├── lighttpd.conf │ │ └── mod_fastcgi.conf │ ├── logrotate.conf │ └── logrotate.d │ │ ├── fail2ban │ │ └── lighttpd ├── opt │ ├── announcementSubject │ ├── announcement_email_body.erb │ ├── avatar.png │ ├── config │ │ ├── announcement_body.html │ │ ├── cfg │ │ │ ├── advanced.yaml │ │ │ ├── secure.php │ │ │ └── version │ │ ├── email_body.erb │ │ ├── logs │ │ │ ├── fail2ban.log │ │ │ ├── lighttpd_access.log │ │ │ ├── nowshowing.log │ │ │ └── plex_token_errors.log │ │ ├── web_body.erb │ │ └── www │ │ │ ├── admin │ │ │ ├── announcement.php │ │ │ ├── changepass.php │ │ │ ├── gettoken-pipes-setup.php │ │ │ ├── gettoken-pipes.php │ │ │ ├── index.html │ │ │ ├── index.php │ │ │ ├── logs.php │ │ │ ├── ondemand_report.php │ │ │ ├── reset.php │ │ │ ├── save_announcement.php │ │ │ ├── save_settings.php │ │ │ ├── save_setup.php │ │ │ ├── tautulli_check.php │ │ │ └── test_report.php │ │ │ ├── css │ │ │ ├── admin_style.css │ │ │ ├── pure-min.css │ │ │ └── style.css │ │ │ ├── img │ │ │ ├── background-admin3.png │ │ │ ├── background-m.png │ │ │ ├── background.jpg │ │ │ ├── favicon.ico │ │ │ ├── imdb.png │ │ │ ├── logo.png │ │ │ ├── nowshowing-icon.png │ │ │ ├── nowshowing-icon2.png │ │ │ ├── nowshowing.png │ │ │ ├── preloader.svg │ │ │ └── youtube.png │ │ │ ├── js │ │ │ ├── admin_custom.js │ │ │ ├── custom.js │ │ │ └── modal_steps.js │ │ │ └── lib │ │ │ ├── admin │ │ │ ├── bootstrap.min.css │ │ │ ├── bootstrap.min.js │ │ │ └── jquery.min.js │ │ │ ├── animate-css │ │ │ └── animate.min.css │ │ │ ├── bootstrap │ │ │ ├── css │ │ │ │ ├── bootstrap-theme.css │ │ │ │ ├── bootstrap-theme.css.map │ │ │ │ ├── bootstrap-theme.min.css │ │ │ │ ├── bootstrap-theme.min.css.map │ │ │ │ ├── bootstrap.css │ │ │ │ ├── bootstrap.css.map │ │ │ │ ├── bootstrap.min.css │ │ │ │ └── bootstrap.min.css.map │ │ │ ├── fonts │ │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ │ └── glyphicons-halflings-regular.woff2 │ │ │ └── js │ │ │ │ ├── bootstrap.js │ │ │ │ ├── bootstrap.min.js │ │ │ │ └── npm.js │ │ │ ├── easing │ │ │ ├── easing.js │ │ │ └── easing.min.js │ │ │ ├── font-awesome │ │ │ ├── css │ │ │ │ ├── font-awesome.css │ │ │ │ └── font-awesome.min.css │ │ │ └── fonts │ │ │ │ ├── FontAwesome.otf │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.svg │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ └── fontawesome-webfont.woff2 │ │ │ ├── jquery │ │ │ ├── jquery-migrate.min.js │ │ │ └── jquery.min.js │ │ │ ├── morphext │ │ │ ├── morphext.js │ │ │ └── morphext.min.js │ │ │ ├── stickyjs │ │ │ └── sticky.js │ │ │ ├── superfish │ │ │ ├── hoverIntent.js │ │ │ ├── superfish.js │ │ │ └── superfish.min.js │ │ │ └── wow │ │ │ ├── wow.js │ │ │ └── wow.min.js │ ├── f2b │ │ ├── fail2ban.local │ │ ├── iptables-common.conf │ │ ├── jail.local │ │ └── nowshowing.conf │ ├── gem │ │ ├── Gemfile │ │ └── Gemfile.lock │ ├── index.html │ ├── php │ │ ├── changepass.php │ │ ├── loadadvanced.php │ │ ├── logs.php │ │ ├── randomPass.php │ │ ├── reset.php │ │ ├── run_announcement.php │ │ ├── run_gettoken_pipes.php │ │ ├── run_ondemand_report.php │ │ ├── run_tautulli_check.php │ │ ├── run_test_report.php │ │ ├── spyc.php │ │ ├── writeadvanced.php │ │ ├── writeannouncement.php │ │ └── writesetup.php │ └── smtp.rb ├── usr │ └── local │ │ └── sbin │ │ ├── announcementreport │ │ ├── combinedreport │ │ ├── create-cron │ │ ├── emailreport │ │ ├── gettoken-pipes │ │ ├── ondemand_report │ │ ├── tautulli_check │ │ ├── webreport │ │ └── webserver └── var │ └── lib │ └── nowshowing │ ├── locales │ ├── de.yml │ ├── en.yml │ ├── fr.yml │ └── no.yml │ ├── mailAnnouncement.rb │ ├── mailReport.rb │ ├── omdb.rb │ ├── plex.rb │ ├── plexTv.rb │ ├── tautulli.rb │ ├── themoviedb.rb │ └── thetvdb.rb └── s6-overlay ├── bin ├── background ├── backtick ├── cd ├── define ├── dollarat ├── elgetopt ├── elgetpositionals ├── elglob ├── emptyenv ├── exec ├── execlineb ├── exit ├── export ├── fdblock ├── fdclose ├── fdmove ├── fdreserve ├── fdswap ├── forbacktickx ├── foreground ├── forstdin ├── forx ├── getcwd ├── getpid ├── heredoc ├── homeof ├── if ├── ifelse ├── ifte ├── ifthenelse ├── import ├── importas ├── loopwhilex ├── minidentd ├── multidefine ├── multisubstitute ├── pipeline ├── piperw ├── redirfd ├── runblock ├── s6-accessrules-cdb-from-fs ├── s6-accessrules-fs-from-cdb ├── s6-applyuidgid ├── s6-basename ├── s6-cat ├── s6-chmod ├── s6-chown ├── s6-chroot ├── s6-cleanfifodir ├── s6-clock ├── s6-clockadd ├── s6-clockview ├── s6-connlimit ├── s6-cut ├── s6-devd ├── s6-dirname ├── s6-dnsip4 ├── s6-dnsip4-filter ├── s6-dnsip6 ├── s6-dnsip6-filter ├── s6-dnsmx ├── s6-dnsname ├── s6-dnsname-filter ├── s6-dnsns ├── s6-dnsq ├── s6-dnsqr ├── s6-dnsqualify ├── s6-dnssoa ├── s6-dnssrv ├── s6-dnstxt ├── s6-dumpenv ├── s6-echo ├── s6-env ├── s6-envdir ├── s6-envuidgid ├── s6-expr ├── s6-false ├── s6-fdholder-daemon ├── s6-fdholder-delete ├── s6-fdholder-deletec ├── s6-fdholder-getdump ├── s6-fdholder-getdumpc ├── s6-fdholder-list ├── s6-fdholder-listc ├── s6-fdholder-retrieve ├── s6-fdholder-retrievec ├── s6-fdholder-setdump ├── s6-fdholder-setdumpc ├── s6-fdholder-store ├── s6-fdholder-storec ├── s6-fdholder-transferdump ├── s6-fdholder-transferdumpc ├── s6-fdholderd ├── s6-fghack ├── s6-fillurandompool ├── s6-format-filter ├── s6-freeramdisk ├── s6-ftrig-listen ├── s6-ftrig-listen1 ├── s6-ftrig-notify ├── s6-ftrig-wait ├── s6-ftrigrd ├── s6-getservbyname ├── s6-grep ├── s6-head ├── s6-hiercopy ├── s6-hostname ├── s6-ident-client ├── s6-ioconnect ├── s6-ipcclient ├── s6-ipcserver ├── s6-ipcserver-access ├── s6-ipcserver-socketbinder ├── s6-ipcserverd ├── s6-linkname ├── s6-ln ├── s6-log ├── s6-logwatch ├── s6-ls ├── s6-maximumtime ├── s6-mkdir ├── s6-mkfifo ├── s6-mkfifodir ├── s6-mount ├── s6-nice ├── s6-nuke ├── s6-pause ├── s6-pivotchroot ├── s6-printenv ├── s6-ps ├── s6-quote ├── s6-quote-filter ├── s6-randomip ├── s6-rc ├── s6-rc-bundle ├── s6-rc-compile ├── s6-rc-db ├── s6-rc-dryrun ├── s6-rc-init ├── s6-rc-update ├── s6-rename ├── s6-rmrf ├── s6-seq ├── s6-setlock ├── s6-setsid ├── s6-setuidgid ├── s6-sleep ├── s6-sntpclock ├── s6-softlimit ├── s6-sort ├── s6-sudo ├── s6-sudoc ├── s6-sudod ├── s6-supervise ├── s6-svc ├── s6-svlisten ├── s6-svlisten1 ├── s6-svok ├── s6-svscan ├── s6-svscanctl ├── s6-svstat ├── s6-svwait ├── s6-swapoff ├── s6-swapon ├── s6-sync ├── s6-tai64n ├── s6-tai64nlocal ├── s6-taiclock ├── s6-taiclockd ├── s6-tail ├── s6-tcpclient ├── s6-tcpserver ├── s6-tcpserver-access ├── s6-tcpserver4 ├── s6-tcpserver4-socketbinder ├── s6-tcpserver4d ├── s6-tcpserver6 ├── s6-tcpserver6-socketbinder ├── s6-tcpserver6d ├── s6-test ├── s6-touch ├── s6-true ├── s6-uevent-listener ├── s6-uevent-spawner ├── s6-umount ├── s6-uniquename ├── s6-unquote ├── s6-unquote-filter ├── s6-update-symlinks ├── s6lockd ├── seekablepipe ├── shift ├── skadnsd ├── trap ├── tryexec ├── ucspilogd ├── umask ├── unexport ├── wait └── withstdinas ├── etc ├── cont-finish.d │ └── .gitignore ├── cont-init.d │ └── .gitignore ├── fix-attrs.d │ └── .gitignore ├── leapsecs.dat ├── s6 │ ├── init-catchall │ │ ├── init-stage1 │ │ └── init-stage2 │ ├── init-no-catchall │ │ ├── init-stage1 │ │ └── init-stage2 │ ├── init │ │ ├── env-stage2 │ │ │ └── .gitignore │ │ ├── env │ │ │ └── PATH │ │ ├── init-stage1 │ │ ├── init-stage2 │ │ ├── init-stage2-fixattrs.txt │ │ ├── init-stage2-redirfd │ │ └── init-stage3 │ └── services │ │ ├── .s6-svscan │ │ ├── crash │ │ └── finish │ │ ├── s6-fdholderd │ │ ├── down │ │ ├── notification-fd │ │ ├── rules │ │ │ └── uid │ │ │ │ ├── 0 │ │ │ │ ├── allow │ │ │ │ └── env │ │ │ │ │ ├── S6_FDHOLDER_GETDUMP │ │ │ │ │ ├── S6_FDHOLDER_LIST │ │ │ │ │ ├── S6_FDHOLDER_RETRIEVE_REGEX │ │ │ │ │ ├── S6_FDHOLDER_SETDUMP │ │ │ │ │ └── S6_FDHOLDER_STORE_REGEX │ │ │ │ └── default │ │ │ │ ├── allow │ │ │ │ └── env │ │ │ │ └── S6_FDHOLDER_LIST │ │ ├── run │ │ └── supervise │ │ │ └── .gitignore │ │ └── s6-svscan-log │ │ └── run └── services.d │ └── .gitignore ├── init ├── libexec ├── s6-rc-fdholder-filler ├── s6-rc-oneshot-run └── s6lockd-helper └── usr └── bin ├── execlineb ├── fix-attrs ├── logutil-newfifo ├── logutil-service ├── logutil-service-main ├── printcontenv ├── with-contenv └── with-retries /.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | .gitignore 3 | images 4 | LICENSE 5 | VERSION 6 | README.md 7 | Changelog.md 8 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.5 2 | MAINTAINER ninthwalker 3 | 4 | ENV UPDATED_ON 28APR2018 5 | ENV NOWSHOWING_VERSION 2.0.3 6 | 7 | VOLUME /config 8 | EXPOSE 6878 9 | 10 | #copy app and s6-overlay files 11 | COPY root/ s6-overlay/ / 12 | 13 | # Install permanent packages 14 | RUN apk add --no-cache ruby ruby-json ruby-io-console curl-dev lighttpd php7-cgi php7-json php7-curl php7-mbstring busybox-suid fail2ban ca-certificates wget tzdata shadow && \ 15 | 16 | # Install temporary build dependencies 17 | apk add --no-cache --virtual build-dependencies \ 18 | ruby-dev \ 19 | ruby-bundler \ 20 | libc-dev \ 21 | make \ 22 | gcc && \ 23 | 24 | # Create default user & lighttpd path 25 | groupmod -g 1000 users && \ 26 | useradd -u 99 -U -d /config -s /bin/false xyz && \ 27 | groupmod -o -g 100 xyz && \ 28 | usermod -G users xyz && \ 29 | mkdir /run/lighttpd /var/run/fail2ban && \ 30 | 31 | # fail2ban setup - remove alpine default jail & copy in our jail settings and filter 32 | rm /etc/fail2ban/jail.d/* && \ 33 | cp /opt/f2b/fail2ban.local /opt/f2b/jail.local /etc/fail2ban/ && \ 34 | cp /opt/f2b/nowshowing.conf /etc/fail2ban/filter.d/ && \ 35 | cp /opt/f2b/iptables-common.conf /etc/fail2ban/action.d/ && \ 36 | 37 | # smtp.rb mail fix 38 | cp /opt/smtp.rb /usr/lib/ruby/2.3.0/net/ && \ 39 | 40 | # Insall NowShowing app dependencies 41 | bundle config --global silence_root_warning 1 && \ 42 | cd /opt/gem ; bundle install && \ 43 | 44 | # Remove temp files 45 | apk del --purge build-dependencies 46 | 47 | # Start s6 init & webserver 48 | ENTRYPOINT ["/init"] 49 | CMD ["lighttpd", "-D", "-f", "/etc/lighttpd/lighttpd.conf"] 50 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 ninthwalker 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # NowShowing v2 3 | 4 | ![](https://raw.githubusercontent.com/ninthwalker/NowShowing/v2/images/ns_v2_title.png) 5 | 6 | 7 | [![Docker Automated build](https://img.shields.io/docker/automated/ninthwalker/nowshowing.svg)](https://hub.docker.com/r/ninthwalker/nowshowing/) ![](https://img.shields.io/docker/pulls/ninthwalker/nowshowing.svg) [![](https://images.microbadger.com/badges/image/ninthwalker/nowshowing:v2.svg)](https://microbadger.com/images/ninthwalker/nowshowing:v2 "NowShowing") [![Build Passing](https://img.shields.io/badge/build-passing-brightgreen.svg)](https://hub.docker.com/r/ninthwalker/nowshowing/) 8 | 9 | ## Introduction 10 | The NowShowing docker provides a summary of new media that has recently been added to Plex, giving the Plex owner the option of delivering the information in two ways: 11 | 1) An email summary sent to all or selected users of the Plex Server 12 | 2) A web page for users to visit 13 | 14 | ## Description / Background 15 | NowShowing is the successor of the popular plexReport docker. The original brainchild of [bstascavage](https://github.com/bstascavage/plexReport). Further developed by NinthWalker & enhanced by GroxyPod, NowShowing adds additional improvements and features in a friendly, easy to install docker. 16 | 17 | ## New in v2: 18 | ### Complete code rewrite with tons of new features! 19 | * Same great Email/webpage for Plex recently added as v1 20 | * All new Web Interface for settings and customization 21 | * Library Filtering! 22 | * Movie/TV Trailers 23 | * [Tautilli](https://github.com/Tautulli/Tautulli) Statistics integration 24 | * New user Setup Wizard 25 | * Announcement Emails 26 | * Web based Log Viewer 27 | * Easy Plex token retrieval 28 | * Most email providers supported 29 | * BCC users instead of multiple emails 30 | * Web tools including On-Demand and Test reports 31 | 32 | 33 | 34 | ### [Screenshots](https://github.com/ninthwalker/NowShowing/wiki/Screenshots) 35 | 36 | ## Supported Platforms 37 | * Docker (Windows or Linux based) [See Wiki](https://github.com/ninthwalker/NowShowing/wiki/Other-Docker-Platforms) 38 | * unRAID v6+ 39 | 40 | 41 | ## Supported Email Clients 42 | * Most Email providers with SSL SMTP support [see Wiki FAQ](https://github.com/ninthwalker/NowShowing/wiki/FAQ-&-Known-Issues) 43 | 44 | ## Supported Plex Agents 45 | * Plex Movie 46 | * TheMovieDB 47 | * TheTVDB 48 | 49 | ## Prerequisites 50 | 1. Plex 51 | 2. Docker 52 | 3. Plex Movie or TheMovieDB set as your Agent for Movie sections on the Plex server 53 | 4. TheTVDB set as your Agent for TV sections on the Plex server 54 | 5. An Email account that supports SSL SMTP 55 | 56 | ## Installation on unRAID 57 | [See unRAID Wiki](https://github.com/ninthwalker/NowShowing/wiki/unRAID-Instructions) 58 | 59 | ## Installation on other Docker platforms 60 | [See Other Docker platforms Wiki](https://github.com/ninthwalker/NowShowing/wiki/Other-Docker-Platforms) 61 | 62 | ## Advanced settings, FAQ, Command-line options & other questions: 63 | [See Github Wiki](https://github.com/ninthwalker/NowShowing/wiki) 64 | -------------------------------------------------------------------------------- /images/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/avatar.png -------------------------------------------------------------------------------- /images/background-admin3-optimized.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/background-admin3-optimized.png -------------------------------------------------------------------------------- /images/background-admin3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/background-admin3.png -------------------------------------------------------------------------------- /images/background-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/background-m.png -------------------------------------------------------------------------------- /images/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/background.jpg -------------------------------------------------------------------------------- /images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/favicon.ico -------------------------------------------------------------------------------- /images/imdb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/imdb.png -------------------------------------------------------------------------------- /images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/logo.png -------------------------------------------------------------------------------- /images/nowshowing-color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/nowshowing-color.png -------------------------------------------------------------------------------- /images/nowshowing-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/nowshowing-icon.png -------------------------------------------------------------------------------- /images/nowshowing-icon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/nowshowing-icon2.png -------------------------------------------------------------------------------- /images/nowshowing-iconx100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/nowshowing-iconx100.png -------------------------------------------------------------------------------- /images/nowshowing-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/nowshowing-white.png -------------------------------------------------------------------------------- /images/nowshowing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/nowshowing.png -------------------------------------------------------------------------------- /images/nowshowing250x250.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/nowshowing250x250.png -------------------------------------------------------------------------------- /images/ns_v2_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/ns_v2_menu.png -------------------------------------------------------------------------------- /images/ns_v2_stats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/ns_v2_stats.png -------------------------------------------------------------------------------- /images/ns_v2_title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/ns_v2_title.png -------------------------------------------------------------------------------- /images/plex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/plex.png -------------------------------------------------------------------------------- /images/stats-web-grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/stats-web-grid.png -------------------------------------------------------------------------------- /images/stats-web-table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/stats-web-table.png -------------------------------------------------------------------------------- /images/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/images/youtube.png -------------------------------------------------------------------------------- /root/etc/cont-init.d/10-set-uidgid: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv sh 2 | 3 | PUID=${PUID:-99} 4 | PGID=${PGID:-100} 5 | 6 | groupmod -o -g "$PGID" xyz 7 | usermod -o -u "$PUID" xyz 8 | chown -R xyz:xyz /opt /run/lighttpd 9 | echo " 10 | ----------------------------------------- 11 | NowShowing 12 | ----------------------------------------- 13 | Brought to you by: 14 | 15 | Ninthwalker/GroxyPod/Limen75 16 | 17 | ----------------------------------------- 18 | User xyz set to: $(id -u xyz) 19 | Group xyz set to: $(id -g xyz) 20 | ----------------------------------------- 21 | " 22 | -------------------------------------------------------------------------------- /root/etc/cont-init.d/20-setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv sh 2 | 3 | # current version 4 | this_version=2.0.3 5 | 6 | # get version 7 | if [ -f /config/cfg/version ]; then 8 | their_version=$(cat /config/cfg/version) 9 | else 10 | echo "version not detected." 11 | fi 12 | 13 | #Copies config files and creates advanced config file if not present 14 | if [ -f /config/cfg/advanced.yaml ]; then 15 | echo "Advanced config file detected. Checking version .." 16 | if [ $their_version = $this_version ]; then 17 | # do nothing, latest version 18 | echo "Latest $this_version release found. Nothing to update." 19 | elif [ $their_version != $this_version ]; then 20 | # copy files since last version 21 | echo "Version $their_version found." 22 | echo "Backing up files to /config/backup/ & upgrading to $this_version release." 23 | mkdir -p /config/backup && chmod 775 /config/backup 24 | cp -Rfp /config/cfg/ /config/www /config/announcement_body.html /config/email_body.erb /config/web_body.erb /config/backup/ 25 | cp -Rfp /opt/config/www /opt/config/announcement_body.html /opt/config/email_body.erb /opt/config/web_body.erb /config/ 26 | rm /config/www/admin/gettoken-pipes-setup.php /config/www/admin/index.html /config/www/admin/save_setup.php 27 | cp -fp /opt/config/cfg/version /config/cfg/ 28 | chown xyz:xyz -R /config/backup/ 29 | fi 30 | 31 | else 32 | # copy files incl advanced.yaml 33 | echo "New Install detected. Installing $this_version release .." 34 | cp -Rfp /opt/config/. /config/ 35 | cp -fp /opt/avatar.png /config/www/img/ 36 | cp -fp /opt/index.html /config/www/ 37 | # set password to a random one 38 | php-cgi7 /opt/php/randomPass.php 39 | fi 40 | 41 | # Always load latest cron settings 42 | ruby /usr/local/sbin/create-cron 43 | 44 | #fail2ban start 45 | fail2ban-client start 46 | 47 | #read nowshowing_schedule.cron on container startup and add to crontab. 48 | chown xyz:xyz /opt/nowshowing_schedule.cron 49 | crontab -u xyz /opt/nowshowing_schedule.cron 50 | 51 | #start cron 52 | crond 53 | 54 | echo "Please go to http://hostIP:hostPort/admin to configure settings" 55 | -------------------------------------------------------------------------------- /root/etc/fix-attrs.d/10-apply-perms: -------------------------------------------------------------------------------- 1 | /opt true xyz 0664 0775 2 | -------------------------------------------------------------------------------- /root/etc/lighttpd/lighttpd.conf: -------------------------------------------------------------------------------- 1 | server.document-root = "/config/www/" 2 | 3 | server.port = 6878 4 | 5 | server.username = "xyz" 6 | server.groupname = "xyz" 7 | 8 | server.modules = ( 9 | "mod_access", 10 | "mod_accesslog" 11 | ) 12 | 13 | mimetype.assign = ( 14 | ".html" => "text/html", 15 | ".htm" => "text/html", 16 | ".txt" => "text/plain", 17 | ".jpg" => "image/jpeg", 18 | ".png" => "image/png", 19 | ".js" => "text/javascript", 20 | ".css" => "text/css" 21 | ) 22 | 23 | include "mod_fastcgi.conf" 24 | 25 | static-file.exclude-extensions = ( ".fcgi", ".php", ".rb", "~", ".inc" ) 26 | index-file.names = ( "index.html", "index.htm" , "index.php") 27 | 28 | server.pid-file = "/var/run/lighttpd.pid" 29 | accesslog.filename = "/config/logs/lighttpd_access.log" 30 | -------------------------------------------------------------------------------- /root/etc/lighttpd/mod_fastcgi.conf: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # mod_fastcgi.conf 3 | # include'd by lighttpd.conf. 4 | # $Header: /var/cvsroot/gentoo-x86/www-servers/lighttpd/files/conf/mod_fastcgi.conf-1.4.13-r2,v 1.1 2007/04/01 23:22:00 robbat2 Exp $ 5 | ############################################################################### 6 | 7 | server.modules += ("mod_fastcgi") 8 | fastcgi.server = ( ".php" => 9 | ( "localhost" => 10 | ( 11 | "socket" => "/run/lighttpd/lighttpd-fastcgi-php-" + PID + ".socket", 12 | "bin-path" => "/usr/bin/php-cgi7" 13 | ) 14 | ) 15 | ) 16 | 17 | # vim: set ft=conf foldmethod=marker et : 18 | -------------------------------------------------------------------------------- /root/etc/logrotate.conf: -------------------------------------------------------------------------------- 1 | # see "man logrotate" for details 2 | # rotate log files weekly 3 | weekly 4 | su xyz xyz 5 | # keep 4 weeks worth of backlogs 6 | rotate 4 7 | 8 | # create new (empty) log files after rotating old ones 9 | create 10 | 11 | # use date as a suffix of the rotated file 12 | dateext 13 | 14 | # exclude alpine files 15 | tabooext + .apk-new 16 | 17 | # uncomment this if you want your log files compressed 18 | compress 19 | 20 | # main log file 21 | #/var/log/messages {} 22 | 23 | # apk packages drop log rotation information into this directory 24 | include /etc/logrotate.d 25 | 26 | # system-specific logs may be also be configured here. 27 | -------------------------------------------------------------------------------- /root/etc/logrotate.d/fail2ban: -------------------------------------------------------------------------------- 1 | /config/logs/fail2ban.log { 2 | daily 3 | maxsize 25M 4 | rotate 2 5 | missingok 6 | compress 7 | postrotate 8 | /usr/bin/fail2ban-client flushlogs 1>/dev/null || true 9 | endscript 10 | } 11 | -------------------------------------------------------------------------------- /root/etc/logrotate.d/lighttpd: -------------------------------------------------------------------------------- 1 | # $Header: /var/cvsroot/gentoo-x86/www-servers/lighttpd/files/lighttpd.logrotate,v 1.2 2006/05/30 19:49:29 bangert Exp $ 2 | # lighttpd logrotate script for Gentoo 3 | 4 | /config/logs/lighttpd_access.log { 5 | daily 6 | maxsize 25M 7 | missingok 8 | copytruncate 9 | rotate 2 10 | compress 11 | notifempty 12 | sharedscripts 13 | postrotate 14 | kill -hup $(cat /var/run/lighttpd.pid) 15 | endscript 16 | } 17 | -------------------------------------------------------------------------------- /root/opt/announcementSubject: -------------------------------------------------------------------------------- 1 | Plex Announcement -------------------------------------------------------------------------------- /root/opt/announcement_email_body.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= $announcement %> 9 | 10 | -------------------------------------------------------------------------------- /root/opt/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/avatar.png -------------------------------------------------------------------------------- /root/opt/config/announcement_body.html: -------------------------------------------------------------------------------- 1 |

Example Announcement


2 | This is a test announcement!

3 | The Plex Server will be offline 4 | for maintenance on April 1st for 5 | approximately 2 hours.

6 | 7 | We apologize for any inconvenience.
8 | Thanks for watching!

9 | -------------------------------------------------------------------------------- /root/opt/config/cfg/advanced.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | email: 3 | title: "New This Week" 4 | image: "http://i.imgur.com/LNTSbFl.png" 5 | footer: "Thanks for watching!" 6 | language: "en" 7 | web: 8 | title_image: "img/nowshowing.png" 9 | logo: "img/logo.png" 10 | headline_title: 'Just added:' 11 | headliners: "Laughs,Screams,Thrills,Entertainment" 12 | footer: "Thanks for watching!" 13 | language: "en" 14 | plex: 15 | plex_user_emails: "yes" 16 | libraries_to_skip: 17 | - "" 18 | server: "" 19 | mail: 20 | from: "Plex Server" 21 | subject: "Now Showing" 22 | recipients_email: 23 | - "" 24 | recipients: 25 | - "" 26 | provider: "" 27 | address: "" 28 | port: "" 29 | username: "" 30 | password: "" 31 | report: 32 | interval: "7" 33 | report_type: "both" 34 | email_report_time: '30 10 * * 5' 35 | web_report_time: '30 23 * * *' 36 | extra_details: "no" 37 | test: "disable" 38 | tautulli: 39 | server: "" 40 | port: "" 41 | api_key: "" 42 | httproot: "" 43 | https: "no" 44 | title: "Statistics:" 45 | stats: "" 46 | token: 47 | api_key: "" 48 | -------------------------------------------------------------------------------- /root/opt/config/cfg/secure.php: -------------------------------------------------------------------------------- 1 | 'NowShowing' 11 | ); 12 | 13 | // request login? true - show login and password boxes, false - password box only 14 | define('USE_USERNAME', true); 15 | 16 | // User will be redirected to this page after logout 17 | // define('LOGOUT_URL', '../'); 18 | 19 | // time out after NN minutes of inactivity. Set to 0 to not timeout 20 | // I set to 3 days 21 | define('TIMEOUT_MINUTES', 4320); 22 | 23 | // This parameter is only useful when TIMEOUT_MINUTES is not zero 24 | // true - timeout time from last activity, false - timeout time from login 25 | define('TIMEOUT_CHECK_ACTIVITY', false); 26 | 27 | ################################################################## 28 | # SETTINGS END 29 | ################################################################## 30 | 31 | /////////////////////////////////////////////////////// 32 | // do not change code below 33 | /////////////////////////////////////////////////////// 34 | 35 | // show usage example 36 | if(isset($_GET['help'])) { 37 | die('Include following code into every page you would like to protect, at the very beginning (first line):
<?php include("' . str_replace('\\','\\\\',__FILE__) . '"); ?>'); 38 | } 39 | 40 | // timeout in seconds 41 | $timeout = (TIMEOUT_MINUTES == 0 ? 0 : time() + TIMEOUT_MINUTES * 60); 42 | 43 | // logout? 44 | if(isset($_GET['logout'])) { 45 | setcookie("NowShowing", '', $timeout, '/'); // clear password; 46 | header("Location: http://".$_SERVER['HTTP_HOST']."/admin/index.php"); 47 | exit(); 48 | } 49 | 50 | if(!function_exists('showLoginPasswordProtect')) { 51 | 52 | // show login form 53 | function showLoginPasswordProtect($error_msg) { 54 | ?> 55 | 56 | 57 | NowShowing 58 | 59 | 60 | 61 | 62 | 63 | 118 |
119 |
120 |

121 | nowshowing-Icon 122 | NowShowing 123 |

124 |

Admin Access

125 |
126 |

Password:
'; ?> 127 |

128 | 129 |
130 |
131 | Forgot Password 132 |
133 |
134 | 135 | 136 | 137 | $val) { 176 | $lp = (USE_USERNAME ? $key : '') .'%'.$val; 177 | if ($_COOKIE['NowShowing'] == md5($lp)) { 178 | $found = true; 179 | // prolong timeout 180 | if (TIMEOUT_CHECK_ACTIVITY) { 181 | setcookie("NowShowing", md5($lp), $timeout, '/'); 182 | } 183 | break; 184 | } 185 | } 186 | if (!$found) { 187 | showLoginPasswordProtect(""); 188 | } 189 | } 190 | ?> 191 | -------------------------------------------------------------------------------- /root/opt/config/cfg/version: -------------------------------------------------------------------------------- 1 | 2.0.3 -------------------------------------------------------------------------------- /root/opt/config/logs/fail2ban.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/logs/fail2ban.log -------------------------------------------------------------------------------- /root/opt/config/logs/lighttpd_access.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/logs/lighttpd_access.log -------------------------------------------------------------------------------- /root/opt/config/logs/nowshowing.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/logs/nowshowing.log -------------------------------------------------------------------------------- /root/opt/config/logs/plex_token_errors.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/logs/plex_token_errors.log -------------------------------------------------------------------------------- /root/opt/config/www/admin/announcement.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /root/opt/config/www/admin/changepass.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /root/opt/config/www/admin/gettoken-pipes-setup.php: -------------------------------------------------------------------------------- 1 | array("pipe", "r"), // stdin is a pipe that the child will read from 9 | 1 => array("pipe", "w"), // stdout is a pipe that the child will write to 10 | 2 => array("file", "/config/logs/plex_token_errors.log", "a") // stderr is a file to write to 11 | ); 12 | $process = proc_open('ruby /usr/local/sbin/gettoken-pipes', $descriptorspec, $pipes); 13 | 14 | if (is_resource($process)) { 15 | $userpass = strip_tags($_POST['plex_username']) . '|+/+/+|' . strip_tags($_POST['plex_password']); 16 | fwrite($pipes[0], $userpass); 17 | fclose($pipes[0]); 18 | 19 | $stream = stream_get_contents($pipes[1]); 20 | $stream = str_replace("\n", '', $stream); 21 | $stream = explode(" ",$stream); 22 | $token = $stream[0]; 23 | $avatar = isset($stream[1]) ? $stream[1] : ""; 24 | fclose($pipes[1]); 25 | proc_close($process); 26 | } 27 | 28 | if (!empty($token)) { 29 | # save token to advanced.yaml 30 | $adv_array = Spyc::YAMLLoad('../../cfg/advanced.yaml'); 31 | $adv_array['token'] = array('api_key' => $token); 32 | 33 | # d/l gravatar avatar 34 | exec("wget $avatar -O /config/www/img/avatar.png"); 35 | 36 | $adv_yaml = Spyc::YAMLDump($adv_array,2,0); 37 | file_put_contents($adv_file, $adv_yaml); 38 | 39 | $statustext = "Plex Token Saved!"; 40 | $tokenarray = array( 'token' => $token, 'statustext' => $statustext); 41 | echo json_encode($tokenarray); 42 | exit; 43 | } 44 | else { 45 | $statustext = "Error: Verify username/password!"; 46 | $tokenarray = array( 'statustext' => $statustext); 47 | echo json_encode($tokenarray); 48 | exit; 49 | } 50 | } 51 | echo "Check username/password!"; 52 | exit; 53 | ?> 54 | -------------------------------------------------------------------------------- /root/opt/config/www/admin/gettoken-pipes.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /root/opt/config/www/admin/logs.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /root/opt/config/www/admin/ondemand_report.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /root/opt/config/www/admin/reset.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /root/opt/config/www/admin/save_announcement.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /root/opt/config/www/admin/save_settings.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /root/opt/config/www/admin/save_setup.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /root/opt/config/www/admin/tautulli_check.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /root/opt/config/www/admin/test_report.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /root/opt/config/www/img/background-admin3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/img/background-admin3.png -------------------------------------------------------------------------------- /root/opt/config/www/img/background-m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/img/background-m.png -------------------------------------------------------------------------------- /root/opt/config/www/img/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/img/background.jpg -------------------------------------------------------------------------------- /root/opt/config/www/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/img/favicon.ico -------------------------------------------------------------------------------- /root/opt/config/www/img/imdb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/img/imdb.png -------------------------------------------------------------------------------- /root/opt/config/www/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/img/logo.png -------------------------------------------------------------------------------- /root/opt/config/www/img/nowshowing-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/img/nowshowing-icon.png -------------------------------------------------------------------------------- /root/opt/config/www/img/nowshowing-icon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/img/nowshowing-icon2.png -------------------------------------------------------------------------------- /root/opt/config/www/img/nowshowing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/img/nowshowing.png -------------------------------------------------------------------------------- /root/opt/config/www/img/preloader.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /root/opt/config/www/img/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/img/youtube.png -------------------------------------------------------------------------------- /root/opt/config/www/js/custom.js: -------------------------------------------------------------------------------- 1 | jQuery(document).ready(function( $ ) { 2 | 3 | // Preloader 4 | $(window).load(function(){ 5 | $('#preloader').delay(100).fadeOut('slow',function(){$(this).remove();}); 6 | }); 7 | 8 | //Limittext synopsis to 260 char - changed to 225 after adding imdb/trailer img's 9 | $(".limittext").each(function(){ 10 | len=$(this).text().length; 11 | if(len>225) 12 | { 13 | $(this).text($(this).text().substr(0,225)+'...'); 14 | } 15 | }); 16 | 17 | // Hero rotating texts 18 | $("#hero .rotating").Morphext({ 19 | animation: "flipInX", 20 | separator: ",", 21 | speed: 3000 22 | }); 23 | 24 | // Initiate the wowjs 25 | new WOW().init(); 26 | 27 | // Initiate superfish on nav menu 28 | $('.nav-menu').superfish({ 29 | animation: {opacity:'show'}, 30 | speed: 400 31 | }); 32 | 33 | // Mobile Navigation 34 | if( $('#nav-menu-container').length ) { 35 | var $mobile_nav = $('#nav-menu-container').clone().prop({ id: 'mobile-nav'}); 36 | $mobile_nav.find('> ul').attr({ 'class' : '', 'id' : '' }); 37 | $('body').append( $mobile_nav ); 38 | $('body').prepend( '' ); 39 | $('body').append( '
' ); 40 | $('#mobile-nav').find('.menu-has-children').prepend(''); 41 | 42 | $(document).on('click', '.menu-has-children i', function(e){ 43 | $(this).next().toggleClass('menu-item-active'); 44 | $(this).nextAll('ul').eq(0).slideToggle(); 45 | $(this).toggleClass("fa-chevron-up fa-chevron-down"); 46 | }); 47 | 48 | $(document).on('click', '#mobile-nav-toggle', function(e){ 49 | $('body').toggleClass('mobile-nav-active'); 50 | $('#mobile-nav-toggle i').toggleClass('fa-times fa-bars'); 51 | $('#mobile-body-overly').toggle(); 52 | }); 53 | 54 | $(document).click(function (e) { 55 | var container = $("#mobile-nav, #mobile-nav-toggle"); 56 | if (!container.is(e.target) && container.has(e.target).length === 0) { 57 | if ( $('body').hasClass('mobile-nav-active') ) { 58 | $('body').removeClass('mobile-nav-active'); 59 | $('#mobile-nav-toggle i').toggleClass('fa-times fa-bars'); 60 | $('#mobile-body-overly').fadeOut(); 61 | } 62 | } 63 | }); 64 | } else if ( $("#mobile-nav, #mobile-nav-toggle").length ) { 65 | $("#mobile-nav, #mobile-nav-toggle").hide(); 66 | } 67 | 68 | // Stick the header at top on scroll 69 | $("#header").sticky({topSpacing:0, zIndex: '50'}); 70 | 71 | // Smoth scroll on page hash links 72 | $('a[href*="#"]:not([href="#"])').on('click', function() { 73 | if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) { 74 | var target = $(this.hash); 75 | if (target.length) { 76 | 77 | var top_space = 0; 78 | 79 | if( $('#header').length ) { 80 | top_space = $('#header').outerHeight(); 81 | } 82 | 83 | $('html, body').animate({ 84 | scrollTop: target.offset().top - top_space 85 | }, 1500, 'easeInOutExpo'); 86 | 87 | if ( $(this).parents('.nav-menu').length ) { 88 | $('.nav-menu .menu-active').removeClass('menu-active'); 89 | $(this).closest('li').addClass('menu-active'); 90 | } 91 | 92 | if ( $('body').hasClass('mobile-nav-active') ) { 93 | $('body').removeClass('mobile-nav-active'); 94 | $('#mobile-nav-toggle i').toggleClass('fa-times fa-bars'); 95 | $('#mobile-body-overly').fadeOut(); 96 | } 97 | 98 | return false; 99 | } 100 | } 101 | }); 102 | 103 | // Back to top button 104 | $(window).scroll(function() { 105 | 106 | if ($(this).scrollTop() > 100) { 107 | $('.back-to-top').fadeIn('slow'); 108 | } else { 109 | $('.back-to-top').fadeOut('slow'); 110 | } 111 | 112 | }); 113 | 114 | $('.back-to-top').click(function(){ 115 | $('html, body').animate({scrollTop : 0},1500, 'easeInOutExpo'); 116 | return false; 117 | }); 118 | 119 | var $videoSrc; 120 | $('.video-btn').click(function() { 121 | $videoSrc = $(this).data( "src" ); 122 | console.log($videoSrc); 123 | }); 124 | 125 | // when the modal is opened autoplay it 126 | $('#myModal').on('shown.bs.modal', function (e) { 127 | 128 | // set the video src to autoplay and not to show related video. Youtube related video is like a box of chocolates... you never know what you're gonna get 129 | $("#video").attr('src',$videoSrc + "?rel=0&showinfo=0&modestbranding=1&autoplay=1" ); 130 | }) 131 | 132 | // stop playing the youtube video when I close the modal 133 | $('#myModal').on('hide.bs.modal', function (e) { 134 | // a poor man's stop video 135 | $("#video").attr('src',$videoSrc); 136 | }) 137 | 138 | }); 139 | 140 | //$(document).ready(function() { 141 | 142 | // Gets the video src from the data-src on each button 143 | 144 | 145 | 146 | // document ready 147 | // }); 148 | -------------------------------------------------------------------------------- /root/opt/config/www/lib/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/lib/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /root/opt/config/www/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /root/opt/config/www/lib/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/lib/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /root/opt/config/www/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /root/opt/config/www/lib/bootstrap/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /root/opt/config/www/lib/easing/easing.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery Easing v1.4.0 - http://gsgd.co.uk/sandbox/jquery/easing/ 3 | * Open source under the BSD License. 4 | * Copyright © 2008 George McGinley Smith 5 | * All rights reserved. 6 | * https://raw.github.com/gdsmith/jquery-easing/master/LICENSE 7 | */ 8 | 9 | (function (factory) { 10 | if (typeof define === "function" && define.amd) { 11 | define(['jquery'], function ($) { 12 | return factory($); 13 | }); 14 | } else if (typeof module === "object" && typeof module.exports === "object") { 15 | exports = factory(require('jquery')); 16 | } else { 17 | factory(jQuery); 18 | } 19 | })(function($){ 20 | 21 | // Preserve the original jQuery "swing" easing as "jswing" 22 | $.easing['jswing'] = $.easing['swing']; 23 | 24 | var pow = Math.pow, 25 | sqrt = Math.sqrt, 26 | sin = Math.sin, 27 | cos = Math.cos, 28 | PI = Math.PI, 29 | c1 = 1.70158, 30 | c2 = c1 * 1.525, 31 | c3 = c1 + 1, 32 | c4 = ( 2 * PI ) / 3, 33 | c5 = ( 2 * PI ) / 4.5; 34 | 35 | // x is the fraction of animation progress, in the range 0..1 36 | function bounceOut(x) { 37 | var n1 = 7.5625, 38 | d1 = 2.75; 39 | if ( x < 1/d1 ) { 40 | return n1*x*x; 41 | } else if ( x < 2/d1 ) { 42 | return n1*(x-=(1.5/d1))*x + .75; 43 | } else if ( x < 2.5/d1 ) { 44 | return n1*(x-=(2.25/d1))*x + .9375; 45 | } else { 46 | return n1*(x-=(2.625/d1))*x + .984375; 47 | } 48 | } 49 | 50 | $.extend( $.easing, 51 | { 52 | def: 'easeOutQuad', 53 | swing: function (x) { 54 | return $.easing[$.easing.def](x); 55 | }, 56 | easeInQuad: function (x) { 57 | return x * x; 58 | }, 59 | easeOutQuad: function (x) { 60 | return 1 - ( 1 - x ) * ( 1 - x ); 61 | }, 62 | easeInOutQuad: function (x) { 63 | return x < 0.5 ? 64 | 2 * x * x : 65 | 1 - pow( -2 * x + 2, 2 ) / 2; 66 | }, 67 | easeInCubic: function (x) { 68 | return x * x * x; 69 | }, 70 | easeOutCubic: function (x) { 71 | return 1 - pow( 1 - x, 3 ); 72 | }, 73 | easeInOutCubic: function (x) { 74 | return x < 0.5 ? 75 | 4 * x * x * x : 76 | 1 - pow( -2 * x + 2, 3 ) / 2; 77 | }, 78 | easeInQuart: function (x) { 79 | return x * x * x * x; 80 | }, 81 | easeOutQuart: function (x) { 82 | return 1 - pow( 1 - x, 4 ); 83 | }, 84 | easeInOutQuart: function (x) { 85 | return x < 0.5 ? 86 | 8 * x * x * x * x : 87 | 1 - pow( -2 * x + 2, 4 ) / 2; 88 | }, 89 | easeInQuint: function (x) { 90 | return x * x * x * x * x; 91 | }, 92 | easeOutQuint: function (x) { 93 | return 1 - pow( 1 - x, 5 ); 94 | }, 95 | easeInOutQuint: function (x) { 96 | return x < 0.5 ? 97 | 16 * x * x * x * x * x : 98 | 1 - pow( -2 * x + 2, 5 ) / 2; 99 | }, 100 | easeInSine: function (x) { 101 | return 1 - cos( x * PI/2 ); 102 | }, 103 | easeOutSine: function (x) { 104 | return sin( x * PI/2 ); 105 | }, 106 | easeInOutSine: function (x) { 107 | return -( cos( PI * x ) - 1 ) / 2; 108 | }, 109 | easeInExpo: function (x) { 110 | return x === 0 ? 0 : pow( 2, 10 * x - 10 ); 111 | }, 112 | easeOutExpo: function (x) { 113 | return x === 1 ? 1 : 1 - pow( 2, -10 * x ); 114 | }, 115 | easeInOutExpo: function (x) { 116 | return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? 117 | pow( 2, 20 * x - 10 ) / 2 : 118 | ( 2 - pow( 2, -20 * x + 10 ) ) / 2; 119 | }, 120 | easeInCirc: function (x) { 121 | return 1 - sqrt( 1 - pow( x, 2 ) ); 122 | }, 123 | easeOutCirc: function (x) { 124 | return sqrt( 1 - pow( x - 1, 2 ) ); 125 | }, 126 | easeInOutCirc: function (x) { 127 | return x < 0.5 ? 128 | ( 1 - sqrt( 1 - pow( 2 * x, 2 ) ) ) / 2 : 129 | ( sqrt( 1 - pow( -2 * x + 2, 2 ) ) + 1 ) / 2; 130 | }, 131 | easeInElastic: function (x) { 132 | return x === 0 ? 0 : x === 1 ? 1 : 133 | -pow( 2, 10 * x - 10 ) * sin( ( x * 10 - 10.75 ) * c4 ); 134 | }, 135 | easeOutElastic: function (x) { 136 | return x === 0 ? 0 : x === 1 ? 1 : 137 | pow( 2, -10 * x ) * sin( ( x * 10 - 0.75 ) * c4 ) + 1; 138 | }, 139 | easeInOutElastic: function (x) { 140 | return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? 141 | -( pow( 2, 20 * x - 10 ) * sin( ( 20 * x - 11.125 ) * c5 )) / 2 : 142 | pow( 2, -20 * x + 10 ) * sin( ( 20 * x - 11.125 ) * c5 ) / 2 + 1; 143 | }, 144 | easeInBack: function (x) { 145 | return c3 * x * x * x - c1 * x * x; 146 | }, 147 | easeOutBack: function (x) { 148 | return 1 + c3 * pow( x - 1, 3 ) + c1 * pow( x - 1, 2 ); 149 | }, 150 | easeInOutBack: function (x) { 151 | return x < 0.5 ? 152 | ( pow( 2 * x, 2 ) * ( ( c2 + 1 ) * 2 * x - c2 ) ) / 2 : 153 | ( pow( 2 * x - 2, 2 ) *( ( c2 + 1 ) * ( x * 2 - 2 ) + c2 ) + 2 ) / 2; 154 | }, 155 | easeInBounce: function (x) { 156 | return 1 - bounceOut( 1 - x ); 157 | }, 158 | easeOutBounce: bounceOut, 159 | easeInOutBounce: function (x) { 160 | return x < 0.5 ? 161 | ( 1 - bounceOut( 1 - 2 * x ) ) / 2 : 162 | ( 1 + bounceOut( 2 * x - 1 ) ) / 2; 163 | } 164 | }); 165 | 166 | }); 167 | -------------------------------------------------------------------------------- /root/opt/config/www/lib/easing/easing.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],function($){return factory($)})}else if(typeof module==="object"&&typeof module.exports==="object"){exports=factory(require("jquery"))}else{factory(jQuery)}})(function($){$.easing["jswing"]=$.easing["swing"];var pow=Math.pow,sqrt=Math.sqrt,sin=Math.sin,cos=Math.cos,PI=Math.PI,c1=1.70158,c2=c1*1.525,c3=c1+1,c4=2*PI/3,c5=2*PI/4.5;function bounceOut(x){var n1=7.5625,d1=2.75;if(x<1/d1){return n1*x*x}else if(x<2/d1){return n1*(x-=1.5/d1)*x+.75}else if(x<2.5/d1){return n1*(x-=2.25/d1)*x+.9375}else{return n1*(x-=2.625/d1)*x+.984375}}$.extend($.easing,{def:"easeOutQuad",swing:function(x){return $.easing[$.easing.def](x)},easeInQuad:function(x){return x*x},easeOutQuad:function(x){return 1-(1-x)*(1-x)},easeInOutQuad:function(x){return x<.5?2*x*x:1-pow(-2*x+2,2)/2},easeInCubic:function(x){return x*x*x},easeOutCubic:function(x){return 1-pow(1-x,3)},easeInOutCubic:function(x){return x<.5?4*x*x*x:1-pow(-2*x+2,3)/2},easeInQuart:function(x){return x*x*x*x},easeOutQuart:function(x){return 1-pow(1-x,4)},easeInOutQuart:function(x){return x<.5?8*x*x*x*x:1-pow(-2*x+2,4)/2},easeInQuint:function(x){return x*x*x*x*x},easeOutQuint:function(x){return 1-pow(1-x,5)},easeInOutQuint:function(x){return x<.5?16*x*x*x*x*x:1-pow(-2*x+2,5)/2},easeInSine:function(x){return 1-cos(x*PI/2)},easeOutSine:function(x){return sin(x*PI/2)},easeInOutSine:function(x){return-(cos(PI*x)-1)/2},easeInExpo:function(x){return x===0?0:pow(2,10*x-10)},easeOutExpo:function(x){return x===1?1:1-pow(2,-10*x)},easeInOutExpo:function(x){return x===0?0:x===1?1:x<.5?pow(2,20*x-10)/2:(2-pow(2,-20*x+10))/2},easeInCirc:function(x){return 1-sqrt(1-pow(x,2))},easeOutCirc:function(x){return sqrt(1-pow(x-1,2))},easeInOutCirc:function(x){return x<.5?(1-sqrt(1-pow(2*x,2)))/2:(sqrt(1-pow(-2*x+2,2))+1)/2},easeInElastic:function(x){return x===0?0:x===1?1:-pow(2,10*x-10)*sin((x*10-10.75)*c4)},easeOutElastic:function(x){return x===0?0:x===1?1:pow(2,-10*x)*sin((x*10-.75)*c4)+1},easeInOutElastic:function(x){return x===0?0:x===1?1:x<.5?-(pow(2,20*x-10)*sin((20*x-11.125)*c5))/2:pow(2,-20*x+10)*sin((20*x-11.125)*c5)/2+1},easeInBack:function(x){return c3*x*x*x-c1*x*x},easeOutBack:function(x){return 1+c3*pow(x-1,3)+c1*pow(x-1,2)},easeInOutBack:function(x){return x<.5?pow(2*x,2)*((c2+1)*2*x-c2)/2:(pow(2*x-2,2)*((c2+1)*(x*2-2)+c2)+2)/2},easeInBounce:function(x){return 1-bounceOut(1-x)},easeOutBounce:bounceOut,easeInOutBounce:function(x){return x<.5?(1-bounceOut(1-2*x))/2:(1+bounceOut(2*x-1))/2}})}); -------------------------------------------------------------------------------- /root/opt/config/www/lib/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/lib/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /root/opt/config/www/lib/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/lib/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /root/opt/config/www/lib/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/lib/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /root/opt/config/www/lib/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/lib/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /root/opt/config/www/lib/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/root/opt/config/www/lib/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /root/opt/config/www/lib/jquery/jquery-migrate.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Migrate v3.0.0 | (c) jQuery Foundation and other contributors | jquery.org/license */ 2 | "undefined"==typeof jQuery.migrateMute&&(jQuery.migrateMute=!0),function(a,b){"use strict";function c(c){var d=b.console;e[c]||(e[c]=!0,a.migrateWarnings.push(c),d&&d.warn&&!a.migrateMute&&(d.warn("JQMIGRATE: "+c),a.migrateTrace&&d.trace&&d.trace()))}function d(a,b,d,e){Object.defineProperty(a,b,{configurable:!0,enumerable:!0,get:function(){return c(e),d}})}a.migrateVersion="3.0.0",function(){var c=b.console&&b.console.log&&function(){b.console.log.apply(b.console,arguments)},d=/^[12]\./;c&&(a&&!d.test(a.fn.jquery)||c("JQMIGRATE: jQuery 3.0.0+ REQUIRED"),a.migrateWarnings&&c("JQMIGRATE: Migrate plugin loaded multiple times"),c("JQMIGRATE: Migrate is installed"+(a.migrateMute?"":" with logging active")+", version "+a.migrateVersion))}();var e={};a.migrateWarnings=[],void 0===a.migrateTrace&&(a.migrateTrace=!0),a.migrateReset=function(){e={},a.migrateWarnings.length=0},"BackCompat"===document.compatMode&&c("jQuery is not compatible with Quirks Mode");var f=a.fn.init,g=a.isNumeric,h=a.find,i=/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,j=/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g;a.fn.init=function(a){var b=Array.prototype.slice.call(arguments);return"string"==typeof a&&"#"===a&&(c("jQuery( '#' ) is not a valid selector"),b[0]=[]),f.apply(this,b)},a.fn.init.prototype=a.fn,a.find=function(a){var b=Array.prototype.slice.call(arguments);if("string"==typeof a&&i.test(a))try{document.querySelector(a)}catch(d){a=a.replace(j,function(a,b,c,d){return"["+b+c+'"'+d+'"]'});try{document.querySelector(a),c("Attribute selector with '#' must be quoted: "+b[0]),b[0]=a}catch(e){c("Attribute selector with '#' was not fixed: "+b[0])}}return h.apply(this,b)};var k;for(k in h)Object.prototype.hasOwnProperty.call(h,k)&&(a.find[k]=h[k]);a.fn.size=function(){return c("jQuery.fn.size() is deprecated; use the .length property"),this.length},a.parseJSON=function(){return c("jQuery.parseJSON is deprecated; use JSON.parse"),JSON.parse.apply(null,arguments)},a.isNumeric=function(b){function d(b){var c=b&&b.toString();return!a.isArray(b)&&c-parseFloat(c)+1>=0}var e=g(b),f=d(b);return e!==f&&c("jQuery.isNumeric() should not be called on constructed objects"),f},d(a,"unique",a.uniqueSort,"jQuery.unique is deprecated, use jQuery.uniqueSort"),d(a.expr,"filters",a.expr.pseudos,"jQuery.expr.filters is now jQuery.expr.pseudos"),d(a.expr,":",a.expr.pseudos,'jQuery.expr[":"] is now jQuery.expr.pseudos');var l=a.ajax;a.ajax=function(){var a=l.apply(this,arguments);return a.promise&&(d(a,"success",a.done,"jQXHR.success is deprecated and removed"),d(a,"error",a.fail,"jQXHR.error is deprecated and removed"),d(a,"complete",a.always,"jQXHR.complete is deprecated and removed")),a};var m=a.fn.removeAttr,n=a.fn.toggleClass,o=/\S+/g;a.fn.removeAttr=function(b){var d=this;return a.each(b.match(o),function(b,e){a.expr.match.bool.test(e)&&(c("jQuery.fn.removeAttr no longer sets boolean properties: "+e),d.prop(e,!1))}),m.apply(this,arguments)},a.fn.toggleClass=function(b){return void 0!==b&&"boolean"!=typeof b?n.apply(this,arguments):(c("jQuery.fn.toggleClass( boolean ) is deprecated"),this.each(function(){var c=this.getAttribute&&this.getAttribute("class")||"";c&&a.data(this,"__className__",c),this.setAttribute&&this.setAttribute("class",c||b===!1?"":a.data(this,"__className__")||"")}))};var p=!1;a.swap&&a.each(["height","width","reliableMarginRight"],function(b,c){var d=a.cssHooks[c]&&a.cssHooks[c].get;d&&(a.cssHooks[c].get=function(){var a;return p=!0,a=d.apply(this,arguments),p=!1,a})}),a.swap=function(a,b,d,e){var f,g,h={};p||c("jQuery.swap() is undocumented and deprecated");for(g in b)h[g]=a.style[g],a.style[g]=b[g];f=d.apply(a,e||[]);for(g in b)a.style[g]=h[g];return f};var q=a.data;a.data=function(b,d,e){var f;return d&&d!==a.camelCase(d)&&(f=a.hasData(b)&&q.call(this,b),f&&d in f)?(c("jQuery.data() always sets/gets camelCased names: "+d),arguments.length>2&&(f[d]=e),f[d]):q.apply(this,arguments)};var r=a.Tween.prototype.run;a.Tween.prototype.run=function(b){a.easing[this.easing].length>1&&(c('easing function "jQuery.easing.'+this.easing.toString()+'" should use only first argument'),a.easing[this.easing]=a.easing[this.easing].bind(a.easing,b,this.options.duration*b,0,1,this.options.duration)),r.apply(this,arguments)};var s=a.fn.load,t=a.event.fix;a.event.props=[],a.event.fixHooks={},a.event.fix=function(b){var d,e=b.type,f=this.fixHooks[e],g=a.event.props;if(g.length)for(c("jQuery.event.props are deprecated and removed: "+g.join());g.length;)a.event.addProp(g.pop());if(f&&!f._migrated_&&(f._migrated_=!0,c("jQuery.event.fixHooks are deprecated and removed: "+e),(g=f.props)&&g.length))for(;g.length;)a.event.addProp(g.pop());return d=t.call(this,b),f&&f.filter?f.filter(d,b):d},a.each(["load","unload","error"],function(b,d){a.fn[d]=function(){var a=Array.prototype.slice.call(arguments,0);return"load"===d&&"string"==typeof a[0]?s.apply(this,a):(c("jQuery.fn."+d+"() is deprecated"),a.splice(0,0,d),arguments.length?this.on.apply(this,a):(this.triggerHandler.apply(this,a),this))}}),a(function(){a(document).triggerHandler("ready")}),a.event.special.ready={setup:function(){this===document&&c("'ready' event is deprecated")}},a.fn.extend({bind:function(a,b,d){return c("jQuery.fn.bind() is deprecated"),this.on(a,null,b,d)},unbind:function(a,b){return c("jQuery.fn.unbind() is deprecated"),this.off(a,null,b)},delegate:function(a,b,d,e){return c("jQuery.fn.delegate() is deprecated"),this.on(b,a,d,e)},undelegate:function(a,b,d){return c("jQuery.fn.undelegate() is deprecated"),1===arguments.length?this.off(a,"**"):this.off(b,a||"**",d)}});var u=a.fn.offset;a.fn.offset=function(){var b,d=this[0],e={top:0,left:0};return d&&d.nodeType?(b=(d.ownerDocument||document).documentElement,a.contains(b,d)?u.apply(this,arguments):(c("jQuery.fn.offset() requires an element connected to a document"),e)):(c("jQuery.fn.offset() requires a valid DOM element"),e)};var v=a.param;a.param=function(b,d){var e=a.ajaxSettings&&a.ajaxSettings.traditional;return void 0===d&&e&&(c("jQuery.param() no longer uses jQuery.ajaxSettings.traditional"),d=e),v.call(this,b,d)};var w=a.fn.andSelf||a.fn.addBack;a.fn.andSelf=function(){return c("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)};var x=a.Deferred,y=[["resolve","done",a.Callbacks("once memory"),a.Callbacks("once memory"),"resolved"],["reject","fail",a.Callbacks("once memory"),a.Callbacks("once memory"),"rejected"],["notify","progress",a.Callbacks("memory"),a.Callbacks("memory")]];a.Deferred=function(b){var d=x(),e=d.promise();return d.pipe=e.pipe=function(){var b=arguments;return c("deferred.pipe() is deprecated"),a.Deferred(function(c){a.each(y,function(f,g){var h=a.isFunction(b[f])&&b[f];d[g[1]](function(){var b=h&&h.apply(this,arguments);b&&a.isFunction(b.promise)?b.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[g[0]+"With"](this===e?c.promise():this,h?[b]:arguments)})}),b=null}).promise()},b&&b.call(d,d),d}}(jQuery,window); -------------------------------------------------------------------------------- /root/opt/config/www/lib/morphext/morphext.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Morphext - Text Rotating Plugin for jQuery 3 | * https://github.com/MrSaints/Morphext 4 | * 5 | * Built on jQuery Boilerplate 6 | * http://jqueryboilerplate.com/ 7 | * 8 | * Copyright 2014 Ian Lai and other contributors 9 | * Released under the MIT license 10 | * http://ian.mit-license.org/ 11 | */ 12 | 13 | /*eslint-env browser */ 14 | /*global jQuery:false */ 15 | /*eslint-disable no-underscore-dangle */ 16 | 17 | (function ($) { 18 | "use strict"; 19 | 20 | var pluginName = "Morphext", 21 | defaults = { 22 | animation: "bounceIn", 23 | separator: ",", 24 | speed: 2000, 25 | complete: $.noop 26 | }; 27 | 28 | function Plugin (element, options) { 29 | this.element = $(element); 30 | 31 | this.settings = $.extend({}, defaults, options); 32 | this._defaults = defaults; 33 | this._init(); 34 | } 35 | 36 | Plugin.prototype = { 37 | _init: function () { 38 | var $that = this; 39 | this.phrases = []; 40 | 41 | this.element.addClass("morphext"); 42 | 43 | $.each(this.element.text().split(this.settings.separator), function (key, value) { 44 | $that.phrases.push($.trim(value)); 45 | }); 46 | 47 | this.index = -1; 48 | this.animate(); 49 | this.start(); 50 | }, 51 | animate: function () { 52 | this.index = ++this.index % this.phrases.length; 53 | this.element[0].innerHTML = "" + this.phrases[this.index] + ""; 54 | 55 | if ($.isFunction(this.settings.complete)) { 56 | this.settings.complete.call(this); 57 | } 58 | }, 59 | start: function () { 60 | var $that = this; 61 | this._interval = setInterval(function () { 62 | $that.animate(); 63 | }, this.settings.speed); 64 | }, 65 | stop: function () { 66 | this._interval = clearInterval(this._interval); 67 | } 68 | }; 69 | 70 | $.fn[pluginName] = function (options) { 71 | return this.each(function() { 72 | if (!$.data(this, "plugin_" + pluginName)) { 73 | $.data(this, "plugin_" + pluginName, new Plugin(this, options)); 74 | } 75 | }); 76 | }; 77 | })(jQuery); 78 | -------------------------------------------------------------------------------- /root/opt/config/www/lib/morphext/morphext.min.js: -------------------------------------------------------------------------------- 1 | /*! Morphext - v2.4.4 - 2015-05-21 */!function(a){"use strict";function b(b,c){this.element=a(b),this.settings=a.extend({},d,c),this._defaults=d,this._init()}var c="Morphext",d={animation:"bounceIn",separator:",",speed:2e3,complete:a.noop};b.prototype={_init:function(){var b=this;this.phrases=[],this.element.addClass("morphext"),a.each(this.element.text().split(this.settings.separator),function(c,d){b.phrases.push(a.trim(d))}),this.index=-1,this.animate(),this.start()},animate:function(){this.index=++this.index%this.phrases.length,this.element[0].innerHTML=''+this.phrases[this.index]+"",a.isFunction(this.settings.complete)&&this.settings.complete.call(this)},start:function(){var a=this;this._interval=setInterval(function(){a.animate()},this.settings.speed)},stop:function(){this._interval=clearInterval(this._interval)}},a.fn[c]=function(d){return this.each(function(){a.data(this,"plugin_"+c)||a.data(this,"plugin_"+c,new b(this,d))})}}(jQuery); -------------------------------------------------------------------------------- /root/opt/config/www/lib/superfish/hoverIntent.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * hoverIntent v1.8.1 // 2014.08.11 // jQuery v1.9.1+ 3 | * http://briancherne.github.io/jquery-hoverIntent/ 4 | * 5 | * You may use hoverIntent under the terms of the MIT license. Basically that 6 | * means you are free to use hoverIntent as long as this header is left intact. 7 | * Copyright 2007, 2014 Brian Cherne 8 | */ 9 | 10 | /* hoverIntent is similar to jQuery's built-in "hover" method except that 11 | * instead of firing the handlerIn function immediately, hoverIntent checks 12 | * to see if the user's mouse has slowed down (beneath the sensitivity 13 | * threshold) before firing the event. The handlerOut function is only 14 | * called after a matching handlerIn. 15 | * 16 | * // basic usage ... just like .hover() 17 | * .hoverIntent( handlerIn, handlerOut ) 18 | * .hoverIntent( handlerInOut ) 19 | * 20 | * // basic usage ... with event delegation! 21 | * .hoverIntent( handlerIn, handlerOut, selector ) 22 | * .hoverIntent( handlerInOut, selector ) 23 | * 24 | * // using a basic configuration object 25 | * .hoverIntent( config ) 26 | * 27 | * @param handlerIn function OR configuration object 28 | * @param handlerOut function OR selector for delegation OR undefined 29 | * @param selector selector OR undefined 30 | * @author Brian Cherne 31 | */ 32 | 33 | ;(function(factory) { 34 | 'use strict'; 35 | if (typeof define === 'function' && define.amd) { 36 | define(['jquery'], factory); 37 | } else if (jQuery && !jQuery.fn.hoverIntent) { 38 | factory(jQuery); 39 | } 40 | })(function($) { 41 | 'use strict'; 42 | 43 | // default configuration values 44 | var _cfg = { 45 | interval: 100, 46 | sensitivity: 6, 47 | timeout: 0 48 | }; 49 | 50 | // counter used to generate an ID for each instance 51 | var INSTANCE_COUNT = 0; 52 | 53 | // current X and Y position of mouse, updated during mousemove tracking (shared across instances) 54 | var cX, cY; 55 | 56 | // saves the current pointer position coordinates based on the given mousemove event 57 | var track = function(ev) { 58 | cX = ev.pageX; 59 | cY = ev.pageY; 60 | }; 61 | 62 | // compares current and previous mouse positions 63 | var compare = function(ev,$el,s,cfg) { 64 | // compare mouse positions to see if pointer has slowed enough to trigger `over` function 65 | if ( Math.sqrt( (s.pX-cX)*(s.pX-cX) + (s.pY-cY)*(s.pY-cY) ) < cfg.sensitivity ) { 66 | $el.off(s.event,track); 67 | delete s.timeoutId; 68 | // set hoverIntent state as active for this element (permits `out` handler to trigger) 69 | s.isActive = true; 70 | // overwrite old mouseenter event coordinates with most recent pointer position 71 | ev.pageX = cX; ev.pageY = cY; 72 | // clear coordinate data from state object 73 | delete s.pX; delete s.pY; 74 | return cfg.over.apply($el[0],[ev]); 75 | } else { 76 | // set previous coordinates for next comparison 77 | s.pX = cX; s.pY = cY; 78 | // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs) 79 | s.timeoutId = setTimeout( function(){compare(ev, $el, s, cfg);} , cfg.interval ); 80 | } 81 | }; 82 | 83 | // triggers given `out` function at configured `timeout` after a mouseleave and clears state 84 | var delay = function(ev,$el,s,out) { 85 | delete $el.data('hoverIntent')[s.id]; 86 | return out.apply($el[0],[ev]); 87 | }; 88 | 89 | $.fn.hoverIntent = function(handlerIn,handlerOut,selector) { 90 | // instance ID, used as a key to store and retrieve state information on an element 91 | var instanceId = INSTANCE_COUNT++; 92 | 93 | // extend the default configuration and parse parameters 94 | var cfg = $.extend({}, _cfg); 95 | if ( $.isPlainObject(handlerIn) ) { 96 | cfg = $.extend(cfg, handlerIn); 97 | if ( !$.isFunction(cfg.out) ) { 98 | cfg.out = cfg.over; 99 | } 100 | } else if ( $.isFunction(handlerOut) ) { 101 | cfg = $.extend(cfg, { over: handlerIn, out: handlerOut, selector: selector } ); 102 | } else { 103 | cfg = $.extend(cfg, { over: handlerIn, out: handlerIn, selector: handlerOut } ); 104 | } 105 | 106 | // A private function for handling mouse 'hovering' 107 | var handleHover = function(e) { 108 | // cloned event to pass to handlers (copy required for event object to be passed in IE) 109 | var ev = $.extend({},e); 110 | 111 | // the current target of the mouse event, wrapped in a jQuery object 112 | var $el = $(this); 113 | 114 | // read hoverIntent data from element (or initialize if not present) 115 | var hoverIntentData = $el.data('hoverIntent'); 116 | if (!hoverIntentData) { $el.data('hoverIntent', (hoverIntentData = {})); } 117 | 118 | // read per-instance state from element (or initialize if not present) 119 | var state = hoverIntentData[instanceId]; 120 | if (!state) { hoverIntentData[instanceId] = state = { id: instanceId }; } 121 | 122 | // state properties: 123 | // id = instance ID, used to clean up data 124 | // timeoutId = timeout ID, reused for tracking mouse position and delaying "out" handler 125 | // isActive = plugin state, true after `over` is called just until `out` is called 126 | // pX, pY = previously-measured pointer coordinates, updated at each polling interval 127 | // event = string representing the namespaced event used for mouse tracking 128 | 129 | // clear any existing timeout 130 | if (state.timeoutId) { state.timeoutId = clearTimeout(state.timeoutId); } 131 | 132 | // namespaced event used to register and unregister mousemove tracking 133 | var mousemove = state.event = 'mousemove.hoverIntent.hoverIntent'+instanceId; 134 | 135 | // handle the event, based on its type 136 | if (e.type === 'mouseenter') { 137 | // do nothing if already active 138 | if (state.isActive) { return; } 139 | // set "previous" X and Y position based on initial entry point 140 | state.pX = ev.pageX; state.pY = ev.pageY; 141 | // update "current" X and Y position based on mousemove 142 | $el.off(mousemove,track).on(mousemove,track); 143 | // start polling interval (self-calling timeout) to compare mouse coordinates over time 144 | state.timeoutId = setTimeout( function(){compare(ev,$el,state,cfg);} , cfg.interval ); 145 | } else { // "mouseleave" 146 | // do nothing if not already active 147 | if (!state.isActive) { return; } 148 | // unbind expensive mousemove event 149 | $el.off(mousemove,track); 150 | // if hoverIntent state is true, then call the mouseOut function after the specified delay 151 | state.timeoutId = setTimeout( function(){delay(ev,$el,state,cfg.out);} , cfg.timeout ); 152 | } 153 | }; 154 | 155 | // listen for mouseenter and mouseleave 156 | return this.on({'mouseenter.hoverIntent':handleHover,'mouseleave.hoverIntent':handleHover}, cfg.selector); 157 | }; 158 | }); 159 | -------------------------------------------------------------------------------- /root/opt/config/www/lib/superfish/superfish.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery Superfish Menu Plugin - v1.7.9 3 | * Copyright (c) 2016 Joel Birch 4 | * 5 | * Dual licensed under the MIT and GPL licenses: 6 | * http://www.opensource.org/licenses/mit-license.php 7 | * http://www.gnu.org/licenses/gpl.html 8 | */ 9 | 10 | ;!function(a,b){"use strict";var c=function(){var c={bcClass:"sf-breadcrumb",menuClass:"sf-js-enabled",anchorClass:"sf-with-ul",menuArrowClass:"sf-arrows"},d=function(){var b=/^(?![\w\W]*Windows Phone)[\w\W]*(iPhone|iPad|iPod)/i.test(navigator.userAgent);return b&&a("html").css("cursor","pointer").on("click",a.noop),b}(),e=function(){var a=document.documentElement.style;return"behavior"in a&&"fill"in a&&/iemobile/i.test(navigator.userAgent)}(),f=function(){return!!b.PointerEvent}(),g=function(a,b,d){var e,f=c.menuClass;b.cssArrows&&(f+=" "+c.menuArrowClass),e=d?"addClass":"removeClass",a[e](f)},h=function(b,d){return b.find("li."+d.pathClass).slice(0,d.pathLevels).addClass(d.hoverClass+" "+c.bcClass).filter(function(){return a(this).children(d.popUpSelector).hide().show().length}).removeClass(d.pathClass)},i=function(a,b){var d=b?"addClass":"removeClass";a.children("a")[d](c.anchorClass)},j=function(a){var b=a.css("ms-touch-action"),c=a.css("touch-action");c=c||b,c="pan-y"===c?"auto":"pan-y",a.css({"ms-touch-action":c,"touch-action":c})},k=function(a){return a.closest("."+c.menuClass)},l=function(a){return k(a).data("sfOptions")},m=function(){var b=a(this),c=l(b);clearTimeout(c.sfTimer),b.siblings().superfish("hide").end().superfish("show")},n=function(b){b.retainPath=a.inArray(this[0],b.$path)>-1,this.superfish("hide"),this.parents("."+b.hoverClass).length||(b.onIdle.call(k(this)),b.$path.length&&a.proxy(m,b.$path)())},o=function(){var b=a(this),c=l(b);d?a.proxy(n,b,c)():(clearTimeout(c.sfTimer),c.sfTimer=setTimeout(a.proxy(n,b,c),c.delay))},p=function(b){var c=a(this),d=l(c),e=c.siblings(b.data.popUpSelector);return d.onHandleTouch.call(e)===!1?this:void(e.length>0&&e.is(":hidden")&&(c.one("click.superfish",!1),"MSPointerDown"===b.type||"pointerdown"===b.type?c.trigger("focus"):a.proxy(m,c.parent("li"))()))},q=function(b,c){var g="li:has("+c.popUpSelector+")";a.fn.hoverIntent&&!c.disableHI?b.hoverIntent(m,o,g):b.on("mouseenter.superfish",g,m).on("mouseleave.superfish",g,o);var h="MSPointerDown.superfish";f&&(h="pointerdown.superfish"),d||(h+=" touchend.superfish"),e&&(h+=" mousedown.superfish"),b.on("focusin.superfish","li",m).on("focusout.superfish","li",o).on(h,"a",c,p)};return{hide:function(b){if(this.length){var c=this,d=l(c);if(!d)return this;var e=d.retainPath===!0?d.$path:"",f=c.find("li."+d.hoverClass).add(this).not(e).removeClass(d.hoverClass).children(d.popUpSelector),g=d.speedOut;if(b&&(f.show(),g=0),d.retainPath=!1,d.onBeforeHide.call(f)===!1)return this;f.stop(!0,!0).animate(d.animationOut,g,function(){var b=a(this);d.onHide.call(b)})}return this},show:function(){var a=l(this);if(!a)return this;var b=this.addClass(a.hoverClass),c=b.children(a.popUpSelector);return a.onBeforeShow.call(c)===!1?this:(c.stop(!0,!0).animate(a.animation,a.speed,function(){a.onShow.call(c)}),this)},destroy:function(){return this.each(function(){var b,d=a(this),e=d.data("sfOptions");return e?(b=d.find(e.popUpSelector).parent("li"),clearTimeout(e.sfTimer),g(d,e),i(b),j(d),d.off(".superfish").off(".hoverIntent"),b.children(e.popUpSelector).attr("style",function(a,b){return b.replace(/display[^;]+;?/g,"")}),e.$path.removeClass(e.hoverClass+" "+c.bcClass).addClass(e.pathClass),d.find("."+e.hoverClass).removeClass(e.hoverClass),e.onDestroy.call(d),void d.removeData("sfOptions")):!1})},init:function(b){return this.each(function(){var d=a(this);if(d.data("sfOptions"))return!1;var e=a.extend({},a.fn.superfish.defaults,b),f=d.find(e.popUpSelector).parent("li");e.$path=h(d,e),d.data("sfOptions",e),g(d,e,!0),i(f,!0),j(d),q(d,e),f.not("."+c.bcClass).superfish("hide",!0),e.onInit.call(this)})}}}();a.fn.superfish=function(b,d){return c[b]?c[b].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof b&&b?a.error("Method "+b+" does not exist on jQuery.fn.superfish"):c.init.apply(this,arguments)},a.fn.superfish.defaults={popUpSelector:"ul,.sf-mega",hoverClass:"sfHover",pathClass:"overrideThisToUse",pathLevels:1,delay:800,animation:{opacity:"show"},animationOut:{opacity:"hide"},speed:"normal",speedOut:"fast",cssArrows:!0,disableHI:!1,onInit:a.noop,onBeforeShow:a.noop,onShow:a.noop,onBeforeHide:a.noop,onHide:a.noop,onIdle:a.noop,onDestroy:a.noop,onHandleTouch:a.noop}}(jQuery,window); -------------------------------------------------------------------------------- /root/opt/f2b/fail2ban.local: -------------------------------------------------------------------------------- 1 | # NowShowing Fail2Ban config 2 | # 3 | # [Definition] 4 | # loglevel = DEBUG 5 | # 6 | 7 | [Definition] 8 | 9 | # Option: loglevel 10 | # Notes.: Set the log level output. 11 | # CRITICAL 12 | # ERROR 13 | # WARNING 14 | # NOTICE 15 | # INFO 16 | # DEBUG 17 | # Values: [ LEVEL ] Default: ERROR 18 | # 19 | loglevel = INFO 20 | 21 | # Option: logtarget 22 | # Notes.: Set the log target. This could be a file, SYSLOG, STDERR or STDOUT. 23 | # Only one log target can be specified. 24 | # If you change logtarget from the default value and you are 25 | # using logrotate -- also adjust or disable rotation in the 26 | # corresponding configuration file 27 | # (e.g. /etc/logrotate.d/fail2ban on Debian systems) 28 | # Values: [ STDOUT | STDERR | SYSLOG | FILE ] Default: STDERR 29 | # 30 | logtarget = /config/logs/fail2ban.log 31 | 32 | # Option: syslogsocket 33 | # Notes: Set the syslog socket file. Only used when logtarget is SYSLOG 34 | # auto uses platform.system() to determine predefined paths 35 | # Values: [ auto | FILE ] Default: auto 36 | syslogsocket = auto 37 | 38 | # Option: socket 39 | # Notes.: Set the socket file. This is used to communicate with the daemon. Do 40 | # not remove this file when Fail2ban runs. It will not be possible to 41 | # communicate with the server afterwards. 42 | # Values: [ FILE ] Default: /var/run/fail2ban/fail2ban.sock 43 | # 44 | socket = /var/run/fail2ban/fail2ban.sock 45 | 46 | # Option: pidfile 47 | # Notes.: Set the PID file. This is used to store the process ID of the 48 | # fail2ban server. 49 | # Values: [ FILE ] Default: /var/run/fail2ban/fail2ban.pid 50 | # 51 | pidfile = /var/run/fail2ban/fail2ban.pid 52 | 53 | # Options: dbfile 54 | # Notes.: Set the file for the fail2ban persistent data to be stored. 55 | # A value of ":memory:" means database is only stored in memory 56 | # and data is lost when fail2ban is stopped. 57 | # A value of "None" disables the database. 58 | # Values: [ None :memory: FILE ] Default: /var/lib/fail2ban/fail2ban.sqlite3 59 | dbfile = None 60 | 61 | # Options: dbpurgeage 62 | # Notes.: Sets age at which bans should be purged from the database 63 | # Values: [ SECONDS ] Default: 86400 (24hours) 64 | # dbpurgeage = 1d 65 | -------------------------------------------------------------------------------- /root/opt/f2b/iptables-common.conf: -------------------------------------------------------------------------------- 1 | # Fail2Ban configuration file 2 | # 3 | # Author: Daniel Black 4 | # 5 | # This is a included configuration file and includes the definitions for the iptables 6 | # used in all iptables based actions by default. 7 | # 8 | # The user can override the defaults in iptables-common.local 9 | # 10 | # Modified: Alexander Koeppe , Serg G. Brester 11 | # made config file IPv6 capable (see new section Init?family=inet6) 12 | 13 | [INCLUDES] 14 | 15 | after = iptables-blocktype.local 16 | iptables-common.local 17 | # iptables-blocktype.local is obsolete 18 | 19 | 20 | [Init] 21 | 22 | # Option: chain 23 | # Notes specifies the iptables chain to which the Fail2Ban rules should be 24 | # added 25 | # Values: STRING Default: INPUT 26 | chain = INPUT 27 | 28 | # Default name of the chain 29 | # 30 | name = default 31 | 32 | # Option: port 33 | # Notes.: specifies port to monitor 34 | # Values: [ NUM | STRING ] Default: 35 | # 36 | port = ssh 37 | 38 | # Option: protocol 39 | # Notes.: internally used by config reader for interpolations. 40 | # Values: [ tcp | udp | icmp | all ] Default: tcp 41 | # 42 | protocol = tcp 43 | 44 | # Option: blocktype 45 | # Note: This is what the action does with rules. This can be any jump target 46 | # as per the iptables man page (section 8). Common values are DROP 47 | # REJECT, REJECT --reject-with icmp-port-unreachable 48 | # Values: STRING 49 | blocktype = REJECT --reject-with icmp-port-unreachable 50 | 51 | # Option: returntype 52 | # Note: This is the default rule on "actionstart". This should be RETURN 53 | # in all (blocking) actions, except REJECT in allowing actions. 54 | # Values: STRING 55 | returntype = RETURN 56 | 57 | # Option: lockingopt 58 | # Notes.: Option was introduced to iptables to prevent multiple instances from 59 | # running concurrently and causing irratic behavior. -w was introduced 60 | # in iptables 1.4.20, so might be absent on older systems 61 | # See https://github.com/fail2ban/fail2ban/issues/1122 62 | # Values: STRING 63 | lockingopt = -w 64 | 65 | # Option: iptables 66 | # Notes.: Actual command to be executed, including common to all calls options 67 | # Values: STRING 68 | iptables = iptables 69 | 70 | 71 | #[Init?family=inet6] 72 | 73 | # Option: blocktype (ipv6) 74 | # Note: This is what the action does with rules. This can be any jump target 75 | # as per the iptables man page (section 8). Common values are DROP 76 | # REJECT, REJECT --reject-with icmp6-port-unreachable 77 | # Values: STRING 78 | #blocktype = REJECT --reject-with icmp6-port-unreachable 79 | 80 | # Option: iptables (ipv6) 81 | # Notes.: Actual command to be executed, including common to all calls options 82 | # Values: STRING 83 | #iptables = ip6tables 84 | 85 | -------------------------------------------------------------------------------- /root/opt/f2b/jail.local: -------------------------------------------------------------------------------- 1 | # NowShowing Jail 2 | # 3 | # The DEFAULT allows a global definition of the options. They can be overridden 4 | # in each jail afterwards. 5 | 6 | [DEFAULT] 7 | 8 | # 9 | # MISCELLANEOUS OPTIONS 10 | # 11 | 12 | # "usedns" specifies if jails should trust hostnames in logs, 13 | # warn when DNS lookups are performed, or ignore all hostnames in logs 14 | # 15 | # yes: if a hostname is encountered, a DNS lookup will be performed. 16 | # warn: if a hostname is encountered, a DNS lookup will be performed, 17 | # but it will be logged as a warning. 18 | # no: if a hostname is encountered, will not be used for banning, 19 | # but it will be logged as info. 20 | # raw: use raw value (no hostname), allow use it for no-host filters/actions (example user) 21 | usedns = warn 22 | 23 | # "logencoding" specifies the encoding of the log files handled by the jail 24 | # This is used to decode the lines from the log file. 25 | # Typical examples: "ascii", "utf-8" 26 | # auto: will use the system locale setting 27 | logencoding = auto 28 | 29 | #defaul disable jail rule 30 | enabled = false 31 | 32 | # 33 | # ACTIONS 34 | # 35 | 36 | # Specify chain where jumps would need to be added in iptables-* actions 37 | chain = INPUT 38 | 39 | # Format of user-agent https://tools.ietf.org/html/rfc7231#section-5.5.3 40 | fail2ban_agent = Fail2Ban/%(fail2ban_version)s 41 | 42 | # 43 | # JAILS 44 | # 45 | 46 | [nowshowing] 47 | enabled = true 48 | filter = nowshowing 49 | action = iptables[name=NOWSHOWING, port="6878", protocol=TCP] 50 | logpath = /config/logs/lighttpd_access.log 51 | bantime = 10m 52 | findtime = 5m 53 | maxretry = 15 54 | backend = polling 55 | ignoreip = 127.0.0.1/8 ::1 56 | -------------------------------------------------------------------------------- /root/opt/f2b/nowshowing.conf: -------------------------------------------------------------------------------- 1 | [Definition] 2 | failregex = ^ .* "POST /admin 3 | ignoreregex = 4 | -------------------------------------------------------------------------------- /root/opt/gem/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'json', '1.8.2' 4 | gem 'httparty', '0.13.1' 5 | gem 'mail', '2.6.3' 6 | gem 'logger', '1.2.8' 7 | gem 'highline', '1.7.1' 8 | gem 'i18n', '0.7.0' 9 | -------------------------------------------------------------------------------- /root/opt/gem/Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | highline (1.7.1) 5 | httparty (0.13.1) 6 | json (1.8.2) 7 | multi_xml (>= 0.5.2) 8 | i18n (0.7.0) 9 | json (1.8.2) 10 | logger (1.2.8) 11 | mail (2.6.3) 12 | mime-types (>= 1.16, < 3) 13 | mime-types (2.4.3) 14 | multi_xml (0.5.5) 15 | 16 | PLATFORMS 17 | ruby 18 | 19 | DEPENDENCIES 20 | highline (= 1.7.1) 21 | httparty (= 0.13.1) 22 | i18n (= 0.7.0) 23 | json (= 1.8.2) 24 | logger (= 1.2.8) 25 | mail (= 2.6.3) 26 | -------------------------------------------------------------------------------- /root/opt/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Now Showing 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Admin 43 | 46 |
47 |
48 |
49 | 53 | 54 |

55 |

Just added: Laughs, Screams, Thrills, Entertainment

56 |
57 | New Movies 58 | New Episodes 59 | New Seasons 60 | 61 |
62 |
63 |
64 |
65 | 66 | 69 | 91 | 92 | 95 |
96 | 97 | 98 | 99 | 100 |
101 | 102 |
103 | 104 |
105 | 106 | 107 |
108 |

THIS WILL BE UPDATED AFTER YOU RUN YOUR FIRST REPORT!

109 |

Click here to access the admin page.

110 | 111 |
112 | 113 | 114 |

115 | 116 |
117 | 118 |
119 | 120 | 121 | 122 | 123 |
124 | 125 | 126 | 127 |
128 | 129 | 130 |
131 | 132 |
133 | 134 | 135 | 138 |
139 | 140 | 141 | 142 | 143 | 144 |
145 | 146 | 149 |
150 | 151 | 152 | 153 | 154 | 155 | 156 |
157 | 158 | 159 | 162 |
163 |
164 |
165 |
166 | 169 |
170 |
171 | Art, summaries, and metadata provided by themoviedb.org and thetvdb.com

172 |
173 |
174 |
175 |
176 |
177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | -------------------------------------------------------------------------------- /root/opt/php/changepass.php: -------------------------------------------------------------------------------- 1 | '$pass'"; 11 | file_put_contents($login_file , implode("\n", $lines)); 12 | } 13 | else { 14 | echo "Fill in username/password fields"; 15 | } 16 | 17 | # delete cookie and logout 18 | setcookie("NowShowing", '', -1, '/'); 19 | header("Location: http://".$_SERVER['HTTP_HOST']."/admin"); 20 | exit; 21 | } 22 | exit; 23 | ?> 24 | -------------------------------------------------------------------------------- /root/opt/php/loadadvanced.php: -------------------------------------------------------------------------------- 1 | New Version Available!
Update your docker image for latest $cur_ver release."; 49 | } 50 | else { 51 | $update_available = ""; 52 | } 53 | ?> 54 | -------------------------------------------------------------------------------- /root/opt/php/randomPass.php: -------------------------------------------------------------------------------- 1 | \'$pass\'/\" /config/cfg/secure.php"); 15 | ?> -------------------------------------------------------------------------------- /root/opt/php/reset.php: -------------------------------------------------------------------------------- 1 | 21 | 22 | -------------------------------------------------------------------------------- /root/opt/php/run_announcement.php: -------------------------------------------------------------------------------- 1 | 48 | -------------------------------------------------------------------------------- /root/opt/php/run_gettoken_pipes.php: -------------------------------------------------------------------------------- 1 | array("pipe", "r"), // stdin is a pipe that the child will read from 9 | 1 => array("pipe", "w"), // stdout is a pipe that the child will write to 10 | 2 => array("file", "/config/logs/plex_token_errors.log", "a") // stderr is a file to write to 11 | ); 12 | $process = proc_open('ruby /usr/local/sbin/gettoken-pipes', $descriptorspec, $pipes); 13 | 14 | if (is_resource($process)) { 15 | $userpass = strip_tags($_POST['plex_username']) . '|+/+/+|' . strip_tags($_POST['plex_password']); 16 | fwrite($pipes[0], $userpass); 17 | fclose($pipes[0]); 18 | 19 | $stream = stream_get_contents($pipes[1]); 20 | $stream = str_replace("\n", '', $stream); 21 | $stream = explode(" ",$stream); 22 | $token = $stream[0]; 23 | $avatar = isset($stream[1]) ? $stream[1] : ""; 24 | fclose($pipes[1]); 25 | proc_close($process); 26 | } 27 | 28 | if (!empty($token)) { 29 | # save token to advanced.yaml 30 | $adv_array = Spyc::YAMLLoad('../../cfg/advanced.yaml'); 31 | $adv_array['token'] = array('api_key' => $token); 32 | $adv_yaml = Spyc::YAMLDump($adv_array,2,0); 33 | file_put_contents($adv_file, $adv_yaml); 34 | 35 | # d/l gravatar avatar 36 | exec("wget $avatar -O /config/www/img/avatar.png"); 37 | 38 | $statustext = "Plex Token Saved!"; 39 | $tokenarray = array( 'token' => $token, 'statustext' => $statustext); 40 | echo json_encode($tokenarray); 41 | exit; 42 | } 43 | else { 44 | $statustext = "Error: Verify username/password!"; 45 | $tokenarray = array( 'statustext' => $statustext); 46 | echo json_encode($tokenarray); 47 | exit; 48 | } 49 | } 50 | echo "Check username/password!"; 51 | exit; 52 | ?> 53 | -------------------------------------------------------------------------------- /root/opt/php/run_ondemand_report.php: -------------------------------------------------------------------------------- 1 | 17 | 18 | -------------------------------------------------------------------------------- /root/opt/php/run_tautulli_check.php: -------------------------------------------------------------------------------- 1 | array("pipe", "r"), // stdin is a pipe that the child will read from 9 | 1 => array("pipe", "w"), // stdout is a pipe that the child will write to 10 | 2 => array("file", "/config/logs/nowshowing.log", "a") // stderr is a file to write to 11 | ); 12 | $process = proc_open('ruby /usr/local/sbin/tautulli_check', $descriptorspec, $pipes); 13 | 14 | if (is_resource($process)) { 15 | $stream = stream_get_contents($pipes[1]); 16 | $stream = str_replace("\n", '', $stream); 17 | $testy = isset($stream[0]) ? $stream[0] : "failed"; 18 | fclose($pipes[1]); 19 | proc_close($process); 20 | } 21 | 22 | if ($testy == "s") { 23 | echo "Successful!"; 24 | exit; 25 | } 26 | elseif ($testy == "e") { 27 | echo "Check API key!"; 28 | exit; 29 | } 30 | else { 31 | echo "Failed!"; 32 | exit; 33 | } 34 | } 35 | echo "Error: Could not divide by zero!"; 36 | exit; 37 | ?> 38 | -------------------------------------------------------------------------------- /root/opt/php/run_test_report.php: -------------------------------------------------------------------------------- 1 | 56 | 57 | -------------------------------------------------------------------------------- /root/opt/php/writeadvanced.php: -------------------------------------------------------------------------------- 1 | strip_tags($_POST['title']), 'image' => strip_tags($_POST['image']), 'footer' => strip_tags($_POST['footer']), 'language' => strip_tags($_POST['language'])); 51 | $adv_array['web'] = array('title_image' => strip_tags($_POST['title_image']), 'logo' => strip_tags($_POST['logo']), 'headline_title' => strip_tags($_POST['headline_title']), 'headliners' => strip_tags($_POST['headliners']), 'footer' => strip_tags($_POST['web_footer']), 'language' => strip_tags($_POST['web_language'])); 52 | $adv_array['plex'] = array('plex_user_emails' => strip_tags($_POST['plex_user_emails']), 'libraries_to_skip' => $libraries_to_skip, 'server' => strip_tags($_POST['server'])); 53 | $adv_array['mail'] = array('from' => strip_tags($_POST['from']), 'subject' => strip_tags($_POST['subject']), 'recipients_email' => $recipients_email, 'recipients' => $recipients, 'provider' => $provider, 'address' => $smtp_address, 'port' => $smtp_port, 'username' => strip_tags($_POST['email_username']), 'password' => $_POST['email_password']); 54 | $adv_array['report'] = array('interval' => strip_tags($_POST['interval']), 'report_type' => strip_tags($_POST['report_type']), 'email_report_time' => strip_tags($_POST['email_report_time']), 'web_report_time' => strip_tags($_POST['web_report_time']), 'extra_details' => strip_tags($_POST['extra_details']), 'test' => strip_tags($_POST['test'])); 55 | $adv_array['tautulli'] = array('server' => strip_tags($_POST['plexpy_server']), 'port' => strip_tags($_POST['plexpy_port']), 'https' => strip_tags($_POST['plexpy_https']), 'httproot' => strip_tags($_POST['plexpy_root']), 'api_key' => strip_tags($_POST['plexpy_api']), 'title' => strip_tags($_POST['plexpy_title']), 'stats' => strip_tags($stats)); 56 | $adv_array['token'] = array('api_key' => strip_tags($_POST['plex_token'])); 57 | 58 | $adv_yaml = Spyc::YAMLDump($adv_array,2,0); 59 | file_put_contents($adv_file, $adv_yaml); 60 | 61 | # delete current cron entries and creat new cron 62 | exec("/usr/local/sbin/create-cron && crontab /opt/nowshowing_schedule.cron"); 63 | 64 | #header("Location: index2.php"); 65 | #header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); 66 | #header("Location: http://".$_SERVER['HTTP_HOST']."/admin"); 67 | echo "Settings Saved!"; 68 | } 69 | else { 70 | echo "Error: Failed to save settings!"; 71 | } 72 | exit; 73 | ?> 74 | 75 | -------------------------------------------------------------------------------- /root/opt/php/writeannouncement.php: -------------------------------------------------------------------------------- 1 | 27 | -------------------------------------------------------------------------------- /root/opt/php/writesetup.php: -------------------------------------------------------------------------------- 1 | '$pass'"; 16 | file_put_contents($login_file , implode("\n", $lines)); 17 | 18 | # email provider selection 19 | switch ($provider) { 20 | case 'gmail': 21 | $smtp_address = 'smtp.gmail.com'; 22 | $smtp_port = '587'; 23 | break; 24 | case 'yahoo': 25 | $smtp_address = 'smtp.mail.yahoo.com'; 26 | $smtp_port = '587'; 27 | break; 28 | case 'microsoft': 29 | $smtp_address = 'smtp.live.com'; 30 | $smtp_port = '587'; 31 | break; 32 | case 'office365': 33 | $smtp_address = 'smtp.office365.com'; 34 | $smtp_port = '587'; 35 | break; 36 | case 'mail.com': 37 | $smtp_address = 'smtp.mail.com'; 38 | $smtp_port = '587'; 39 | break; 40 | case 'zoho': 41 | $smtp_address = 'smtp.zoho.com'; 42 | $smtp_port = '587'; 43 | break; 44 | case 'other': 45 | $smtp_address = strip_tags($_POST['smtp_address']); 46 | $smtp_port = strip_tags($_POST['smtp_port']); 47 | break; 48 | } 49 | 50 | # save main settings to advanced.yaml 51 | $adv_array['plex'] = array('plex_user_emails' => "yes", 'libraries_to_skip' => "", 'server' => strip_tags($_POST['server'])); 52 | $adv_array['mail'] = array('from' => "Plex Server", 'subject' => "Now Showing", 'recipients_email' => "", 'recipients' => "", 'provider' => $provider, 'address' => $smtp_address, 'port' => $smtp_port, 'username' => strip_tags($_POST['email_username']), 'password' => $_POST['email_password']); 53 | 54 | if (!empty($_POST['plex_token'])) { 55 | $adv_array['token'] = array('api_key' => strip_tags($_POST['plex_token'])); 56 | } 57 | 58 | $adv_yaml = Spyc::YAMLDump($adv_array,2,0); 59 | file_put_contents($adv_file, $adv_yaml); 60 | 61 | unlink('/config/www/admin/index.html'); 62 | unlink('/config/www/admin/gettoken-pipes-setup.php'); 63 | unlink('/config/www/admin/save_setup.php'); 64 | echo "Setup Completed!"; 65 | } 66 | else { 67 | echo "Error: Failed to finish setup!"; 68 | } 69 | exit; 70 | ?> 71 | 72 | -------------------------------------------------------------------------------- /root/usr/local/sbin/announcementreport: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | 3 | require 'rubygems' 4 | require 'time' 5 | require 'date' 6 | require 'yaml' 7 | require 'erb' 8 | require 'logger' 9 | require 'optparse' 10 | require 'pp' 11 | 12 | require_relative '/var/lib/nowshowing/plex' 13 | require_relative '/var/lib/nowshowing/mailAnnouncement' 14 | 15 | # Class for parsing the Plex server for new movies and TV Shows 16 | # 17 | # Author: Brian Stascavage 18 | # Email: brian@stascavage.com 19 | # Modified by: ninthwalker & GroxyPod 20 | # 21 | class Report 22 | $options = { 23 | :emails => true, 24 | :test_email => false, 25 | :debug => false 26 | } 27 | 28 | OptionParser.new do |opts| 29 | 30 | opts.on("-n", "--no-plex-email", "Do not send emails to Plex friends") do |opt| 31 | $options[:emails] = false 32 | end 33 | 34 | opts.on("-t", "--test-email", "Send email only to the Plex owner (ie yourself). For testing purposes") do |opt| 35 | $options[:test_email] = true 36 | end 37 | 38 | opts.on("-v", "--verbose", "Enable verbose debug logging") do |opt| 39 | $options[:verbose] = true 40 | end 41 | end.parse! 42 | 43 | def initialize 44 | begin 45 | $advanced = YAML.load_file('/config/cfg/advanced.yaml') 46 | $announcement = File.read('/config/announcement_body.html') 47 | 48 | # Log-rotate if greater than 25M 49 | logsize_ns = File.size('/config/logs/nowshowing.log') 50 | logsize_plx = File.size('/config/logs/plex_token_errors.log') 51 | 52 | if logsize_ns > 25000000 53 | File.delete('/config/logs/nowshowing.log') 54 | File.write('/config/logs/nowshowing.log', "") 55 | end 56 | if logsize_plx > 25000000 57 | File.delete('/config/logs/plex_token_errors.log') 58 | File.write('/config/logs/plex_token_errors.log', "") 59 | end 60 | 61 | rescue Errno::ENOENT => e 62 | abort('Configuration file not found. Exiting...') 63 | end 64 | 65 | begin 66 | $logger = Logger.new('/config/logs/nowshowing.log') 67 | 68 | if $options[:verbose] 69 | $logger.level = Logger::DEBUG 70 | else 71 | $logger.level = Logger::INFO 72 | end 73 | rescue 74 | abort('Log file not found. Exiting...') 75 | end 76 | end 77 | end 78 | 79 | # Main method that starts the report 80 | def main 81 | report = Report.new 82 | 83 | YAML.load_file('/config/cfg/advanced.yaml') 84 | template = ERB.new File.new("/opt/announcement_email_body.erb").read, nil, "%" 85 | mail = MailReport.new($advanced, $options) 86 | 87 | mail.sendMail(template.result(binding)) 88 | 89 | $logger.info("Announcement Email Sent.") 90 | end 91 | main() 92 | -------------------------------------------------------------------------------- /root/usr/local/sbin/create-cron: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | require 'yaml' 3 | 4 | #variables 5 | advanced = YAML.load_file('/config/cfg/advanced.yaml') 6 | reporttype = advanced['report']['report_type'] 7 | webtime = advanced['report']['web_report_time'] 8 | emailtime = advanced['report']['email_report_time'] 9 | details = advanced['report']['extra_details'] 10 | plexusers = advanced['plex']['plex_user_emails'] 11 | test = advanced['report']['test'] 12 | 13 | case 14 | when test == 'enable' 15 | File.write("/opt/nowshowing_schedule.cron", "#{emailtime} combinedreport -t &> /dev/null") 16 | 17 | when reporttype == 'both' && plexusers == 'yes' && details == 'yes' 18 | File.write("/opt/nowshowing_schedule.cron", "#{webtime} webreport -d &> /dev/null\n#{emailtime} emailreport -d &> /dev/null") 19 | 20 | when reporttype == 'both' && plexusers == 'yes' && details == 'no' 21 | File.write("/opt/nowshowing_schedule.cron", "#{webtime} webreport &> /dev/null\n#{emailtime} emailreport &> /dev/null") 22 | 23 | when reporttype == 'both' && plexusers == 'no' && details == 'yes' 24 | File.write("/opt/nowshowing_schedule.cron", "#{webtime} webreport -n -d &> /dev/null\n#{emailtime} emailreport -n -d &> /dev/null") 25 | 26 | when reporttype == 'both' && plexusers == 'no' && details == 'no' 27 | File.write("/opt/nowshowing_schedule.cron", "#{webtime} webreport -n &> /dev/null\n#{emailtime} emailreport -n &> /dev/null") 28 | 29 | when reporttype == 'emailonly' && plexusers == 'yes' && details == 'yes' 30 | File.write("/opt/nowshowing_schedule.cron", "#{emailtime} emailreport -d &> /dev/null") 31 | 32 | when reporttype == 'emailonly' && plexusers == 'yes' && details == 'no' 33 | File.write("/opt/nowshowing_schedule.cron", "#{emailtime} emailreport &> /dev/null") 34 | 35 | when reporttype == 'emailonly' && plexusers == 'no' && details == 'yes' 36 | File.write("/opt/nowshowing_schedule.cron", "#{emailtime} emailreport -n -d &> /dev/null") 37 | 38 | when reporttype == 'emailonly' && plexusers == 'no' && details == 'no' 39 | File.write("/opt/nowshowing_schedule.cron", "#{emailtime} emailreport -n &> /dev/null") 40 | 41 | when reporttype == 'webonly' && plexusers == 'yes' && details == 'yes' 42 | File.write("/opt/nowshowing_schedule.cron", "#{webtime} webreport -d &> /dev/null") 43 | 44 | when reporttype == 'webonly' && plexusers == 'yes' && details == 'no' 45 | File.write("/opt/nowshowing_schedule.cron", "#{webtime} webreport &> /dev/null") 46 | 47 | when reporttype == 'webonly' && plexusers == 'no' && details == 'yes' 48 | File.write("/opt/nowshowing_schedule.cron", "#{webtime} webreport -n -d &> /dev/null") 49 | 50 | when reporttype == 'webonly' && plexusers == 'no' && details == 'no' 51 | File.write("/opt/nowshowing_schedule.cron", "#{webtime} webreport -n &> /dev/null") 52 | end 53 | -------------------------------------------------------------------------------- /root/usr/local/sbin/gettoken-pipes: -------------------------------------------------------------------------------- 1 | #!/usr/bin/with-contenv ruby 2 | require 'rubygems' 3 | require 'json' 4 | require 'httparty' 5 | 6 | # Retrive Plex Token 7 | # Called from a PHP script with proc_open 8 | # Author: Ninthwalker 9 | # Email: ninthwalker@gmail.com 10 | 11 | class Setup 12 | 13 | include HTTParty 14 | base_uri 'https://plex.tv' 15 | format :xml 16 | #debug_output $stderr 17 | 18 | def getPlexToken 19 | $lines = ARGF.readlines(sep="|+/+/+|") 20 | $plexusername = $lines[0].chomp('|+/+/+|') 21 | $plexpassword = $lines[1] 22 | $UUID = rand(4674..77238345694) 23 | auth = {:username => $plexusername, :password => $plexpassword} 24 | 25 | headers = { 26 | "X-Plex-Product" => "NowShowing", 27 | "X-Plex-Version" => "2.0", 28 | "X-Plex-Client-Identifier" => "$UUID" 29 | } 30 | owner = self.class.post("/users/sign_in.xml", :basic_auth => auth, :headers => headers) 31 | $token = owner['user']['authToken'] + " " + owner['user']['thumb'] 32 | end 33 | 34 | def start 35 | self.getPlexToken 36 | puts $token 37 | end 38 | end 39 | 40 | begin 41 | setup_agent = Setup.new 42 | setup_agent.start 43 | rescue 44 | $stderr.puts "Check plex username/password" 45 | end 46 | -------------------------------------------------------------------------------- /root/usr/local/sbin/ondemand_report: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | require 'yaml' 3 | 4 | #variables 5 | advanced = YAML.load_file('/config/cfg/advanced.yaml') 6 | reporttype = advanced['report']['report_type'] 7 | webtime = advanced['report']['web_report_time'] 8 | emailtime = advanced['report']['email_report_time'] 9 | details = advanced['report']['extra_details'] 10 | plexusers = advanced['plex']['plex_user_emails'] 11 | test = advanced['report']['test'] 12 | 13 | case 14 | when test == 'enable' 15 | exec('combinedreport -t') 16 | 17 | when reporttype == 'both' && plexusers == 'yes' && details == 'yes' 18 | exec('combinedreport -d') 19 | 20 | when reporttype == 'both' && plexusers == 'yes' && details == 'no' 21 | exec('combinedreport') 22 | 23 | when reporttype == 'both' && plexusers == 'no' && details == 'yes' 24 | exec('combinedreport -n -d') 25 | 26 | when reporttype == 'both' && plexusers == 'no' && details == 'no' 27 | exec('combinedreport -n') 28 | 29 | when reporttype == 'emailonly' && plexusers == 'yes' && details == 'yes' 30 | exec('emailreport -d') 31 | 32 | when reporttype == 'emailonly' && plexusers == 'yes' && details == 'no' 33 | exec('emailreport') 34 | 35 | when reporttype == 'emailonly' && plexusers == 'no' && details == 'yes' 36 | exec('emailreport -n -d') 37 | 38 | when reporttype == 'emailonly' && plexusers == 'no' && details == 'no' 39 | exec('emailreport -n') 40 | 41 | when reporttype == 'webonly' && plexusers == 'yes' && details == 'yes' 42 | exec('webreport -d') 43 | 44 | when reporttype == 'webonly' && plexusers == 'yes' && details == 'no' 45 | exec('webreport') 46 | 47 | when reporttype == 'webonly' && plexusers == 'no' && details == 'yes' 48 | exec('webreport -n -d') 49 | 50 | when reporttype == 'webonly' && plexusers == 'no' && details == 'no' 51 | exec('webreport -n') 52 | end 53 | -------------------------------------------------------------------------------- /root/usr/local/sbin/tautulli_check: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | require 'timeout' 3 | require_relative '/var/lib/nowshowing/tautulli' 4 | 5 | Timeout::timeout(8) { 6 | begin 7 | t = Tautulli.new 8 | t.test_connection 9 | puts t.test_result 10 | rescue 11 | $stderr.puts "Failed to connect to Tautulli" 12 | end 13 | } 14 | -------------------------------------------------------------------------------- /root/usr/local/sbin/webserver: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | #start lighttpd webserver 4 | lighttpd -D -f /etc/lighttpd/lighttpd.conf 5 | -------------------------------------------------------------------------------- /root/var/lib/nowshowing/locales/de.yml: -------------------------------------------------------------------------------- 1 | de: 2 | air_date: "Sendedatum" 3 | cast: "Cast" 4 | credits_sentence: "Alle medialen Inhalte, Zusammenfassungen und Metadaten wurden von themoviedb.org und thetvdb.com bereitgestellt" 5 | date: 6 | abbr_day_names: 7 | - So 8 | - Mo 9 | - Di 10 | - Mi 11 | - Do 12 | - Fr 13 | - Sa 14 | abbr_month_names: 15 | - 16 | - Jan 17 | - Feb 18 | - Mär 19 | - Apr 20 | - Mai 21 | - Jun 22 | - Jul 23 | - Aug 24 | - Sep 25 | - Okt 26 | - Nov 27 | - Dez 28 | day_names: 29 | - Sonntag 30 | - Montag 31 | - Dienstag 32 | - Mittwoch 33 | - Donnerstag 34 | - Freitag 35 | - Samstag 36 | formats: 37 | default: "%d.%m.%Y" 38 | long: "%e. %B %Y" 39 | short: "%e. %b" 40 | month_names: 41 | - 42 | - Januar 43 | - Februar 44 | - März 45 | - April 46 | - Mai 47 | - Juni 48 | - Juli 49 | - August 50 | - September 51 | - Oktober 52 | - November 53 | - Dezember 54 | order: 55 | - :day 56 | - :month 57 | - :year 58 | director: "Regie" 59 | from: "für" 60 | genre: "Genre" 61 | help_page_sentence: "Ein Problem? Diese Seite gefällt Ihnen? Sie möchten helfen? Dann schauen Sie doch einmal auf meiner github-Seite vorbei!" 62 | imdb_rating: "IMDB-Rating" 63 | minutes: "Minuten" 64 | network: "Sender" 65 | new_episodes: "Neue Episoden" 66 | new_movies: "Neue Filme" 67 | new_seasons: "Neue Staffeln" 68 | rating: "Note" 69 | release_date: "Erscheinungsdatum" 70 | runtime: "Dauer" 71 | seasons: { 72 | one: "Staffel", 73 | other: "Staffeln" 74 | } 75 | thanks_sentence: "Das ist alles, Leute - vielen Dank für's Lesen!" 76 | users: "Benutzer" 77 | -------------------------------------------------------------------------------- /root/var/lib/nowshowing/locales/en.yml: -------------------------------------------------------------------------------- 1 | en: 2 | air_date: "Air date" 3 | cast: "Cast" 4 | credits_sentence: "Art, summaries, and metadata provided by themoviedb.org and thetvdb.com" 5 | date: 6 | abbr_day_names: 7 | - Sun 8 | - Mon 9 | - Tue 10 | - Wed 11 | - Thu 12 | - Fri 13 | - Sat 14 | abbr_month_names: 15 | - 16 | - Jan 17 | - Feb 18 | - Mar 19 | - Apr 20 | - May 21 | - Jun 22 | - Jul 23 | - Aug 24 | - Sep 25 | - Oct 26 | - Nov 27 | - Dec 28 | day_names: 29 | - Sunday 30 | - Monday 31 | - Tuesday 32 | - Wednesday 33 | - Thursday 34 | - Friday 35 | - Saturday 36 | formats: 37 | default: "%m-%d-%Y" 38 | long: "%B %d, %Y" 39 | short: "%b %d" 40 | month_names: 41 | - 42 | - January 43 | - February 44 | - March 45 | - April 46 | - May 47 | - June 48 | - July 49 | - August 50 | - September 51 | - October 52 | - November 53 | - December 54 | order: 55 | - :month 56 | - :day 57 | - :year 58 | director: "Director" 59 | from: "from" 60 | genre: "Genre" 61 | help_page_sentence: "Have an issue? Like what you see? Want to help? Then please check out my github page" 62 | imdb_rating: "IMDB Rating" 63 | minutes: "minutes" 64 | network: "Network" 65 | new_episodes: "New Episodes" 66 | new_movies: "New Movies" 67 | new_seasons: "New Seasons" 68 | rating: "Rating" 69 | release_date: "Release Date" 70 | runtime: "Runtime" 71 | seasons: { 72 | one: "season", 73 | other: "seasons" 74 | } 75 | thanks_sentence: "Thanks for watching!" 76 | users: "users" 77 | -------------------------------------------------------------------------------- /root/var/lib/nowshowing/locales/fr.yml: -------------------------------------------------------------------------------- 1 | fr: 2 | air_date: "Date de diffusion" 3 | cast: "Casting" 4 | credits_sentence: "Les affiches, résumés et méta-données sont fournies par themoviedb.org et par thetvdb.com" 5 | date: 6 | abbr_day_names: 7 | - dim 8 | - lun 9 | - mar 10 | - mer 11 | - jeu 12 | - ven 13 | - sam 14 | abbr_month_names: 15 | - 16 | - jan. 17 | - fév. 18 | - mar. 19 | - avr. 20 | - mai 21 | - juin 22 | - juil. 23 | - août 24 | - sept. 25 | - oct. 26 | - nov. 27 | - déc. 28 | day_names: 29 | - dimanche 30 | - lundi 31 | - mardi 32 | - mercredi 33 | - jeudi 34 | - vendredi 35 | - samedi 36 | formats: 37 | default: "%d/%m/%Y" 38 | short: "%e %b" 39 | long: "%e %B %Y" 40 | month_names: 41 | - 42 | - janvier 43 | - février 44 | - mars 45 | - avril 46 | - mai 47 | - juin 48 | - juillet 49 | - août 50 | - septembre 51 | - octobre 52 | - novembre 53 | - décembre 54 | order: 55 | - :day 56 | - :month 57 | - :year 58 | director: "Réalisateur" 59 | from: "pour" 60 | genre: "Genre" 61 | help_page_sentence: "Vous avez un problème ? Vous aimez ? Vous voulez aider ? Venez visiter la page github du projet" 62 | imdb_rating: "Note IMDB" 63 | minutes: "minutes" 64 | network: "Chaine" 65 | new_episodes: "Nouveaux épisodes" 66 | new_movies: "Nouveaux films" 67 | new_seasons: "Nouvelles saisons" 68 | rating: "Classification" 69 | release_date: "Date de sortie" 70 | runtime: "Durée" 71 | seasons: { 72 | one: "saison", 73 | other: "saisons" 74 | } 75 | thanks_sentence: "C'est tout, pour le moment. Merci pour votre attention." 76 | users: "utilisateurs" 77 | -------------------------------------------------------------------------------- /root/var/lib/nowshowing/locales/no.yml: -------------------------------------------------------------------------------- 1 | "no": 2 | air_date: "Sendedato" 3 | cast: "Rollebesetning" 4 | credits_sentence: "Grafikk, tekst og metadata er hentet fra themoviedb.org og thetvdb.com" 5 | date: 6 | abbr_day_names: 7 | - Søn 8 | - Man 9 | - Tir 10 | - Ons 11 | - Tor 12 | - Fre 13 | - Lør 14 | abbr_month_names: 15 | - 16 | - Jan 17 | - Feb 18 | - Mar 19 | - Apr 20 | - Mai 21 | - Jun 22 | - Jul 23 | - Aug 24 | - Sep 25 | - Okt 26 | - Nov 27 | - Des 28 | day_names: 29 | - Søndag 30 | - Mandag 31 | - Tirsdag 32 | - Onsdag 33 | - Torsdag 34 | - Fredag 35 | - Lørdag 36 | formats: 37 | default: "%d.%m.%Y" 38 | long: "%d %B, %Y" 39 | short: "%d %b" 40 | month_names: 41 | - 42 | - Januar 43 | - Februar 44 | - Mars 45 | - April 46 | - Mai 47 | - Juni 48 | - Juli 49 | - August 50 | - September 51 | - Oktober 52 | - November 53 | - Desember 54 | order: 55 | - :måned 56 | - :dag 57 | - :år 58 | director: "Regissør" 59 | from: "fra" 60 | genre: "Sjanger" 61 | help_page_sentence: "Opplever du problemer? Liker du hva du ser? Vil du hjelpe til? Så sjekk ut min github side" 62 | imdb_rating: "IMDB Vurdering" 63 | minutes: "minutter" 64 | network: "Nettverk" 65 | new_episodes: "Nye Episoder" 66 | new_movies: "Nye Filmer" 67 | new_seasons: "Nye Sesonger" 68 | rating: "Vurdering" 69 | release_date: "Utgivelsesdato" 70 | runtime: "Spilletid" 71 | seasons: { 72 | one: "sesong", 73 | other: "sesonger" 74 | } 75 | thanks_sentence: "Takk for at du ser på!" 76 | users: "brukere" -------------------------------------------------------------------------------- /root/var/lib/nowshowing/mailAnnouncement.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | 3 | require 'rubygems' 4 | require 'mail' 5 | require 'time' 6 | 7 | require_relative '/var/lib/nowshowing/plexTv' 8 | 9 | # Class for sending out the email notification. 10 | # 11 | # Author: Brian Stascavage 12 | # Email: brian@stascavage.com 13 | # Modified by: ninthwalker 14 | # 15 | class MailReport 16 | def initialize(advanced, options) 17 | $advanced = advanced 18 | $announcementSubject = File.read('/opt/announcementSubject') 19 | $plexEmails = options[:emails] 20 | $testEmail = options[:test_email] 21 | if !$advanced['mail']['port'].nil? 22 | $port = $advanced['mail']['port'] 23 | else 24 | $port = 587 25 | end 26 | 27 | if !$announcementSubject.nil? 28 | $subject = $announcementSubject 29 | else 30 | $subject = "Plex Announcement" 31 | end 32 | end 33 | 34 | # Method for pulling the email information from the config and emailing all Plex users 35 | # set auth to nil, and use ruby smtp.rb modified with auto-detection code. 36 | def sendMail(body) 37 | options = { :address => $advanced['mail']['address'], 38 | :port => $port, 39 | :domain => ENV['HOSTNAME'], 40 | :user_name => $advanced['mail']['username'], 41 | :password => $advanced['mail']['password'], 42 | :authentication => nil, 43 | :enable_starttls_auto => true } 44 | Mail.defaults do 45 | delivery_method :smtp, options 46 | end 47 | 48 | users = Array.new 49 | 50 | # Logic for pulling the email accounts from Plex.tv and/or the 51 | # config file 52 | plexTv = PlexTv.new($advanced) 53 | 54 | if !$testEmail 55 | if $plexEmails 56 | plex_users = plexTv.get('/pms/friends/all') 57 | 58 | if plex_users.nil? || plex_users.empty? 59 | $logger.info("No Plex friends found.") 60 | else 61 | plex_users['MediaContainer']['User'].each do | user | 62 | if !user['email'].empty? 63 | users.push(user['email']) 64 | end 65 | end 66 | end 67 | end 68 | if !$advanced['mail']['recipients'].nil? || !$advanced['mail']['recipients_email'].nil? 69 | if !$advanced['mail']['recipients_email'].nil? 70 | $advanced['mail']['recipients_email'].each do | recipient | 71 | users.push(recipient) 72 | end 73 | end 74 | if !$advanced['mail']['recipients'].nil? 75 | $advanced['mail']['recipients'].each do | recipient | 76 | plex_users = plexTv.get('/pms/friends/all') 77 | plex_users['MediaContainer']['User'].each do | user | 78 | if user['username'] == recipient 79 | users.push(user['email']) 80 | end 81 | end 82 | end 83 | end 84 | end 85 | end 86 | 87 | #Get owner's email as well and add it to the list of recpients 88 | users.push(plexTv.get('/users/account')['user']['email'][0]) 89 | 90 | #used to send individual email. Now it bcc's one email 91 | #users.each do | user | 92 | mail = Mail.new do 93 | from "#{$advanced['mail']['from']} <#{$advanced['mail']['username']}>" 94 | bcc users 95 | subject $subject 96 | content_type 'text/html; charset=UTF-8' 97 | body body 98 | end 99 | begin 100 | mail.deliver! 101 | rescue => e 102 | $logger.info("SMTP mailing failed!\n#{e.message}#{e.backtrace}") 103 | end 104 | #end 105 | end 106 | end 107 | -------------------------------------------------------------------------------- /root/var/lib/nowshowing/mailReport.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | 3 | require 'rubygems' 4 | require 'mail' 5 | require 'time' 6 | 7 | require_relative '/var/lib/nowshowing/plexTv' 8 | 9 | # Class for sending out the email notification. 10 | # 11 | # Author: Brian Stascavage 12 | # Email: brian@stascavage.com 13 | # Modified by: ninthwalker 14 | # 15 | class MailReport 16 | def initialize(advanced, options) 17 | $advanced = advanced 18 | $plexEmails = options[:emails] 19 | $testEmail = options[:test_email] 20 | if !$advanced['mail']['port'].nil? 21 | $port = $advanced['mail']['port'] 22 | else 23 | $port = 587 24 | end 25 | 26 | if !$advanced['mail']['subject'].nil? 27 | $subject = $advanced['mail']['subject'] 28 | else 29 | $subject = "Plex Summary " 30 | end 31 | end 32 | 33 | # Method for pulling the email information from the config and emailing all Plex users 34 | # set auth to nil, and use ruby smtp.rb modified with auto-detection code. 35 | def sendMail(body) 36 | options = { :address => $advanced['mail']['address'], 37 | :port => $port, 38 | :domain => ENV['HOSTNAME'], 39 | :user_name => $advanced['mail']['username'], 40 | :password => $advanced['mail']['password'], 41 | :authentication => nil, 42 | :enable_starttls_auto => true } 43 | Mail.defaults do 44 | delivery_method :smtp, options 45 | end 46 | 47 | users = Array.new 48 | 49 | # Logic for pulling the email accounts from Plex.tv and/or the 50 | # config file 51 | plexTv = PlexTv.new($advanced) 52 | 53 | if !$testEmail 54 | if $plexEmails 55 | plex_users = plexTv.get('/pms/friends/all') 56 | 57 | if plex_users.nil? || plex_users.empty? 58 | $logger.info("No Plex friends found.") 59 | else 60 | plex_users['MediaContainer']['User'].each do | user | 61 | if !user['email'].empty? 62 | users.push(user['email']) 63 | end 64 | end 65 | end 66 | end 67 | if !$advanced['mail']['recipients'].nil? || !$advanced['mail']['recipients_email'].nil? 68 | if !$advanced['mail']['recipients_email'].nil? 69 | $advanced['mail']['recipients_email'].each do | recipient | 70 | users.push(recipient) 71 | end 72 | end 73 | if !$advanced['mail']['recipients'].nil? 74 | $advanced['mail']['recipients'].each do | recipient | 75 | plex_users = plexTv.get('/pms/friends/all') 76 | plex_users['MediaContainer']['User'].each do | user | 77 | if user['username'] == recipient 78 | users.push(user['email']) 79 | end 80 | end 81 | end 82 | end 83 | end 84 | end 85 | 86 | #Get owner's email as well and add it to the list of recpients 87 | users.push(plexTv.get('/users/account')['user']['email'][0]) 88 | 89 | #used to send individual email. Now it bcc's one email 90 | #users.each do | user | 91 | mail = Mail.new do 92 | from "#{$advanced['mail']['from']} <#{$advanced['mail']['username']}>" 93 | bcc users 94 | subject $advanced['mail']['subject'] + " " + (I18n.l Time.now.to_date) 95 | content_type 'text/html; charset=UTF-8' 96 | body body 97 | end 98 | begin 99 | mail.deliver! 100 | rescue => e 101 | $logger.info("SMTP mailing failed!\n#{e.message}#{e.backtrace}") 102 | end 103 | #end 104 | end 105 | end 106 | -------------------------------------------------------------------------------- /root/var/lib/nowshowing/omdb.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | require 'rubygems' 3 | require 'json' 4 | require 'httparty' 5 | 6 | # Class that interacts with omdbapi.com. 7 | # 8 | # Author: Brian Stascavage 9 | # Email: brian@stascavage.com 10 | # 11 | class OMDB 12 | include HTTParty 13 | # temporarily add api key since OMBI closed their API and started charging. 14 | # Old: base_uri 'http://www.omdbapi.com//' 15 | base_uri 'https://www.omdbapi.com/?apikey=bab71153' 16 | format :json 17 | 18 | def initialize 19 | end 20 | 21 | def get(query, args=nil) 22 | new_query = '&i=' + query + '&plot=short&r=json' 23 | 24 | response = self.class.get(new_query, :verify => false) 25 | 26 | if response.code != 200 27 | if response.nil? 28 | return 'nil' 29 | end 30 | while retry_attempts < 3 do 31 | $logger.error("Could not connect to omdb. Will retry in 30 seconds") 32 | sleep(30) 33 | $retry_attempts += 1 34 | $logger.debug("Retry attempt: #{$retry_attempts}") 35 | if self.get(query).code == 200 36 | break 37 | end 38 | end 39 | if retry_attempts >= 3 40 | $logger.error "Could not connect to omdb. Exiting script." 41 | exit 42 | end 43 | end 44 | return response 45 | end 46 | end 47 | -------------------------------------------------------------------------------- /root/var/lib/nowshowing/plex.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | require 'rubygems' 3 | require 'json' 4 | require 'httparty' 5 | 6 | # Class To interact with a Plex server, for pulling movie and TV info and stuff 7 | # 8 | # Author: Brian Stascavage 9 | # Email: brian@stascavage.com 10 | # Modified by: Ninthwalker 11 | # 12 | class Plex 13 | include HTTParty 14 | 15 | def initialize(config) 16 | $advanced = config 17 | $server = $advanced['plex']['server'] 18 | $header = { "X-Plex-Token" => "#{$advanced['token']['api_key']}" } 19 | 20 | self.class.headers['X-Plex-Token'] = $advanced['token']['api_key'] 21 | if !$server.nil? 22 | if $server.downcase.include?('http') 23 | self.class.base_uri $server 24 | else 25 | self.class.base_uri "http://#{$server}:32400/" 26 | end 27 | end 28 | end 29 | 30 | base_uri "http://localhost:32400/" 31 | format :xml 32 | 33 | def get(query, args=nil) 34 | self.class.headers['X-Plex-Token'] = $advanced['token']['api_key'] 35 | response = self.class.get(query) 36 | 37 | if response.code != 200 38 | if response.code == 401 39 | $logger.error("Unauthorized access to Plex server") 40 | else 41 | $logger.error("Cannot connect to Plex server") 42 | end 43 | 44 | abort 45 | end 46 | 47 | $logger.debug("Debug info for plexmediaserver connection") 48 | $logger.debug(response.code) 49 | $logger.debug(response.request) 50 | $logger.debug(response) 51 | return response 52 | end 53 | end 54 | -------------------------------------------------------------------------------- /root/var/lib/nowshowing/plexTv.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | require 'rubygems' 3 | require 'json' 4 | require 'httparty' 5 | 6 | # Class To interact with Plex.tv 7 | # 8 | # Author: Brian Stascavage 9 | # Email: brian@stascavage.com 10 | # 11 | class PlexTv 12 | include HTTParty 13 | 14 | base_uri 'https://plex.tv/' 15 | format :xml 16 | 17 | def initialize(config) 18 | if !config.empty? 19 | if !config['token']['api_key'].empty? 20 | $token = config['token']['api_key'] 21 | else 22 | if defined? $logger 23 | $logger.error("Missing Plex token") 24 | end 25 | end 26 | end 27 | end 28 | 29 | def get(query, auth=nil, token_check=false) 30 | if !token_check 31 | new_query = query + "?X-Plex-Token=#{$token}" 32 | else 33 | new_query = query 34 | end 35 | 36 | if auth.nil? 37 | response = self.class.get(new_query) 38 | else 39 | response = self.class.get(new_query, :basic_auth => auth) 40 | end 41 | 42 | if response.code != 200 43 | if response.code == 401 44 | puts "Invalid Plex.tv Credentials!" 45 | abort 46 | else 47 | puts "Cannot connect to Plex.tv! Check connection." 48 | abort 49 | end 50 | end 51 | return response 52 | end 53 | end 54 | -------------------------------------------------------------------------------- /root/var/lib/nowshowing/themoviedb.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | require 'rubygems' 3 | require 'json' 4 | require 'httparty' 5 | 6 | # Class that interacts with themoviedb.org. 7 | # Note that themoviedb.org limits API calls to 30 every 10 seconds, 8 | # hence the sleep in this code. 9 | # 10 | # Author: Brian Stascavage 11 | # Email: brian@stascavage.com 12 | # Modified by: ninthwalker 13 | # 14 | class TheMovieDB 15 | include HTTParty 16 | 17 | base_uri 'https://api.themoviedb.org/3//' 18 | format :json 19 | 20 | def initialize(config) 21 | $token = '15cebd6668ef6e90315fe023723ea5a7' 22 | $retry_attempt = 0 23 | end 24 | 25 | def get(query, args=nil) 26 | if args.nil? 27 | new_query = query + "?api_key=#{$token}" 28 | else 29 | new_query = query + "?api_key=#{$token}&#{args}" 30 | end 31 | 32 | response = self.class.get(new_query, :verify => false) 33 | 34 | if response.code != 200 35 | if response.nil? 36 | return 'nil' 37 | end 38 | while $retry_attempts < 3 do 39 | $logger.error("Could not connect to themoviedb.org. Will retry in 30 seconds") 40 | sleep(30) 41 | $retry_attempts += 1 42 | $logger.debug("Retry attempt: #{$retry_attempts}") 43 | if self.get(query).code == 200 44 | break 45 | end 46 | end 47 | if $retry_attempts >= 3 48 | $logger.error("Could not connect to themoviedb.org. Exiting script") 49 | exit 50 | end 51 | end 52 | 53 | sleep 0.6 54 | $retry_attempt = 0 55 | return response 56 | end 57 | end 58 | -------------------------------------------------------------------------------- /root/var/lib/nowshowing/thetvdb.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | require 'rubygems' 3 | require 'json' 4 | require 'httparty' 5 | 6 | # Class that interacts with thetvdb.org. 7 | # 8 | # Author: Brian Stascavage 9 | # Email: brian@stascavage.com 10 | # Modified by: ninthwalker 11 | 12 | class TheTVDB 13 | include HTTParty 14 | 15 | token = 'FCBE9A97726CD688' 16 | base_uri "https://thetvdb.com/api/#{token}//" 17 | 18 | def initialize 19 | $retry_attempts = 0 20 | end 21 | 22 | def get(query, args=nil) 23 | begin 24 | response = self.class.get(query, :verify => false) 25 | rescue EOFError 26 | $logger.error("thetvdb.org is providing wrong headers. Blah! Retrying.") 27 | while $retry_attempts < 3 do 28 | $logger.error("Could not connect to thetvdb.com. Will retry in 30 seconds") 29 | sleep(30) 30 | $retry_attempts += 1 31 | $logger.debug("Retry attempt: #{$retry_attempts}i for query #{query}") 32 | if self.get(query).code == 200 33 | break 34 | end 35 | end 36 | if $retry_attempts >= 3 37 | $logger.error("Could not connect to thetvdb. Exiting script. If you are constantly seeing this, please turn on debugging and open an issue.") 38 | $logger.debug("Failed to connect to thetvdb for query: #{query}") 39 | exit 40 | end 41 | 42 | $retry_attempts = 0 43 | return nil 44 | end 45 | $logger.debug("Response from thetvdb for query #{query}: Code: #{response.code}.") 46 | 47 | if response.code != 200 48 | if response.nil? 49 | return 'nil' 50 | end 51 | while $retry_attempts < 3 do 52 | $logger.error("Could not connect to thetvdb.com. Will retry in 30 seconds") 53 | sleep(30) 54 | $retry_attempts += 1 55 | $logger.debug("Retry attempt: #{$retry_attempts} for query #{query}") 56 | if self.get(query).code == 200 57 | break 58 | end 59 | end 60 | if $retry_attempts >= 3 61 | $logger.error("Could not connect to thetvdb. Exiting script. If you are constantly seeing this, please turn on debugging and open an issue.") 62 | $logger.debug("Failed to connect to thetvdb for query: #{query}") 63 | exit 64 | end 65 | end 66 | 67 | $retry_attempts = 0 68 | return response 69 | end 70 | end 71 | -------------------------------------------------------------------------------- /s6-overlay/bin/background: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/background -------------------------------------------------------------------------------- /s6-overlay/bin/backtick: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/backtick -------------------------------------------------------------------------------- /s6-overlay/bin/cd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/cd -------------------------------------------------------------------------------- /s6-overlay/bin/define: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/define -------------------------------------------------------------------------------- /s6-overlay/bin/dollarat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/dollarat -------------------------------------------------------------------------------- /s6-overlay/bin/elgetopt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/elgetopt -------------------------------------------------------------------------------- /s6-overlay/bin/elgetpositionals: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/elgetpositionals -------------------------------------------------------------------------------- /s6-overlay/bin/elglob: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/elglob -------------------------------------------------------------------------------- /s6-overlay/bin/emptyenv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/emptyenv -------------------------------------------------------------------------------- /s6-overlay/bin/exec: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/exec -------------------------------------------------------------------------------- /s6-overlay/bin/execlineb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/execlineb -------------------------------------------------------------------------------- /s6-overlay/bin/exit: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/exit -------------------------------------------------------------------------------- /s6-overlay/bin/export: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/export -------------------------------------------------------------------------------- /s6-overlay/bin/fdblock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/fdblock -------------------------------------------------------------------------------- /s6-overlay/bin/fdclose: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/fdclose -------------------------------------------------------------------------------- /s6-overlay/bin/fdmove: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/fdmove -------------------------------------------------------------------------------- /s6-overlay/bin/fdreserve: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/fdreserve -------------------------------------------------------------------------------- /s6-overlay/bin/fdswap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/fdswap -------------------------------------------------------------------------------- /s6-overlay/bin/forbacktickx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/forbacktickx -------------------------------------------------------------------------------- /s6-overlay/bin/foreground: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/foreground -------------------------------------------------------------------------------- /s6-overlay/bin/forstdin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/forstdin -------------------------------------------------------------------------------- /s6-overlay/bin/forx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/forx -------------------------------------------------------------------------------- /s6-overlay/bin/getcwd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/getcwd -------------------------------------------------------------------------------- /s6-overlay/bin/getpid: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/getpid -------------------------------------------------------------------------------- /s6-overlay/bin/heredoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/heredoc -------------------------------------------------------------------------------- /s6-overlay/bin/homeof: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/homeof -------------------------------------------------------------------------------- /s6-overlay/bin/if: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/if -------------------------------------------------------------------------------- /s6-overlay/bin/ifelse: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/ifelse -------------------------------------------------------------------------------- /s6-overlay/bin/ifte: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/ifte -------------------------------------------------------------------------------- /s6-overlay/bin/ifthenelse: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/ifthenelse -------------------------------------------------------------------------------- /s6-overlay/bin/import: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/import -------------------------------------------------------------------------------- /s6-overlay/bin/importas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/importas -------------------------------------------------------------------------------- /s6-overlay/bin/loopwhilex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/loopwhilex -------------------------------------------------------------------------------- /s6-overlay/bin/minidentd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/minidentd -------------------------------------------------------------------------------- /s6-overlay/bin/multidefine: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/multidefine -------------------------------------------------------------------------------- /s6-overlay/bin/multisubstitute: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/multisubstitute -------------------------------------------------------------------------------- /s6-overlay/bin/pipeline: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/pipeline -------------------------------------------------------------------------------- /s6-overlay/bin/piperw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/piperw -------------------------------------------------------------------------------- /s6-overlay/bin/redirfd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/redirfd -------------------------------------------------------------------------------- /s6-overlay/bin/runblock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/runblock -------------------------------------------------------------------------------- /s6-overlay/bin/s6-accessrules-cdb-from-fs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-accessrules-cdb-from-fs -------------------------------------------------------------------------------- /s6-overlay/bin/s6-accessrules-fs-from-cdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-accessrules-fs-from-cdb -------------------------------------------------------------------------------- /s6-overlay/bin/s6-applyuidgid: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-applyuidgid -------------------------------------------------------------------------------- /s6-overlay/bin/s6-basename: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-basename -------------------------------------------------------------------------------- /s6-overlay/bin/s6-cat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-cat -------------------------------------------------------------------------------- /s6-overlay/bin/s6-chmod: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-chmod -------------------------------------------------------------------------------- /s6-overlay/bin/s6-chown: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-chown -------------------------------------------------------------------------------- /s6-overlay/bin/s6-chroot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-chroot -------------------------------------------------------------------------------- /s6-overlay/bin/s6-cleanfifodir: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-cleanfifodir -------------------------------------------------------------------------------- /s6-overlay/bin/s6-clock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-clock -------------------------------------------------------------------------------- /s6-overlay/bin/s6-clockadd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-clockadd -------------------------------------------------------------------------------- /s6-overlay/bin/s6-clockview: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-clockview -------------------------------------------------------------------------------- /s6-overlay/bin/s6-connlimit: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-connlimit -------------------------------------------------------------------------------- /s6-overlay/bin/s6-cut: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-cut -------------------------------------------------------------------------------- /s6-overlay/bin/s6-devd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-devd -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dirname: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dirname -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dnsip4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dnsip4 -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dnsip4-filter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dnsip4-filter -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dnsip6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dnsip6 -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dnsip6-filter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dnsip6-filter -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dnsmx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dnsmx -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dnsname: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dnsname -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dnsname-filter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dnsname-filter -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dnsns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dnsns -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dnsq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dnsq -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dnsqr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dnsqr -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dnsqualify: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dnsqualify -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dnssoa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dnssoa -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dnssrv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dnssrv -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dnstxt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dnstxt -------------------------------------------------------------------------------- /s6-overlay/bin/s6-dumpenv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-dumpenv -------------------------------------------------------------------------------- /s6-overlay/bin/s6-echo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-echo -------------------------------------------------------------------------------- /s6-overlay/bin/s6-env: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-env -------------------------------------------------------------------------------- /s6-overlay/bin/s6-envdir: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-envdir -------------------------------------------------------------------------------- /s6-overlay/bin/s6-envuidgid: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-envuidgid -------------------------------------------------------------------------------- /s6-overlay/bin/s6-expr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-expr -------------------------------------------------------------------------------- /s6-overlay/bin/s6-false: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-false -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-daemon: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-daemon -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-delete: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-delete -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-deletec: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-deletec -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-getdump: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-getdump -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-getdumpc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-getdumpc -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-list: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-list -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-listc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-listc -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-retrieve: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-retrieve -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-retrievec: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-retrievec -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-setdump: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-setdump -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-setdumpc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-setdumpc -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-store -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-storec: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-storec -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-transferdump: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-transferdump -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholder-transferdumpc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholder-transferdumpc -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fdholderd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fdholderd -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fghack: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fghack -------------------------------------------------------------------------------- /s6-overlay/bin/s6-fillurandompool: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-fillurandompool -------------------------------------------------------------------------------- /s6-overlay/bin/s6-format-filter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-format-filter -------------------------------------------------------------------------------- /s6-overlay/bin/s6-freeramdisk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-freeramdisk -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ftrig-listen: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ftrig-listen -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ftrig-listen1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ftrig-listen1 -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ftrig-notify: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ftrig-notify -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ftrig-wait: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ftrig-wait -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ftrigrd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ftrigrd -------------------------------------------------------------------------------- /s6-overlay/bin/s6-getservbyname: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-getservbyname -------------------------------------------------------------------------------- /s6-overlay/bin/s6-grep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-grep -------------------------------------------------------------------------------- /s6-overlay/bin/s6-head: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-head -------------------------------------------------------------------------------- /s6-overlay/bin/s6-hiercopy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-hiercopy -------------------------------------------------------------------------------- /s6-overlay/bin/s6-hostname: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-hostname -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ident-client: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ident-client -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ioconnect: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ioconnect -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ipcclient: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ipcclient -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ipcserver: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ipcserver -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ipcserver-access: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ipcserver-access -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ipcserver-socketbinder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ipcserver-socketbinder -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ipcserverd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ipcserverd -------------------------------------------------------------------------------- /s6-overlay/bin/s6-linkname: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-linkname -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ln: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ln -------------------------------------------------------------------------------- /s6-overlay/bin/s6-log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-log -------------------------------------------------------------------------------- /s6-overlay/bin/s6-logwatch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-logwatch -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ls -------------------------------------------------------------------------------- /s6-overlay/bin/s6-maximumtime: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-maximumtime -------------------------------------------------------------------------------- /s6-overlay/bin/s6-mkdir: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-mkdir -------------------------------------------------------------------------------- /s6-overlay/bin/s6-mkfifo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-mkfifo -------------------------------------------------------------------------------- /s6-overlay/bin/s6-mkfifodir: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-mkfifodir -------------------------------------------------------------------------------- /s6-overlay/bin/s6-mount: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-mount -------------------------------------------------------------------------------- /s6-overlay/bin/s6-nice: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-nice -------------------------------------------------------------------------------- /s6-overlay/bin/s6-nuke: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-nuke -------------------------------------------------------------------------------- /s6-overlay/bin/s6-pause: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-pause -------------------------------------------------------------------------------- /s6-overlay/bin/s6-pivotchroot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-pivotchroot -------------------------------------------------------------------------------- /s6-overlay/bin/s6-printenv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-printenv -------------------------------------------------------------------------------- /s6-overlay/bin/s6-ps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-ps -------------------------------------------------------------------------------- /s6-overlay/bin/s6-quote: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-quote -------------------------------------------------------------------------------- /s6-overlay/bin/s6-quote-filter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-quote-filter -------------------------------------------------------------------------------- /s6-overlay/bin/s6-randomip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-randomip -------------------------------------------------------------------------------- /s6-overlay/bin/s6-rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-rc -------------------------------------------------------------------------------- /s6-overlay/bin/s6-rc-bundle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-rc-bundle -------------------------------------------------------------------------------- /s6-overlay/bin/s6-rc-compile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-rc-compile -------------------------------------------------------------------------------- /s6-overlay/bin/s6-rc-db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-rc-db -------------------------------------------------------------------------------- /s6-overlay/bin/s6-rc-dryrun: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-rc-dryrun -------------------------------------------------------------------------------- /s6-overlay/bin/s6-rc-init: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-rc-init -------------------------------------------------------------------------------- /s6-overlay/bin/s6-rc-update: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-rc-update -------------------------------------------------------------------------------- /s6-overlay/bin/s6-rename: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-rename -------------------------------------------------------------------------------- /s6-overlay/bin/s6-rmrf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-rmrf -------------------------------------------------------------------------------- /s6-overlay/bin/s6-seq: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-seq -------------------------------------------------------------------------------- /s6-overlay/bin/s6-setlock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-setlock -------------------------------------------------------------------------------- /s6-overlay/bin/s6-setsid: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-setsid -------------------------------------------------------------------------------- /s6-overlay/bin/s6-setuidgid: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-setuidgid -------------------------------------------------------------------------------- /s6-overlay/bin/s6-sleep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-sleep -------------------------------------------------------------------------------- /s6-overlay/bin/s6-sntpclock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-sntpclock -------------------------------------------------------------------------------- /s6-overlay/bin/s6-softlimit: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-softlimit -------------------------------------------------------------------------------- /s6-overlay/bin/s6-sort: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-sort -------------------------------------------------------------------------------- /s6-overlay/bin/s6-sudo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-sudo -------------------------------------------------------------------------------- /s6-overlay/bin/s6-sudoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-sudoc -------------------------------------------------------------------------------- /s6-overlay/bin/s6-sudod: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-sudod -------------------------------------------------------------------------------- /s6-overlay/bin/s6-supervise: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-supervise -------------------------------------------------------------------------------- /s6-overlay/bin/s6-svc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-svc -------------------------------------------------------------------------------- /s6-overlay/bin/s6-svlisten: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-svlisten -------------------------------------------------------------------------------- /s6-overlay/bin/s6-svlisten1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-svlisten1 -------------------------------------------------------------------------------- /s6-overlay/bin/s6-svok: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-svok -------------------------------------------------------------------------------- /s6-overlay/bin/s6-svscan: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-svscan -------------------------------------------------------------------------------- /s6-overlay/bin/s6-svscanctl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-svscanctl -------------------------------------------------------------------------------- /s6-overlay/bin/s6-svstat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-svstat -------------------------------------------------------------------------------- /s6-overlay/bin/s6-svwait: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-svwait -------------------------------------------------------------------------------- /s6-overlay/bin/s6-swapoff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-swapoff -------------------------------------------------------------------------------- /s6-overlay/bin/s6-swapon: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-swapon -------------------------------------------------------------------------------- /s6-overlay/bin/s6-sync: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-sync -------------------------------------------------------------------------------- /s6-overlay/bin/s6-tai64n: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-tai64n -------------------------------------------------------------------------------- /s6-overlay/bin/s6-tai64nlocal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-tai64nlocal -------------------------------------------------------------------------------- /s6-overlay/bin/s6-taiclock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-taiclock -------------------------------------------------------------------------------- /s6-overlay/bin/s6-taiclockd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-taiclockd -------------------------------------------------------------------------------- /s6-overlay/bin/s6-tail: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-tail -------------------------------------------------------------------------------- /s6-overlay/bin/s6-tcpclient: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-tcpclient -------------------------------------------------------------------------------- /s6-overlay/bin/s6-tcpserver: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-tcpserver -------------------------------------------------------------------------------- /s6-overlay/bin/s6-tcpserver-access: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-tcpserver-access -------------------------------------------------------------------------------- /s6-overlay/bin/s6-tcpserver4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-tcpserver4 -------------------------------------------------------------------------------- /s6-overlay/bin/s6-tcpserver4-socketbinder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-tcpserver4-socketbinder -------------------------------------------------------------------------------- /s6-overlay/bin/s6-tcpserver4d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-tcpserver4d -------------------------------------------------------------------------------- /s6-overlay/bin/s6-tcpserver6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-tcpserver6 -------------------------------------------------------------------------------- /s6-overlay/bin/s6-tcpserver6-socketbinder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-tcpserver6-socketbinder -------------------------------------------------------------------------------- /s6-overlay/bin/s6-tcpserver6d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-tcpserver6d -------------------------------------------------------------------------------- /s6-overlay/bin/s6-test: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-test -------------------------------------------------------------------------------- /s6-overlay/bin/s6-touch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-touch -------------------------------------------------------------------------------- /s6-overlay/bin/s6-true: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-true -------------------------------------------------------------------------------- /s6-overlay/bin/s6-uevent-listener: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-uevent-listener -------------------------------------------------------------------------------- /s6-overlay/bin/s6-uevent-spawner: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-uevent-spawner -------------------------------------------------------------------------------- /s6-overlay/bin/s6-umount: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-umount -------------------------------------------------------------------------------- /s6-overlay/bin/s6-uniquename: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-uniquename -------------------------------------------------------------------------------- /s6-overlay/bin/s6-unquote: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-unquote -------------------------------------------------------------------------------- /s6-overlay/bin/s6-unquote-filter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-unquote-filter -------------------------------------------------------------------------------- /s6-overlay/bin/s6-update-symlinks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6-update-symlinks -------------------------------------------------------------------------------- /s6-overlay/bin/s6lockd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/s6lockd -------------------------------------------------------------------------------- /s6-overlay/bin/seekablepipe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/seekablepipe -------------------------------------------------------------------------------- /s6-overlay/bin/shift: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/shift -------------------------------------------------------------------------------- /s6-overlay/bin/skadnsd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/skadnsd -------------------------------------------------------------------------------- /s6-overlay/bin/trap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/trap -------------------------------------------------------------------------------- /s6-overlay/bin/tryexec: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/tryexec -------------------------------------------------------------------------------- /s6-overlay/bin/ucspilogd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/ucspilogd -------------------------------------------------------------------------------- /s6-overlay/bin/umask: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/umask -------------------------------------------------------------------------------- /s6-overlay/bin/unexport: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/unexport -------------------------------------------------------------------------------- /s6-overlay/bin/wait: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/wait -------------------------------------------------------------------------------- /s6-overlay/bin/withstdinas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/bin/withstdinas -------------------------------------------------------------------------------- /s6-overlay/etc/cont-finish.d/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /s6-overlay/etc/cont-init.d/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /s6-overlay/etc/fix-attrs.d/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /s6-overlay/etc/leapsecs.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/etc/leapsecs.dat -------------------------------------------------------------------------------- /s6-overlay/etc/s6/init-catchall/init-stage1: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -S0 2 | 3 | ## 4 | ## ensure our vital fifo exists 5 | ## 6 | 7 | if { s6-rmrf /var/run/s6/uncaught-logs-fifo } 8 | if { s6-mkfifo -m 0600 -- /var/run/s6/uncaught-logs-fifo } 9 | 10 | 11 | ## 12 | ## ensure ownership & permissions for our vital files 13 | ## 14 | 15 | if { s6-rmrf /var/log/s6-uncaught-logs } 16 | if { s6-mkdir -p /var/log/s6-uncaught-logs } 17 | if { s6-envuidgid -D 32768:32768 nobody s6-chown -U /var/log/s6-uncaught-logs } 18 | if { s6-chmod 2700 /var/log/s6-uncaught-logs } 19 | 20 | 21 | ## 22 | ## init the scandir with our base services 23 | ## 24 | 25 | if { s6-rmrf /var/run/s6/services } 26 | if { s6-hiercopy /etc/s6/services /var/run/s6/services } 27 | 28 | 29 | ## 30 | ## fork the "init-stage2" script 31 | ## 32 | 33 | background 34 | { 35 | # block until the supervision tree is running 36 | redirfd -w 3 /var/run/s6/uncaught-logs-fifo 37 | fdclose 3 38 | 39 | # add some environment 40 | s6-envdir -- /etc/s6/init/env-stage2 41 | 42 | # run the script 43 | /etc/s6/init-catchall/init-stage2 $@ 44 | } 45 | unexport ! 46 | 47 | 48 | ## 49 | ## run the rest of stage 1 with sanitized descriptors 50 | ## 51 | 52 | redirfd -r 0 /dev/null 53 | redirfd -wnb 1 /var/run/s6/uncaught-logs-fifo 54 | fdmove -c 2 1 55 | 56 | 57 | ## 58 | ## start the supervision tree 59 | ## 60 | 61 | s6-svscan -t0 /var/run/s6/services 62 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/init-catchall/init-stage2: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -S0 2 | /etc/s6/init/init-stage2 $@ 3 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/init-no-catchall/init-stage1: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -S0 2 | 3 | ## 4 | ## init the scandir with our base services 5 | ## 6 | 7 | if { s6-rmrf /var/run/s6/services } 8 | if { s6-hiercopy /etc/s6/services /var/run/s6/services } 9 | if { s6-rmrf /var/run/s6/services/s6-svscan-log } 10 | 11 | 12 | ## 13 | ## ensure our vital fifo exists 14 | ## 15 | 16 | if { s6-rmrf /var/run/s6/services/s6-fdholderd/supervise/control } 17 | if { s6-mkfifo -m 0600 /var/run/s6/services/s6-fdholderd/supervise/control } 18 | 19 | 20 | ## 21 | ## fork the "init-stage2" script 22 | ## 23 | 24 | background 25 | { 26 | # block until the supervision tree is running 27 | redirfd -w 3 /var/run/s6/services/s6-fdholderd/supervise/control 28 | fdclose 3 29 | 30 | # add some environment 31 | s6-envdir -- /etc/s6/init/env-stage2 32 | 33 | # run the script 34 | /etc/s6/init-no-catchall/init-stage2 $@ 35 | } 36 | unexport ! 37 | 38 | 39 | ## 40 | ## run the rest of stage 1 with sanitized descriptors 41 | ## 42 | 43 | redirfd -r 0 /dev/null 44 | 45 | 46 | ## 47 | ## start the supervision tree 48 | ## 49 | 50 | s6-svscan -t0 /var/run/s6/services 51 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/init-no-catchall/init-stage2: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -S0 2 | /etc/s6/init/init-stage2 $@ 3 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/init/env-stage2/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/init/env/PATH: -------------------------------------------------------------------------------- 1 | /usr/bin:/usr/sbin:/bin:/sbin 2 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/init/init-stage1: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -S0 2 | 3 | ## 4 | ## dump environment into an envdir if S6_KEEP_ENV is unset 5 | ## 6 | 7 | importas -D 0 S6_KEEP_ENV S6_KEEP_ENV 8 | define -s DO_NOT_KEEP_ENV "s6-test ${S6_KEEP_ENV} -eq 0" 9 | if 10 | { 11 | ifelse { ${DO_NOT_KEEP_ENV} } 12 | { 13 | if { s6-mkdir -pm 0755 -- /var/run/s6/container_environment } 14 | s6-dumpenv -- /var/run/s6/container_environment 15 | } 16 | exit 0 17 | } 18 | 19 | ## 20 | ## create env folder for each init stage, although stage1 is always copied from 21 | ## /etc/s6/init/env, it's made available in /var/run/s6/env-stage1 just for 22 | ## consistency. 23 | ## 24 | 25 | if 26 | { 27 | elglob -0 -- envdirs /var/run/s6/env-* 28 | forx -p -- envdir { ${envdirs} } 29 | importas -u envdir envdir 30 | s6-rmrf ${envdir} 31 | } 32 | if { s6-mkdir -pm 0755 -- /var/run/s6 } 33 | if { s6-hiercopy /etc/s6/init/env /var/run/s6/env-stage1 } 34 | if { s6-mkdir -pm 0755 -- /var/run/s6/env-stage2 } 35 | if { s6-mkdir -pm 0755 -- /var/run/s6/env-stage3 } 36 | 37 | 38 | ## 39 | ## run everything else with only the environment defined in 40 | ## /var/run/s6/env-stage1 if we are not instructed to keep 41 | ## docker env. Programs can get back the container 42 | ## environment by using "with-contenv program". 43 | ## 44 | 45 | ifthenelse -s { ${DO_NOT_KEEP_ENV} } 46 | { 47 | exec -c -- 48 | s6-envdir /var/run/s6/env-stage1 49 | } 50 | { } 51 | 52 | backtick -n S6_CMD_ARG0 { printcontenv S6_CMD_ARG0 } 53 | importas -d "\n" -s -u S6_CMD_ARG0 S6_CMD_ARG0 54 | 55 | ## 56 | ## route based on what was provided in S6_LOGGING 57 | ## 58 | 59 | backtick -D 0 -n S6_LOGGING { printcontenv S6_LOGGING } 60 | importas -u S6_LOGGING S6_LOGGING 61 | ifelse { s6-test ${S6_LOGGING} -ne 0 } 62 | { 63 | /etc/s6/init-catchall/init-stage1 ${S6_CMD_ARG0} $@ 64 | } 65 | /etc/s6/init-no-catchall/init-stage1 ${S6_CMD_ARG0} $@ 66 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/init/init-stage2-fixattrs.txt: -------------------------------------------------------------------------------- 1 | /var/run/s6/etc/fix-attrs.d/* false root 0644 0755 2 | /var/run/s6/etc/cont-init.d/* false root 0755 0755 3 | /var/run/s6/etc/cont-finish.d/* false root 0755 0755 4 | /var/run/s6/etc/services.d/*/run false root 0755 0755 5 | /var/run/s6/etc/services.d/*/finish false root 0755 0755 6 | /var/run/s6/etc/services.d/*/log/run false root 0755 0755 7 | /var/run/s6/etc/services.d/*/log/finish false root 0755 0755 8 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/init/init-stage2-redirfd: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -S0 2 | 3 | backtick -D 0 -n S6_LOGGING { printcontenv S6_LOGGING } 4 | importas -u S6_LOGGING S6_LOGGING 5 | ifelse { s6-test ${S6_LOGGING} -ne 0 } 6 | { 7 | redirfd -w 1 /var/run/s6/uncaught-logs-fifo 8 | fdmove -c 2 1 9 | $@ 10 | } 11 | $@ 12 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/init/init-stage3: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -S0 2 | 3 | # This is the shutdown script, running as process 1. 4 | cd / 5 | 6 | # Merge environments from our custom stage into current context 7 | s6-envdir -I /var/run/s6/env-stage3 8 | 9 | # cont-finish.d: one-time finish scripts 10 | 11 | foreground 12 | { 13 | backtick -D 5000 -n S6_KILL_FINISH_MAXTIME { printcontenv S6_KILL_FINISH_MAXTIME } 14 | importas -u S6_KILL_FINISH_MAXTIME S6_KILL_FINISH_MAXTIME 15 | if 16 | { 17 | if -t { s6-test -d /var/run/s6/etc/cont-finish.d } 18 | if { s6-echo "[cont-finish.d] executing container finish scripts..." } 19 | if 20 | { 21 | pipeline { s6-ls -0 -- /var/run/s6/etc/cont-finish.d } 22 | pipeline { s6-sort -0 -- } 23 | forstdin -o 0 -0 -- i 24 | importas -u i i 25 | if { s6-echo -- "[cont-finish.d] ${i}: executing... " } 26 | foreground 27 | { 28 | s6-maximumtime -k ${S6_KILL_FINISH_MAXTIME} 29 | /var/run/s6/etc/cont-finish.d/${i} 30 | } 31 | importas -u ? ? 32 | s6-echo -- "[cont-finish.d] ${i}: exited ${?}." 33 | } 34 | s6-echo -- "[cont-finish.d] done." 35 | } 36 | } 37 | 38 | 39 | # Sync before TERM'n 40 | 41 | foreground { s6-echo "[s6-finish] syncing disks." } 42 | foreground { s6-sync } 43 | 44 | 45 | # Kill everything, gently. 46 | 47 | foreground { s6-echo "[s6-finish] sending all processes the TERM signal." } 48 | foreground { s6-nuke -th } # foreground is process 1: it survives 49 | foreground 50 | { 51 | 52 | backtick -D 3000 -n S6_KILL_GRACETIME { printcontenv S6_KILL_GRACETIME } 53 | importas -u S6_KILL_GRACETIME S6_KILL_GRACETIME 54 | s6-sleep -m -- ${S6_KILL_GRACETIME} 55 | } 56 | 57 | # Last message, then close our pipes and give the logger some time. 58 | foreground { s6-echo "[s6-finish] sending all processes the KILL signal and exiting." } 59 | fdclose 1 fdclose 2 60 | s6-sleep -m 200 61 | 62 | 63 | # Kill everything, brutally. 64 | 65 | foreground { s6-nuke -k } # foreground is process 1: it survives again 66 | 67 | 68 | # Reap all the zombies then sync, and we're done. 69 | 70 | wait { } 71 | foreground { s6-sync } 72 | 73 | 74 | # Use CMD exit code defaulting to zero if not present. 75 | 76 | importas -u -D0 S6_CMD_EXITED S6_CMD_EXITED 77 | exit ${S6_CMD_EXITED} 78 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/.s6-svscan/crash: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -P 2 | 3 | # This file is run when an unrecoverable error happens 4 | # to s6-svscan. Edit it to suit your needs. 5 | 6 | fdmove -c 2 1 7 | foreground { s6-echo "s6-svscan panicked! Dropping to a root shell.\n" } 8 | /bin/sh -i 9 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/.s6-svscan/finish: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -S0 2 | /etc/s6/init/init-stage3 $@ 3 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/s6-fdholderd/down: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/s6-fdholderd/notification-fd: -------------------------------------------------------------------------------- 1 | 1 -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/s6-fdholderd/rules/uid/0/allow: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/etc/s6/services/s6-fdholderd/rules/uid/0/allow -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/s6-fdholderd/rules/uid/0/env/S6_FDHOLDER_GETDUMP: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/s6-fdholderd/rules/uid/0/env/S6_FDHOLDER_LIST: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/s6-fdholderd/rules/uid/0/env/S6_FDHOLDER_RETRIEVE_REGEX: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/s6-fdholderd/rules/uid/0/env/S6_FDHOLDER_SETDUMP: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/s6-fdholderd/rules/uid/0/env/S6_FDHOLDER_STORE_REGEX: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/s6-fdholderd/rules/uid/default/allow: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/etc/s6/services/s6-fdholderd/rules/uid/default/allow -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/s6-fdholderd/rules/uid/default/env/S6_FDHOLDER_LIST: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/s6-fdholderd/run: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -P 2 | s6-envuidgid -D 32769:32769 daemon 3 | s6-fdholder-daemon -U -1 -i rules -- /var/run/s6/fdholderd-socket 4 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/s6-fdholderd/supervise/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /s6-overlay/etc/s6/services/s6-svscan-log/run: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -P 2 | logutil-service -f /var/run/s6/uncaught-logs-fifo /var/log/s6-uncaught-logs 3 | -------------------------------------------------------------------------------- /s6-overlay/etc/services.d/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /s6-overlay/init: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -S0 2 | 3 | ## 4 | ## load default PATH (the same that Docker includes if not provided) if it doesn't exist, 5 | ## then go ahead with stage1. 6 | ## this was motivated due to this issue: 7 | ## - https://github.com/just-containers/s6-overlay/issues/108 8 | ## 9 | 10 | 11 | /bin/importas -D /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PATH PATH 12 | /etc/s6/init/init-stage1 $@ 13 | -------------------------------------------------------------------------------- /s6-overlay/libexec/s6-rc-fdholder-filler: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/libexec/s6-rc-fdholder-filler -------------------------------------------------------------------------------- /s6-overlay/libexec/s6-rc-oneshot-run: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/libexec/s6-rc-oneshot-run -------------------------------------------------------------------------------- /s6-overlay/libexec/s6lockd-helper: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ninthwalker/NowShowing/dd4f8c3dbc822e3379e976510ca437fe1d52afd8/s6-overlay/libexec/s6lockd-helper -------------------------------------------------------------------------------- /s6-overlay/usr/bin/execlineb: -------------------------------------------------------------------------------- 1 | /bin/execlineb -------------------------------------------------------------------------------- /s6-overlay/usr/bin/fix-attrs: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -P 2 | 3 | /bin/export PATH /usr/bin:/bin 4 | /bin/export recfunction "\ 5 | foreground { s6-chown -u ${3} -g ${4} -- ${1} } 6 | foreground 7 | { 8 | ifelse { s6-test -d ${1} } 9 | { 10 | if -t { s6-test ! ${6} = "-" } 11 | s6-chmod ${6} ${1} 12 | } 13 | if -t { s6-test ! ${5} = "-" } 14 | s6-chmod ${5} ${1} 15 | } 16 | if -t { if { s6-${2} } s6-test -d ${1} } 17 | forbacktickx -0 subfile 18 | { 19 | importas -D 0 S6_FIX_ATTRS_HIDDEN S6_FIX_ATTRS_HIDDEN 20 | ifelse { s6-test ${S6_FIX_ATTRS_HIDDEN} -eq 0 } { s6-ls -0 ${1} } 21 | s6-ls -0 -a ${1} 22 | } 23 | multisubstitute 24 | { 25 | importas -u subfile subfile 26 | importas recfunction recfunction 27 | } 28 | execlineb -S6 -c ${recfunction} ${1}/${subfile} true ${3} ${4} ${5} ${6}" 29 | 30 | # process each line 31 | forstdin -d"\n" -- line 32 | importas -u line line 33 | if { s6-test -n ${line} } 34 | multidefine -0 -Cd" \t" -- ${line} { globex recurse userentry fmode dmode } 35 | # get 'uid' and 'gid' 36 | multidefine -Cd"," -- ${userentry} { account uidgid } 37 | backtick -n envuidgid_opts 38 | { 39 | backtick -n opts 40 | { 41 | ifte { s6-echo -- -D${uidgid} } { s6-echo -- -i } 42 | s6-test -n ${uidgid} 43 | } 44 | importas -u opts opts 45 | ifte { s6-echo -- -nB ${opts} } { s6-echo -- ${opts} } 46 | pipeline { s6-echo ${account} } 47 | if 48 | { 49 | redirfd -w 1 /dev/null 50 | fdmove -c 2 1 51 | s6-grep -- ":" 52 | } 53 | } 54 | importas -u -sCd" \t" envuidgid_opts envuidgid_opts 55 | s6-envuidgid ${envuidgid_opts} ${account} 56 | importas -u uid UID 57 | importas -u gid GID 58 | elglob -0 -- files ${globex} 59 | forx -p -- file { ${files} } 60 | multisubstitute 61 | { 62 | importas -u file file 63 | importas recfunction recfunction 64 | } 65 | execlineb -S6 -c ${recfunction} ${file} ${recurse} ${uid} ${gid} ${fmode} ${dmode} 66 | -------------------------------------------------------------------------------- /s6-overlay/usr/bin/logutil-newfifo: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb 2 | 3 | elgetopt "m:o:" 4 | multisubstitute 5 | { 6 | importas -u -D "0600" fmode ELGETOPT_m 7 | importas -u -D "root" owner ELGETOPT_o 8 | } 9 | elgetpositionals -P0 10 | emptyenv -P 11 | if { s6-test ${#} -ge 1 } 12 | if { s6-svwait -t 5000 -U /var/run/s6/services/s6-fdholderd } 13 | if { s6-rmrf ${1} } 14 | if { s6-mkfifo -m ${fmode} -- ${1} } 15 | if 16 | { 17 | s6-envuidgid -- ${owner} 18 | s6-chown -U -- ${1} 19 | } 20 | if 21 | { 22 | backtick -n name { s6-uniquename ${1} } 23 | importas -u name name 24 | redirfd -rnb 0 ${1} 25 | s6-fdholder-store /var/run/s6/fdholderd-socket ${name} 26 | } 27 | -------------------------------------------------------------------------------- /s6-overlay/usr/bin/logutil-service: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb 2 | 3 | # test if arguments were given 4 | elgetopt "f:" 5 | multisubstitute 6 | { 7 | importas -u -D "" fifo ELGETOPT_f 8 | } 9 | elgetpositionals -P0 10 | emptyenv -P 11 | if { s6-test ${#} -ge 1 } 12 | 13 | 14 | # switch between std{out,err} or fifo 15 | ifelse { s6-test -n ${fifo} } 16 | { 17 | redirfd -rnb 0 ${fifo} 18 | logutil-service-main ${1} 19 | } 20 | logutil-service-main ${1} 21 | -------------------------------------------------------------------------------- /s6-overlay/usr/bin/logutil-service-main: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -S1 2 | 3 | # this env decides what to log and how. 4 | backtick -D "n20 s1000000 T" -n S6_LOGGING_SCRIPT { printcontenv S6_LOGGING_SCRIPT } 5 | importas -u -sCd" \t" S6_LOGGING_SCRIPT S6_LOGGING_SCRIPT 6 | 7 | # execute s6-log and drop root rights in favor of nobody 8 | s6-envuidgid -D 32768:32768 nobody 9 | s6-applyuidgid -U 10 | exec -c 11 | s6-log -bp -- ${S6_LOGGING_SCRIPT} ${1} 12 | -------------------------------------------------------------------------------- /s6-overlay/usr/bin/printcontenv: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -S0 2 | 3 | # test if arguments were given 4 | if { s6-test ${#} -ge 1 } 5 | 6 | importas -D 0 S6_KEEP_ENV S6_KEEP_ENV 7 | # if S6_KEEP_ENV was passed, whole supervision tree should see 8 | # original docker environement 9 | ifelse { s6-test ${S6_KEEP_ENV} -ne 0 } 10 | { 11 | redirfd -w 2 /dev/null importas -i value ${1} 12 | s6-echo -n -- ${value} 13 | } 14 | 15 | # else: original docker env was dumped into container_environment 16 | # retrieve it from there and print if it exists 17 | if { s6-test -f /var/run/s6/container_environment/${1} } 18 | if 19 | { 20 | backtick value 21 | { 22 | redirfd -r 0 /var/run/s6/container_environment/${1} 23 | s6-cat 24 | } 25 | importas -u value value 26 | s6-echo -- ${value} 27 | } 28 | -------------------------------------------------------------------------------- /s6-overlay/usr/bin/with-contenv: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb -S0 2 | importas -D 0 S6_KEEP_ENV S6_KEEP_ENV 3 | ifelse { s6-test ${S6_KEEP_ENV} -eq 0 } 4 | { 5 | /bin/exec -c -- 6 | /bin/s6-envdir -fn -- /var/run/s6/container_environment 7 | /bin/exec -- 8 | $@ 9 | } 10 | 11 | $@ 12 | -------------------------------------------------------------------------------- /s6-overlay/usr/bin/with-retries: -------------------------------------------------------------------------------- 1 | #!/bin/execlineb 2 | 3 | # 4 | # with-retries -n numretries -t millisecs prog... 5 | # 6 | 7 | elgetopt "n:t:" 8 | multisubstitute 9 | { 10 | importas -u -D 3 nretries ELGETOPT_n 11 | importas -u -D 500 timeout ELGETOPT_t 12 | } 13 | elgetpositionals -P0 14 | emptyenv -P 15 | forbacktickx -x 0,1 -d"\n" i { s6-seq 0 ${nretries} } 16 | importas -u i i 17 | if { s6-test ${i} -ne ${nretries} } 18 | foreground 19 | { 20 | s6-maximumtime -t ${timeout} 21 | $@ 22 | } 23 | importas -u ? ? 24 | if -x 99 { s6-test ${?} -eq 0 } 25 | --------------------------------------------------------------------------------