Golang: 扫描目录并获取相关信息Scan Directory and Get File Information

作者:Ajian 发布时间:May 18, 2012 分类:Golang

前言:最近看到Go里面有一个func很容易就可以扫描整个目录,并且可以得到相应的目录和文件信息,所以我将其进行了封装,拿到file info的所有信息 这样就可以方便的做其它用途了。

直接上代码,代码基于Go version 1

package main

import (
    "path/filepath"
    "os"
    "flag"
    "fmt"
    "time"
)

const (
    IsDirectory             = iota
    IsRegular
    IsSymlink
)

type sysFile struct {  
    fType       int
    fName       string
    fLink       string
    fSize       int64
    fMtime      time.Time
    fPerm       os.FileMode
}

type F struct {
    files []*sysFile
}

func (self *F) visit(path string, f os.FileInfo, err error) error {
    if ( f == nil ) {
        return err
    }
    var tp int
    if f.IsDir() {
        tp = IsDirectory
    }else if (  f.Mode() & os.ModeSymlink ) > 0 {
        tp = IsSymlink 
    }else{
        tp = IsRegular
    }
    inoFile := &sysFile{
        fName : path,
        fType : tp,
        fPerm : f.Mode(),
        fMtime: f.ModTime(),
        fSize : f.Size(),
    }
    self.files = append( self.files, inoFile )
    return nil
} 


func main() {
    flag.Parse()
    root := flag.Arg(0)
    self := F{
        files: make( []*sysFile, 0 ),
    }
    err := filepath.Walk(root, func(path string, f os.FileInfo, err error) error {
        return self.visit(path, f, err)
    })

    if err != nil {  
      fmt.Printf("filepath.Walk() returned %v\n", err)
    }

    for _, v := range self.files {
        fmt.Println( v.fName,v.fSize )
    }
}

Golang: RPC Authorization 简单ip安全验证

作者:Ajian 发布时间:May 7, 2012 分类:Golang

前言:写网络服务,总要考虑安全机制,对ip和网段进行判断是最简单的一个验证机制。之后想做一个类似注册式的安全验证机制,既可以减少配置文件的麻烦,又可以很好的进行安全管理。

直接上代码 (基于go version 1 编译)

package main
import(
    "net"
    "fmt"
    "time"
    "strings"
)

func main(){
    IP_ARRAY := "192.168.1.234,192.168.1.47,192.168.2.0/28"
    servPort:=":7272"
    l,err := net.Listen( "tcp",servPort )
    if err != nil {
        fmt.Printf( "Listen is error" )
        return 
    }
    allowList :=strings.Split( IP_ARRAY,"," )
    for{  
        conn,err:=l.Accept()
        if err != nil {
            fmt.Printf( "start connect  is error" )
            return 
        }
        ipAddr:=conn.RemoteAddr()
        Addr := strings.Split( ipAddr.String(), ":")
        rAddr := net.ParseIP( Addr[0] )
        var authorized bool = false
        for v := range allowList{
            _,ipNet,err := net.ParseCIDR( allowList[v] )
            if err != nil{
                fmt.Printf( "parse ip net error" )
                ipHost := net.ParseIP( allowList[v])
                if ipHost != nil{
                   if ipHost.Equal( rAddr ) {
                      authorized =true
                   }
                }else{
                    fmt.Printf( "ip list error" )
                }
            }else{ 
                fmt.Printf( "Contains ip " )
                if ipNet.Contains( rAddr ) {
                    authorized =true
                }
            }
        }
        if authorized == true{  
            curTime:=time.Now()
            fmt.Printf( curTime.Format( "2006-01-02 15:04:05" )  )
            conn.Write( []byte(curTime.Format( "2006-01-02 15:04:05" ) ) )
            time.Sleep( 10)
        }else{
            conn.Close()
        }
    }
}

从不同的网络telnet 看下效果吧。