Compare commits

...

35 Commits
0.2.1 ... 0.4.0

Author SHA1 Message Date
6e2d8bef16 Version 0.4.0 2023-03-12 07:05:09 +00:00
23fd1d045d Merge pull request #15 from nikdoof/renovate/kubernetes-26.x
Update dependency kubernetes to v26
2023-03-12 07:02:44 +00:00
renovate[bot]
7ea651c099 Update dependency kubernetes to v26 2023-03-12 07:01:56 +00:00
d1bf7c5b55 Merge pull request #10 from nikdoof/renovate/python-3.x
Update python Docker tag to v3.11
2023-03-12 07:01:49 +00:00
b960f77934 Merge pull request #7 from nikdoof/renovate/flask-2.x
Update dependency flask to v2.2.3
2023-03-12 07:01:38 +00:00
32b93a9e2f Merge pull request #9 from nikdoof/renovate/helm-chart-releaser-action-1.x
Update helm/chart-releaser-action action to v1.5.0
2023-03-12 06:59:43 +00:00
2f769da1c6 Merge pull request #14 from nikdoof/renovate/azure-setup-helm-3.x
Update azure/setup-helm action to v3
2023-03-12 06:59:34 +00:00
f46e6b59df Merge pull request #16 from nikdoof/renovate/docker-build-push-action-4.x
Update docker/build-push-action action to v4
2023-03-12 06:59:25 +00:00
a80d7a9dd3 Merge pull request #17 from nikdoof/renovate/docker-login-action-2.x
Update docker/login-action action to v2
2023-03-12 06:59:17 +00:00
654440a476 Merge pull request #18 from nikdoof/renovate/docker-setup-buildx-action-2.x
Update docker/setup-buildx-action action to v2
2023-03-12 06:59:10 +00:00
c46d7ae252 Merge pull request #19 from nikdoof/renovate/docker-setup-qemu-action-2.x
Update docker/setup-qemu-action action to v2
2023-03-12 06:59:01 +00:00
8f7d47a579 Merge pull request #13 from nikdoof/renovate/actions-setup-python-4.x
Update actions/setup-python action to v4
2023-03-12 06:58:07 +00:00
0957513c41 Merge pull request #12 from nikdoof/renovate/actions-checkout-3.x
Update actions/checkout action to v3
2023-03-12 06:57:51 +00:00
7fa687defb Merge pull request #11 from nikdoof/renovate/wemake-services-wemake-python-styleguide-0.x
Update wemake-services/wemake-python-styleguide action to v0.17.0
2023-03-12 06:54:46 +00:00
147e03bb33 Bump version 2023-03-12 06:52:51 +00:00
renovate[bot]
18340a4f69 Update docker/setup-qemu-action action to v2 2023-03-12 06:51:36 +00:00
renovate[bot]
f5ac7cebc3 Update docker/setup-buildx-action action to v2 2023-03-12 06:51:31 +00:00
renovate[bot]
3681cda2fd Update docker/login-action action to v2 2023-03-12 06:51:27 +00:00
renovate[bot]
c48dbdbaa7 Update docker/build-push-action action to v4 2023-03-12 06:51:22 +00:00
renovate[bot]
75e067d585 Update azure/setup-helm action to v3 2023-03-12 06:51:12 +00:00
renovate[bot]
70b2a720b7 Update actions/setup-python action to v4 2023-03-12 06:51:07 +00:00
renovate[bot]
57b17266c4 Update actions/checkout action to v3 2023-03-12 06:51:03 +00:00
renovate[bot]
79c7311107 Update wemake-services/wemake-python-styleguide action to v0.17.0 2023-03-12 06:50:58 +00:00
renovate[bot]
8b2c2dcc38 Update python Docker tag to v3.11 2023-03-12 06:50:53 +00:00
renovate[bot]
bb50e54ab2 Update helm/chart-releaser-action action to v1.5.0 2023-03-12 06:50:48 +00:00
renovate[bot]
a186e4b3c1 Update dependency flask to v2.2.3 2023-03-12 06:48:25 +00:00
a525a777ae Update issue templates 2022-01-21 16:36:19 +00:00
7cf949ba26 Version 0.3.0 2022-01-21 16:15:19 +00:00
f3f99d1162 Clean up lint issues 2022-01-09 13:26:01 +00:00
44741b76bc Update Documentation 2022-01-09 10:46:25 +00:00
559b5a8f80 Update Documentation 2022-01-09 10:42:02 +00:00
8f535ddf25 Get provider data from K8s 2022-01-09 10:09:37 +00:00
7068d84718 Switch to search driven from providers.json 2022-01-09 09:54:07 +00:00
eced7966df Correct Google search URL 2022-01-09 08:53:58 +00:00
d78a7531cf Chart Version 0.2.1 2022-01-08 16:56:20 +00:00
15 changed files with 301 additions and 123 deletions

