Compare commits

...

18 Commits
6 ... master

Author SHA1 Message Date
sparklyballs
e7adab45ff
Merge pull request #5 from linuxserver/cosmetic_stuff
cosmetic changes using variables for all packages
2018-04-04 09:58:14 +01:00
sparklyballs
791d38dc3b cosmetic changes using variables for all packages 2018-04-04 09:48:15 +01:00
Paul Hendryx
17bc60c5bc
Merge pull request #4 from linuxserver/jsonscript
added org to influxdb, added org and full url to repo on json feed
2018-04-03 23:34:22 -04:00
Paul Hendryx
a3b123b4c2 added org to influxdb, added org and full url to repo on json feed 2018-04-03 23:29:12 -04:00
Paul Hendryx
47d777f510
Merge pull request #2 from linuxserver/linting
linting fix
2018-03-27 20:27:47 -04:00
Paul Hendryx
c0f35c6a8e
Merge pull request #3 from linuxserver/jsonscript
oopsy on hash key names overwriting each other
2018-03-27 20:27:21 -04:00
Paul Hendryx
1afc9a8e1f oopsy on hash key names overwriting each other 2018-03-27 20:18:19 -04:00
sparklyballs
b7a9a23cbb change to new baseimage name and tidy Dockerfile 2018-03-26 10:30:41 +01:00
sparklyballs
9d57d2ce36 linting fix 2018-03-26 10:18:33 +01:00
Paul Hendryx
86d7f4f197
Merge pull request #1 from linuxserver/jsonscript
Jsonscript
2018-03-25 12:23:59 -04:00
Paul Hendryx
2859c8e414 Merge branch 'master' into jsonscript
# Conflicts:
#	Dockerfile
2018-03-25 12:13:44 -04:00
Paul Hendryx
b807b6876e add sinatra, json pull, etc 2018-03-25 12:10:32 -04:00
Paul Hendryx
f45bcb41b1 change name from stats.rb to stats_pull.rb 2018-03-25 11:24:25 -04:00
Paul Hendryx
e7c8b7491e update stats pull 2018-03-25 11:23:41 -04:00
sparklyballs
010aba2ac0 simplify Dockerfile 2017-04-06 12:18:49 +01:00
sparklyballs
b867b3ad81 influxdb kill by pid and tidying Dockerfile 2017-04-06 10:16:05 +01:00
sparklyballs
faea8e8b0f kill grafana by pid 2017-04-06 09:35:06 +01:00
sparklyballs
d4989967c9 some Dockerfile tidying and using variables for package versions 2017-04-06 09:19:14 +01:00
11 changed files with 195 additions and 175 deletions

4
.gitignore vendored
View File

@ -47,3 +47,7 @@ app/config/settings.yml
app/tmp
tmp
local-*.sh
testconfig
.idea

View File

