mirror of
https://codeberg.org/hyperreal/hyperfocus
synced 2024-11-25 12:13:43 +01:00
Fix file paths for Windows
This commit is contained in:
parent
cf3e061007
commit
69dc22507e
@ -1,12 +1,19 @@
|
|||||||
# go-hyperfocus
|
# go-hyperfocus
|
||||||
|
|
||||||
> Work-In-Progress: Not tested on Windows; there are some file paths I need to fix before it can work.
|
> Work-In-Progress: Not tested on macOS, *BSD, or Solaris.
|
||||||
|
|
||||||
Block distracting websites and hyperfocus on your tasks!
|
Block distracting websites and hyperfocus on your tasks!
|
||||||
|
|
||||||
This is a Go implementation of the Python-written [concentration](https://github.com/timothycrosley/concentration) program. This program aims to be cleaner and simpler than its predecessor.
|
This is a Go implementation of the Python-written [concentration](https://github.com/timothycrosley/concentration) program. This program aims to be cleaner and simpler than its predecessor.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
go install git.envs.net/hyperreal/go-hyperfocus@latest
|
go install git.envs.net/hyperreal/go-hyperfocus@latest
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo go-hyperfocus --help
|
||||||
|
```
|
||||||
|
114
main.go
114
main.go
@ -17,11 +17,7 @@ import (
|
|||||||
"github.com/akamensky/argparse"
|
"github.com/akamensky/argparse"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
// TODO: Figure out what to do with this
|
||||||
distractorsFile string = "/etc/hf_distractors"
|
|
||||||
predefDistractorsFile string = "/etc/hf_predef_distractors"
|
|
||||||
)
|
|
||||||
|
|
||||||
const resetDNSMsg string = `
|
const resetDNSMsg string = `
|
||||||
Note that you may need to flush your system's DNS cache for changes to take effect.
|
Note that you may need to flush your system's DNS cache for changes to take effect.
|
||||||
In most cases this could be done by restarting the resolver daemon.
|
In most cases this could be done by restarting the resolver daemon.
|
||||||
@ -30,6 +26,8 @@ macOS: open terminal and run "sudo dscacheutil -flushcache"
|
|||||||
Linux with Systemd: open terminal and run "sudo systemctl restart systemd-resolved"
|
Linux with Systemd: open terminal and run "sudo systemctl restart systemd-resolved"
|
||||||
Other init systems or *BSD: You probably already know how to do this.`
|
Other init systems or *BSD: You probably already know how to do this.`
|
||||||
|
|
||||||
|
var localFilePaths = make(map[string]string, 4)
|
||||||
|
|
||||||
// Check if <path> exists on the host filesystem
|
// Check if <path> exists on the host filesystem
|
||||||
func fileExists(path string) bool {
|
func fileExists(path string) bool {
|
||||||
|
|
||||||
@ -37,15 +35,32 @@ func fileExists(path string) bool {
|
|||||||
return !errors.Is(err, os.ErrNotExist)
|
return !errors.Is(err, os.ErrNotExist)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getLocalFilePaths() {
|
||||||
|
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "windows":
|
||||||
|
localFilePaths["hosts"] = filepath.Clean("C:\\Windows\\System32\\drivers\\etc\\hosts")
|
||||||
|
localFilePaths["hostsBackup"] = filepath.Clean("C:\\Windows\\System32\\drivers\\etc\\hosts.backup")
|
||||||
|
localFilePaths["uDistractors"] = filepath.Clean(os.Getenv("HOME") + "\\.hf_distractors")
|
||||||
|
localFilePaths["pDistractors"] = filepath.Clean(os.Getenv("HOME") + "\\.hf_predef_distractors")
|
||||||
|
|
||||||
|
default:
|
||||||
|
localFilePaths["hosts"] = filepath.Clean("/etc/hosts")
|
||||||
|
localFilePaths["hostsBackup"] = filepath.Clean("/etc/.hosts.backup")
|
||||||
|
localFilePaths["uDistractors"] = filepath.Clean("/etc/hf_distractors")
|
||||||
|
localFilePaths["pDistractors"] = filepath.Clean("/etc/hf_predef_distractors")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Copy src to dest
|
// Copy src to dest
|
||||||
func copyFile(src string, dest string) error {
|
func copyFile(src string, dest string) error {
|
||||||
|
|
||||||
origFile, err := os.Open(filepath.Clean(src))
|
origFile, err := os.Open(src)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not open original file %s for copying: %s", src, err)
|
return fmt.Errorf("could not open original file %s for copying: %s", src, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
backupFile, err := os.OpenFile(filepath.Clean(dest), os.O_CREATE|os.O_WRONLY, 0666)
|
backupFile, err := os.OpenFile(dest, os.O_CREATE|os.O_WRONLY, 0666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not open backup file %s for writing: %s", dest, err)
|
return fmt.Errorf("could not open backup file %s for writing: %s", dest, err)
|
||||||
}
|
}
|
||||||
@ -58,49 +73,54 @@ func copyFile(src string, dest string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return system's host file as string
|
|
||||||
func getHostFile() string {
|
|
||||||
|
|
||||||
var hostFile string
|
|
||||||
switch runtime.GOOS {
|
|
||||||
case "windows":
|
|
||||||
hostFile = "/Windows/System32/drivers/etc/hosts"
|
|
||||||
|
|
||||||
default:
|
|
||||||
hostFile = "/etc/hosts"
|
|
||||||
}
|
|
||||||
|
|
||||||
return hostFile
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if running as super user
|
// Check if running as super user
|
||||||
func isRoot() bool {
|
func isRoot() bool {
|
||||||
|
|
||||||
|
var isSu bool
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "windows":
|
||||||
|
_, err := os.Open("\\\\.\\PHYSICALDRIVE0")
|
||||||
|
if err != nil {
|
||||||
|
isSu = false
|
||||||
|
} else {
|
||||||
|
isSu = true
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
currUser, err := user.Current()
|
currUser, err := user.Current()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("[Super user check] Unable to get current user: %s\n", err)
|
log.Fatalf("[Super user check] Unable to get current user: %s\n", err)
|
||||||
}
|
}
|
||||||
|
isSu = currUser.Username == "root"
|
||||||
|
}
|
||||||
|
|
||||||
return currUser.Username == "root"
|
return isSu
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disables access to websites that are defined as 'distractors'
|
// Disables access to websites that are defined as 'distractors'
|
||||||
func improveFocus() {
|
func improveFocus() {
|
||||||
|
|
||||||
|
var displayMsg bool = false
|
||||||
|
|
||||||
|
// If first run, display resetDNSMsg
|
||||||
|
if !fileExists(localFilePaths["hostsBackup"]) {
|
||||||
|
displayMsg = true
|
||||||
|
}
|
||||||
|
|
||||||
// Backup host file if a backup does not already exist
|
// Backup host file if a backup does not already exist
|
||||||
if !fileExists("/etc/.hosts.backup") {
|
if !fileExists(localFilePaths["hostsBackup"]) {
|
||||||
if err := copyFile(getHostFile(), "/etc/.hosts.backup"); err != nil {
|
if err := copyFile(localFilePaths["hosts"], localFilePaths["hostsBackup"]); err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open host file for writing/appending
|
// Open host file for writing/appending
|
||||||
hostFile, err := os.OpenFile(getHostFile(), os.O_APPEND|os.O_WRONLY, 0666)
|
hostFileObj, err := os.OpenFile(localFilePaths["hosts"], os.O_APPEND|os.O_WRONLY, 0666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := hostFile.Close(); err != nil {
|
if err := hostFileObj.Close(); err != nil {
|
||||||
log.Printf("Error closing file: %s\n", err)
|
log.Printf("Error closing file: %s\n", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@ -114,9 +134,9 @@ func improveFocus() {
|
|||||||
|
|
||||||
// If /etc/hf_distractors exists, take each host from it and append it
|
// If /etc/hf_distractors exists, take each host from it and append it
|
||||||
// to /etc/hosts for blocking. Else set distractorsFileWarn to true.
|
// to /etc/hosts for blocking. Else set distractorsFileWarn to true.
|
||||||
if fileExists(filepath.Clean(distractorsFile)) {
|
if fileExists(localFilePaths["uDistractors"]) {
|
||||||
|
|
||||||
distractorsFileObj, err := os.Open(filepath.Clean(distractorsFile))
|
distractorsFileObj, err := os.Open(localFilePaths["uDistractors"])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
@ -129,7 +149,7 @@ func improveFocus() {
|
|||||||
scanner := bufio.NewScanner(distractorsFileObj)
|
scanner := bufio.NewScanner(distractorsFileObj)
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
var hostLine string = fmt.Sprintf("127.0.0.1\t%s\n", scanner.Text())
|
var hostLine string = fmt.Sprintf("127.0.0.1\t%s\n", scanner.Text())
|
||||||
if _, err := hostFile.WriteString(hostLine); err != nil {
|
if _, err := hostFileObj.WriteString(hostLine); err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -139,9 +159,9 @@ func improveFocus() {
|
|||||||
|
|
||||||
// If /etc/hf_predef_distractors exists, take each host from it and,
|
// If /etc/hf_predef_distractors exists, take each host from it and,
|
||||||
// append it to /etc/hosts for blocking. Else set predefDistractorsFileWarn to true.
|
// append it to /etc/hosts for blocking. Else set predefDistractorsFileWarn to true.
|
||||||
if fileExists(filepath.Clean(predefDistractorsFile)) {
|
if fileExists(localFilePaths["pDistractors"]) {
|
||||||
|
|
||||||
predefDistractorsFileObj, err := os.Open(filepath.Clean(predefDistractorsFile))
|
predefDistractorsFileObj, err := os.Open(localFilePaths["pDistractors"])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
@ -154,7 +174,7 @@ func improveFocus() {
|
|||||||
scanner := bufio.NewScanner(predefDistractorsFileObj)
|
scanner := bufio.NewScanner(predefDistractorsFileObj)
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
var hostLine string = fmt.Sprintf("127.0.0.1\t%s\n", scanner.Text())
|
var hostLine string = fmt.Sprintf("127.0.0.1\t%s\n", scanner.Text())
|
||||||
if _, err := hostFile.WriteString(hostLine); err != nil {
|
if _, err := hostFileObj.WriteString(hostLine); err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -169,18 +189,21 @@ func improveFocus() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("Focus is now improved 😊")
|
fmt.Println("Focus is now improved 😊")
|
||||||
|
if displayMsg {
|
||||||
|
fmt.Println(resetDNSMsg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enables access to websites that are defined as 'distractors'
|
// Enables access to websites that are defined as 'distractors'
|
||||||
func loseFocus() {
|
func loseFocus() {
|
||||||
|
|
||||||
// Remove the current /etc/hosts file before restoring the backup.
|
// Remove the current /etc/hosts file before restoring the backup.
|
||||||
if err := os.Remove(getHostFile()); err != nil {
|
if err := os.Remove(localFilePaths["hosts"]); err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore the backup of /etc/hosts
|
// Restore the backup of /etc/hosts
|
||||||
if err := copyFile("/etc/.hosts.backup", getHostFile()); err != nil {
|
if err := copyFile(localFilePaths["hostsBackup"], localFilePaths["hosts"]); err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,37 +236,37 @@ func takeBreak(minutes int) {
|
|||||||
func listDistractors() {
|
func listDistractors() {
|
||||||
|
|
||||||
// Open /etc/hf_distractors and store it as *os.File type
|
// Open /etc/hf_distractors and store it as *os.File type
|
||||||
userDistractorsFile, err := os.Open(filepath.Clean(distractorsFile))
|
userDistractorsFileObj, err := os.Open(localFilePaths["uDistractors"])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := userDistractorsFile.Close(); err != nil {
|
if err := userDistractorsFileObj.Close(); err != nil {
|
||||||
log.Printf("Error closing file: %s\n", err)
|
fmt.Printf("Error closing file: %s\n", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Initialize a new scanner, scan /etc/hf_distractors, and print to
|
// Initialize a new scanner, scan /etc/hf_distractors, and print to
|
||||||
// stdout line by line.
|
// stdout line by line.
|
||||||
scanner := bufio.NewScanner(userDistractorsFile)
|
scanner := bufio.NewScanner(userDistractorsFileObj)
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
fmt.Println(scanner.Text())
|
fmt.Println(scanner.Text())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open /etc/hf_predef_distractors and store it as *os.File type
|
// Open /etc/hf_predef_distractors and store it as *os.File type
|
||||||
predefDistractorsFile, err := os.Open(filepath.Clean(predefDistractorsFile))
|
predefDistractorsFileObj, err := os.Open(localFilePaths["pDistractors"])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := predefDistractorsFile.Close(); err != nil {
|
if err := predefDistractorsFileObj.Close(); err != nil {
|
||||||
log.Printf("Error closing file: %s\n", err)
|
fmt.Printf("Error closing file: %s\n", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Initialize a new scanner, scan /etc/hf_predef_distractors, and print to
|
// Initialize a new scanner, scan /etc/hf_predef_distractors, and print to
|
||||||
// stdout line by line.
|
// stdout line by line.
|
||||||
scanner = bufio.NewScanner(predefDistractorsFile)
|
scanner = bufio.NewScanner(predefDistractorsFileObj)
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
fmt.Println(scanner.Text())
|
fmt.Println(scanner.Text())
|
||||||
}
|
}
|
||||||
@ -376,7 +399,8 @@ func addPredefinedDistractors() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Open or create /etc/hf_predef_distractors and store it in *os.File type
|
// Open or create /etc/hf_predef_distractors and store it in *os.File type
|
||||||
predefDistractorsFileObj, err := os.OpenFile(filepath.Clean(predefDistractorsFile), os.O_CREATE|os.O_WRONLY, 0666)
|
fmt.Println(localFilePaths["pDistractors"])
|
||||||
|
predefDistractorsFileObj, err := os.OpenFile(localFilePaths["pDistractors"], os.O_CREATE|os.O_WRONLY, 0666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
@ -414,6 +438,8 @@ func main() {
|
|||||||
|
|
||||||
if isRoot() {
|
if isRoot() {
|
||||||
|
|
||||||
|
getLocalFilePaths()
|
||||||
|
|
||||||
err := parser.Parse(os.Args)
|
err := parser.Parse(os.Args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Print(parser.Usage(err))
|
fmt.Print(parser.Usage(err))
|
||||||
|
Loading…
Reference in New Issue
Block a user