summaryrefslogtreecommitdiffstats
path: root/web/gui/bundle_dashboard_v2.py
blob: 66c74503de86537f7a1a6ff059d49b41e6dc0a07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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
136
137
138
#!/usr/bin/env python3
#
# Copyright: © 2023 Netdata Inc.
# SPDX-License-Identifier: GPL-3.0-or-later
'''Bundle the v2 dashboard code into the agent repo.

   This is designed to be run as part of a GHA workflow, but will work fine outside of one.'''

import os
import shutil
import subprocess

from pathlib import Path

os.chdir(Path(__file__).parent.absolute())

BASEDIR = 'v2'

BASEPATH = Path(BASEDIR)

TMPPATH = Path('tmp')

URLSRC = 'https://app.netdata.cloud/agent.tar.gz'

MAKEFILETEMPLATE = '''
# Auto-generated by bundle_dashboard_v2.py
# Copyright: © 2023 Netdata Inc.
# SPDX-License-Identifier: GPL-3.0-or-later
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in

dist_noinst_DATA = \\
    $(srcdir)/README.md

webv2dir=$(webdir)/v2

dist_webv2_DATA = \\
    {0} \\
    $(NULL)

webv2staticdir=$(webv2dir)/static
dist_webv2static_DATA = \\
    {1} \\
    $(NULL)

webv2staticemailimgdir=$(webv2staticdir)/email/img
dist_webv2staticemailimg_DATA = \\
    {2} \\
    $(NULL)

webv2staticimgdir=$(webv2staticdir)/img
dist_webv2staticimg_DATA = \\
    {3} \\
    $(NULL)

webv2staticimglogososdir=$(webv2staticimgdir)/logos/os
dist_webv2staticimglogosos_DATA = \\
    {4} \\
    $(NULL)

webv2staticimglogosservicesdir=$(webv2staticimgdir)/logos/services
dist_webv2staticimglogosservices_DATA = \\
    {5} \\
    $(NULL)

webv2staticimgmaildir=$(webv2staticimgdir)/mail
dist_webv2staticimgmail_DATA = \\
    {6} \\
    $(NULL)

webv2staticsitepagesholding503dir=$(webv2staticdir)/site/pages/holding-page-503
dist_webv2staticsitepagesholding503_DATA = \\
    {7} \\
    $(NULL)
'''


def copy_dashboard():
    '''Fetch and bundle the dashboard code.'''
    print('Preparing target directory')
    shutil.rmtree(BASEPATH)
    TMPPATH.mkdir()
    print('::group::Fetching dashboard release tarball')
    subprocess.check_call(f'curl -L -o agent.tar { URLSRC }', shell=True)
    print('::endgroup::')
    print('::group::Extracting dashboard release tarball')
    subprocess.check_call(f"tar -xvf agent.tar -C { TMPPATH } --strip-components=1 --exclude='*.br' --exclude='*.gz'", shell=True)
    print('::endgroup::')
    print('Copying files')
    (TMPPATH / 'agent' / BASEDIR).rename(BASEPATH)
    (TMPPATH / 'agent' / 'index.html').rename(Path('./index.html'))
    (TMPPATH / 'agent' / 'registry-access.html').rename('./registry-access.html')
    (TMPPATH / 'agent' / 'registry-alert-redirect.html').rename('./registry-alert-redirect.html')
    (TMPPATH / 'agent' / 'registry-hello.html').rename('./registry-hello.html')
    shutil.copytree(TMPPATH / 'agent' / 'static', Path('./static'), dirs_exist_ok=True)
    shutil.rmtree(TMPPATH)
    print('Copying README.md')
    BASEPATH.joinpath('README.md').symlink_to('../.dashboard-v2-notice.md')
    print('Removing dashboard release tarball')
    BASEPATH.joinpath('..', 'agent.tar').unlink()


def genfilelist(path):
    '''Generate a list of files for the Makefile.'''
    files = [f for f in path.iterdir() if f.is_file() and f.name != 'README.md']
    files = [Path(*f.parts[1:]) for f in files]
    files.sort()
    return ' \\\n    '.join([("$(srcdir)/" + str(f)) for f in files])


def write_makefile():
    '''Write out the makefile for the dashboard code.'''
    print('Generating Makefile')
    MAKEFILEDATA = MAKEFILETEMPLATE.format(
        genfilelist(BASEPATH),
        genfilelist(BASEPATH.joinpath('static')),
        genfilelist(BASEPATH.joinpath('static', 'email', 'img')),
        genfilelist(BASEPATH.joinpath('static', 'img')),
        genfilelist(BASEPATH.joinpath('static', 'img', 'logos', 'os')),
        genfilelist(BASEPATH.joinpath('static', 'img', 'logos', 'services')),
        genfilelist(BASEPATH.joinpath('static', 'img', 'mail')),
        genfilelist(BASEPATH.joinpath('static', 'site', 'pages', 'holding-page-503')),
    )

    BASEPATH.joinpath('Makefile.am').write_text(MAKEFILEDATA)


def list_changed_files():
    '''Create a list of changed files, and set it in an environment variable.'''
    if 'GITHUB_ENV' in os.environ:
        print('Generating file list for commit.')
        subprocess.check_call('echo "COMMIT_FILES<<EOF" >> $GITHUB_ENV', shell=True)
        subprocess.check_call('git status --porcelain=v1 --no-renames --untracked-files=all | rev | cut -d \' \' -f 1 | rev >> $GITHUB_ENV', shell=True)
        subprocess.check_call('echo "EOF" >> $GITHUB_ENV', shell=True)


copy_dashboard()
write_makefile()
list_changed_files()