Skip to content

Instantly share code, notes, and snippets.

@wkharold
Last active August 29, 2015 13:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wkharold/9879103 to your computer and use it in GitHub Desktop.
Save wkharold/9879103 to your computer and use it in GitHub Desktop.
/*** clone.go ***/
type clonefile struct {
srv.File
}
// Write handles writes to the clone file by attempting to parse the data being
// written into a job definition and if successful adding the corresponding job
// to the jobs directory.
func (k *clonefile) Write(fid *srv.FFid, data []byte, offset uint64) (int, error) {
glog.V(4).Infof("Entering clonefile.Write(%v, %v, %v)", fid, data, offset)
defer glog.V(4).Infof("Exiting clonefile.Write(%v, %v, %v)", fid, data, offset)
k.Lock()
defer k.Unlock()
glog.V(3).Infof("Create a new job from: %s", string(data))
jdparts := strings.Split(string(data), ":")
if len(jdparts) != 3 {
return 0, fmt.Errorf("invalid job definition: %s", string(data))
}
jd, err := mkJobDefinition(jdparts[0], jdparts[1], jdparts[2])
if err != nil {
return 0, err
}
if err := jobsroot.addJob(*jd); err != nil {
return len(data), err
}
db, err := os.OpenFile(jobsdb, os.O_WRONLY|os.O_APPEND, 0755)
if err != nil {
return len(data), err
}
fmt.Fprintf(db, "%s\n", string(data))
db.Close()
return len(data), nil
}
/*** jobs.go ***/
type jobsdir struct {
srv.File
user p.User
}
// addJob uses mkJob to create a new job subtree for the given job definition and adds it to
// the jobd name space under the jobs directory.
func (jd *jobsdir) addJob(def jobdef) error {
glog.V(4).Infof("Entering jobsdir.addJob(%s)", def)
defer glog.V(4).Infof("Leaving jobsdir.addJob(%s)", def)
glog.V(3).Info("Add job: ", def)
job, err := mkJob(&jd.File, jd.user, def)
if err != nil {
return err
}
if err := job.Add(&jd.File, def.name, jd.user, nil, p.DMDIR|0555, job); err != nil {
glog.Errorf("Can't add job %s to jobs directory", def.name)
return err
}
return nil
}
/*** job.go ***/
type jobdef struct {
name string
schedule string
cmd string
state string
}
// mkJobDefinition examines the components of a job definition it is given and
// returns a new jobdef struct containing them if they are valid.
func mkJobDefinition(name, schedule, cmd string) (*jobdef, error) {
if ok, err := regexp.MatchString("[^[:word:]]", name); ok || err != nil {
switch {
case ok:
return nil, fmt.Errorf("invalid job name: %s", name)
default:
return nil, err
}
}
if _, err := cronexpr.Parse(schedule); err != nil {
return nil, err
}
return &jobdef{name, schedule, cmd, STOPPED}, nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment