Last active
August 29, 2015 13:57
-
-
Save wkharold/9879103 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*** 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