gupax/src
2022-11-22 13:58:39 -05:00
..
constants.rs cargo/tor/p2pool: clean deps, warn macos arti, fix node overflow 2022-11-21 17:25:38 -05:00
disk.rs cargo/tor/p2pool: clean deps, warn macos arti, fix node overflow 2022-11-21 17:25:38 -05:00
ferris.rs disk: add [ErrorState] handling for disk errors 2022-11-19 22:49:15 -05:00
gupax.rs gupax: consolidate FileWindow thread into separate function 2022-11-21 19:57:36 -05:00
main.rs v0.5.0 2022-11-22 10:12:16 -05:00
node.rs p2pool: refine ping auto_select 2022-11-21 20:11:31 -05:00
p2pool.rs v0.5.0 2022-11-22 10:12:16 -05:00
README.md utils: add package.sh 2022-11-22 13:58:39 -05:00
status.rs update: implement retry on [v*] failure, version diff to new vec 2022-10-26 23:15:56 -04:00
update.rs v0.5.0 2022-11-22 10:12:16 -05:00
xmrig.rs cleanup cargo warnings 2022-11-16 14:40:25 -05:00

Gupax source files

Structure

File/Folder Purpose
constants.rs General constants needed in Gupax
command.rs Code for executing/handling P2Pool/XMRig
disk.rs Code for writing to disk: state.toml, node.toml; This holds the structs for mutable [State]
ferris.rs Cute crab bytes
gupax.rs Gupax tab
main.rs App/Tab/State + misc data/functions
node.rs Community node ping code for the P2Pool simple tab
p2pool.rs P2Pool tab
status.rs Status tab
update.rs Update code for the Gupax tab
xmrig.rs XMRig tab

Bootstrap

This is how Gupax works internally when starting up:

  1. INIT

    • Initialize custom console logging with log, env_logger
    • Initialize misc data (structs, text styles, thread count, images, etc)
    • Check for admin privilege (for XMRig)
    • Start initializing main App struct
    • Parse command arguments
    • Attempt to read disk files state.toml, node.toml
    • If errors were found, pop-up window
  2. AUTO

    • If auto_update == true, spawn auto-updating thread
    • If auto_select == true, spawn community node ping thread
  3. MAIN

    • All data should be initialized at this point, either via state.toml or default options
    • Start App frame
    • Do App stuff
    • If ask_before_quit == true, ask before quitting
    • Kill processes, kill connections, exit

Disk

Long-term state is saved onto the disk in the "OS data folder", using the TOML format. If not found, default files will be created. Given a slightly corrupted state file, Gupax will attempt to merge it with a new default one. This will most likely happen if the internal data structure of state.toml is changed in the future (e.g removing an outdated setting). Merging silently in the background is a good non-interactive way to handle this. If Gupax can't read/write to disk at all, or if there are any other big issues, it will show an un-recoverable error window.

OS Data Folder Example
Windows {FOLDERID_LocalAppData} C:\Users\Alice\AppData\Roaming\Gupax
macOS $HOME/Library/Application Support /Users/Alice/Library/Application Support/Gupax
Linux $XDG_DATA_HOME or $HOME/.local/share /home/alice/.local/share/gupax

The current files saved to disk:

  • state.toml Gupax state/settings
  • node.toml The manual node database used for P2Pool advanced

Arti (Tor) also needs to save cache and state. It uses the same file/folder conventions (.local/arti, .cache/arti).

Scale

Every frame, the max available [width, height] are calculated, and those are used as a baseline for the Top/Bottom bars, containing the tabs and status bar. After that, all available space is given to the middle ui elements. The scale is calculated every frame so that all elements can scale immediately as the user adjusts it; this doesn't take as much CPU as you might think since frames are only rendered on user interaction. Some elements are subtracted a fixed number because the ui.seperator()s add some fixed space which needs to be accounted for.

Main [App] outer frame (default: [1280.0, 720.0])
   ├─ TopPanel     = height: 1/12th
   ├─ BottomPanel  = height: 1/20th
   ├─ CentralPanel = height: the rest

Naming Scheme

This is the internal naming scheme used by Gupax when updating/creating default folders/etc:

Windows: - Gupax: Gupax.exe - P2Pool: P2Pool\p2pool.exe - XMRig: XMRig\xmrig.exe macOS: - Gupax: Gupax.app/.../Gupax (Gupax is packaged as an .app on macOS) - P2Pool: p2pool/p2pool - XMRig: xmrig/xmrig Linux: - Gupax: gupax - P2Pool: p2pool/p2pool - XMRig: xmrig/xmrig

These have to be packaged exactly with these names because the update code is case-sensitive. If an exact match is not found, it will error.

Package naming schemes:
gupax  | gupax-vX.X.X-(windows|macos|linux)-x64(standalone|bundle).(zip|tar.gz)
p2pool | p2pool-vX.X.X-(windows|macos|linux)-x64.(zip|tar.gz)
xmrig  | xmrig-X.X.X-(msvc-win64|macos-x64|linux-static-x64).(zip|tar.gz)

Download link = PREFIX + Version (found at runtime) + SUFFIX + Version + EXT
Example: https://github.com/hinto-janaiyo/gupax/releases/download/v0.0.1/gupax-v0.0.1-linux-standalone-x64.tar.gz

Exceptions (there are always exceptions...):
   - XMRig doesn't have a [v], so it is [xmrig-6.18.0-...]
   - XMRig separates the hash and signature
   - P2Pool hashes are in UPPERCASE

For the Gupax data folder: - Windows: Gupax - macOS: Gupax - Linux: gupax