gohost -- go 開發的命令列hosts組態管理工具

來源:互聯網
上載者:User

前幾天在微博上看到有人推薦了lazygit這個工具,讓人眼前一亮,什麼時候命令列也可以這麼搶到了,,調研了下,發現它使用了gocui,使用它可以做出來很多很炫的命令列工具。

現有的hosts工具裡面也有switchosts!,但我是用的時候發現他還是有bug,也只能用在介面化平台。想了下,準備著手搞一個命令列的hsots組態工具,這個類庫完全可以滿足。

介面設計

在介面設計上,還是做個copycat,抄襲switchosts!的,分兩欄,左側是hosts分組,右邊兒是當前聚焦hosts分組內容,控制開關放在左側,如下所示。左側開關控制每個組的開啟關閉與否,系統當前的hosts是左側所有開啟hosts的集合。

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

hosts實現原理

原理和switchosts!的類似,通過修改系統hosts檔案來達到目的,每次修改的變動都會即時的體現到系統hosts檔案中,這樣就實現了控制hosts的目的。

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可以獨立控制重新整理,響應鍵盤的事件,所以,只要你願意,甚至可以做出一些簡單的小遊戲。

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檢測一次輸入的內容是否合規,如下所示,協程中是個死迴圈,如果不合規,標紅展示。

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...

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.