38
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,38 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

View File

@@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@@ -12,11 +12,11 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v1 uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1 uses: docker/setup-buildx-action@v2
- name: Login to GHCR - name: Login to GHCR
uses: docker/login-action@v1 uses: docker/login-action@v2
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request'
with: with:
registry: ghcr.io registry: ghcr.io
@@ -24,7 +24,7 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push - name: Build and push
id: docker_build id: docker_build
uses: docker/build-push-action@v2 uses: docker/build-push-action@v4
with: with:
push: true push: true
tags: | tags: |

View File

@@ -15,7 +15,7 @@ jobs:
steps: steps:
- name: Check out Git repository - name: Check out Git repository
uses: actions/checkout@v2 uses: actions/checkout@v3
- name: wemake-python-styleguide - name: wemake-python-styleguide
uses: wemake-services/wemake-python-styleguide@0.16.0 uses: wemake-services/wemake-python-styleguide@0.17.0

View File

@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
fetch-depth: 0 fetch-depth: 0
@@ -21,12 +21,12 @@ jobs:
git config user.name "$GITHUB_ACTOR" git config user.name "$GITHUB_ACTOR"
git config user.email "$GITHUB_ACTOR@users.noreply.github.com" git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
- name: Install Helm - name: Install Helm
uses: azure/setup-helm@v1 uses: azure/setup-helm@v3
with: with:
version: v3.6.3 version: v3.6.3
- name: Run chart-releaser - name: Run chart-releaser
uses: helm/chart-releaser-action@v1.2.1 uses: helm/chart-releaser-action@v1.5.0
env: env:
CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}" CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
CR_RELEASE_NAME_TEMPLATE: "ohayodash-helm-chart-{{ .Version }}" CR_RELEASE_NAME_TEMPLATE: "ohayodash-helm-chart-{{ .Version }}"

View File

@@ -10,9 +10,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v3
- uses: actions/setup-python@v2 - uses: actions/setup-python@v4
- run: pip install -r requirements-dev.txt - run: pip install -r requirements-dev.txt
- name: Build Assets - name: Build Assets

View File

@@ -1,4 +1,4 @@
FROM python:3.9-alpine FROM python:3.11-alpine
WORKDIR /app WORKDIR /app
COPY ./requirements.txt /app/requirements.txt COPY ./requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt

View File

