gohost -- go 開發的命令行hosts配置管理工具

前幾天在微博上看到有人推薦了lazygit這個工具,讓人眼前一亮,何時命令行也能夠這麼搶到了,🤣,調研了下,發現它使用了gocui,使用它能夠作出來不少很炫的命令行工具。linux

現有的hosts工具裏面也有switchosts!,但我是用的時候發現他仍是有bug,也只能用在界面化平臺。想了下,準備着手搞一個命令行的hsots配置工具,這個類庫徹底能夠知足。git

界面設計

在界面設計上,仍是作個copycat,抄襲switchosts!的,分兩欄,左側是hosts分組,右邊兒是當前聚焦hosts分組內容,控制開關放在左側,以下所示。左側開關控制每一個組的開啓關閉與否,系統當前的hosts是左側全部打開hosts的集合。github

*------*-------------------*
|×name1|# hosts for name2  |
|√name2|1.1.1.1 a.com      |
|×name3|0.0.0.0 abc.com    |
|      |                   |
|      |                   |
|      |                   |
*------*-------------------*

hosts實現原理

原理和switchosts!的相似,經過修改系統hosts文件來達到目的,每次修改的變更都會實時的體現到系統hosts文件中,這樣就實現了控制hosts的目的。golang

hosts 配置軟件                    系統hosts
*------*-------------------*     *-------------------------*
|×name1|# hosts for name2  |     |# hosts for name2        |
|√name2|1.1.1.1 a.com      |     |1.1.1.1 a.com            |
|√name3|0.0.0.0 abc.com    |     |0.0.0.0 abc.com          |  
|      |                   | =>  |# hosts for name3        |
|      |                   |     |127.0.0.1 localhost      |
|      |                   |     |                         |
*------*-------------------*     *-------------------------*

gocui爲咱們提供了什麼

gocui是一個很強大的庫,就像他所說的那樣Go Console User Interface,提供一個命令行用戶界面。他爲咱們賦予了控制刷新terminal的能力,好比將terminal分爲多個view(分區),每一個view能夠獨立控制刷新,響應鍵盤的事件,因此,只要你願意,甚至能夠作出一些簡單的小遊戲。windows

gohosts

目前爲止gohosts的功能基本已開發完成,主要有功能就是切換hosts,有以下交互:函數

  1. 聚焦左側view時,經過shift + a組合鍵,建立新的hosts分組。
  2. 經過tab鍵,切換左側、右側view。
  3. 聚焦彈層view時,當建立新的hosts分組的時候,會進入彈層view,輸入內容後,按下enter鍵生效。
  4. 聚焦左側view時,經過上下箭頭切換hosts分組。
  5. 聚焦左側view時候,經過左右箭頭切換hosts分組開關。

gohosts實現

由於要修改hosts,因此運行程序的時候也必需要使用root權限,初次運行的時候,會自動進行初始化,生成backup分組,並將系統當前已有hosts內容放入其中。工具

gohosts的配置文件會放在運行用戶的家目錄下面的.gohost文件夾下,每次啓動的時候,會從其中讀取配置文件,並展示出來。另外,爲了作兼容,區分了windows系統和linux系統,經過getUserHome函數獲取用戶家目錄。另外做爲一個copycat,從switchosts!哪裏瞭解到,有的windows系統盤不裝在C盤,經過getWinSystemDir獲取windows的系統盤目錄,作到儘量的全平臺、多環境兼容。動畫

func getUserHome() string {
  home := ""
  if runtime.GOOS == "windows" {
    home = os.Getenv("USERPROFILE")
  } else {
    home = os.Getenv("HOME")
  }

  return home
}

func getWinSystemDir() string {
  dir := ""
  if runtime.GOOS == "windows" {
    dir = os.Getenv("windir")
  }

  return dir
}

另外這裏2次使用了go協程來檢驗語法,啓動軟件的時候,啓動協程,每隔50ms檢測一次輸入的內容是否合規,以下所示,協程中是個死循環,若是不合規,標紅展現。ui

go func() {
  for range time.Tick(time.Millisecond * 50) {
    // do something
  }
}()

好比咱們輸入hosts配置的時候,必須知足下面3中正則,否則會提示哪一行有錯誤。命令行

"^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}(?:[  ]{1,})(?:[ 0-9a-zA-Z._-]{1,}){1,}$"
"^[    ]*$"
"^#.*"

還有咱們輸入新建hosts分組的時候,若是hosts分組名字已經存在了,或者hosts分組名字超過長度了,也會在輸入彈層view中提示標紅。

golang的協程處理這些內容簡直得天獨厚,處理起來很輕鬆,也很簡單高效。

另外比較麻煩的地方就是控制光標焦點了,左側增長hosts分組的時候,還有當分組個數超過最大顯示行數的時候,這就至關用畫布、畫框的狀況,當移動焦點的時候,須要對應的作出移動畫布仍是移動畫框,哈哈,有興趣的能夠看看代碼中的邏輯。

gohosts效果展現

總結

本身已經實際使用了幾天了,還算好用,比較遺憾的就是不支持中文,中文會出現顯示不全的問題,這是依賴庫致使的,改起來估計比較費勁,不過對於hosts來講,全英文也沒問題。

原文連接:
http://www.5aikid.com/2018/08/23/gohost-go-開發的命令行hosts配置管理工具/

github地址:
https://github.com/aizuyan/gohosts

另外這是第一次真正的使用golang作出一些有用的東西,感受還挺不錯,準備稍微閒點兒了,好好研究下這個 依賴庫gocui。

相關文章
相關標籤/搜索