diff options
Diffstat (limited to 'cmd/unstickocr')
| -rw-r--r-- | cmd/unstickocr/main.go | 114 | 
1 files changed, 114 insertions, 0 deletions
| diff --git a/cmd/unstickocr/main.go b/cmd/unstickocr/main.go new file mode 100644 index 0000000..27f3c0d --- /dev/null +++ b/cmd/unstickocr/main.go @@ -0,0 +1,114 @@ +package main + +import ( +	"flag" +	"fmt" +	"log" +	"os" +	"time" + +	"rescribe.xyz/bookpipeline" +) + +const usage = `Usage: unstickocr [-v] bookname + +unstickocr deletes a book from the OCR queue and adds it to the +Analyse queue. + +This should be done automatically by the bookpipeline tool once +the OCR job has completed, but sometimes it isn't, because of a +nasty bug. Once that bug is squashed, this tool can be deleted. +` + +// null writer to enable non-verbose logging to be discarded +type NullWriter bool + +func (w NullWriter) Write(p []byte) (n int, err error) { +	return len(p), nil +} + +type UnstickPipeliner interface { +	Init() error +	CheckQueue(url string, timeout int64) (bookpipeline.Qmsg, error) +	AddToQueue(url string, msg string) error +	DelFromQueue(url string, handle string) error +	OCRQueueId() string +	AnalyseQueueId() string +} + +func main() { +	verbose := flag.Bool("v", false, "verbose") +	flag.Usage = func() { +		fmt.Fprintf(flag.CommandLine.Output(), usage) +		flag.PrintDefaults() +	} +	flag.Parse() + +	if flag.NArg() != 1 { +		flag.Usage() +		return +	} + +	var verboselog *log.Logger +	if *verbose { +		verboselog = log.New(os.Stdout, "", 0) +	} else { +		var n NullWriter +		verboselog = log.New(n, "", 0) +	} + +	var conn UnstickPipeliner +	conn = &bookpipeline.AwsConn{Region: "eu-west-2", Logger: verboselog} + +	err := conn.Init() +	if err != nil { +		log.Fatalln("Error setting up cloud connection:", err) +	} + +	book := flag.Arg(0) +	done := false + +	for a := 0; a < 5; a++ { +		for i := 0; i < 10; i++ { +			verboselog.Println("Checking OCR queue for", book) +			msg, err := conn.CheckQueue(conn.OCRQueueId(), 10) +			if err != nil { +				log.Fatalln("Error checking OCR queue:", err) +				continue +			} +			if msg.Handle == "" { +				verboselog.Println("No message received on OCR queue") +				continue +			} +			if msg.Body != book { +				verboselog.Println("Message received on OCR queue is not the one we're", +					"looking for, so will try again - found", msg.Body) +				continue +			} +			err = conn.DelFromQueue(conn.OCRQueueId(), msg.Handle) +			if err != nil { +				log.Fatalln("Error deleting message from OCR queue:", err) +			} +			err = conn.AddToQueue(conn.AnalyseQueueId(), book) +			if err != nil { +				log.Fatalln("Error adding message to Analyse queue:", err) +			} +			done = true +			break +		} +		if done == true { +			break +		} +		log.Println("No message found yet, sleeping for 30 seconds to try again") +		time.Sleep(30 * time.Minute) +	} + +	if done == true { +		fmt.Println("Succeeded moving message from OCR queue to Analyse queue.") +	} else { +		log.Fatalln("Failed to find message", book, "on OCR queue; is it still being processed?", +			"It can only be discovered and processed by this tool when it is available.", +			"Try shutting down any instance that is using it, waiting a few minutes,", +			"and rerunning this tool.") +	} +} | 
