胡 浩,吳軍平
(1.武漢郵電科學研究院,湖北武漢 430074;2.烽火通信科技股份有限公司,湖北武漢 430074)
Samba 是用來使UNIX 系列的操作系統與微軟Windows 操作系統的SMB/CIFS 網絡協議作鏈接的自由軟件[1]。如今,SMB/CIFS 協議被廣泛地用在各種各樣的設備上,Windows 電腦上文件共享、各種系統的NAS 的文件共享功能以及一些嵌入式設備(如網絡攝像頭)的網絡存儲功能都使用SMB/CIFS 網絡協議。在Linux 系統上使用SMB/CIFS 網絡協議進行文件共享要使用Samba 軟件,然而Linux 系統上配置Samba 并不像Windows 系統一樣有現成的圖形界面可以使用,用戶只能通過文本編輯器手動編輯配置文件來配置Samba,容易配置出錯,使用難度很大[2]。文中研究并實現了Linux 系統上Samba 的圖形化配置,降低了Samba 在Linux 系統上的使用難度。
Pyside2 是Python 項目的官方Qt Python 模塊,可訪問完整的Qt5.12框架[3]。Pyside2分為QtGui、QtXml、QtCore、QtSvg、QtNetwork、QtSql 以及QtOpenGL 七大主要模塊。其中,QtGui模塊主要用作繪圖,包含圖形的組件如常見的窗體、狀態欄、按鈕、位圖、滾動條等以及相關的類;QtXml模塊提供了DOM API和SAX的實現;QtCore 模塊用于文件和目錄、各種數據類型、流、MIME 類型、網址、線程或進程,包含核心的非GUI 功能;QtSvg 模塊提供SVG 文件的類;QtNetwork 使得網絡編程更加簡單輕便,包含了網絡編程相關的類;QtSql模塊提供數據庫的類;QtOpenGL 模塊能夠完美集成Qt的GUI和OpenGL庫,主要利用OpenGL庫對3D和2D 圖形進行渲染。
以使用Ubuntu for IoT 系統的嵌入式設備為例,使用"apt install Samba"命令從ubuntu 的軟件倉庫中安裝Samba 后,Samba 的默認配置被存儲在“/etc/Samba/smb.conf”文件中,smbd 服務啟動后從這個文件中讀取配置[4]。打開smb.conf 文件可以發現Samba配置文件解析算法的流程如圖1 所示。smb.conf 含有多個段,每個段由段名開始,直到下個段名,每個段名放在方括號中間[5]。每段參數的格式是:名稱=值。配置文件中每行為一個段名和參數,段名和參數名不分大小寫。除了[global]段外,所有的段都可以看作是一個共享資源。段名是該共享資源的名字,段里的參數是該共享資源的屬性。解析算法需要讀取smb.conf 并從中提取有效配置字段,略過注釋部分,并將配置字段與段名相對應。

圖1 Samba配置解析流程
程序第一步會對當前系統中是否安裝了Samba服務進行檢查,只有當Samba 服務已經被安裝且可以正常使用才會繼續進行之后的步驟。方法是通過Python 的OS 庫執行“ps-ef | grep smb”命令,通過返回值來判斷Samba 服務是否已安裝且正常運行[6]。Samba 服務可以正常使用后程序以讀寫權限讀取配置文件smb.conf 并開始解析。
解析算法的第一步是過濾掉配置文件中的注釋以及行首位的空格,并檢查文件是否已讀完,讀完則結束解析。這一步去除字符串首尾空格及制表符使用的是Python 自帶的lstrip()和rstrip()函數,lstrip()去除左邊的空格,rstrip()去除右邊的空格。
第二步是過濾配置文件中的注釋部分,在smb.conf 文件中,注釋由#開頭,因此第二步會過濾掉#開頭的行。方法是判斷字符串的第一個字符,如果為#則跳回第二步,讀取下一行。
第三步是對讀取到的行進行正則匹配,首先匹配由[]包裹的段名,匹配到段名就會添加一個同名的字典結構,同時將flag 標志賦值為1,并將接下來的參數以鍵值對的形式存儲到字典中。如果flag 值為0 且匹配[]失敗,則跳回第二步讀取下一行。如果flag 為1 且匹配[]失敗,則直接進入下一步。
最后一步是正則匹配smb.conf 文件中的參數,參數是由“=”連接的,等號左邊是參數名,右邊是參數值,匹配前先調用replace 函數去掉字符串中的空格。解析算法使用了一個名為flag 的變量作為匹配標志,遇到參數名時將flag 反轉,通過判斷flag 的值(0 或1)即可將接下來解析出的參數存入參數名對應的字典中,只需一次遍歷就能解析所有的參數。
Python 語言存儲鍵值對數據可以直接使用字典結構,Python 字典可以嵌套使用,意味著Python 字典中key 對應的value 可以是一個字典[7]。解析結果以字典的方式存儲在內存中,主程序可以直接讀取字典變量來讀取到當前系統的Samba 配置,并使用QT的組件將配置信息展現在用戶桌面上,用戶使用圖形界面即可直接修改配置,解析結果存儲的數據結構如圖2 所示。

