diff --git a/py-dashboard/GhostRequest.py b/py-dashboard/GhostRequest.py new file mode 100644 index 00000000..a8a10219 --- /dev/null +++ b/py-dashboard/GhostRequest.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Class holds default settings for json requests to Grafana - +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +import sys + +if sys.version_info[0] != 3: + print("This script requires Python 3") + exit() + +import requests + +import jwt +from datetime import datetime as date + + +class GhostRequest: + def __init__(self, + _ghostjson_host, + _ghostjson_port, + _api_token=None, + _headers=dict(), + _overwrite='false', + debug_=False, + die_on_error_=False): + self.debug = debug_ + self.die_on_error = die_on_error_ + self.ghostjson_url = "http://%s:%s/ghost/api/v3" % (_ghostjson_host, _ghostjson_port) + self.data = dict() + self.data['overwrite'] = _overwrite + self.ghostjson_login = self.ghostjson_url + '/admin/session/' + self.api_token = _api_token + + + def create_post(self, + title=None, + text=None, + tags=None, + authors=None, + status="published"): + ghostjson_url = self.ghostjson_url + '/admin/posts/' + datastore = dict() + datastore['title'] = title + if tags is not None: + datastore['tags'] = tags + if authors is not None: + datastore['authors'] = authors + datastore['html'] = text + datastore['status'] = status + post = dict() + posts = list() + datastore = dict() + datastore['html'] = text + datastore['title'] = title + datastore['status'] = status + posts.append(datastore) + post['posts'] = posts + + headers = dict() + + # Split the key into ID and SECRET + id, secret = self.api_token.split(':') + + # Prepare header and payload + iat = int(date.now().timestamp()) + + header = {'alg': 'HS256', 'typ': 'JWT', 'kid': id} + payload = { + 'iat': iat, + 'exp': iat + 5 * 60, + 'aud': '/v3/admin/' + } + token = jwt.encode(payload, bytes.fromhex(secret), algorithm='HS256', headers=header) + headers['Authorization'] = 'Ghost {}'.format(token) + requests.post(ghostjson_url, json=post, headers=headers) diff --git a/py-scripts/ghost_profile.py b/py-scripts/ghost_profile.py new file mode 100755 index 00000000..996dd82b --- /dev/null +++ b/py-scripts/ghost_profile.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 + +""" +NAME: ghost_profile.py +PURPOSE: modify ghost database from the command line. +SETUP: A Ghost installation which the user has admin access to. +EXAMPLE: ./ghost_profile.py --article_text_file text.txt --title Test --authors Matthew --ghost_token SECRET_KEY --host 192.168.1.1 + + Matthew Stidham + Copyright 2021 Candela Technologies Inc + License: Free to distribute and modify. LANforge systems must be licensed. +""" +import sys +import os +import argparse + +if sys.version_info[0] != 3: + print("This script requires Python 3") + exit(1) + +if 'py-json' not in sys.path: + sys.path.append(os.path.join(os.path.abspath('..'), 'py-json')) + sys.path.append(os.path.join(os.path.abspath('..'), 'py-dashboard')) + +from GhostRequest import GhostRequest +from LANforge.lfcli_base import LFCliBase + +class UseGhost(LFCliBase): + def __init__(self, + _ghost_token=None, + host="localhost", + port=8080, + _debug_on=False, + _exit_on_fail=False, + _ghost_host="localhost", + _ghost_port=2368, ): + super().__init__(host, port, _debug=_debug_on, _exit_on_fail=_exit_on_fail) + self.ghost_host = _ghost_host + self.ghost_port = _ghost_port + self.ghost_token = _ghost_token + self.GP = GhostRequest(self.ghost_host, str(self.ghost_port), _api_token=self.ghost_token) + + def create_post(self, title, text, tags, authors): + return self.GP.create_post(title=title, text=text, tags=tags, authors=authors) + + def create_post_from_file(self, title, file, tags, authors): + text = open(file).read() + return self.GP.create_post(title=title, text=text, tags=tags, authors=authors) + + +def main(): + parser = LFCliBase.create_basic_argparse( + prog='ghost_profile.py', + formatter_class=argparse.RawTextHelpFormatter, + epilog='''Manage Ghost Website''', + description=''' + ghost_profile.py + ---------------- + Command example: + ./ghost_profile.py + --ghost_token''' + ) + optional = parser.add_argument_group('optional arguments') + optional.add_argument('--ghost_token', default=None) + optional.add_argument('--create_post', default=None) + optional.add_argument('--article_text_file', default=None) + + optional.add_argument('--ghost_port', help='Ghost port if different from 2368', default=2368) + optional.add_argument('--ghost_host', help='Ghost host if different from localhost', default='localhost') + optional.add_argument('--article_text') + optional.add_argument('--article_tags', action='append') + optional.add_argument('--authors', action='append') + optional.add_argument('--title', default=None) + args = parser.parse_args() + + Ghost = UseGhost(_ghost_token=args.ghost_token, + _ghost_port=args.ghost_port, + _ghost_host=args.ghost_host) + + if args.create_post is not None: + Ghost.create_post(args.title, args.article_text, args.article_tags, args.authors) + if args.article_text_file is not None: + Ghost.create_post_from_file(args.title, args.article_text_file, args.article_tags, args.authors) + + +if __name__ == "__main__": + main()