From 5f05b9aa3be732fd43cfbaeb203764e7361eadf9 Mon Sep 17 00:00:00 2001 From: k9ert Date: Wed, 22 May 2024 17:40:21 +0200 Subject: [PATCH] Electron Bug Fixes and Miscellaneous Changes (#2441) * migrate the downloadpage generation script to this repo * tiny docs fix * fix 2 electron issues * support intel platform * fix save preferences bug --- docs/release-guide.md | 78 +- docs/self-signed-certificates.md | 9 +- pyinstaller/electron/basic_auth.html | 5 +- pyinstaller/electron/main.js | 13 +- pyinstaller/electron/package.json | 10 +- pyinstaller/electron/settings.html | 7 +- pyinstaller/electron/src/config.js | 1 + pyinstaller/electron/src/download.js | 15 +- pyinstaller/electron/src/helpers.js | 2 +- pyinstaller/electron/src/uiHelpers.js | 1 + pyproject.toml | 4 + utils/generate_downloadpage.py | 134 + utils/generate_downloadpage.sh | 66 + utils/templates/download-page.html | 5289 +++++++++++++++++++ utils/templates/download-page_current.html | 426 ++ utils/templates/download-page_releases.html | 136 + utils/templates/gh_release-page-v2.md | 34 + utils/templates/gh_release-page.md | 24 + 18 files changed, 6194 insertions(+), 60 deletions(-) create mode 100644 utils/generate_downloadpage.py create mode 100755 utils/generate_downloadpage.sh create mode 100644 utils/templates/download-page.html create mode 100644 utils/templates/download-page_current.html create mode 100644 utils/templates/download-page_releases.html create mode 100644 utils/templates/gh_release-page-v2.md create mode 100644 utils/templates/gh_release-page.md diff --git a/docs/release-guide.md b/docs/release-guide.md index 0f9b4316c1..fa9dba200b 100644 --- a/docs/release-guide.md +++ b/docs/release-guide.md @@ -1,41 +1,55 @@ # Release Guide ## Creating release notes + ### Pre-requisites + - You need the correct upstream master. You should see -```bash -git remote -v | grep upstream + +```bash +git remote -v | grep upstream upstream git@github.com:cryptoadvance/specter-desktop.git (fetch) upstream git@github.com:cryptoadvance/specter-desktop.git (push) ``` + - You need a GitHub token: -If you don't have one, get one here https://github.com/settings/tokens and make sure to tick the boxes for repo and workflow as below: + If you don't have one, get one here https://github.com/settings/tokens and make sure to tick the boxes for repo and workflow as below: ![](./images/release-guide/github-token.png) Using the new token, run - ```bash - export GH_TOKEN=YOURTOKEN - ``` + +```bash +export GH_TOKEN=YOURTOKEN +``` + - You need Docker running - Checkout the master branch and ensure a clean workspace. Now, you can run + ```bash ./utils/release.sh --release-notes ``` + Or, if you want to directly set the new version: + ```bash ./utils/release.sh --new-version v1.13.1 --release-notes ``` + ## Creating a new tag + Update your master branch after the release notes PR ([example](https://github.com/cryptoadvance/specter-desktop/commit/65ff6959d7fd85cba745e4d454b30031839f857f/)) has been merged and then run: + ```bash git tag v1.13.1 && git push upstream v1.13.1 ``` + ## GitLab - releasing stage -Creating a tag triggers the release process of the GitLab runners. -There exists a mirror of the GitHub repo on GitLab, but only when a tag is created on GitHub will the release part of the runners execute. You can check the status here: + +Creating a tag triggers the release process of the GitLab runners. +There exists a mirror of the GitHub repo on GitLab, but only when a tag is created on GitHub will the release part of the runners execute. You can check the status here: https://gitlab.com/cryptoadvance/specter-desktop/-/pipelines There are three stages: @@ -50,14 +64,17 @@ The first relevant stage is "releasing". Here, the Windows, Linux and pip releas - specter_desktop-v1.13.1-x86_64-linux-gnu.tar.gz The three jobs in more detail: + - release_binary_windows: is creating a binary for specterd and for Windows (Windows runner) - release_electron_linux_windows: Creates a specterd for Linux, an AppImage for Linux and an executable for Windows (Linux runner). -- release_pip: Is releasing a pypi package on [pypi](https://pypi.org/project/cryptoadvance.specter/) and creates a tarball of the pip package for the GitHub release page (Linux runner). +- release_pip: Is releasing a pypi package on [pypi](https://pypi.org/project/cryptoadvance.specter/) and creates a tarball of the pip package for the GitHub release page (Linux runner). For details look at `.gitlab-ci.yml` ## MacOS + Ideally, directly after the tag is created, start with the MacOS release. This has to be done manually, for now. There is a script for this: + ```bash ./utils/build-osx.sh --version v1.13.1 --appleid "Satoshi Nakamoto (appleid)" --mail "satoshi@gmx.com" make-hash specterd electron sign upload ``` @@ -70,9 +87,11 @@ This script also runs `github.py upload `, so two more binares and the hash and - SHA256SUMS-macos.asc ## GitLab - post releasing -Back to GitLab, the final stage is "post releasing". + +Back to GitLab, the final stage is "post releasing". In this stage, the invididual SHA256-hashes and signatures are combined into two final files: + - SHA256SUMS - SHA256SUMS.asc @@ -80,44 +99,25 @@ Everything, apart from the MacOS files, are pulled from the GitLab environment, Don't forget to delete the two MacOS files (`SHA256SUMS-macos` and `SHA256SUMS-macos.asc`) on the GitHub release page in the end. ## Trouble shooting + If the MacOS signatures are missing, it can happen that the following Exception will be raised: + ```bash File "/builds/cryptoadvance/specter-desktop/utils/github.py", line 295, in download_artifact raise Exception( Exception: Status-cod04 for url ... ) ``` + In any case, if the macOS binaries arrive on GitHub too late, you have to manually delete the already created `SHA256SUMS` and `SHA256SUMS.asc`, otherwise the upload to GitHub will fail if you rerun the release signatures job on GitLab - for details see ([this PR](https://github.com/cryptoadvance/specter-desktop/pull/689)). The green arrow in the screenshot is where you rerun the release signatures job on GitLab: ![](./images/release-guide/rerun-release-signatures.png) -## Editing the text on the GitHub release page -We are running a script here to create a markdown file that can be used for copy and paste. The script uses the latest release on GitHub to create links to the artifacts in the release, so it only makes sense to run it once the previous step has been completed. -- Checkout this repo: `git@github.com:cryptoadvance/corp-notes.git` -- `cd download-page` -- Run `./build.sh` - -The result `gh_page.md` can be found in the build directory. -Edit the release on GitHub and paste the md-file there along with the release notes from `release-notes.md`. - -## Website -The above script also produces html files for the website (in the same directory). The second item needs to have the release notes on GitHub, otherwise the content for the details button is missing. So, you need to re-run `./build.sh` after the release notes on GitHub are done. -- `download-page_current.html` -- `download-page_releases.html` - -Login into: https://specter.solutions/wp-login.php - -- Go to "Pages" -- Hover over "Specter Desktop - Elementor" and choose `Edit with Elementor` -- Click somewhere on area 1 (see screenshot), then somewhere on area 2, select all, delete, and paste: `download-page_current.html` - -![](./images/release-guide/website-1.png)\ -- Then click `update` -Note: If you see jinja tags, you probably pasted some templates. - -Do the same for the "Specter Releases" part, just, in this case, replace with:\ -`download-page_releases.html` - -![](./images/release-guide/website-2.png)\ +## GitHub release page and download page -You can then just exit the editing with Elementor. +This is handled by the script `./utils/generate_downloadpage.sh`. As a prerequisite, you need to clone the `specter-static` repo which contains the specter website. Clone it on the same level than specter-desktop. +Running that script will: +- install the prerequisites (basically markdown, see pyproject.toml) +- generate the GH-page and the download-page based on the `utils/templates`. +- Asks whether it should replace/update/initialize the Github Release page for the latest version +- copies over the new download-pages and asks whether it should commit/push those diff --git a/docs/self-signed-certificates.md b/docs/self-signed-certificates.md index ce0235a37e..7b3373021b 100644 --- a/docs/self-signed-certificates.md +++ b/docs/self-signed-certificates.md @@ -1,22 +1,23 @@ # SSL Certificate + ## Why a certificate is important Browsers require secure communication with the server to use camera API. Without it we can't use QR code scanning. -If you are running a VPS it's easy - you just [issue a new certificate](./reverse-proxy#adding-https) with Letsencrypt. +If you are running a VPS it's easy - you just [issue a new certificate](./reverse-proxy.md#adding-https) with Letsencrypt. If you are only using the node at home and want to use it from your local network and via camera, you need to run it via SSL. ## Easy solution The easiest solution is to simply add `--ssl` to the serve-command and the certificate will get created automatically in the specter-home-folder. + ``` python3 -m cryptoadance.specter server --ssl ``` ## Manual creation - A second way, which provides more customization, is to run the [`gen-certificate.sh`](gen-certificate.sh) script in this folder with your node's IP address as an argument: ```sh @@ -33,7 +34,7 @@ Provide these files to Specter as arguments: python -m cryptoadvance.specter server --cert=./cert.pem --key=./key.pem ``` -*Note:* Adding `--tor=your-tor-password` will create a tor hidden service with https. +_Note:_ Adding `--tor=your-tor-password` will create a tor hidden service with https. ### Specter with Nginx @@ -53,7 +54,7 @@ The config should look like this: server{ listen 80 default_server; listen 443 ssl http2; - + server_name your_domain_or_ip; ssl_certificate /etc/ssl/certs/cert.pem; diff --git a/pyinstaller/electron/basic_auth.html b/pyinstaller/electron/basic_auth.html index 80a2c7ac82..957fecb0f9 100644 --- a/pyinstaller/electron/basic_auth.html +++ b/pyinstaller/electron/basic_auth.html @@ -33,8 +33,9 @@

The server at '...' is prompting for authorization< const fs = require('fs') const { ipcRenderer } = require('electron') const helpers = require('./helpers') - const getAppSettings = helpers.getAppSettings - const appSettingsPath = helpers.appSettingsPath + const config = require('./config') + const getAppSettings = config.getAppSettings + const appSettingsPath = config.appSettingsPath function cancel() { window.close(); diff --git a/pyinstaller/electron/main.js b/pyinstaller/electron/main.js index 3607d287cd..9fb0185126 100644 --- a/pyinstaller/electron/main.js +++ b/pyinstaller/electron/main.js @@ -8,10 +8,11 @@ const contextMenu = require('electron-context-menu') const { appSettingsPath, specterdDirPath, appSettings, platformName, appNameLower } = require('./src/config.js') const { logger } = require('./src/logging.js') const downloadloc = require('./downloadloc') -const { downloadSpecterd } = require('./src/download.js') +const { downloadSpecterd, destroyProgressbar } = require('./src/download.js') const getDownloadLocation = downloadloc.getDownloadLocation const { startSpecterd, quitSpecterd } = require('./src/specterd.js') -const { getFileHash, getAppSettings, versionData, isDev, devFolder, isMac } = require('./src/helpers.js') +const { getFileHash, versionData, isDev, devFolder, isMac } = require('./src/helpers.js') +const { getAppSettings } = require('./src/config.js') const { showError, updatingLoaderMsg, initMainWindow, loadUrl, initTray } = require('./src/uiHelpers.js') // Quit again if there is no version-data in dev @@ -191,13 +192,7 @@ app.on('before-quit', (event) => { quitted = true quitSpecterd() if (mainWindow && !mainWindow.isDestroyed()) { - if (progressBar) { - // You can only destroy the progress bar if it hadn't been closed before - if (progressBar.browserWindow) { - progressBar.destroy() - } - progressBar = null - } + destroyProgressbar() mainWindow.destroy() mainWindow = null prefWindow = null diff --git a/pyinstaller/electron/package.json b/pyinstaller/electron/package.json index 37d6b5de82..69e24fe901 100644 --- a/pyinstaller/electron/package.json +++ b/pyinstaller/electron/package.json @@ -32,7 +32,15 @@ "entitlements": "./build/entitlements.mac.plist", "hardenedRuntime": true, "icon": "./icons/icon.icns", - "provisioningProfile": "/Users/kim/Specter_Desktop_vanilla.provisionprofile" + "provisioningProfile": "/Users/kim/Specter_Desktop_vanilla.provisionprofile", + "target": [ + { + "target": "dmg", + "arch": [ + "universal" + ] + } + ] }, "win": { "icon": "./icons/icon.ico" diff --git a/pyinstaller/electron/settings.html b/pyinstaller/electron/settings.html index a3681e7a75..5dd7700151 100644 --- a/pyinstaller/electron/settings.html +++ b/pyinstaller/electron/settings.html @@ -115,10 +115,11 @@

Use a custom specterd file

const fs = require("fs"); const path = require("path"); const { ipcRenderer } = require("electron"); - const helpers = require("./helpers"); + const helpers = require("./src/helpers"); + const config = require("./src/config"); const getFileHash = helpers.getFileHash; - const getAppSettings = helpers.getAppSettings; - const appSettingsPath = helpers.appSettingsPath; + const getAppSettings = config.getAppSettings; + const appSettingsPath = config.appSettingsPath; const specterdDirPath = helpers.specterdDirPath; function toggleAdvanced() { diff --git a/pyinstaller/electron/src/config.js b/pyinstaller/electron/src/config.js index b656030c42..2197da1e93 100644 --- a/pyinstaller/electron/src/config.js +++ b/pyinstaller/electron/src/config.js @@ -104,6 +104,7 @@ module.exports = { specterAppLogPath, versionDataPath, versionData, + getAppSettings, isDev: isDev, devFolder, } \ No newline at end of file diff --git a/pyinstaller/electron/src/download.js b/pyinstaller/electron/src/download.js index b72a5712dc..32bb8cb4f7 100644 --- a/pyinstaller/electron/src/download.js +++ b/pyinstaller/electron/src/download.js @@ -10,6 +10,8 @@ const ProgressBar = require('electron-progressbar') const { updateSpecterdStatus, updatingLoaderMsg, createProgressBar } = require('./uiHelpers.js') const { startSpecterd } = require('./specterd.js') +let progressBar + // The standard quit item cannot be replaced / modified and it is not triggering the // before-quit event on MacOS if a child window is open const dockMenuWithforceQuit = Menu.buildFromTemplate([ @@ -85,7 +87,7 @@ const download = (uri, filename, callback) => { let receivedBytes = 0 const totalBytes = res.headers['content-length'] logger.info(`Total size to download: ${totalBytes}`) - const progressBar = createProgressBar(totalBytes) + progressBar = createProgressBar(totalBytes) // Add Force Quit item during download for MacOS dock if (isMac) { app.dock.setMenu(dockMenuWithforceQuit) @@ -139,7 +141,18 @@ const download = (uri, filename, callback) => { }) } +const destroyProgressbar = () => { + if (progressBar) { + // You can only destroy the progress bar if it hadn't been closed before + if (progressBar.browserWindow) { + progressBar.destroy() + } + progressBar = null + } +} + module.exports = { downloadSpecterd: downloadSpecterd, download: download, + destroyProgressbar, } diff --git a/pyinstaller/electron/src/helpers.js b/pyinstaller/electron/src/helpers.js index a2e87f9f26..ec32fc300a 100644 --- a/pyinstaller/electron/src/helpers.js +++ b/pyinstaller/electron/src/helpers.js @@ -5,7 +5,7 @@ const crypto = require('crypto') const readLastLines = require('read-last-lines') const isMac = process.platform === 'darwin' -const { versionData, appSettingsPath, specterAppLogPath } = require('./config.js') +const { versionData, specterAppLogPath } = require('./config.js') const { logger } = require('./logging.js') // Use different version-data.jsons diff --git a/pyinstaller/electron/src/uiHelpers.js b/pyinstaller/electron/src/uiHelpers.js index b41ccc3ce4..4d0ca3a10b 100644 --- a/pyinstaller/electron/src/uiHelpers.js +++ b/pyinstaller/electron/src/uiHelpers.js @@ -4,6 +4,7 @@ const { logger } = require('./logging') const { appSettings, isDev, platformName } = require('./config') const ProgressBar = require('electron-progressbar') const { isMac } = require('./helpers') +const { shell } = require('electron') // Initialized with initMainWindow let mainWindow diff --git a/pyproject.toml b/pyproject.toml index 7a477e19ee..2cafcf2f5d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -85,4 +85,8 @@ test = [ "python-gitlab==2.10.1", # requirements for stuff in ./utils "requests==2.26.0", +] + +gendownloadpage = [ + "markdown==3.3.7" ] \ No newline at end of file diff --git a/utils/generate_downloadpage.py b/utils/generate_downloadpage.py new file mode 100644 index 0000000000..d8ead96492 --- /dev/null +++ b/utils/generate_downloadpage.py @@ -0,0 +1,134 @@ +import datetime +import json +import logging +import re +import sys + +import markdown +import requests +from jinja2 import Environment, FileSystemLoader, select_autoescape +from jinja2.utils import markupsafe + + +stoh = logging.StreamHandler(sys.stderr) +fmth = logging.Formatter("[%(levelname)s] %(asctime)s %(message)s") +stoh.setFormatter(fmth) + +logger = logging.getLogger(__name__) +logger.addHandler(stoh) +logger.setLevel(logging.DEBUG) + + +def website(): + """generates the two snippets for the website""" + md = markdown.Markdown(extensions=["meta"]) + env = Environment( + loader=FileSystemLoader("./templates"), + autoescape=select_autoescape(["html", "xml"]), + ) + env.filters["markdown"] = lambda text: markupsafe.Markup(md.convert(text)) + env.globals["get_title"] = lambda: md.Meta["title"][0] + env.trim_blocks = True + env.lstrip_blocks = True + date = None + headers = {"Accept": "application/vnd.github.v3+json"} + data = json.loads( + requests.get( + "https://api.github.com/repos/cryptoadvance/specter-desktop/releases", + headers=headers, + ).text + ) + # Some time-conversion to make formating easier in jinja2 + logger.info(f" --> preprocessing all releases") + pre_release_pattern = re.compile(".*-pre[0-9]") # -(pre)|(dev)[0-9] + for idx, release in enumerate(data): + logger.info(f" processing {release['name']}") + if pre_release_pattern.match(release["name"]): + logger.info(f" marking {release['name']} as pre-release") + release["is_pre_release"] = True + else: + release["published_at"] = datetime.datetime.strptime( + release["published_at"], "%Y-%m-%dT%H:%M:%SZ" + ) + + current = data[0] + current["assets_by_os"] = { + "macos": "not_existing", + "linux": "not_existing", + "win": "not_existing", + } + logger.info(f" --> preprocessing current release") + for asset in current["assets"]: + logger.info(f" processing {asset['name']}") + if asset["browser_download_url"].endswith(".exe"): + current["assets_by_os"]["win"] = asset + logger.info(f" Found win for {asset['name']}") + if asset["browser_download_url"].endswith(".dmg"): + current["assets_by_os"]["macos"] = asset + logger.info(f" Found macos for {asset['name']}") + if asset["browser_download_url"].endswith(".tar.gz") and asset[ + "name" + ].startswith("specter_desktop"): + current["assets_by_os"]["linux"] = asset + logger.info(f" Found linux for {asset['name']}") + if asset["browser_download_url"].endswith("SHA256SUMS.asc"): + current["signatures"] = asset + logger.info(f" Found signatures") + if asset["browser_download_url"].endswith("SHA256SUMS"): + current["hashes"] = asset + logger.info(f" Found hashes") + template = env.get_template("download-page_current.html") + with open("build/download-page_current.html", "w") as f: + f.write(template.render(data=data, current=data[0])) + template = env.get_template("download-page_releases.html") + # print(data) + with open("build/download-page_releases.html", "w") as f: + f.write(template.render(data=data, current=data[0])) + + # download_page final + template = env.get_template("download-page.html") + with open("build/download-page.html", "w") as f: + f.write(template.render(data=data, current=data[0])) + + +def gh_release_notes(latest_release): + env = Environment(loader=FileSystemLoader("./templates")) + template = env.get_template("gh_release-page-v2.md") + data = {"version": latest_release, "release_notes": ""} + rn_file = requests.get( + "https://raw.githubusercontent.com/cryptoadvance/specter-desktop/master/docs/release-notes.md" + ).text.split("\n") + logger.info(" --> Creating Release") + status = "search" + release_item_counter = 0 + for line in rn_file: + if status == "search" and line.startswith("##"): + status = "harvest" + continue + if status == "harvest" and not line.strip(): + break + if status == "search": + continue + + data["release_notes"] = data["release_notes"] + line + "\n" + release_item_counter = release_item_counter + 1 + + logger.info(f" {release_item_counter} items added to release_notes") + + print(line) + with open("build/gh_page.md", "w") as f: + f.write(template.render(data=data)) + + +if __name__ == "__main__": + headers = {"Accept": "application/vnd.github.v3+json"} + latest_release = json.loads( + requests.get( + "https://api.github.com/repos/cryptoadvance/specter-desktop/releases/latest", + headers=headers, + ).text + ) + latest_release = latest_release["name"] + logger.info(latest_release) + website() + gh_release_notes(latest_release) diff --git a/utils/generate_downloadpage.sh b/utils/generate_downloadpage.sh new file mode 100755 index 0000000000..69c83a9a1f --- /dev/null +++ b/utils/generate_downloadpage.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +set -e + +# We start in the directory where this script is located +cd "$(dirname "${BASH_SOURCE[0]}")/." +source ../.env/bin/activate +cd .. && pip3 install -e ".[gendownloadpage]" && cd utils +rm -rf build +mkdir -p build +python3 ./generate_downloadpage.py + +# Update Github Release Page +latest_release=$(python3 -c 'import json; import requests; ver = json.loads(requests.get("https://api.github.com/repos/cryptoadvance/specter-desktop/releases/latest", headers={"Accept": "application/vnd.github.v3+json"}).text)["name"]; print(ver)') + +if ! command -v gh &> /dev/null; then + echo "WARNING: 'gh' binary not found or not executable. Please ensure it is installed and in your PATH." + echo "You need now to manually replace the release-Notes. I'll list them here:" + echo "------(snip)-->-8---(snap)--8-<-------------" + cat build/gh_page.md + echo "------(snip)-->-8---(snap)--8-<-------------" + read -p "Press a button to continue when you've done it ..." +else + read -p "Update the Github Release page for version $latest_release ? (y/n): " confirm + if [[ $confirm =~ ^[Yy]$ ]]; then + gh release edit $latest_release --repo cryptoadvance/specter-desktop --notes-file build/gh_page.md + fi +fi + + +if ! [[ -d ../../specter-static ]]; then + echo "You don't have cloned the specter-static repo." + echo "Go and clone it and then run this script again!" + exit 1 +fi + +cp build/download-page.html ../../specter-static/specter-httrack-src/specter.solutions/downloads/index.html + +# Change to the Git working directory +cd ../../specter-static + +# Check if working directory is clean +if git diff --quiet && git diff --staged --quiet; then + echo "Git working directory is clean. Exiting..." + exit 0 +fi + +# Add the file to the staging area +git add specter-httrack-src/specter.solutions/downloads/index.html + +# Commit the changes +read -p "Commit changes? (y/n): " confirm +if [[ $confirm =~ ^[Yy]$ ]]; then + git commit -m "Update specter.solutions/downloads/index.html" +else + echo "Commit aborted." + exit 1 +fi + +# Push the commit +read -p "Push commit to remote? (y/n): " confirm +if [[ $confirm =~ ^[Yy]$ ]]; then + git push +else + echo "Push aborted." + exit 1 +fi diff --git a/utils/templates/download-page.html b/utils/templates/download-page.html new file mode 100644 index 0000000000..75116be966 --- /dev/null +++ b/utils/templates/download-page.html @@ -0,0 +1,5289 @@ + + + + + + + + + + + + ⇣ Specter Desktop - Specter Solutions | Your Keys, Your Bitcoin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+ + Specter Solutions + +
+
+
+
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ Download Specter Desktop +

+
+
+
+
+
+

+ Use + your own node, improve + your privacy + and verify + your Bitcoin. +

+
+
+
+
+
+ + {% include './download-page_current.html' %} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + {% include './download-page_releases.html' %} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + +
+ + + +
+ +
+ + +
+ + +
+
+ +
+
+
+ +
+ + +
+ +
+ + 0 + + + + +
+ +
+ + + +
+ +
    +
    + + 0 +
    + + Your Cart + + + +
    + +
    + + +
    + + + +
    Your cart is emptyReturn to Shop
    + +
    + + + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/utils/templates/download-page_current.html b/utils/templates/download-page_current.html new file mode 100644 index 0000000000..1af4633db0 --- /dev/null +++ b/utils/templates/download-page_current.html @@ -0,0 +1,426 @@ + + + + +
    + +

    + Signatures
    + View our Open Source project on Github.

    +
    + + + + diff --git a/utils/templates/download-page_releases.html b/utils/templates/download-page_releases.html new file mode 100644 index 0000000000..70bed6ba99 --- /dev/null +++ b/utils/templates/download-page_releases.html @@ -0,0 +1,136 @@ + + + + +

    Specter Releases:

    + +{% for release in data if not release["is_pre_release"] %} + +

    + {{ release.name }} + {% if loop.index == 1 %} + Latest + {% endif %} +

    +
    Date: {{release.published_at.strftime('%Y-%m-%d')}}
    +

    Assets:


    + +
    + +
    + {{ release.body | markdown}} +
    + +{% endfor %} + + + + diff --git a/utils/templates/gh_release-page-v2.md b/utils/templates/gh_release-page-v2.md new file mode 100644 index 0000000000..e7412b3955 --- /dev/null +++ b/utils/templates/gh_release-page-v2.md @@ -0,0 +1,34 @@ +*Please create a full backup* before migrating or any major internal changes like switching to an electrum based installation. You can easily create a backup in Settings --> Backup Specter (zip file). + +## Artifacts + +Specter is available in several forms: as a GUI application, as a binary that can be executed like a web app, and as a PyPI package. Additionally, Specter is available as a Docker image via the awesome [Chiang Mai LN devs](https://github.com/lncm/docker-specter-desktop). + +Signed hashsum files are available for all binaries. + +## GUI Application + +This is a GUI application with a windowed interface, which includes the Specter server. +Supported platforms: [Windows](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/Specter-Setup-{{ data.version }}.exe), [MacOS](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/Specter-{{ data.version }}.dmg), [Linux (x86_64)](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specter_desktop-{{ data.version }}-x86_64-linux-gnu.tar.gz) + +**Note on Linux**: you need to set up udev rules (included in the archive). Check out the [readme](https://github.com/cryptoadvance/specter-desktop/blob/master/udev/README.md#usage). + +**Note on macOS**: The current build supports only macOS Catalina (10.15) or higher. If you'd like to run Specter on an older macOS version, you can [install Specter from Pip](https://github.com/cryptoadvance/specter-desktop#installing-specter-from-pip). + + +## specterd +Specterd is a command-line program that runs only the Specter server, behaving like a traditional web application. +Supported platforms: [Windows](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specterd-{{ data.version }}-win64.zip), [MacOS](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specterd-{{ data.version }}-osx.zip), [Linux (x86_64)](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specterd-{{ data.version }}-x86_64-linux-gnu.zip) + +## PyPi Packages + +If you’re experienced Python user and/or developer, you might appreciate the [pypi-packages](https://pypi.org/project/cryptoadvance.specter/) which are also available on our github-release-page. + +## Signatures and hashes +[SHA256SUMS](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/SHA256SUMS) file contains sha256 hashes of all binary files and signed with "Specter Signer's" GPG key. +You can get the public key from [here](http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x785a2269ee3a9736ac1a4f4c864b7cf9a811fef7). +Fingerprint of the key is `785A 2269 EE3A 9736 AC1A 4F4C 864B 7CF9 A811 FEF7` +This key has been signed by @k9ert's key. For more information about Verifying signatures, see, e.g. this video. + +# Release notes +{{ data.release_notes }} diff --git a/utils/templates/gh_release-page.md b/utils/templates/gh_release-page.md new file mode 100644 index 0000000000..ce2084ba7b --- /dev/null +++ b/utils/templates/gh_release-page.md @@ -0,0 +1,24 @@ +# Binaries + +There are two types of binaries: + +## Specter Desktop +It's a windowed GUI application with Specter server included. +Supported platforms: [Windows](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/Specter-Setup-{{ data.version }}.exe), [MacOS](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/Specter-{{ data.version }}.dmg), [Linux (x86_64)](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specter_desktop-{{ data.version }}-x86_64-linux-gnu.tar.gz) + +**Note on Linux**: you need to set up udev rules (included in the archive). Check out [readme](https://github.com/cryptoadvance/specter-desktop/blob/master/udev/README.md#usage). + +**Note on macOS**: The current build supports only macOS Catalina (10.15) or higher. If you'd like to run Specter on an older macOS version, you can [install Specter from Pip](https://github.com/cryptoadvance/specter-desktop#installing-specter-from-pip). + +## specterd +It's a command-line program that only runs Specter server. +Supported platforms: [Windows](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specterd-{{ data.version }}-win64.zip), [MacOS](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specterd-{{ data.version }}-osx.zip), [Linux (x86_64)](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specterd-{{ data.version }}-x86_64-linux-gnu.zip) + +## Signatures and hashes +[SHA256SUMS](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/SHA256SUMS) file contains sha256 hashes of all binary files and signed with "Specter Signer's" GPG key. +You can get the public key from [here](http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x785a2269ee3a9736ac1a4f4c864b7cf9a811fef7). +Fingerprint of the key is `785A 2269 EE3A 9736 AC1A 4F4C 864B 7CF9 A811 FEF7` +This key has been signed by @k9ert's key which you might have used for validating th 1.7.0 release. + +# Release notes +{{ data.release_notes }}