github.com/divan/go-ethereum@v1.8.14-0.20180820134928-1de9ada4016d/cmd/swarm/mru.go (about) 1 // Copyright 2016 The go-ethereum Authors 2 // This file is part of go-ethereum. 3 // 4 // go-ethereum is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // go-ethereum is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. 16 17 // Command resource allows the user to create and update signed mutable resource updates 18 package main 19 20 import ( 21 "fmt" 22 "strconv" 23 "strings" 24 25 "github.com/ethereum/go-ethereum/common/hexutil" 26 27 "github.com/ethereum/go-ethereum/cmd/utils" 28 swarm "github.com/ethereum/go-ethereum/swarm/api/client" 29 "github.com/ethereum/go-ethereum/swarm/storage/mru" 30 "gopkg.in/urfave/cli.v1" 31 ) 32 33 func NewGenericSigner(ctx *cli.Context) mru.Signer { 34 return mru.NewGenericSigner(getPrivKey(ctx)) 35 } 36 37 // swarm resource create <frequency> [--name <name>] [--data <0x Hexdata> [--multihash=false]] 38 // swarm resource update <Manifest Address or ENS domain> <0x Hexdata> [--multihash=false] 39 // swarm resource info <Manifest Address or ENS domain> 40 41 func resourceCreate(ctx *cli.Context) { 42 args := ctx.Args() 43 44 var ( 45 bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") 46 client = swarm.NewClient(bzzapi) 47 multihash = ctx.Bool(SwarmResourceMultihashFlag.Name) 48 initialData = ctx.String(SwarmResourceDataOnCreateFlag.Name) 49 name = ctx.String(SwarmResourceNameFlag.Name) 50 ) 51 52 if len(args) < 1 { 53 fmt.Println("Incorrect number of arguments") 54 cli.ShowCommandHelpAndExit(ctx, "create", 1) 55 return 56 } 57 signer := NewGenericSigner(ctx) 58 frequency, err := strconv.ParseUint(args[0], 10, 64) 59 if err != nil { 60 fmt.Printf("Frequency formatting error: %s\n", err.Error()) 61 cli.ShowCommandHelpAndExit(ctx, "create", 1) 62 return 63 } 64 65 metadata := mru.ResourceMetadata{ 66 Name: name, 67 Frequency: frequency, 68 Owner: signer.Address(), 69 } 70 71 var newResourceRequest *mru.Request 72 if initialData != "" { 73 initialDataBytes, err := hexutil.Decode(initialData) 74 if err != nil { 75 fmt.Printf("Error parsing data: %s\n", err.Error()) 76 cli.ShowCommandHelpAndExit(ctx, "create", 1) 77 return 78 } 79 newResourceRequest, err = mru.NewCreateUpdateRequest(&metadata) 80 if err != nil { 81 utils.Fatalf("Error creating new resource request: %s", err) 82 } 83 newResourceRequest.SetData(initialDataBytes, multihash) 84 if err = newResourceRequest.Sign(signer); err != nil { 85 utils.Fatalf("Error signing resource update: %s", err.Error()) 86 } 87 } else { 88 newResourceRequest, err = mru.NewCreateRequest(&metadata) 89 if err != nil { 90 utils.Fatalf("Error creating new resource request: %s", err) 91 } 92 } 93 94 manifestAddress, err := client.CreateResource(newResourceRequest) 95 if err != nil { 96 utils.Fatalf("Error creating resource: %s", err.Error()) 97 return 98 } 99 fmt.Println(manifestAddress) // output manifest address to the user in a single line (useful for other commands to pick up) 100 101 } 102 103 func resourceUpdate(ctx *cli.Context) { 104 args := ctx.Args() 105 106 var ( 107 bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") 108 client = swarm.NewClient(bzzapi) 109 multihash = ctx.Bool(SwarmResourceMultihashFlag.Name) 110 ) 111 112 if len(args) < 2 { 113 fmt.Println("Incorrect number of arguments") 114 cli.ShowCommandHelpAndExit(ctx, "update", 1) 115 return 116 } 117 signer := NewGenericSigner(ctx) 118 manifestAddressOrDomain := args[0] 119 data, err := hexutil.Decode(args[1]) 120 if err != nil { 121 utils.Fatalf("Error parsing data: %s", err.Error()) 122 return 123 } 124 125 // Retrieve resource status and metadata out of the manifest 126 updateRequest, err := client.GetResourceMetadata(manifestAddressOrDomain) 127 if err != nil { 128 utils.Fatalf("Error retrieving resource status: %s", err.Error()) 129 } 130 131 // set the new data 132 updateRequest.SetData(data, multihash) 133 134 // sign update 135 if err = updateRequest.Sign(signer); err != nil { 136 utils.Fatalf("Error signing resource update: %s", err.Error()) 137 } 138 139 // post update 140 err = client.UpdateResource(updateRequest) 141 if err != nil { 142 utils.Fatalf("Error updating resource: %s", err.Error()) 143 return 144 } 145 } 146 147 func resourceInfo(ctx *cli.Context) { 148 var ( 149 bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") 150 client = swarm.NewClient(bzzapi) 151 ) 152 args := ctx.Args() 153 if len(args) < 1 { 154 fmt.Println("Incorrect number of arguments.") 155 cli.ShowCommandHelpAndExit(ctx, "info", 1) 156 return 157 } 158 manifestAddressOrDomain := args[0] 159 metadata, err := client.GetResourceMetadata(manifestAddressOrDomain) 160 if err != nil { 161 utils.Fatalf("Error retrieving resource metadata: %s", err.Error()) 162 return 163 } 164 encodedMetadata, err := metadata.MarshalJSON() 165 if err != nil { 166 utils.Fatalf("Error encoding metadata to JSON for display:%s", err) 167 } 168 fmt.Println(string(encodedMetadata)) 169 }