spm._pike
Go to the documentation of this file.
1 /*0*/
2 inherit Service.Service;
3 class spm {
4 public:
5 
6 void call_service(object user, mixed args, void|int id)
7 {
8 
9 }
10 
11 void install_spm(object spmModule, string pname)
12 {
13  object fp = connection->send_cmd(0, "get_module", "filepath:tree");
14  object packages = fp->path_to_object("/packages");
15  werror("Updating %O\n", pname);
16  if ( objectp(packages) ) {
17  // tarfs
18  object tfs = Filesystem.Tar("spms/"+pname);
19  if ( !objectp(tfs) ) {
20  werror(": " + pname + " not a valid SPM !\n");
21  return;
22  }
23  mixed xml = tfs->open("package.xml", "r");
24  string packageXML = xml->read();
25  xml->close();
26  mapping config =spmModule->spm_check_configuration(packageXML);
27  werror("CONFIG = %O\n", config);
28  mapping pmod = connection->send_cmd(0, "get_module", config->name);
29  if ( !objectp(pmod) )
30  pmod = connection->send_cmd(0, "get_module", "package:"+config->name);
31  if ( objectp(pmod) ) {
32  if ( spmModule->spm_version_value(config->version) <= spmModule->spm_version_value(pmod->get_version()) ) {
33  werror("Found installed module with version %O, skipping installation !\n", pmod->get_version());
34  return;
35  }
36  else {
37  werror("Found installed module - updating to %O (previous version %O)\n",
38  config->version, pmod->get_version());
39  }
40  }
41  else {
42  werror("Module " + config->name + " not found on server - installing\n");
43  }
44 
45  Stdio.File file = Stdio.File("spms/"+pname, "r");
46  object package = packages->get_object_byname(pname);
47  if ( !objectp(package) ) {
48  object docfactory = connection->get_variable("Document.factory");
49  package = docfactory->execute( (["name": pname, ]));
50  package->move(packages);
51  }
52  string spmContent = file->read();
53  package->set_content(spmContent);
54  string spmRealContent = package->get_content();
55  werror("Content Length: %d and %d\n", strlen(spmContent), strlen(spmRealContent));
56  for ( int i = 0; i < strlen(spmContent); i++ ) {
57  if ( spmContent[i] != spmRealContent[i] ) {
58  werror("SPM Differs in byte %d\n 100 bytes:\n%O\n------\n%O\n",
59  i, spmContent[i-50..i+50], spmRealContent[i-50..i+50]);
60  error("SPM Differ!");
61  }
62  }
63  spmModule->install_spm(package, fp->path_to_object("/"));
64  return;
65  }
66  error("Failed to install - no /packages found on server");
67 }
68 
69 protected:
70  void check_spms()
71 {
72  call_out(check_spms, 86400); // once a day ought to be enough!
73  object _spm = connection->send_cmd( 0, "get_module", "SPM" );
74  if ( !objectp(_spm) )
75  werror("Failed to find SPM Module !\n");
76  array directory = get_dir("spms");
77  directory = sort(directory);
78  foreach ( directory, string file ) {
79  werror("file = %O\n", file);
80  if ( sscanf(file, "%*s.spm") ) {
81  mixed err = catch ( install_spm(_spm, file) );
82  if ( err )
83  werror( "Error while installing %s : %O\n%O", file, err[0], err[1] );
84  }
85  }
86 }
87 
88 public:
89 
90 protected:
91  void run()
92 {
93  werror("cwd = " + getcwd() + "\n");
94  check_spms();
95 }
96 
97 public:
98 
99 private:
100  private void got_kill(int sig) {
101  _exit(1);
102 }
103 
104 public:
105 
106 int main(int argc, array argv)
107 {
108  signal(signum("QUIT"), got_kill);
109  init( "spm", argv );
110  start();
111  return -17;
112 }
113 
114 
115 };