Skip to content

Instantly share code, notes, and snippets.

@ethercflow
Last active January 9, 2020 05:22
Show Gist options
  • Save ethercflow/a1a804f1c280c1c7166af9a676093fa7 to your computer and use it in GitHub Desktop.
Save ethercflow/a1a804f1c280c1c7166af9a676093fa7 to your computer and use it in GitHub Desktop.
package main
import (
"context"
"flag"
"log"
"strings"
"time"
pb "github.com/ethercflow/injuredfs/pb"
"github.com/golang/protobuf/ptypes/empty"
"google.golang.org/grpc"
)
var (
addr = flag.String("addr", ":65534", "The address to bind to")
mountpoint = flag.String("mountpoint", "", "MOUNTPOINT")
it = flag.Int("it", 1, "inject type")
methods = flag.String("methods", "", "methods to inject")
errno = flag.Uint("errno", 0, "errno")
random = flag.Bool("random", false, "random")
pct = flag.Uint("pct", 100, "pct")
path = flag.String("path", "", "path")
delay = flag.Uint("delay", 0, "delay (microseconds)")
)
func main() {
flag.Parse()
// Set up a connection to the server.
conn, err := grpc.Dial(*addr, grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewInjureClient(conn)
ctx, cancel := context.WithTimeout(context.Background(), 5 * time.Second)
defer cancel()
ms, err := c.Methods(ctx, &empty.Empty{})
if err != nil {
log.Fatalf("RPC Methods failed: %v", err)
} else {
log.Println("Vaild methods: ", ms.Methods)
}
switch *it {
case 1: // inject all
req := &pb.Request{Methods:[]string{}, Errno: uint32(*errno), Random: *random, Pct: uint32(*pct), Path: *path, Delay: uint32(*delay)}
if _, err := c.SetFaultAll(ctx, req); err != nil {
log.Fatalf("Set fault failed: %v", err)
}
case 2: // inject methods
req := &pb.Request{Methods:strings.Split(*methods, ","), Errno: uint32(*errno), Random: *random, Pct: uint32(*pct), Path: *path, Delay: uint32(*delay)}
if _, err := c.SetFault(ctx, req); err != nil {
log.Fatalf("Set fault failed: %v", err)
}
case 3: // recover all
if _, err := c.RecoverAll(ctx, &empty.Empty{}); err != nil {
log.Fatalf("Set fault failed: %v", err)
}
case 4: // recover methods
req := &pb.Request{Methods:strings.Split(*methods, ","), Path: *path}
if _, err := c.RecoverMethod(ctx, req); err != nil {
log.Fatalf("Set fault failed: %v", err)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment