mirror of
https://codeberg.org/scip/gowipe.git
synced 2025-12-17 12:40:59 +01:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f7aabc75be | |||
| 88febcf664 | |||
|
|
8dc372a222 | ||
| a90d6e5c3c | |||
| ed4ad2340b | |||
| f7b0cfa905 | |||
| b914fdfcdf |
35
.github/workflows/ci.yaml
vendored
35
.github/workflows/ci.yaml
vendored
@@ -1,35 +0,0 @@
|
|||||||
name: build-and-test-gowipe
|
|
||||||
on: [push, pull_request]
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
version: ['1.21','1.22']
|
|
||||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
||||||
name: Build
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- name: Set up Go ${{ matrix.version }}
|
|
||||||
uses: actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: '${{ matrix.version }}'
|
|
||||||
id: go
|
|
||||||
|
|
||||||
- name: checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: build
|
|
||||||
run: go build
|
|
||||||
|
|
||||||
golangci:
|
|
||||||
name: lint
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: 1.22
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: golangci-lint
|
|
||||||
uses: golangci/golangci-lint-action@v6
|
|
||||||
with:
|
|
||||||
skip-cache: true
|
|
||||||
32
.github/workflows/release.yaml
vendored
32
.github/workflows/release.yaml
vendored
@@ -1,32 +0,0 @@
|
|||||||
name: build-and-test
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "*"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
name: Build Release Assets
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Set up Go
|
|
||||||
uses: actions/setup-go@v1
|
|
||||||
with:
|
|
||||||
go-version: 1.22.11
|
|
||||||
|
|
||||||
- name: Build the executables
|
|
||||||
run: ./mkrel.sh gowipe ${{ github.ref_name}}
|
|
||||||
|
|
||||||
- name: List the executables
|
|
||||||
run: ls -l ./releases
|
|
||||||
|
|
||||||
- name: Upload the binaries
|
|
||||||
uses: svenstaro/upload-release-action@v2
|
|
||||||
with:
|
|
||||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
tag: ${{ github.ref_name }}
|
|
||||||
file: ./releases/*
|
|
||||||
file_glob: true
|
|
||||||
65
.goreleaser.yaml
Normal file
65
.goreleaser.yaml
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# vim: set ts=2 sw=2 tw=0 fo=cnqoj
|
||||||
|
|
||||||
|
version: 2
|
||||||
|
|
||||||
|
before:
|
||||||
|
hooks:
|
||||||
|
- go mod tidy
|
||||||
|
|
||||||
|
gitea_urls:
|
||||||
|
api: https://codeberg.org/api/v1
|
||||||
|
download: https://codeberg.org
|
||||||
|
|
||||||
|
builds:
|
||||||
|
- env:
|
||||||
|
- CGO_ENABLED=0
|
||||||
|
goos:
|
||||||
|
- linux
|
||||||
|
- freebsd
|
||||||
|
|
||||||
|
archives:
|
||||||
|
- formats: [tar.gz]
|
||||||
|
# this name template makes the OS and Arch compatible with the results of `uname`.
|
||||||
|
name_template: >-
|
||||||
|
{{ .ProjectName }}_
|
||||||
|
{{- title .Os }}_
|
||||||
|
{{- if eq .Arch "amd64" }}x86_64
|
||||||
|
{{- else if eq .Arch "386" }}i386
|
||||||
|
{{- else }}{{ .Arch }}{{ end }}
|
||||||
|
{{- if .Arm }}v{{ .Arm }}{{ end }}_{{ .Tag }}
|
||||||
|
# use zip for windows archives
|
||||||
|
format_overrides:
|
||||||
|
- goos: windows
|
||||||
|
formats: [zip]
|
||||||
|
- goos: linux
|
||||||
|
formats: [tar.gz,binary]
|
||||||
|
files:
|
||||||
|
- src: "*.md"
|
||||||
|
strip_parent: true
|
||||||
|
- src: Makefile.dist
|
||||||
|
dst: Makefile
|
||||||
|
wrap_in_directory: true
|
||||||
|
|
||||||
|
changelog:
|
||||||
|
sort: asc
|
||||||
|
filters:
|
||||||
|
exclude:
|
||||||
|
- "^docs:"
|
||||||
|
- "^test:"
|
||||||
|
groups:
|
||||||
|
- title: Improved
|
||||||
|
regexp: '^.*?(feat|add|new)(\([[:word:]]+\))??!?:.+$'
|
||||||
|
order: 0
|
||||||
|
- title: Fixed
|
||||||
|
regexp: '^.*?(bug|fix)(\([[:word:]]+\))??!?:.+$'
|
||||||
|
order: 1
|
||||||
|
- title: Changed
|
||||||
|
order: 999
|
||||||
|
|
||||||
|
release:
|
||||||
|
header: "# Release Notes"
|
||||||
|
footer: >-
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Full Changelog: [{{ .PreviousTag }}...{{ .Tag }}](https://codeberg.org/scip/gowipe/compare/{{ .PreviousTag }}...{{ .Tag }})
|
||||||
36
.woodpecker/build.yaml
Normal file
36
.woodpecker/build.yaml
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
matrix:
|
||||||
|
platform:
|
||||||
|
- linux/amd64
|
||||||
|
goversion:
|
||||||
|
- 1.24
|
||||||
|
|
||||||
|
labels:
|
||||||
|
platform: ${platform}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
build:
|
||||||
|
when:
|
||||||
|
event: [push]
|
||||||
|
image: golang:${goversion}
|
||||||
|
commands:
|
||||||
|
- go get
|
||||||
|
- go build
|
||||||
|
|
||||||
|
linter:
|
||||||
|
when:
|
||||||
|
event: [push]
|
||||||
|
image: golang:${goversion}
|
||||||
|
commands:
|
||||||
|
- curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.5.0
|
||||||
|
- golangci-lint --version
|
||||||
|
- golangci-lint run ./...
|
||||||
|
depends_on: [build]
|
||||||
|
|
||||||
|
test:
|
||||||
|
when:
|
||||||
|
event: [push]
|
||||||
|
image: golang:${goversion}
|
||||||
|
commands:
|
||||||
|
- go get
|
||||||
|
- go test -v -cover
|
||||||
|
depends_on: [build,linter]
|
||||||
15
.woodpecker/release.yaml
Normal file
15
.woodpecker/release.yaml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# build release
|
||||||
|
|
||||||
|
labels:
|
||||||
|
platform: linux/amd64
|
||||||
|
|
||||||
|
steps:
|
||||||
|
goreleaser:
|
||||||
|
image: goreleaser/goreleaser
|
||||||
|
when:
|
||||||
|
event: [tag]
|
||||||
|
environment:
|
||||||
|
GITEA_TOKEN:
|
||||||
|
from_secret: DEPLOY_TOKEN
|
||||||
|
commands:
|
||||||
|
- goreleaser release --clean --verbose
|
||||||
18
Makefile.dist
Normal file
18
Makefile.dist
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# -*-make-*-
|
||||||
|
|
||||||
|
.PHONY: install all
|
||||||
|
|
||||||
|
tool = rpn
|
||||||
|
PREFIX = /usr/local
|
||||||
|
UID = root
|
||||||
|
GID = 0
|
||||||
|
|
||||||
|
all:
|
||||||
|
@echo "Type 'sudo make install' to install the tool."
|
||||||
|
@echo "To change prefix, type 'sudo make install PREFIX=/opt'"
|
||||||
|
|
||||||
|
install:
|
||||||
|
install -d -o $(UID) -g $(GID) $(PREFIX)/bin
|
||||||
|
install -d -o $(UID) -g $(GID) $(PREFIX)/share/doc
|
||||||
|
install -o $(UID) -g $(GID) -m 555 $(tool) $(PREFIX)/sbin/
|
||||||
|
install -o $(UID) -g $(GID) -m 444 *.md $(PREFIX)/share/doc/
|
||||||
57
README.md
57
README.md
@@ -1,10 +1,55 @@
|
|||||||
## gowipe - securely delete files and directories (not for SSD)
|
## gowipe - securely delete files and directories (not for SSD)
|
||||||
|
|
||||||
[](https://github.com/tlinden/gowipe/actions)
|
[](https://ci.codeberg.org/repos/15612)
|
||||||
[](https://github.com/tlinden/gowipe/blob/master/LICENSE)
|
[](https://codeberg.org/scip/gowipe/raw/branch/main/LICENSE)
|
||||||
[](https://goreportcard.com/report/github.com/tlinden/gowipe)
|
[](https://goreportcard.com/report/codeberg.org/scip/gowipe)
|
||||||
[](https://github.com/TLINDEN/gowipe/releases/latest)
|
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
`gowipe` is a simple self contained tool to securely wipe files and
|
||||||
|
directories. By default it renames and overwrites files and
|
||||||
|
directories 30 times and uses the `secure` mode, which uses strong
|
||||||
|
random bytes for the overwriting process. Gowipe writes as much bytes
|
||||||
|
into a file as its original size.
|
||||||
|
|
||||||
|
You can tweak mode and round numbers. Other modes are `zero`, which
|
||||||
|
uses zeroes for overwriting (not recommended) or `encrypt` which
|
||||||
|
encrypts the data using ChaCha20Poly1305 and a strong random key. This is the most
|
||||||
|
secure but also to slowest mode.
|
||||||
|
|
||||||
|
Although you can use `gowipe` on SSD disks, it doesn't make much
|
||||||
|
sense. To wipe such a disk you have to resort to other means. But you
|
||||||
|
can savely use it on magnetic discs or usb drives.
|
||||||
|
|
||||||
|
Of course there are many other such tools available, this one is
|
||||||
|
insofar special as you can download a pre-compiled binary without any
|
||||||
|
library dependencies. This allows you to wipe files on systems, where
|
||||||
|
you cannot install a wiper via some package management (such as
|
||||||
|
appliance systems or vm's).
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Overwrite the directory `vhs` recursively 50 times using strong
|
||||||
|
encryption and verbose output:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
gowipe -c 50 -E -r -v vhs
|
||||||
|
Wiped vhs/help.png (355011 bytes)
|
||||||
|
Wiped vhs/rec.Dockerfile (348 bytes)
|
||||||
|
Wiped vhs/rec.gif (3533338 bytes)
|
||||||
|
Wiped vhs/rec.tape (852 bytes)
|
||||||
|
Wiped vhs (4096 bytes)
|
||||||
|
|
||||||
|
Dirs wiped: 1
|
||||||
|
Files wiped: 5
|
||||||
|
Bytes deleted: 3889549
|
||||||
|
Time elapsed: 426.286639ms
|
||||||
|
Overwritten: 50 times
|
||||||
|
Wipe mode: encrypt
|
||||||
|
Recurse dirs: true
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
```
|
```
|
||||||
Usage: gowipe [-rcvz] <file|directory>...
|
Usage: gowipe [-rcvz] <file|directory>...
|
||||||
@@ -33,7 +78,7 @@ that's the best way for me to forget to do something.
|
|||||||
|
|
||||||
In order to report a bug, unexpected behavior, feature requests
|
In order to report a bug, unexpected behavior, feature requests
|
||||||
or to submit a patch, please open an issue on github:
|
or to submit a patch, please open an issue on github:
|
||||||
https://github.com/TLINDEN/gowipe/issues.
|
https://codeberg.org/scip/gowipe/issues.
|
||||||
|
|
||||||
## Copyright and license
|
## Copyright and license
|
||||||
|
|
||||||
@@ -45,4 +90,4 @@ T.v.Dein <tom AT vondein DOT org>
|
|||||||
|
|
||||||
## Project homepage
|
## Project homepage
|
||||||
|
|
||||||
https://github.com/TLINDEN/gowipe
|
https://codeberg.org/scip/gowipe
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright © 2022 Thomas von Dein
|
Copyright © 2022-2025 Thomas von Dein
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -22,6 +22,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"log"
|
||||||
"math/big"
|
"math/big"
|
||||||
mathrand "math/rand"
|
mathrand "math/rand"
|
||||||
"os"
|
"os"
|
||||||
@@ -141,7 +142,11 @@ func Encrypt(c *Conf, filename string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer outfile.Close()
|
defer func() {
|
||||||
|
if err := outfile.Close(); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
key, err := GetRandomKey()
|
key, err := GetRandomKey()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
34
main.go
34
main.go
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright © 2022 Thomas von Dein
|
Copyright © 2022-2025 Thomas von Dein
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -22,12 +22,13 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/JojiiOfficial/shred"
|
"github.com/JojiiOfficial/shred"
|
||||||
flag "github.com/spf13/pflag"
|
flag "github.com/spf13/pflag"
|
||||||
)
|
)
|
||||||
|
|
||||||
const VERSION string = "0.0.3"
|
const VERSION string = "0.0.4"
|
||||||
const Usage string = `This is gowipe - destruct files in a non-recoverable way.
|
const Usage string = `This is gowipe - destruct files in a non-recoverable way.
|
||||||
|
|
||||||
Usage: gowipe [-rcvz] <file|directory>...
|
Usage: gowipe [-rcvz] <file|directory>...
|
||||||
@@ -55,6 +56,9 @@ type Conf struct {
|
|||||||
nodelete bool
|
nodelete bool
|
||||||
norename bool
|
norename bool
|
||||||
verbose bool
|
verbose bool
|
||||||
|
files int
|
||||||
|
dirs int
|
||||||
|
size int64
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -138,14 +142,26 @@ func main() {
|
|||||||
shredder := shred.Shredder{}
|
shredder := shred.Shredder{}
|
||||||
shredconf := shred.NewShredderConf(&shredder, option, c.count, !c.nodelete)
|
shredconf := shred.NewShredderConf(&shredder, option, c.count, !c.nodelete)
|
||||||
|
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
for _, file := range flag.Args() {
|
for _, file := range flag.Args() {
|
||||||
Wipe(file, &c, shredconf)
|
Wipe(file, &c, shredconf)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if c.verbose {
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Printf(" Dirs wiped: %d\n", c.dirs)
|
||||||
|
fmt.Printf(" Files wiped: %d\n", c.files)
|
||||||
|
fmt.Printf("Bytes deleted: %d\n", c.size)
|
||||||
|
fmt.Printf(" Time elapsed: %s\n", time.Since(start))
|
||||||
|
fmt.Printf(" Overwritten: %d times\n", c.count)
|
||||||
|
fmt.Printf(" Wipe mode: %s\n", c.mode)
|
||||||
|
fmt.Printf(" Recurse dirs: %t\n", c.recurse)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Wipe(file string, c *Conf, wiper *shred.ShredderConf) {
|
func Wipe(file string, c *Conf, wiper *shred.ShredderConf) {
|
||||||
if info, err := os.Stat(file); err == nil {
|
if info, err := os.Stat(file); err == nil {
|
||||||
|
|
||||||
if info.IsDir() {
|
if info.IsDir() {
|
||||||
if !c.recurse {
|
if !c.recurse {
|
||||||
fmt.Printf("-r not set, ignoring directory %s\n", file)
|
fmt.Printf("-r not set, ignoring directory %s\n", file)
|
||||||
@@ -167,6 +183,8 @@ func Wipe(file string, c *Conf, wiper *shred.ShredderConf) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c.dirs++
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if c.mode == "encrypt" {
|
if c.mode == "encrypt" {
|
||||||
@@ -186,11 +204,15 @@ func Wipe(file string, c *Conf, wiper *shred.ShredderConf) {
|
|||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c.size += info.Size()
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.verbose {
|
if c.verbose {
|
||||||
fmt.Printf("Wiped %d times: %s\n", c.count, file)
|
fmt.Printf("Wiped %s (%d bytes)\n", file, info.Size())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c.files++
|
||||||
} else {
|
} else {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
fmt.Printf("No such file or directory: %s\n", file)
|
fmt.Printf("No such file or directory: %s\n", file)
|
||||||
@@ -227,10 +249,6 @@ func Rename(file string, c *Conf) string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.verbose {
|
|
||||||
fmt.Printf("renaming %s/%s => %s/%s\n", dir, base, dir, newname)
|
|
||||||
}
|
|
||||||
|
|
||||||
err := os.Rename(filepath.Join(dir, base), filepath.Join(dir, newname))
|
err := os.Rename(filepath.Join(dir, base), filepath.Join(dir, newname))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
|||||||
4
mkrel.sh
4
mkrel.sh
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Copyright © 2022 Thomas von Dein
|
# Copyright © 2022-2025 Thomas von Dein
|
||||||
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -43,7 +43,7 @@ for D in $DIST; do
|
|||||||
tardir="${tool}-${os}-${arch}-${version}"
|
tardir="${tool}-${os}-${arch}-${version}"
|
||||||
tarfile="releases/${tool}-${os}-${arch}-${version}.tar.gz"
|
tarfile="releases/${tool}-${os}-${arch}-${version}.tar.gz"
|
||||||
set -x
|
set -x
|
||||||
GOOS=${os} GOARCH=${arch} go build -o ${binfile} -ldflags "-X 'github.com/tlinden/tablizer/cfg.VERSION=${version}'"
|
GOOS=${os} GOARCH=${arch} go build -o ${binfile} -ldflags "-X 'codeberg.org/scip/tablizer/cfg.VERSION=${version}'"
|
||||||
mkdir -p ${tardir}
|
mkdir -p ${tardir}
|
||||||
cp ${binfile} README.md LICENSE ${tardir}/
|
cp ${binfile} README.md LICENSE ${tardir}/
|
||||||
echo 'tool = gowipe
|
echo 'tool = gowipe
|
||||||
|
|||||||
Reference in New Issue
Block a user