SlideShare a Scribd company logo


2
3
4
5
6
7
const (
QUAGGAD_MODULE = "quaggad"
QUAGGAD_PORT = 2699
)
func grpcRegisterModule(conn *grpc.ClientConn) error {
client := rpc.NewRegisterClient(conn)
request := &rpc.RegisterModuleRequest{
Module: QUAGGAD_MODULE,
Port: fmt.Sprintf("%d", QUAGGAD_PORT),
}
_, err := client.DoRegisterModule(context.Background(), request)
if err != nil {
return err
}
return nil
}
8
var showCmdMap = map[string]func(string) *string{
"quagga_show": quaggaShow,
}
func quaggaShow(line string) *string {
return quaggaVtysh(line)
}
func grpcRegisterCommands(conn *grpc.ClientConn) {
client := rpc.NewRegisterClient(conn)
var showCommands []rpc.RegisterRequest
json.Unmarshal([]byte(showCmdSpec), &showCommands)
showParser = cmd.NewParser()
for _, command := range showCommands {
command.Module = QUAGGAD_MODULE
command.Privilege = 1
command.Code = rpc.ExecCode_REDIRECT_SHOW
_, err := client.DoRegister(context.Background(), &command)
if err != nil {
grpclog.Fatalf("client DoRegister failed: %v", err)
}
showParser.InstallLine(command.Line, showCmdMap[command.Name])
}
const showCmdSpec = `
[
{
"name": "quagga_show",
"line": "show running-config",
"mode": "exec",
"helps": [
"Show running system information",
"running configuration"
]
},
{
...
9
func (s *grpcShowServer) Show(request *rpc.ShowRequest, stream rpc.Show_ShowServer)
error {
reply := &rpc.ShowReply{}
_, fn, _, _ := showParser.ParseLine(request.Line)
show := fn.(func(string) *string)
out := show(request.Line)
lines := strings.Split(*out, "n")
for _, line := range lines {
reply.Str = fmt.Sprintln(line)
err := stream.Send(reply)
if err != nil {
fmt.Println(err)
break
}
}
return nil
}
10
11
12
func grpcSubscribe(conn *grpc.ClientConn) (rpc.Config_DoConfigClient, error) {
client := rpc.NewConfigClient(conn)
stream, err := client.DoConfig(context.Background())
if err != nil {
return nil, err
}
path := []string{"interfaces", "protocols", "policy"}
request := &rpc.ConfigRequest{
Type: rpc.ConfigType_SUBSCRIBE_MULTI,
Module: QUAGGAD_MODULE,
Port: QUAGGAD_PORT,
Path: path,
}
err = stream.Send(request)
if err != nil {
return nil, err
}
return stream, err
}
13
func grpcLoop() {
...
for {
conf, err := stream.Recv()
...
switch conf.Type {
case rpc.ConfigType_VALIDATE_START:
validating = true
quaggaConfigStateSync()
case rpc.ConfigType_VALIDATE_END:
request := &rpc.ConfigRequest{}
if quaggaConfigValid(f) {
request.Type = rpc.ConfigType_VALIDATE_SUCCESS
} else {
request.Type = rpc.ConfigType_VALIDATE_FAILED
}
err := stream.Send(request)
validating = false
case rpc.ConfigType_COMMIT_START:
case rpc.ConfigType_COMMIT_END:
case rpc.ConfigType_SET, rpc.ConfigType_DELETE:
quaggaConfig(int(conf.Type), conf.Path)
default:
}
}
14
func quaggaInterfacesInterfaceIpv4OspfAuthenticationMd5KeyId(Cmd int, Args cmd.Args) int {
//interfaces interface WORD ipv4 ospf authentication md5 key-id WORD
switch Cmd {
case cmd.Set:
case cmd.Delete:
}
return cmd.Success
}
func initConfig() {
configParser = cmd.NewParser()
configParser.InstallCmd(
[]string{"interfaces", "interface", "WORD", "ipv4", "ospf", "authentication",
quaggaInterfacesInterfaceIpv4OspfAuthenticationMd5KeyId)
...
func quaggaConfig(command int, path []string) {
switch command {
case cmd.Set:
fmt.Println("[cmd] add", path)
case cmd.Delete:
fmt.Println("[cmd] del", path)
}
if !validating {
ret, fn, args, _ := configParser.ParseCmd(path)
if ret == cmd.ParseSuccess {
fn.(func(int, cmd.Args) int)(command, args)
}
}
quaggaConfigStateUpdate(command, path)
}

More Related Content

What's hot

Program to illustrate Switch, Goto and Exit statements.
Program to illustrate Switch, Goto and  Exit statements.Program to illustrate Switch, Goto and  Exit statements.
Program to illustrate Switch, Goto and Exit statements.
harman kaur
 
Java Code for Sample Projects Methods
Java Code for Sample Projects MethodsJava Code for Sample Projects Methods
Java Code for Sample Projects Methods
jwjablonski
 
Unit 1 ocs752 introduction to c programming
Unit 1 ocs752 introduction to c programmingUnit 1 ocs752 introduction to c programming
Unit 1 ocs752 introduction to c programming
vrgokila
 

What's hot (20)

MFC Rect2
MFC Rect2MFC Rect2
MFC Rect2
 
C++ programs
C++ programsC++ programs
C++ programs
 
Pratik Bakane C++
Pratik Bakane C++Pratik Bakane C++
Pratik Bakane C++
 
Script
ScriptScript
Script
 
Codes for diagram
Codes for diagramCodes for diagram
Codes for diagram
 
Program to illustrate Switch, Goto and Exit statements.
Program to illustrate Switch, Goto and  Exit statements.Program to illustrate Switch, Goto and  Exit statements.
Program to illustrate Switch, Goto and Exit statements.
 
How to send a mail from utl smtp or from back end
How to send a mail from utl smtp or from back endHow to send a mail from utl smtp or from back end
How to send a mail from utl smtp or from back end
 
Pratik Bakane C++
Pratik Bakane C++Pratik Bakane C++
Pratik Bakane C++
 
Advanced pointer
Advanced pointerAdvanced pointer
Advanced pointer
 
Java Code for Sample Projects Methods
Java Code for Sample Projects MethodsJava Code for Sample Projects Methods
Java Code for Sample Projects Methods
 
Unit 1 ocs752 introduction to c programming
Unit 1 ocs752 introduction to c programmingUnit 1 ocs752 introduction to c programming
Unit 1 ocs752 introduction to c programming
 
Rcpp11 useR2014
Rcpp11 useR2014Rcpp11 useR2014
Rcpp11 useR2014
 
Debugging tips and tricks - coders on beers Santiago
Debugging tips and tricks -  coders on beers SantiagoDebugging tips and tricks -  coders on beers Santiago
Debugging tips and tricks - coders on beers Santiago
 
Jarmo van de Seijp Shadbox ERC223
Jarmo van de Seijp Shadbox ERC223Jarmo van de Seijp Shadbox ERC223
Jarmo van de Seijp Shadbox ERC223
 
Metnum
MetnumMetnum
Metnum
 
Finch + Finagle OAuth2
Finch + Finagle OAuth2Finch + Finagle OAuth2
Finch + Finagle OAuth2
 
C lab programs
C lab programsC lab programs
C lab programs
 
Rcpp11 genentech
Rcpp11 genentechRcpp11 genentech
Rcpp11 genentech
 
Programming Fundamentals lecture 8
Programming Fundamentals lecture 8Programming Fundamentals lecture 8
Programming Fundamentals lecture 8
 
Tugas Program C++
Tugas Program C++Tugas Program C++
Tugas Program C++
 

Similar to openconfigd

Version1.0 StartHTML000000232 EndHTML000065057 StartFragment0000.docx
Version1.0 StartHTML000000232 EndHTML000065057 StartFragment0000.docxVersion1.0 StartHTML000000232 EndHTML000065057 StartFragment0000.docx
Version1.0 StartHTML000000232 EndHTML000065057 StartFragment0000.docx
tienboileau
 
Call report from x++
Call report from x++Call report from x++
Call report from x++
Ahmed Farag
 

Similar to openconfigd (20)

gRPC in Go
gRPC in GogRPC in Go
gRPC in Go
 
GDG Devfest 2019 - Build go kit microservices at kubernetes with ease
GDG Devfest 2019 - Build go kit microservices at kubernetes with easeGDG Devfest 2019 - Build go kit microservices at kubernetes with ease
GDG Devfest 2019 - Build go kit microservices at kubernetes with ease
 
Qt Network Explained (Portuguese)
Qt Network Explained (Portuguese)Qt Network Explained (Portuguese)
Qt Network Explained (Portuguese)
 
Config interface
Config interfaceConfig interface
Config interface
 
Compose Async with RxJS
Compose Async with RxJSCompose Async with RxJS
Compose Async with RxJS
 
Uncomplicated Nomad
Uncomplicated NomadUncomplicated Nomad
Uncomplicated Nomad
 
NoSQL meets Microservices
NoSQL meets MicroservicesNoSQL meets Microservices
NoSQL meets Microservices
 
Michael Hackstein - NoSQL meets Microservices - NoSQL matters Dublin 2015
Michael Hackstein - NoSQL meets Microservices - NoSQL matters Dublin 2015Michael Hackstein - NoSQL meets Microservices - NoSQL matters Dublin 2015
Michael Hackstein - NoSQL meets Microservices - NoSQL matters Dublin 2015
 
Qt & Webkit
Qt & WebkitQt & Webkit
Qt & Webkit
 
C++
C++C++
C++
 
NoSQL meets Microservices - Michael Hackstein
NoSQL meets Microservices - Michael HacksteinNoSQL meets Microservices - Michael Hackstein
NoSQL meets Microservices - Michael Hackstein
 
PostgreSQL Procedural Languages: Tips, Tricks and Gotchas
PostgreSQL Procedural Languages: Tips, Tricks and GotchasPostgreSQL Procedural Languages: Tips, Tricks and Gotchas
PostgreSQL Procedural Languages: Tips, Tricks and Gotchas
 
Version1.0 StartHTML000000232 EndHTML000065057 StartFragment0000.docx
Version1.0 StartHTML000000232 EndHTML000065057 StartFragment0000.docxVersion1.0 StartHTML000000232 EndHTML000065057 StartFragment0000.docx
Version1.0 StartHTML000000232 EndHTML000065057 StartFragment0000.docx
 
Qt Rest Server
Qt Rest ServerQt Rest Server
Qt Rest Server
 
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейВасилий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексией
 
如何透過 Go-kit 快速搭建微服務架構應用程式實戰
如何透過 Go-kit 快速搭建微服務架構應用程式實戰如何透過 Go-kit 快速搭建微服務架構應用程式實戰
如何透過 Go-kit 快速搭建微服務架構應用程式實戰
 
Функции обратного вызова в C++. Виталий Ткаченко. CoreHard Spring 2019
Функции обратного вызова в C++. Виталий Ткаченко. CoreHard Spring 2019Функции обратного вызова в C++. Виталий Ткаченко. CoreHard Spring 2019
Функции обратного вызова в C++. Виталий Ткаченко. CoreHard Spring 2019
 
Vaadin+Scala
Vaadin+ScalaVaadin+Scala
Vaadin+Scala
 
Call report from x++
Call report from x++Call report from x++
Call report from x++
 
sas aeroplan sample
sas aeroplan samplesas aeroplan sample
sas aeroplan sample
 

More from Masakazu Asama (8)

NETCONFとYANGの話
NETCONFとYANGの話NETCONFとYANGの話
NETCONFとYANGの話
 
Hydrogen → Helium での Linux kernel の違い
Hydrogen → Helium での Linux kernel の違いHydrogen → Helium での Linux kernel の違い
Hydrogen → Helium での Linux kernel の違い
 
Linux packet-forwarding
Linux packet-forwardingLinux packet-forwarding
Linux packet-forwarding
 
VTI の中身
VTI の中身VTI の中身
VTI の中身
 
ASAMAP Update
ASAMAP UpdateASAMAP Update
ASAMAP Update
 
ASAMAP 開発秘話
ASAMAP 開発秘話ASAMAP 開発秘話
ASAMAP 開発秘話
 
Vyatta 改造入門
Vyatta 改造入門Vyatta 改造入門
Vyatta 改造入門
 
MAP 実装してみた
MAP 実装してみたMAP 実装してみた
MAP 実装してみた
 

Recently uploaded

Article writing on excessive use of internet.pptx
Article writing on excessive use of internet.pptxArticle writing on excessive use of internet.pptx
Article writing on excessive use of internet.pptx
abhinandnam9997
 
一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理
一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理
一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理
aagad
 

Recently uploaded (12)

Article writing on excessive use of internet.pptx
Article writing on excessive use of internet.pptxArticle writing on excessive use of internet.pptx
Article writing on excessive use of internet.pptx
 
The Use of AI in Indonesia Election 2024: A Case Study
The Use of AI in Indonesia Election 2024: A Case StudyThe Use of AI in Indonesia Election 2024: A Case Study
The Use of AI in Indonesia Election 2024: A Case Study
 
The AI Powered Organization-Intro to AI-LAN.pdf
The AI Powered Organization-Intro to AI-LAN.pdfThe AI Powered Organization-Intro to AI-LAN.pdf
The AI Powered Organization-Intro to AI-LAN.pdf
 
ER(Entity Relationship) Diagram for online shopping - TAE
ER(Entity Relationship) Diagram for online shopping - TAEER(Entity Relationship) Diagram for online shopping - TAE
ER(Entity Relationship) Diagram for online shopping - TAE
 
一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理
一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理
一比一原版UTS毕业证悉尼科技大学毕业证成绩单如何办理
 
History+of+E-commerce+Development+in+China-www.cfye-commerce.shop
History+of+E-commerce+Development+in+China-www.cfye-commerce.shopHistory+of+E-commerce+Development+in+China-www.cfye-commerce.shop
History+of+E-commerce+Development+in+China-www.cfye-commerce.shop
 
The Best AI Powered Software - Intellivid AI Studio
The Best AI Powered Software - Intellivid AI StudioThe Best AI Powered Software - Intellivid AI Studio
The Best AI Powered Software - Intellivid AI Studio
 
How Do I Begin the Linksys Velop Setup Process?
How Do I Begin the Linksys Velop Setup Process?How Do I Begin the Linksys Velop Setup Process?
How Do I Begin the Linksys Velop Setup Process?
 
The+Prospects+of+E-Commerce+in+China.pptx
The+Prospects+of+E-Commerce+in+China.pptxThe+Prospects+of+E-Commerce+in+China.pptx
The+Prospects+of+E-Commerce+in+China.pptx
 
Pvtaan Social media marketing proposal.pdf
Pvtaan Social media marketing proposal.pdfPvtaan Social media marketing proposal.pdf
Pvtaan Social media marketing proposal.pdf
 
Multi-cluster Kubernetes Networking- Patterns, Projects and Guidelines
Multi-cluster Kubernetes Networking- Patterns, Projects and GuidelinesMulti-cluster Kubernetes Networking- Patterns, Projects and Guidelines
Multi-cluster Kubernetes Networking- Patterns, Projects and Guidelines
 
How to Use Contact Form 7 Like a Pro.pptx
How to Use Contact Form 7 Like a Pro.pptxHow to Use Contact Form 7 Like a Pro.pptx
How to Use Contact Form 7 Like a Pro.pptx
 

openconfigd

  • 1.
  • 2. 2
  • 3. 3
  • 4. 4
  • 5. 5
  • 6. 6
  • 7. 7 const ( QUAGGAD_MODULE = "quaggad" QUAGGAD_PORT = 2699 ) func grpcRegisterModule(conn *grpc.ClientConn) error { client := rpc.NewRegisterClient(conn) request := &rpc.RegisterModuleRequest{ Module: QUAGGAD_MODULE, Port: fmt.Sprintf("%d", QUAGGAD_PORT), } _, err := client.DoRegisterModule(context.Background(), request) if err != nil { return err } return nil }
  • 8. 8 var showCmdMap = map[string]func(string) *string{ "quagga_show": quaggaShow, } func quaggaShow(line string) *string { return quaggaVtysh(line) } func grpcRegisterCommands(conn *grpc.ClientConn) { client := rpc.NewRegisterClient(conn) var showCommands []rpc.RegisterRequest json.Unmarshal([]byte(showCmdSpec), &showCommands) showParser = cmd.NewParser() for _, command := range showCommands { command.Module = QUAGGAD_MODULE command.Privilege = 1 command.Code = rpc.ExecCode_REDIRECT_SHOW _, err := client.DoRegister(context.Background(), &command) if err != nil { grpclog.Fatalf("client DoRegister failed: %v", err) } showParser.InstallLine(command.Line, showCmdMap[command.Name]) } const showCmdSpec = ` [ { "name": "quagga_show", "line": "show running-config", "mode": "exec", "helps": [ "Show running system information", "running configuration" ] }, { ...
  • 9. 9 func (s *grpcShowServer) Show(request *rpc.ShowRequest, stream rpc.Show_ShowServer) error { reply := &rpc.ShowReply{} _, fn, _, _ := showParser.ParseLine(request.Line) show := fn.(func(string) *string) out := show(request.Line) lines := strings.Split(*out, "n") for _, line := range lines { reply.Str = fmt.Sprintln(line) err := stream.Send(reply) if err != nil { fmt.Println(err) break } } return nil }
  • 10. 10
  • 11. 11
  • 12. 12 func grpcSubscribe(conn *grpc.ClientConn) (rpc.Config_DoConfigClient, error) { client := rpc.NewConfigClient(conn) stream, err := client.DoConfig(context.Background()) if err != nil { return nil, err } path := []string{"interfaces", "protocols", "policy"} request := &rpc.ConfigRequest{ Type: rpc.ConfigType_SUBSCRIBE_MULTI, Module: QUAGGAD_MODULE, Port: QUAGGAD_PORT, Path: path, } err = stream.Send(request) if err != nil { return nil, err } return stream, err }
  • 13. 13 func grpcLoop() { ... for { conf, err := stream.Recv() ... switch conf.Type { case rpc.ConfigType_VALIDATE_START: validating = true quaggaConfigStateSync() case rpc.ConfigType_VALIDATE_END: request := &rpc.ConfigRequest{} if quaggaConfigValid(f) { request.Type = rpc.ConfigType_VALIDATE_SUCCESS } else { request.Type = rpc.ConfigType_VALIDATE_FAILED } err := stream.Send(request) validating = false case rpc.ConfigType_COMMIT_START: case rpc.ConfigType_COMMIT_END: case rpc.ConfigType_SET, rpc.ConfigType_DELETE: quaggaConfig(int(conf.Type), conf.Path) default: } }
  • 14. 14 func quaggaInterfacesInterfaceIpv4OspfAuthenticationMd5KeyId(Cmd int, Args cmd.Args) int { //interfaces interface WORD ipv4 ospf authentication md5 key-id WORD switch Cmd { case cmd.Set: case cmd.Delete: } return cmd.Success } func initConfig() { configParser = cmd.NewParser() configParser.InstallCmd( []string{"interfaces", "interface", "WORD", "ipv4", "ospf", "authentication", quaggaInterfacesInterfaceIpv4OspfAuthenticationMd5KeyId) ... func quaggaConfig(command int, path []string) { switch command { case cmd.Set: fmt.Println("[cmd] add", path) case cmd.Delete: fmt.Println("[cmd] del", path) } if !validating { ret, fn, args, _ := configParser.ParseCmd(path) if ret == cmd.ParseSuccess { fn.(func(int, cmd.Args) int)(command, args) } } quaggaConfigStateUpdate(command, path) }