@ -1,167 +1,78 @@
FROM lsiobase/xenial
MAINTAINER phendryx
FROM lsiobase/ubuntu:xenial
# set version label
ARG BUILD_DATE
ARG VERSION
LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}"
LABEL maintainer="phendryx"
# copy app files
COPY app/ /opt/dockerhub-stats/
# environment settings
ARG DEBIAN_FRONTEND="noninteractive"
# build packages as variable
# package versions
ARG GRAFANA_VER="4.1.2-1486989747"
ARG INFLUX_VER="1.2.0"
# packages as variables
ARG BUILD_PACKAGES="\
apt-transport-https \
binutils \
bzip2 \
cpp \
cpp-5 \
dh-python \
distro-info-data \
g++ \
g++-5 \
gcc \
gcc-5 \
git \
git-core \
git-man \
icu-devtools \
libasan2 \
libatomic1 \
libc-dev-bin \
libc6-dev \
libcc1-0 \
libcilkrts5 \
liberror-perl \
libgcc-5-dev \
libgdbm3 \
libgmp-dev \
libgmpxx4ldbl \
libgomp1 \
libicu-dev \
libicu55 \
libisl15 \
libitm1 \
liblsan0 \
libmpc3 \
libmpdec2 \
libmpfr4 \
libmpx0 \
libperl5.22 \
libpng12-0 \
libpython3-stdlib \
libpython3.5-minimal \
libpython3.5-stdlib \
libquadmath0 \
libruby2.3 \
libstdc++-5-dev \
libtcl8.6 \
libtcltk-ruby \
libtk8.6 \
libtsan0 \
libubsan0 \
libx11-6 \
libx11-data \
libxau6 \
libxcb1 \
libxdmcp6 \
libxext6 \
libxml2 \
libxml2-dev \
libxrender1 \
libxslt1-dev \
libxslt1.1 \
libxss1 \
libyaml-0-2 \
linux-libc-dev \
lsb-release \
make \
mime-support \
perl \
perl-modules-5.22 \
python3 \
python3-minimal \
python3.5 \
python3.5-minimal \
rake \
ri \
ruby \
ruby-dev \
ruby-did-you-mean \
ruby-full \
ruby-minitest \
ruby-net-telnet \
ruby-power-assert \
ruby-test-unit \
ruby2.3 \
ruby2.3-dev \
ruby2.3-doc \
ruby2.3-tcltk \
rubygems-integration \
wget \
x11-common \
zlib1g-dev \
fontconfig-config \
fonts-dejavu-core \
libexpat1 \
libfontconfig1 \
libfontconfig \
libfreetype6 \
libpng12-0 \
ucf"
# copy app and excludes
COPY root/ /
COPY app/ /opt/dockerhub-stats/
# install build packages
RUN \
apt-get update && \
apt-get install -y \
--no-install-recommends \
$BUILD_PACKAGES && \
# install ruby app gems
cd /opt/dockerhub-stats/ && \
echo 'gem: --no-document' > \
/etc/gemrc && \
gem install bundler && \
bundle install && \
# clean up
apt-get purge -y --auto-remove \
$BUILD_PACKAGES && \
# install runtime packages
apt-get install -y \
--no-install-recommends \
wget"
ARG RUNTIME_PACKAGES="\
cron \
libfontconfig1 \
libfreetype6 \
libpng12-0 \
netcat \
wget \
ruby && \
cd /tmp; wget https://dl.influxdata.com/influxdb/releases/influxdb_1.2.0_amd64.deb; dpkg -i influxdb_1.2.0_amd64.deb && \
cd /tmp; wget https://grafanarel.s3.amazonaws.com/builds/grafana_4.1.2-1486989747_amd64.deb; dpkg -i grafana_4.1.2-1486989747_amd64.deb && apt-get -f install && \
ruby \
wget"
RUN \
echo "**** install build packages ****" && \
apt-get update && \
apt-get install -y \
--no-install-recommends \
$BUILD_PACKAGES && \
echo "**** install ruby app gems ****" && \
cd /opt/dockerhub-stats/ && \
echo 'gem: --no-document' > \
/etc/gemrc && \
gem install bundler && \
bundle install && \
echo "**** uninstall build packages ****" && \
apt-get purge -y --auto-remove \
$BUILD_PACKAGES && \
echo "****install runtime packages ****" && \
apt-get install -y \
--no-install-recommends \
$RUNTIME_PACKAGES && \
echo "**** install influxdb and grafana ****" && \
curl -o \
/tmp/influxdb.deb \
"https://dl.influxdata.com/influxdb/releases/influxdb_${INFLUX_VER}_amd64.deb" && \
dpkg -i /tmp/influxdb.deb && \
curl -o \
/tmp/grafana.deb \
"https://grafanarel.s3.amazonaws.com/builds/grafana_${GRAFANA_VER}_amd64.deb" && \
dpkg -i /tmp/grafana.deb && \
apt-get -f install && \
echo "**** cleanup ****" && \
rm -rf \
/root \
/tmp/* \
/var/lib/apt/lists/* \
/var/tmp/* && \
find /root -name . -o -prune -exec rm -rf -- {} + && \
find /var/lib/gems -name "cache" -type d -exec rm -rf -- {} + && \
mkdir -p \
/root && \
chmod 744 /etc/cron.d/dockerhub-stats
/root
# import grafana dashboard
# ADD ./grafana/dash.json /var/lib/grafana/dashboards/dash.json
# copy local files
COPY root/ /
# ports and volumes
#WORKDIR /opt/docker-readme-sync
EXPOSE 3000 8083 8086
EXPOSE 3000 8083 8086 4567
VOLUME /config

View File

@ -7,3 +7,4 @@ gem 'httparty', '~> 0.14.0'
gem 'influxdb', '~> 0.3.12'
gem 'awesome_print'
gem 'sinatra', '~> 2.0', '>= 2.0.1'

View File

@ -10,7 +10,17 @@ GEM
json
json (2.0.2)
multi_xml (0.5.5)
mustermann (1.0.2)
rack (2.0.4)
rack-protection (2.0.1)
rack
rake (11.3.0)
sinatra (2.0.1)
mustermann (~> 1.0)
rack (~> 2.0)
rack-protection (= 2.0.1)
tilt (~> 2.0)
tilt (2.0.8)
PLATFORMS
ruby
@ -20,9 +30,10 @@ DEPENDENCIES
httparty (~> 0.14.0)
influxdb (~> 0.3.12)
rake (~> 11.3)
sinatra (~> 2.0, >= 2.0.1)
RUBY VERSION
ruby 2.3.1p112
BUNDLED WITH
1.13.6
1.16.1

View File

@ -1,40 +1,33 @@
require "httparty"
require "awesome_print"
require "influxdb"
require "yaml"
require "sinatra"
config_file = File.dirname(__FILE__) + "/config/settings.yml"
config = YAML.load_file(config_file)
def get_data
port = 8086
port = ENV['INFLUXDB_PORT'].to_i unless ENV['INFLUXDB_PORT'].nil?
email = config["email"]
password = config["password"]
org = config["org"]
influxdb = InfluxDB::Client.new database: "dockerhub_stats", port: port
query = 'select max(pull_count) as count from dockerhub_stats where time > now() - 1h group by repo,arch,org'
res = influxdb.query(query)
data = { username: email,
password: password }
data = []
res.each do |repo|
repo_name = repo['tags']['repo']
count = repo['values'][0]['count']
arch = repo['tags']['arch']
org = repo['tags']['org']
url = "https://hub.docker.com/r/#{org}/#{repo_name}"
data << { name: repo_name, count: count, arch: arch, org: org, url: url }
end
res = HTTParty.post("https://hub.docker.com/v2/users/login/", body: data).body
token = JSON.parse(res)["token"]
headers = { token: token}
res = HTTParty.get(
"https://hub.docker.com/v2/repositories/#{org}/",
query: { page_size: 100 },
headers: headers)
data = JSON.parse(res.body)
pull_counts = {}
data["results"].each do |repo|
pull_counts[repo["name"]] = repo["pull_count"]
data
end
influxdb = InfluxDB::Client.new database: "dockerhub_stats"
pull_counts.each do |repo, count|
data = {
values: { pull_count: count },
tags: { repo: repo }
}
set :logging, true
set :dump_errors, true
set :bind, '0.0.0.0'
influxdb.write_point("dockerhub_stats", data)
get '/stats' do
content_type :json
get_data.to_json
end

93
app/stats_pull.rb Normal file
View File

@ -0,0 +1,93 @@
require "httparty"
require "awesome_print"
require "influxdb"
require "yaml"
def processs_org(org)
arch = 'x86'
case(org)
when 'linuxserver' then
arch = 'x86'
when 'lsioarmhf' then
arch = 'armhf'
end
res = HTTParty.get(
"https://hub.docker.com/v2/repositories/#{org}/",
query: { page_size: 100 })
pull_counts = {}
continue = true
while continue
data = JSON.parse(res.body)
pull_counts.merge!(process_counts(data, arch))
if data.include?('next') && data['next'].nil? == false
url = data['next']
res = HTTParty.get(url)
else
continue = false
end
end
pull_counts
end
def process_counts(data, arch)
pull_counts = {}
data['results'].each do |repo|
name = repo['name']
count = repo['pull_count']
pull_counts["#{name}-#{arch}"] = { name: name, arch: arch, pull_count: count}
end
pull_counts
end
def insert_counts(data)
port = 8086
port = ENV['INFLUXDB_PORT'].to_i unless ENV['INFLUXDB_PORT'].nil?
influxdb = InfluxDB::Client.new database: "dockerhub_stats", port: port
data.each do |key, repo_data|
influx_data = {
values: { pull_count: repo_data[:pull_count] },
tags: { repo: repo_data[:name], arch: repo_data[:arch], org: repo_data[:org] }
}
influxdb.write_point("dockerhub_stats", influx_data)
end
end
def run
orgs = nil
# pull orgs from env var
unless ENV['DOCKERHUB_ORGS'].nil?
orgs = ENV['DOCKERHUB_ORGS'].split(',')
end
# pull orgs from settings file if not specified in env var
if orgs.nil?
config_file = File.dirname(__FILE__) + "/config/settings.yml"
config = YAML.load_file(config_file)
orgs = config["orgs"]
end
counts = {}
orgs.each do |org|
org_counts = processs_org(org)
org_counts.each do |org_count|
org_count[1][:org] = org
end
counts.merge!(org_counts)
end
insert_counts(counts)
end
run

View File

@ -13,6 +13,7 @@ mkdir -p /config/etc/grafana /config/var/lib/grafana /config/var/log/grafana
cp /etc/grafana/grafana.ini /config/etc/grafana
/usr/sbin/grafana-server --homepath=/usr/share/grafana --config=/config/etc/grafana/grafana.ini cfg:default.paths.data=/config/var/lib/grafana cfg:default.paths.logs=/config/var/log/grafana 2>&1 &
GRAFANA_PID=$!
until nc -z -v -w5 localhost 3000 < /dev/null; do sleep 1; done
@ -32,6 +33,5 @@ curl 'http://admin:admin@localhost:3000/api/datasources' \
DATASOURCE
echo
kill `ps -ef | grep grafana-server | grep homepath | awk {'print $2'}`
touch ${STAMP}
kill ${GRAFANA_PID}
touch ${STAMP}

View File

@ -15,11 +15,11 @@ cp /etc/influxdb/influxdb.conf /config/etc/influxdb/
sed -i 's/\/var\/lib/\/config\/var\/lib/g' /config/etc/influxdb/influxdb.conf
/usr/bin/influxd -pidfile /var/run/influxdb/influxd.pid -config /config/etc/influxdb/influxdb.conf 2>&1 &
INFLUX_PID=$!
# wait for influxdb to respond to requests
until /usr/bin/influx -execute 'show databases'; do sleep 1; done
/usr/bin/influx -execute 'create database dockerhub_stats'
kill `ps -ef | grep influxd | grep pid | awk {'print $2'}`
kill ${INFLUX_PID}
touch ${STAMP}

View File

@ -11,3 +11,5 @@ fi
if [ ! -f /opt/dockerhub-stats/config/settings.yml ]; then
ln -s /config/app/settings.yml /opt/dockerhub-stats/config/settings.yml
fi
chmod 744 /etc/cron.d/dockerhub-stats

View File

@ -1 +1 @@
12 * * * * root /bin/bash -l -c 'cd /opt/dockerhub-stats; ruby stats.rb 2>&1'
12 * * * * root /bin/bash -l -c 'cd /opt/dockerhub-stats; ruby stats_pull.rb 2>&1'

View File

@ -0,0 +1,5 @@
#!/usr/bin/with-contenv bash
cd /opt/dockerhub-stats/ || exit
ruby stats.rb