diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml index bfbe129..ed238e4 100644 --- a/.gitea/workflows/deploy.yaml +++ b/.gitea/workflows/deploy.yaml @@ -21,7 +21,9 @@ jobs: chmod 400 ssh-key export NIX_PATH=nixpkgs=flake:nixpkgs:/nix/var/nix/profiles/per-user/root/channels/nixos /run/current-system/sw/bin/nix-shell -p rsync openssh --run \ - 'rsync -avz -e "ssh -oStrictHostKeyChecking=accept-new -i ssh-key" result/* deploy@andrew.riouxs.co:/srv/site' + 'rsync -avz -e "ssh -oStrictHostKeyChecking=accept-new -i ssh-key" result/{build,index.html,resources} deploy@andrew.riouxs.co:/srv/site' + /run/current-system/sw/bin/nix-shell -p rsync openssh --run \ + 'rsync -avz -e "ssh -oStrictHostKeyChecking=accept-new -i ssh-key" --ignore-existing result/articles/* deploy@andrew.riouxs.co:/srv/site/articles' - name: Remove SSH key if: always() diff --git a/build/build-index.sh b/build/build-index.sh new file mode 100755 index 0000000..fa9abbc --- /dev/null +++ b/build/build-index.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +LINKS="$(ls articles/*.org | tac | head -n 10 | while read -r article; do + TITLE="$(grep -E '^#\+TITLE:' "$article" | sed -e 's/^#+TITLE:\s*//')" + DATE="$(git show --no-patch --no-notes --pretty='%as' `git rev-list -1 HEAD -- $article`)" + echo '
  • ' + echo ''"$DATE - $TITLE"'' + echo '

    ' + awk '/^\*\*+/ { found_header = 0; found_first_header = 1 } /.+/ { if (found_header) { print } } /^\* / { if (!found_first_header) { found_header = 1 } }' < "$article" + echo '

    ' + echo '
  • ' +done)" + +if [ -f index.html.in ]; then + FILE=index.html.in +else + FILE=index.html +fi + +awk '/LINK_INSERT/ { at_stop = 1 } { if (!at_stop) { print } }' < $FILE +echo "$LINKS" +awk '{ if (at_start) { print } } /LINK_INSERT/ { at_start = 1 }' < $FILE diff --git a/default.nix b/default.nix index 84787f8..bf2652a 100644 --- a/default.nix +++ b/default.nix @@ -6,17 +6,25 @@ let text = builtins.readFile ./build/build-article.sh; }; + build-index = pkgs.writeShellApplication { + name = "build-index"; + text = builtins.readFile ./build/build-index.sh; + }; + + articles = pkgs.stdenv.mkDerivation { name = "articles"; src = builtins.filterSource (path: type: !(pkgs.lib.strings.hasPrefix "result" (baseNameOf path))) ./.; - buildInputs = with pkgs; [ emacs git build-article ]; + buildInputs = with pkgs; [ emacs git build-article build-index ]; buildPhase = '' cp -a . $out cd $out - find . -name '*.org' -exec build-article {} \; + mv index.html index.html.in + find . -name 'articles/*.org' -exec build-article {} \; + build-index > index.html ''; }; in { inherit build-article articles; } diff --git a/index.html b/index.html new file mode 100644 index 0000000..510b6c8 --- /dev/null +++ b/index.html @@ -0,0 +1,85 @@ + + + + + + Andrew Rioux + + + + +
    +
    +

    Andrew Rioux

    +

    + Software Engineer & Security Researcher +

    + +
    +
    + +
    +
    +

    Projects

    + +
    +
    +

    Sparse

    +

    Bind shell and C2 beacon/server implementations using direct network access to evade firewalls and auditing

    +
      +
    • Rust
    • +
    + +
    + +
    +

    Jiujitsu

    +

    System security and enumeration tool designed to run on systems plagued with adversaries

    +
      +
    • Rust
    • +
    • Nix
    • +
    • ELK
    • +
    • Wazuh
    • +
    + +
    + +
    +

    CAP Event Manager

    +

    Event management and reporting system for Civil Air Patrol units

    +
      +
    • TypeScript
    • +
    • Docker
    • +
    + +
    +
    +
    + +
    +

    Recent Articles

    + +
    +
    + + + + diff --git a/resources/index.css b/resources/index.css new file mode 100644 index 0000000..903f7d0 --- /dev/null +++ b/resources/index.css @@ -0,0 +1,157 @@ +:root { + --bg: #1e1e2e; + --bg-alt: #2a2a3a; + --bg-alt-2: #4a4a5a; + --fg: #e0e0e0; + --accent: #8aadf4; + --muted: #a0a0a0; + --border: #3a3a4a; +} + +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + margin: 0; + background: var(--bg); + color: var(--fg); + font-family: "Inter", "Segoe UI", system-ui, sans-serif; + line-height: 1.7; +} + +.container { + width: min(70rem, calc(100% - 2rem)); + margin: 0 auto; +} + +.hero { + border-bottom: 1px solid var(--border); + padding: 5rem 0 4rem; +} + +.hero h1 { + margin: 0; + font-size: clamp(2.5rem, 6vw, 4rem); + font-weight: 700; + color: var(--accent); +} + +.subtitle { + margin-top: 0.5rem; + color: var(--muted); + font-size: 1.1rem; +} + +.intro { + max-width: 42rem; + margin-top: 2rem; + font-size: 1.05rem; +} + +.links { + display: flex; + flex-wrap: wrap; + gap: 1rem; + margin-top: 2rem; +} + +main { + padding: 3rem 0; +} + +section + section { + margin-top: 4rem; +} + +h2 { + margin-bottom: 1.5rem; + color: var(--accent); + font-size: 1.8rem; +} + +.project-grid { + display: grid; + gap: 1.5rem; + grid-template-columns: repeat( + auto-fit, + minmax(18rem, 1fr) + ); +} + +.project-card { + background: var(--bg-alt); + border: 1px solid var(--border); + border-radius: 10px; + padding: 1.5rem; +} + +.project-card h3 { + margin-top: 0; + margin-bottom: 0.75rem; +} + +.project-card p { + margin-bottom: 1.25rem; +} + +.project-links { + display: flex; + gap: 1rem; +} + +.article-list { + list-style: none; + padding: 0; + margin: 0; +} + +.article-list li { + background: var(--bg-alt); + border: 1px solid var(--border); + border-radius: 10px; + padding: 1.25rem; +} + +.article-list li + li { + margin-top: 1rem; +} + +.article-list p { + margin-bottom: 0; + color: var(--muted); +} + +a, +a:visited { + color: var(--accent); + text-decoration: none; + border-bottom: 1px dashed var(--accent); +} + +a:hover { + border-bottom-style: solid; +} + +footer { + border-top: 1px solid var(--border); + margin-top: 4rem; + padding: 2rem 0; + color: var(--muted); +} + +@media (max-width: 700px) { + .hero { + padding-top: 3rem; + } + + .links { + flex-direction: column; + align-items: flex-start; + } +} + diff --git a/test.html b/test.html new file mode 100644 index 0000000..c8f5ffc --- /dev/null +++ b/test.html @@ -0,0 +1,90 @@ + + + + + + Andrew Rioux + + + + +
    +
    +

    Andrew Rioux

    +

    + Software Engineer & Security Researcher +

    + +
    +
    + +
    +
    +

    Projects

    + +
    +
    +

    Sparse

    +

    Bind shell and C2 beacon/server implementations using direct network access

    +
      +
    • Rust
    • +
    + +
    + +
    +

    Jiujitsu

    +

    System security and enumeration tool designed to run on systems plagued with adversaries

    +
      +
    • Rust
    • +
    • Nix
    • +
    • ELK
    • +
    • Wazuh
    • +
    + +
    + +
    +

    CAP Event Manager

    +

    Event management and reporting system for Civil Air Patrol units

    +
      +
    • TypeScript
    • +
    • Docker
    • +
    + +
    +
    +
    + +
    +

    Recent Articles

    + +
    +
    + + + +