Hello community,
here is the log from the commit of package openSUSE-release-tools for
openSUSE:Factory checked in at 2018-09-17 14:26:39
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/openSUSE-release-tools (Old)
and /work/SRC/openSUSE:Factory/.openSUSE-release-tools.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openSUSE-release-tools"
Mon Sep 17 14:26:39 2018 rev:131 rq:635880 version:20180914.628c1a1
Changes:
--------
---
/work/SRC/openSUSE:Factory/openSUSE-release-tools/openSUSE-release-tools.changes
2018-09-15 15:40:42.276810074 +0200
+++
/work/SRC/openSUSE:Factory/.openSUSE-release-tools.new/openSUSE-release-tools.changes
2018-09-17 14:26:50.471761848 +0200
@@ -1,0 +2,11 @@
+Fri Sep 14 21:14:06 UTC 2018 - [email protected]
+
+- Update to version 20180914.628c1a1:
+ * metrics/grafana/access: add new row and graphs for image totals by product.
+ * metrics/access/aggregate: process and summarize image totals by product.
+ * metrics/access/aggregate: extract merge_product_plus_key() from merge().
+ * metrics/access/ingest: detect product image paths and included in dump.
+ * metrics/grafana/access: remove left-over raw queries.
+ * metrics/access/aggregate: include Leap 15.1 in published metrics.
+
+-------------------------------------------------------------------
Old:
----
openSUSE-release-tools-20180913.d102240.obscpio
New:
----
openSUSE-release-tools-20180914.628c1a1.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ openSUSE-release-tools.spec ++++++
--- /var/tmp/diff_new_pack.Ga3Lwj/_old 2018-09-17 14:26:54.471758398 +0200
+++ /var/tmp/diff_new_pack.Ga3Lwj/_new 2018-09-17 14:26:54.475758395 +0200
@@ -20,7 +20,7 @@
%define source_dir openSUSE-release-tools
%define announcer_filename factory-package-news
Name: openSUSE-release-tools
-Version: 20180913.d102240
+Version: 20180914.628c1a1
Release: 0
Summary: Tools to aid in staging and release work for openSUSE/SUSE
License: GPL-2.0-or-later AND MIT
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.Ga3Lwj/_old 2018-09-17 14:26:54.519758357 +0200
+++ /var/tmp/diff_new_pack.Ga3Lwj/_new 2018-09-17 14:26:54.519758357 +0200
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param
name="url">https://github.com/openSUSE/openSUSE-release-tools.git</param>
- <param
name="changesrevision">d1022403cb2720cfb1f192690410f8068f432871</param>
+ <param
name="changesrevision">5c410b7c76aa85b5a0eb6b0859717f1e0aefe9c4</param>
</service>
</servicedata>
++++++ openSUSE-release-tools-20180913.d102240.obscpio ->
openSUSE-release-tools-20180914.628c1a1.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/openSUSE-release-tools-20180913.d102240/metrics/access/aggregate.php
new/openSUSE-release-tools-20180914.628c1a1/metrics/access/aggregate.php
--- old/openSUSE-release-tools-20180913.d102240/metrics/access/aggregate.php
2018-09-13 23:57:31.000000000 +0200
+++ new/openSUSE-release-tools-20180914.628c1a1/metrics/access/aggregate.php
2018-09-14 23:09:10.000000000 +0200
@@ -11,7 +11,7 @@
const VHOST = 'download.opensuse.org';
const FILENAME = 'download.opensuse.org-%s-access_log.xz';
const IPV6_PREFIX = 'ipv6.';
-const PRODUCT_PATTERN =
'/^(10\.[2-3]|11\.[0-4]|12\.[1-3]|13\.[1-2]|42\.[1-3]|15\.[0]|tumbleweed)$/';
+const PRODUCT_PATTERN =
'/^(10\.[2-3]|11\.[0-4]|12\.[1-3]|13\.[1-2]|42\.[1-3]|15\.[0-1]|tumbleweed)$/';
$begin = new DateTime();
// Skip the current day since the logs are incomplete and not compressed yet.
@@ -174,6 +174,7 @@
if (!isset($merged_protocol[$protocol])) $merged_protocol[$protocol] =
[];
$data_new['days'] = 1;
+ normalize($data_new);
aggregate($intervals, $merged_protocol[$protocol], $date,
$date_previous, $data_new,
['protocol' => $protocol], 'protocol');
@@ -220,6 +221,11 @@
$count = write_summary($interval, $date_previous, $summary, $tags,
$prefix);
+ if ($prefix == 'access') {
+ $summary =
summarize_product_plus_key($merged[$interval]['data']['total_image_product']);
+ $count += write_summary_product_plus_key($interval, $date_previous,
$summary, 'image');
+ }
+
error_log("[$prefix] [$interval] [{$merged[$interval]['value']}] wrote
$count points at " .
$date_previous->format('Y-m-d') . " spanning " .
$merged[$interval]['data']['days'] . ' day(s)');
}
@@ -237,6 +243,14 @@
}
}
+function normalize(&$data)
+{
+ // Ensure fields added later, that are not present in all data, are
available.
+ if (!isset($data['total_image_product'])) {
+ $data['total_image_product'] = [];
+ }
+}
+
function merge(&$data1, $data2)
{
$data1['days'] += $data2['days'];
@@ -248,22 +262,28 @@
$data1['total_product'][$product] += $data2['total_product'][$product];
}
- foreach ($data2['unique_product'] as $product => $unqiue) {
- if (empty($data1['unique_product'][$product]))
- $data1['unique_product'][$product] = [];
-
- foreach ($unqiue as $uuid => $count) {
- if (empty($data1['unique_product'][$product][$uuid]))
- $data1['unique_product'][$product][$uuid] = 0;
-
- $data1['unique_product'][$product][$uuid] +=
$data2['unique_product'][$product][$uuid];
- }
- }
+ merge_product_plus_key($data1['unique_product'], $data2['unique_product']);
+ merge_product_plus_key($data1['total_image_product'],
$data2['total_image_product']);
$data1['total_invalid'] += $data2['total_invalid'];
$data1['bytes'] += $data2['bytes'];
}
+function merge_product_plus_key(&$data1, $data2)
+{
+ foreach ($data2 as $product => $pairs) {
+ if (empty($data1[$product]))
+ $data1[$product] = [];
+
+ foreach ($pairs as $key => $value) {
+ if (empty($data1[$product][$key]))
+ $data1[$product][$key] = 0;
+
+ $data1[$product][$key] += $data2[$product][$key];
+ }
+ }
+}
+
function summarize($data)
{
static $products = [];
@@ -319,6 +339,29 @@
return $summary;
}
+function summarize_product_plus_key($data)
+{
+ static $keys = [];
+
+ $summary = [];
+ $products = array_merge(array_keys($keys), array_keys($data));
+ foreach ($products as $product) {
+ if (!product_filter($product)) continue;
+
+ $keys_keys = isset($keys[$product]) ? array_keys($keys[$product]) : [];
+ $data_keys = isset($data[$product]) ? array_keys($data[$product]) : [];
+ $product_keys = array_merge($keys_keys, $data_keys);
+
+ $summary[$product] = [];
+ foreach ($product_keys as $key) {
+ // Fill empty data with zeros to achieve appropriate result in graph.
+ $summary[$product][$key] = isset($data[$product][$key]) ?
$data[$product][$key] : 0;
+ }
+ }
+
+ return $summary;
+}
+
function product_filter($product)
{
return (bool) preg_match(PRODUCT_PATTERN, $product);
@@ -341,6 +384,20 @@
}
write($points);
return count($points);
+}
+
+function write_summary_product_plus_key($interval, DateTime $date, $summary,
$prefix)
+{
+ $measurement = $prefix . '_' . $interval;
+ $points = [];
+ foreach ($summary as $product => $pairs) {
+ foreach ($pairs as $key => $value) {
+ $points[] = new Point($measurement, null,
+ ['product' => $product, 'key' => $key], ['value' => $value],
$date->getTimestamp());
+ }
+ }
+ write($points);
+ return count($points);
}
function write($points)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/openSUSE-release-tools-20180913.d102240/metrics/access/ingest.php
new/openSUSE-release-tools-20180914.628c1a1/metrics/access/ingest.php
--- old/openSUSE-release-tools-20180913.d102240/metrics/access/ingest.php
2018-09-13 23:57:31.000000000 +0200
+++ new/openSUSE-release-tools-20180914.628c1a1/metrics/access/ingest.php
2018-09-14 23:09:10.000000000 +0200
@@ -3,11 +3,13 @@
const REGEX_LINE = '/\S+ \S+ \S+ \[([^:]+:\d+:\d+:\d+ [^\]]+)\] "(\S+)(?:
(\S+) \S+)?" (\S+) (\S+) "[^"]*" "[^"]*" .* size:(\S+) \S+(?:
+"?(\S+-\S+-\S+-\S+-[^\s"]+|-)"? "?(dvd|ftp|-)"?)?/';
const REGEX_PRODUCT =
'#/(?:(tumbleweed)|distribution/(?:leap/)?(\d+\.\d+)|openSUSE(?:_|:/)(?:leap(?:_|:/))?(factory|tumbleweed|\d+\.\d+))#i';
+const REGEX_IMAGE =
'#(?:/(?:iso|live)/[^/]+-(DVD|NET|GNOME-Live|KDE-Live|Rescue-CD|Kubic-DVD)-[^/]+\.iso(?:\.torrent)?|/jeos/[^/]+-(JeOS)\.[^/]+\.(?:qcow2|vhdx|vmdk|vmx)$)#';
$total = 0;
$total_invalid = 0;
$total_product = [];
$unique_product = [];
+$total_image_product = [];
$file = $argc == 2 ? $argv[1] : 'php://stdin';
$handle = fopen($file, 'r');
@@ -40,6 +42,15 @@
if (!isset($unique_product[$product][$uuid]))
$unique_product[$product][$uuid] = 0;
$unique_product[$product][$uuid] += 1;
}
+
+ if (preg_match(REGEX_IMAGE, $match[3], $match_image)) {
+ // Remove empty match groups and select non-all match.
+ $values = array_filter($match_image);
+ $image = next($values);
+ if (!isset($total_image_product[$product])) $total_image_product[$product]
= [];
+ if (!isset($total_image_product[$product][$image]))
$total_image_product[$product][$image] = 0;
+ $total_image_product[$product][$image] += 1;
+ }
}
$position = ftell($handle);
fclose($handle);
@@ -54,6 +65,7 @@
'total' => $total,
'total_product' => $total_product,
'unique_product' => $unique_product,
+ 'total_image_product' => $total_image_product,
'total_invalid' => $total_invalid,
'bytes' => $position,
]) . "\n"; // JSON_PRETTY_PRINT for debugging.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/openSUSE-release-tools-20180913.d102240/metrics/grafana/access.json
new/openSUSE-release-tools-20180914.628c1a1/metrics/grafana/access.json
--- old/openSUSE-release-tools-20180913.d102240/metrics/grafana/access.json
2018-09-13 23:57:31.000000000 +0200
+++ new/openSUSE-release-tools-20180914.628c1a1/metrics/grafana/access.json
2018-09-14 23:09:10.000000000 +0200
@@ -201,8 +201,6 @@
"measurement": "/^access_$frequency$/",
"orderByTime": "ASC",
"policy": "default",
- "query": "SELECT \"unique\" FROM /^access_$frequency$/ WHERE
$timeFilter AND product =~
/^(10\\.[2-3]|11\\.[0-4]|12\\.[1-3]|13\\.[1-2]|42\\.[1-3]|15\\.[0]|tumbleweed)$/
GROUP BY \"product\"",
- "rawQuery": false,
"refId": "A",
"resultFormat": "time_series",
"select": [
@@ -311,8 +309,6 @@
"measurement": "/^access_$frequency$/",
"orderByTime": "ASC",
"policy": "default",
- "query": "SELECT \"unique\" FROM /^access_$frequency$/ WHERE
$timeFilter AND product =~
/^(11\\.[1-4]|12\\.[1-3]|13\\.[1-2]|42\\.[1-3]|15\\.[0]|tumbleweed)$/ GROUP BY
\"product\"",
- "rawQuery": false,
"refId": "A",
"resultFormat": "time_series",
"select": [
@@ -421,8 +417,6 @@
"measurement": "/^access_$frequency$/",
"orderByTime": "ASC",
"policy": "default",
- "query": "SELECT \"unique\" FROM /^access_$frequency$/ WHERE
$timeFilter AND product =~
/^(10\\.[2-3]|11\\.[0-4]|12\\.[1-3]|13\\.[1-2]|42\\.[1-3]|15\\.[0]|tumbleweed)$/
GROUP BY \"product\"",
- "rawQuery": false,
"refId": "A",
"resultFormat": "time_series",
"select": [
@@ -535,8 +529,6 @@
"measurement": "/^access_$frequency$/",
"orderByTime": "ASC",
"policy": "default",
- "query": "SELECT mean(\"value\") FROM \"measurement\" WHERE
$timeFilter GROUP BY time($__interval) fill(null)",
- "rawQuery": false,
"refId": "A",
"resultFormat": "table",
"select": [
@@ -617,8 +609,6 @@
"measurement": "/^access_$frequency$/",
"orderByTime": "ASC",
"policy": "default",
- "query": "SELECT MAX(\"unique\") FROM /^access_$frequency$/ WHERE
$timeFilter AND product =~
/^(10\\.[2-3]|11\\.[0-4]|12\\.[1-3]|13\\.[1-2]|42\\.[1-3]|15\\.[0]|tumbleweed)$/
group by product",
- "rawQuery": false,
"refId": "A",
"resultFormat": "time_series",
"select": [
@@ -1903,6 +1893,453 @@
],
"title": "Tool Feedback",
"type": "row"
+ },
+ {
+ "collapsed": true,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 48
+ },
+ "id": 43,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "osrt_access",
+ "fill": 1,
+ "gridPos": {
+ "h": 10,
+ "w": 24,
+ "x": 0,
+ "y": 9
+ },
+ "id": 40,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "$tag_key",
+ "groupBy": [
+ {
+ "params": [
+ "key"
+ ],
+ "type": "tag"
+ }
+ ],
+ "hide": false,
+ "measurement": "/^image_$frequency$/",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "slimit": "",
+ "tags": [
+ {
+ "key": "product",
+ "operator": "=~",
+ "value": "/^$product$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Total by Image (stacked)",
+ "tooltip": {
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "osrt_access",
+ "fill": 1,
+ "gridPos": {
+ "h": 10,
+ "w": 24,
+ "x": 0,
+ "y": 19
+ },
+ "id": 45,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "$tag_key",
+ "groupBy": [
+ {
+ "params": [
+ "key"
+ ],
+ "type": "tag"
+ }
+ ],
+ "hide": false,
+ "measurement": "/^image_$frequency$/",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "slimit": "",
+ "tags": [
+ {
+ "key": "product",
+ "operator": "=~",
+ "value": "/^$product$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Total by Image",
+ "tooltip": {
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "osrt_access",
+ "fill": 1,
+ "gridPos": {
+ "h": 10,
+ "w": 24,
+ "x": 0,
+ "y": 29
+ },
+ "id": 44,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": true,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "$tag_key",
+ "groupBy": [
+ {
+ "params": [
+ "key"
+ ],
+ "type": "tag"
+ }
+ ],
+ "hide": false,
+ "measurement": "/^image_$frequency$/",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "slimit": "",
+ "tags": [
+ {
+ "key": "product",
+ "operator": "=~",
+ "value": "/^$product$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Total by Image (percentage)",
+ "tooltip": {
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": "100",
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "osrt_access",
+ "fill": 1,
+ "gridPos": {
+ "h": 10,
+ "w": 24,
+ "x": 0,
+ "y": 39
+ },
+ "id": 46,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": true,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "$tag_key",
+ "groupBy": [
+ {
+ "params": [
+ "key"
+ ],
+ "type": "tag"
+ }
+ ],
+ "hide": false,
+ "measurement": "/^image_$frequency$/",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "slimit": "",
+ "tags": [
+ {
+ "key": "product",
+ "operator": "=~",
+ "value": "/^$product$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Total by Image (percentage - zoomed)",
+ "tooltip": {
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": "100",
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "title": "Image Media - $product",
+ "type": "row"
}
],
"refresh": false,
@@ -1942,6 +2379,26 @@
],
"query": "day, week, month",
"type": "custom"
+ },
+ {
+ "allValue": null,
+ "current": {},
+ "datasource": "osrt_access",
+ "hide": 0,
+ "includeAll": false,
+ "label": "Product",
+ "multi": false,
+ "name": "product",
+ "options": [],
+ "query": "show tag values from image_month with key = \"product\"",
+ "refresh": 1,
+ "regex": "",
+ "sort": 2,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
}
]
},
++++++ openSUSE-release-tools.obsinfo ++++++
--- /var/tmp/diff_new_pack.Ga3Lwj/_old 2018-09-17 14:26:55.335757654 +0200
+++ /var/tmp/diff_new_pack.Ga3Lwj/_new 2018-09-17 14:26:55.335757654 +0200
@@ -1,5 +1,5 @@
name: openSUSE-release-tools
-version: 20180913.d102240
-mtime: 1536875851
-commit: d1022403cb2720cfb1f192690410f8068f432871
+version: 20180914.628c1a1
+mtime: 1536959350
+commit: 628c1a107d1928793cd54204e4c109a6d793e0b6