圖2 解析結果的數據結構
字典名為conf,conf 的key 值為Samba 配置的對應段名,與key 相對應的value 也是一個字典結構,存儲的是段名對應的參數配置,key 為參數名,value為參數對應的配置。這樣存儲的好處是程序可以直接通過遍歷字典的方式來獲取當前所有的配置信息,通過這種鍵值對的形式使得字典中的內容與smb.conf 文件中的有效配置一一對應,降低了程序的開發難度。圖形界面上的QListWidgetItem 由3 個QLabel 標簽和一個QPushButton 按鈕組成,第一個標簽顯示共享名,直接從conf 字典中獲取key 值顯示在用戶界面上;第二個標簽顯示共享路徑,從conf 字典的key 對應的字典中查找key 值為“path”對應的value 值并顯示;第三個標簽顯示允許訪問共享的用戶名,從conf 字典的key 對應的字典中查找key 值為“user”對應的value 值并顯示,當值為“user”的key 不存在時,顯示“all”,即所有用戶都可以訪問該共享。QPushButton 顯示內容為“-”,點擊QPush Button 按鈕,程序會捕捉到按鈕發出的信號并執行對應的槽函數,從conf 字典中刪除該分享的配置信息。
程序的運行依賴于Python3 環境及QT 運行環境,在PC 上Windows 系統只需要按照Python 官網的安裝介紹一步步安裝Python3 后使用“pip3 install Pyside2”即可完成本工具運行環境搭建,這是因為安裝Pyside2 時會安裝QT 依賴的運行環境[8]。常見的Linux 發行版本如CentOS、Ubuntu、優麒麟等都已自帶了Python 環境,因此只需安裝Pyside2 即可完成運行環境的搭建[9]。要在嵌入式設備上運行該工具則需要移植QT 環境[10]。移植Python 需要從Python 官網下載源碼后,使用交叉編譯工具鏈編譯后將生成的文件移動到嵌入式設備相應的目錄下;QT 執行環境的移植需要下載QT5 對應的Qtopia 源碼文件,配置完成后使用交叉編譯工具鏈編譯出QT5 的最小文件系統并燒寫到嵌入式設備中,也可以直接使用支持ubuntu for IoT 系統的開發板,使用類似PC 的命令安裝Pyside2,即可完成運行環境的搭建。
Samba 圖形化配置工具的GUI 使用QT-designer設計,QT-designer 是QT 自帶的界面設計工具,QTdesigner 用戶界面如圖3所示[11]。

圖3 QT-designer用戶界面
在QT-designer 用戶界面中,左側為QT 的控件列表,直接拖動到中間的預覽窗口即可添加到程序界面中,右邊為控件的詳細配置參數。界面設計完成后點擊文件->保存,QT-designer 就會生成一個后綴名為ui 的文件。使用Pyside2-uic.py 工具可以方便地將QT-designer 生成的ui 文件轉換成Python 代碼,使用時在主程序中直接引用即可[12]。
QT 使用信號與槽將圖形界面上的操作和處理方法綁定,當一個信號被發射時,與其相關聯的槽將被立刻執行。通過這種機制將處理函數與界面上的控件綁定,程序初始化時通過Python 的OS 模塊執行shell 命令創建一個test 用戶并添加到Samba 賬戶中,因此程序啟動時會要求輸入root 用戶的密碼,以便OS 模塊可以使用root 權限來執行命令以及修改配置文件[13]。Ubuntu 系統默認只能使用sudo 命令來執行需要root 權限的命令,root 用戶沒有密碼,因此需要用戶手動為root 用戶設置一個固定的密碼,否則無法使用該工具,設置Ubuntu 系統root 用戶密碼的shell 命令為“sudo passwd root ”[14]。該工具在得到root 用戶密碼后,初始化時會在root 權限下使用“useradd test”和“smbpasswd-a test”命令來新建一個Samba 用戶,默認密碼為test,用戶可以自行修改。點擊“添加共享”按鈕默認添加在test 用戶下,降低使用難度。Samba 圖形化配置工具界面如圖4所示。

圖4 Samba圖形化配置工具界面
通過QT的QListWidget來展示已經解析的配置文件,展示的信息為共享名、路徑和允許訪問的用戶[15]。最右側為刪除按鈕,點擊將會刪除字典中對應的配置項,點擊取消按鈕會放棄修改并直接退出Samba圖形化配置工具,點擊保存會將字典中的配置按照規范的配置文件格式寫入到Samba 配置文件中,并使用”/etc/init.d/smbd restart”命令重啟Samba 使配置生效,最后退出程序。
該軟件針對Linux 系統上配置Samba 只能通過修改配置文件配置復雜的缺點,設計開發了Samba圖形化配置工具。該軟件實現了通過圖形化界面來配置Samba 的基本功能,一方面設計了解析Samba 配置文件的解析算法;另一方面使用Pyside2基于QT 實現了程序的用戶界面。研究結果已投入使用,實現了Linux 系統中通過圖形化界面對Samba 進行配置。