@@ -3,3 +3,96 @@
Ohayo Dash is a Kubernetes driven start page and dashboard. All configuration is done by standard Kubernetes objects and ConfigMaps. Ohayo Dash is a Kubernetes driven start page and dashboard. All configuration is done by standard Kubernetes objects and ConfigMaps.
This is inspired by [Hajimari](https://github.com/toboshii/hajimari) and [SUI](https://github.com/jeroenpardon/sui) projects. This is inspired by [Hajimari](https://github.com/toboshii/hajimari) and [SUI](https://github.com/jeroenpardon/sui) projects.
## Configuration
All configuration is handled with `ConfigMap` and `Ingress` objects within Kubernetes.
### Ingresses
All namespaces as processed by default, only Ingress objects with `ohayodash.github.io/enabled` annotation are then displayed.
Annotations can be used to customize the display of the Ingress objects:
* `ohayodash.github.io/name` - Display name of the app, defaults to the Ingress name.
* `ohayodash.github.io/url` - Target URL of the service, defaults to `https://<ingress host>`
* `ohayodash.github.io/show_url` - Shows the URL under the link, defaults to `false`
### Bookmarks
Bookmark are stored in `ConfigMap` resources, which are identified by the `ohayodash.github.io/bookmarks` annotation.
Values are pulled from the `bookmarks` key in the config map, which consists of a list of objects with the following keys:
* `name` - the display name of the link
* `url` - the target URL.
* `group` - the name the link is to be grouped under.
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: ohayodash-bookmarks
namespace: web
annotations:
ohayodash.github.io/bookmarks: 'true'
data:
bookmarks: |
- name: Renovate Dashboard
url: "https://app.renovatebot.com/dashboard#github/nikdoof/flux-gitops"
group: Github
```
### Providers
Providers are stored in `ConfigMap` resources, which are identified by the `ohayodash.github.io/providers` annotation.
Values are pulled from the `providers` key in the config map, which consists of a list of objects with the following keys:
* `name` - the display name of the link
* `url` - the target URL of the service.
* `search` - suffix to add to search on the service, this will combine the URL, Search value and the text to search for into a URL.
* `prefix` - prefix to use on the URL bar on Ohayodash.
*Note*: If no Providers ConfigMaps are found then a [default](ohayodash/data/providers.yaml) list is used.
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: ohayodash-providers
namespace: web
annotations:
ohayodash.github.io/providers: 'true'
data:
providers: |
- name: Allmusic
url: https://www.allmusic.com/
search: search/all/
prefix: /a
```
### Combining ConfigMaps
ConfigMaps can be combined to allow for easier management:
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: ohayodash-config
namespace: web
annotations:
ohayodash.github.io/bookmarks: 'true'
ohayodash.github.io/providers: 'true'
data:
bookmarks: |
- name: Renovate Dashboard
url: "https://app.renovatebot.com/dashboard#github/nikdoof/flux-gitops"
group: Github
providers: |
- name: Allmusic
url: https://www.allmusic.com/
search: search/all/
prefix: /a
```

View File

@@ -1,9 +1,9 @@
apiVersion: v2 apiVersion: v2
appVersion: 0.2.0 appVersion: 0.3.0
description: Ohayo Dash is a Kubernetes driven start page and dashboard. All configuration is done by standard Kubernetes objects and ConfigMaps. description: Ohayo Dash is a Kubernetes driven start page and dashboard. All configuration is done by standard Kubernetes objects and ConfigMaps.
name: ohayodash name: ohayodash
version: 0.2.0 version: 0.3.0
kubeVersion: ">=1.16.0-0" kubeVersion: ">=1.19.0-0"
keywords: keywords:
- ohayodash - ohayodash
- startpage - startpage

View File

@@ -11,7 +11,7 @@ image:
# -- image pull policy # -- image pull policy
pullPolicy: IfNotPresent pullPolicy: IfNotPresent
# -- image tag # -- image tag
tag: 0.2.0 tag: 0.3.0
# -- environment variables. # -- environment variables.
# @default -- See below # @default -- See below
@@ -38,3 +38,24 @@ ingress:
# @default -- See values.yaml # @default -- See values.yaml
main: main:
enabled: false enabled: false
# configmap:
# bookmarks:
# enabled: false
# annotations:
# ohayodash.github.io/bookmarks: "true"
# data:
# bookmarks:
# - name: TV Calendar
# url: https://www.pogdesign.co.uk/cat/
# group: Tools
# providers:
# enabled: false
# annotations:
# ohayodash.github.io/providers: "true"
# data:
# providers:
# - name: Trakt
# url: https://trakt.tv/
# search: search?query=
# prefix: /t

View File

@@ -1,6 +1,7 @@
import os import os
import kubernetes import kubernetes
import pkg_resources
import yaml import yaml
from flask import Blueprint, jsonify, render_template from flask import Blueprint, jsonify, render_template
@@ -103,6 +104,31 @@ def get_bookmarks(tag: str = None) -> list:
return bookmarks return bookmarks
def get_providers(tag: str = None) -> list:
"""Get all 'provider' ConfigMaps from the cluster and produce a provider list."""
v1 = kubernetes.client.CoreV1Api()
ret = v1.list_config_map_for_all_namespaces(watch=False)
providers = []
for cm in ret.items:
# Skip if the CM has no annotations
if cm.metadata.annotations is None:
continue
# Skip if its not tagged as bookmark CM
if '{0}/providers'.format(ANNOTATION_BASE) not in cm.metadata.annotations:
continue
# Skip if we're limited to a tag, and the CM has tags but not that one.
if not check_tags(tag, cm):
continue
provider_data = yaml.safe_load(cm.data['providers'])
providers.extend(provider_data)
return providers
@base.route('/') @base.route('/')
@base.route('/<tag>/') @base.route('/<tag>/')
def index(tag=None): def index(tag=None):
@@ -112,21 +138,12 @@ def index(tag=None):
@base.route('/providers.json') @base.route('/providers.json')
@base.route('/<tag>/providers.json') @base.route('/<tag>/providers.json')
def providers(tag=None): def providers(tag=None):
return jsonify({ k8s_providers = get_providers(tag)
'providers': [ if not k8s_providers:
{'name': 'Allmusic', 'url': 'https://www.allmusic.com/search/all/', 'prefix': '/a'}, data_file = pkg_resources.resource_filename(__name__, 'data/providers.yaml')
{'name': 'Discogs', 'url': 'https://www.discogs.com/search/?q=', 'prefix': '/di'}, with open(data_file, 'r') as fobj:
{'name': 'Duck Duck Go', 'url': 'https://duckduckgo.com/?q=', 'prefix': '/d'}, k8s_providers.extend(yaml.safe_load(fobj))
{'name': 'iMDB', 'url': 'https://www.imdb.com/find?q=', 'prefix': '/i'}, return jsonify({'providers': k8s_providers})
{'name': 'TheMovieDB', 'url': 'https://www.themoviedb.org/search?query=', 'prefix': '/m'},
{'name': 'Reddit', 'url': 'https://www.reddit.com/search?q=', 'prefix': '/r'},
{'name': 'Qwant', 'url': 'https://www.qwant.com/?q=', 'prefix': '/q'},
{'name': 'Soundcloud', 'url': 'https://soundcloud.com/search?q=', 'prefix': '/so'},
{'name': 'Spotify', 'url': 'https://open.spotify.com/search/results/', 'prefix': '/s'},
{'name': 'TheTVDB', 'url': 'https://www.thetvdb.com/search?query=', 'prefix': '/tv'},
{'name': 'Trakt', 'url': 'https://trakt.tv/search?query=', 'prefix': '/t'},
],
})
@base.route('/apps.json') @base.route('/apps.json')

View File

@@ -0,0 +1,49 @@
---
- name: Allmusic
url: https://www.allmusic.com/
search: search/all/
prefix: /a
- name: Discogs
url: https://www.discogs.com/
search: search/?q=
prefix: /di
- name: DuckDuckGo
url: https://duckduckgo.com/
search: "?q="
prefix: /d
- name: Google
url: https://google.com/
search: search/?q=
prefix: /g
- name: iMDB
url: https://imbdb.com/
search: find?q=
prefix: /i
- name: TheMovieDB
url: https://www.themoviedb.org/
search: search/?query=
prefix: /m
- name: Reddit
url: https://www.reddit.com/
search: search?q=
prefix: /r
- name: Qwant
url: https://www.qwant.com/
search: "?q="
prefix: /q
- name: Soundcloud
url: https://soundcloud.com/
search: search?q=
prefix: /so
- name: Spotify
url: https://open.spotify.com/
search: search/results/
prefix: /s
- name: TheTVDB
url: https://www.thetvdb.com/
search: search?query=
prefix: /tv
- name: Trakt
url: https://trakt.tv/
search: search?query=
prefix: /t

View File

@@ -1,6 +1,15 @@
var sindex = 0; var sindex = 0;
var cycle = false; var cycle = false;
var sengine = "https://www.google.com/?q="; // Default search engine var sengine = "https://www.google.com/search?q="; // Default search engine
var providers = [];
fetch('providers.json')
.then(response => response.json())
.then(data => storeProviders(data));
function storeProviders(data) {
providers = data['providers'];
}
function start() { function start() {
var query = getParameterByName('q'); var query = getParameterByName('q');
@@ -16,35 +25,10 @@ function start() {
function handleKeyPress(e) { function handleKeyPress(e) {
var key = e.keyCode || e.which; var key = e.keyCode || e.which;
var text = document.getElementById("keywords").value.replaceAll("+", "%2B"); var text = document.getElementById("keywords").value.replaceAll("+", "%2B");
var option = text.substr(1, text.indexOf(' ') - 1) || text.substr(1);
var subtext = text.substr(2 + option.length);
if (key == 13) { // Search functions if (key == 13) { // Search functions
search(text); search(text.trim());
} }
if (key == 9) { // Tab Completion Functions if (key == 32) { //Space to go to search
e.preventDefault();
e.stopPropagation();
if (text[0] === ';') {
switch (option) {
case 't':
var streamers = ['admiralbahroo', 'moonmoon_ow', 'witwix'];
if (!subtext || cycle) {
cycle = true;
if (sindex > streamers.length - 1) sindex = 0;
document.getElementById("keywords").value = ';t ' + streamers[sindex++];
return;
}
for (var streamer of streamers) {
if (subtext === streamer.substr(0, subtext.length)) {
document.getElementById("keywords").value = ';t ' + streamer;
return;
}
}
break;
}
}
}
if(key == 32){ //Space to go to search
document.getElementById("keywords").focus(); document.getElementById("keywords").focus();
} }
sindex = 0; sindex = 0;
@@ -55,65 +39,17 @@ function search(text) {
var option = text.substr(1, text.indexOf(' ') - 1) || text.substr(1); var option = text.substr(1, text.indexOf(' ') - 1) || text.substr(1);
var subtext = text.substr(2 + option.length); var subtext = text.substr(2 + option.length);
if (text[0] === '/') { if (text[0] === '/') {
providers.every(function (item) {
if ('/' + option == item['prefix']) {
if (text.indexOf(' ') > -1) { if (text.indexOf(' ') > -1) {
switch (option) { window.location = item['url'] + item['search'] + subtext;
case "am":
window.location = "https://www.allmusic.com/search/all/" + subtext;
break;
case "d":
window.location = "https://duckduckgo.com/?q=" + subtext;
break;
case "di":
window.location = "https://www.discogs.com/search/?q=" + subtext;
break;
case "i":
window.location = "https://www.imdb.com/find?q=" + subtext;
break;
case "m":
window.location = "https://www.themoviedb.org/search?query=" + subtext;
break;
case "r":
window.location = "https://www.reddit.com/search?q=" + subtext;
break;
case "q":
window.location = "https://www.qwant.com/?q=" + subtext;
break;
case "so":
window.location = "https://soundcloud.com/search?q=" + subtext;
break;
case "s":
window.location = "https://open.spotify.com/search/results/" + subtext;
break;
case "t":
window.location = "https://trakt.tv/search?query=" + subtext;
break;
case "tv":
window.location = "https://www.thetvdb.com/search?query=" + subtext;
break;
case "y":
window.location = "https://www.youtube.com/results?search_query=" + subtext;
break;
case "g":
window.location = "https://www.google.com/?q=" + subtext;
break;
}
} else { } else {
var option = text.substr(1); window.location = item['url'] + subtext;
switch (option) {
case "d":
window.location = "https://www.duckduckgo.com";
break;
case "y":
window.location = "https://www.youtube.com";
break;
case "r":
window.location = "https://reddit.com";
break;
case "s":
window.location = "https://open.spotify.com";
break;
} }
return false;
} }
return true;
});
} else if (validURL(text)) { } else if (validURL(text)) {
if (containsProtocol(text)) if (containsProtocol(text))
window.location = text; window.location = text;
@@ -140,7 +76,7 @@ function containsProtocol(str) {
return !!pattern.test(str); return !!pattern.test(str);
} }
String.prototype.replaceAll = function(search, replacement) { String.prototype.replaceAll = function (search, replacement) {
var target = this; var target = this;
return target.split(search).join(replacement); return target.split(search).join(replacement);
}; };

View File

@@ -1,4 +1,4 @@
flask==2.0.2 flask==2.2.3
kubernetes==21.7.0 kubernetes==26.1.0
pyyaml==6.0 pyyaml==6.0
gunicorn==20.1.0 gunicorn==20.1.0

View File

@@ -1,6 +1,6 @@
[metadata] [metadata]
name = ohayodash name = ohayodash
version = 0.2.1 version = 0.4.0
description = A Kubernetes driven start page and dashboard. All configuration is done by standard Kubernetes objects and ConfigMaps. description = A Kubernetes driven start page and dashboard. All configuration is done by standard Kubernetes objects and ConfigMaps.
long_description = file: README.md, LICENSE long_description = file: README.md, LICENSE
license = MIT license = MIT
@@ -13,6 +13,7 @@ classifiers =
[options] [options]
zip_safe = False zip_safe = False
include_package_data = True
packages = ohayodash packages = ohayodash
install_requires = install_requires =
flask flask
@@ -20,9 +21,12 @@ install_requires =
pyyaml pyyaml
gunicorn gunicorn
[options.package_data]
ohayodash = data/*.yaml
[flake8] [flake8]
format = wemake format = wemake
ignore = E501,D,WPS226,WPS110, WPS210,WPS231 ignore = E501,D,WPS226,WPS110, WPS210,WPS231,WPS202
max-line-length = 120 max-line-length = 120
exclude = setup.py exclude = setup.py