вторник, 24 августа 2021 г.

oracle

 ---

# tasks file for cfg_oracle


- name: check os support

  fail: msg="UNSUPPORTED OS"

  when: not

        (( ansible_distribution             == "OracleLinux" or

        ansible_distribution                == "RedHat" or 

        ansible_distribution                == "CentOS" ) and 

        (ansible_distribution_major_version  == "7" or

        ansible_distribution_major_version  == "6")  and

        ansible_userspace_bits              == "64")


#- name: Debug exit check point

#  fail:


- name: Disabling firewalld

  service: name=firewalld state=stopped enabled=no


- name: Disabling selinux

  selinux: state=disabled


- name: Installing chrony

  yum: name=chrony state=present


- name: Stopping chrony

  service: name=chronyd state=stopped enabled=yes


- name: Creating minimal /etc/chrony.conf

  copy:

    src: chrony.conf

    dest: /etc

  when: ansible_distribution == "RedHat" or ansible_distribution == "CentOS"


- name: Starting chrony

  service: name=chronyd state=started enabled=yes


- name: Getting memory size

  shell: free -b | sed -n '2p' | cut -d ' ' -f 5

  register: mem


- name: Calculating KERNEL_SHMALL KERNEL_SHMMAX

  set_fact:

      KERNEL_SHMMAX: "{{ (mem.stdout|int / 2) |int }}"

      KERNEL_SHMALL: "{{ (mem.stdout|int / 2 / 4096) |int }}"


- name: Setting kernel values KERNEL_SHMALL, KERNEL_SHMMAX in /etc/sysctl.d/90-oracle.conf

  template:

    src=../templates/90-oracle.sysctl.conf.j2

    dest=/etc/sysctl.d/90-oracle.conf


- name: Applying kernel settings

  shell: sysctl -p -q



- name: Calculating SHMFS_SIZE

  set_fact:

    SHMFS_SIZE: "{{ (mem.stdout|int *9/10/1024/1024/1024) |int }}"


- name: Mounting shmfs

  mount:

    path: /dev/shm

    src: none

    fstype: tmpfs

    opts: size={{SHMFS_SIZE}}g

    state: mounted



- name: Creating group dba

  group: name=dba state=present gid=103


- name: Creating group oinstall

  group: name=oinstall state=present gid=104


- name: Creating group oper

  group: name=oper state=present gid=105


- name: Adding user oracle

  user: name=oracle groups=dba,oinstall,oper uid=103



- name: Getting root VG name

  shell: df /|tail -1|awk -F [/-] '{print $4}'

  register: root_vg


#- debug: msg={{root_vg}}


- name: Creating /db (30gb)

  lvol:

    vg: "{{root_vg.stdout}}"

    lv: db

    size: 30g

  when: root_vg.stdout != ""


- name: Creating directory /db

  file: path=/db state=directory


- name: Mounting /dev/{{root_vg.stdout}}/db to /db (checking that /dev/{{root_vg.stdout}}/db formated and valid and doesn't need to be formated)

  mount:

    path: /db

    src: /dev/{{root_vg.stdout}}/db

    fstype: ext4

    state: mounted

  ignore_errors: true


- name: Checking if /db is mounted

  shell: mount|grep /db

  register: is_db_mounted

  ignore_errors: true

  

#- debug: msg={{is_db_mounted}}

#- fail:


- name: Formating /dev/{{root_vg.stdout}}/db with mkfs.ext4

  shell: mkfs.ext4 /dev/{{root_vg.stdout}}/db

  when: is_db_mounted.rc != 0


- name: Mounting /dev/{{root_vg.stdout}}/db to /db

  mount:

    path: /db

    src: /dev/{{root_vg.stdout}}/db

    fstype: ext4

    state: mounted


- name: Setting permissions to oracle:dba on /db

  file: path=/db owner=oracle group=dba


- name: Creating /etc/oratab with owner oracle:dba

  file: path={{item}} owner=oracle group=dba state=touch

  with_items:

  - /etc/oratab

  - /etc/oraInst.loc


- name: Calculating memlock limit

  set_fact:

      memlock: "{{ (mem.stdout|int * 9 / 10240) |int }}"


- name: Generating /etc/security/limits.d/90-oracle.conf

  template:

    src=../templates/90-oracle-limits.conf.j2

    dest=/etc/security/limits.d/90-oracle.conf



- name: Copying default /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf to /etc

  shell: cp /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf /etc


- name: Enabling mpathconf

  shell: mpathconf --enable


- name: Enabling multipathd

  service: name=multipathd state=started enabled=yes


- name: Copying /etc/rc.d/rc.local

  copy: src=rc.local dest=/etc/rc.d mode=0755


- name: Setting relayhost in /etc/postfix/main.cf

  lineinfile:

    path: /etc/postfix/main.cf

    line: 'relayhost = [mxsmtp.homecredit.ru]'


- name: Enabling postfix

  service: name=postfix state=started enabled=yes


- name: Installing Oracle dependencies

  yum: name={{ item }} state=present

  with_items: "{{ DEP_PKG }}"


- name: Copying /etc/fonts/local.conf

  copy: src=local.conf dest=/etc/fonts/local.conf mode=0644


вторник, 31 марта 2020 г.

npm nodejs8

#!/usr/bin/env bash

{ # this ensures the entire script is downloaded #

nvm_has() {
  type "$1" > /dev/null 2>&1
}

nvm_install_dir() {
  command printf %s "${NVM_DIR:-"$HOME/.nvm"}"
}

nvm_latest_version() {
  echo "v0.33.11"
}

nvm_profile_is_bash_or_zsh() {
  local TEST_PROFILE
  TEST_PROFILE="${1-}"
  case "${TEST_PROFILE-}" in
    *"/.bashrc" | *"/.bash_profile" | *"/.zshrc")
      return
    ;;
    *)
      return 1
    ;;
  esac
}

#
# Outputs the location to NVM depending on:
# * The availability of $NVM_SOURCE
# * The method used ("script" or "git" in the script, defaults to "git")
# NVM_SOURCE always takes precedence unless the method is "script-nvm-exec"
#
nvm_source() {
  local NVM_METHOD
  NVM_METHOD="$1"
  local NVM_SOURCE_URL
  NVM_SOURCE_URL="$NVM_SOURCE"
  if [ "_$NVM_METHOD" = "_script-nvm-exec" ]; then
    NVM_SOURCE_URL="https://raw.githubusercontent.com/creationix/nvm/$(nvm_latest_version)/nvm-exec"
  elif [ "_$NVM_METHOD" = "_script-nvm-bash-completion" ]; then
    NVM_SOURCE_URL="https://raw.githubusercontent.com/creationix/nvm/$(nvm_latest_version)/bash_completion"
  elif [ -z "$NVM_SOURCE_URL" ]; then
    if [ "_$NVM_METHOD" = "_script" ]; then
      NVM_SOURCE_URL="https://raw.githubusercontent.com/creationix/nvm/$(nvm_latest_version)/nvm.sh"
    elif [ "_$NVM_METHOD" = "_git" ] || [ -z "$NVM_METHOD" ]; then
      NVM_SOURCE_URL="https://github.com/creationix/nvm.git"
    else
      echo >&2 "Unexpected value \"$NVM_METHOD\" for \$NVM_METHOD"
      return 1
    fi
  fi
  echo "$NVM_SOURCE_URL"
}

#
# Node.js version to install
#
nvm_node_version() {
  echo "$NODE_VERSION"
}

nvm_download() {
  if nvm_has "curl"; then
    curl --compressed -q "$@"
  elif nvm_has "wget"; then
    # Emulate curl with wget
    ARGS=$(echo "$*" | command sed -e 's/--progress-bar /--progress=bar /' \
                            -e 's/-L //' \
                            -e 's/--compressed //' \
                            -e 's/-I /--server-response /' \
                            -e 's/-s /-q /' \
                            -e 's/-o /-O /' \
                            -e 's/-C - /-c /')
    # shellcheck disable=SC2086
    eval wget $ARGS
  fi
}

install_nvm_from_git() {
  local INSTALL_DIR
  INSTALL_DIR="$(nvm_install_dir)"

  if [ -d "$INSTALL_DIR/.git" ]; then
    echo "=> nvm is already installed in $INSTALL_DIR, trying to update using git"
    command printf '\r=> '
    command git --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" fetch origin tag "$(nvm_latest_version)" --depth=1 2> /dev/null || {
      echo >&2 "Failed to update nvm, run 'git fetch' in $INSTALL_DIR yourself."
      exit 1
    }
  else
    # Cloning to $INSTALL_DIR
    echo "=> Downloading nvm from git to '$INSTALL_DIR'"
    command printf '\r=> '
    mkdir -p "${INSTALL_DIR}"
    if [ "$(ls -A "${INSTALL_DIR}")" ]; then
      command git init "${INSTALL_DIR}" || {
        echo >&2 'Failed to initialize nvm repo. Please report this!'
        exit 2
      }
      command git --git-dir="${INSTALL_DIR}/.git" remote add origin "$(nvm_source)" 2> /dev/null \
        || command git --git-dir="${INSTALL_DIR}/.git" remote set-url origin "$(nvm_source)" || {
        echo >&2 'Failed to add remote "origin" (or set the URL). Please report this!'
        exit 2
      }
      command git --git-dir="${INSTALL_DIR}/.git" fetch origin tag "$(nvm_latest_version)" --depth=1 || {
        echo >&2 'Failed to fetch origin with tags. Please report this!'
        exit 2
      }
    else
      command git -c advice.detachedHead=false clone "$(nvm_source)" -b "$(nvm_latest_version)" --depth=1 "${INSTALL_DIR}" || {
        echo >&2 'Failed to clone nvm repo. Please report this!'
        exit 2
      }
    fi
  fi
  command git -c advice.detachedHead=false --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" checkout -f --quiet "$(nvm_latest_version)"
  if [ ! -z "$(command git --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" show-ref refs/heads/master)" ]; then
    if command git --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" branch --quiet 2>/dev/null; then
      command git --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" branch --quiet -D master >/dev/null 2>&1
    else
      echo >&2 "Your version of git is out of date. Please update it!"
      command git --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" branch -D master >/dev/null 2>&1
    fi
  fi

  echo "=> Compressing and cleaning up git repository"
  if ! command git --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" reflog expire --expire=now --all; then
    echo >&2 "Your version of git is out of date. Please update it!"
  fi
  if ! command git --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" gc --auto --aggressive --prune=now ; then
    echo >&2 "Your version of git is out of date. Please update it!"
  fi
  return
}

#
# Automatically install Node.js
#
nvm_install_node() {
  local NODE_VERSION_LOCAL
  NODE_VERSION_LOCAL="$(nvm_node_version)"

  if [ -z "$NODE_VERSION_LOCAL" ]; then
    return 0
  fi

  echo "=> Installing Node.js version $NODE_VERSION_LOCAL"
  nvm install "$NODE_VERSION_LOCAL"
  local CURRENT_NVM_NODE

  CURRENT_NVM_NODE="$(nvm_version current)"
  if [ "$(nvm_version "$NODE_VERSION_LOCAL")" == "$CURRENT_NVM_NODE" ]; then
    echo "=> Node.js version $NODE_VERSION_LOCAL has been successfully installed"
  else
    echo >&2 "Failed to install Node.js $NODE_VERSION_LOCAL"
  fi
}

install_nvm_as_script() {
  local INSTALL_DIR
  INSTALL_DIR="$(nvm_install_dir)"
  local NVM_SOURCE_LOCAL
  NVM_SOURCE_LOCAL="$(nvm_source script)"
  local NVM_EXEC_SOURCE
  NVM_EXEC_SOURCE="$(nvm_source script-nvm-exec)"
  local NVM_BASH_COMPLETION_SOURCE
  NVM_BASH_COMPLETION_SOURCE="$(nvm_source script-nvm-bash-completion)"

  # Downloading to $INSTALL_DIR
  mkdir -p "$INSTALL_DIR"
  if [ -f "$INSTALL_DIR/nvm.sh" ]; then
    echo "=> nvm is already installed in $INSTALL_DIR, trying to update the script"
  else
    echo "=> Downloading nvm as script to '$INSTALL_DIR'"
  fi
  nvm_download -s "$NVM_SOURCE_LOCAL" -o "$INSTALL_DIR/nvm.sh" || {
    echo >&2 "Failed to download '$NVM_SOURCE_LOCAL'"
    return 1
  } &
  nvm_download -s "$NVM_EXEC_SOURCE" -o "$INSTALL_DIR/nvm-exec" || {
    echo >&2 "Failed to download '$NVM_EXEC_SOURCE'"
    return 2
  } &
  nvm_download -s "$NVM_BASH_COMPLETION_SOURCE" -o "$INSTALL_DIR/bash_completion" || {
    echo >&2 "Failed to download '$NVM_BASH_COMPLETION_SOURCE'"
    return 2
  } &
  for job in $(jobs -p | command sort)
  do
    wait "$job" || return $?
  done
  chmod a+x "$INSTALL_DIR/nvm-exec" || {
    echo >&2 "Failed to mark '$INSTALL_DIR/nvm-exec' as executable"
    return 3
  }
}

nvm_try_profile() {
  if [ -z "${1-}" ] || [ ! -f "${1}" ]; then
    return 1
  fi
  echo "${1}"
}

#
# Detect profile file if not specified as environment variable
# (eg: PROFILE=~/.myprofile)
# The echo'ed path is guaranteed to be an existing file
# Otherwise, an empty string is returned
#
nvm_detect_profile() {
  if [ -n "${PROFILE}" ] && [ -f "${PROFILE}" ]; then
    echo "${PROFILE}"
    return
  fi

  local DETECTED_PROFILE
  DETECTED_PROFILE=''

  if [ -n "${BASH_VERSION-}" ]; then
    if [ -f "$HOME/.bashrc" ]; then
      DETECTED_PROFILE="$HOME/.bashrc"
    elif [ -f "$HOME/.bash_profile" ]; then
      DETECTED_PROFILE="$HOME/.bash_profile"
    fi
  elif [ -n "${ZSH_VERSION-}" ]; then
    DETECTED_PROFILE="$HOME/.zshrc"
  fi

  if [ -z "$DETECTED_PROFILE" ]; then
    for EACH_PROFILE in ".profile" ".bashrc" ".bash_profile" ".zshrc"
    do
      if DETECTED_PROFILE="$(nvm_try_profile "${HOME}/${EACH_PROFILE}")"; then
        break
      fi
    done
  fi

  if [ ! -z "$DETECTED_PROFILE" ]; then
    echo "$DETECTED_PROFILE"
  fi
}

#
# Check whether the user has any globally-installed npm modules in their system
# Node, and warn them if so.
#
nvm_check_global_modules() {
  command -v npm >/dev/null 2>&1 || return 0

  local NPM_VERSION
  NPM_VERSION="$(npm --version)"
  NPM_VERSION="${NPM_VERSION:--1}"
  [ "${NPM_VERSION%%[!-0-9]*}" -gt 0 ] || return 0

  local NPM_GLOBAL_MODULES
  NPM_GLOBAL_MODULES="$(
    npm list -g --depth=0 |
    command sed -e '/ npm@/d' -e '/ (empty)$/d'
  )"

  local MODULE_COUNT
  MODULE_COUNT="$(
    command printf %s\\n "$NPM_GLOBAL_MODULES" |
    command sed -ne '1!p' |                     # Remove the first line
    wc -l | command tr -d ' '                   # Count entries
  )"

  if [ "${MODULE_COUNT}" != '0' ]; then
    # shellcheck disable=SC2016
    echo '=> You currently have modules installed globally with `npm`. These will no'
    # shellcheck disable=SC2016
    echo '=> longer be linked to the active version of Node when you install a new node'
    # shellcheck disable=SC2016
    echo '=> with `nvm`; and they may (depending on how you construct your `$PATH`)'
    # shellcheck disable=SC2016
    echo '=> override the binaries of modules installed with `nvm`:'
    echo

    command printf %s\\n "$NPM_GLOBAL_MODULES"
    echo '=> If you wish to uninstall them at a later point (or re-install them under your'
    # shellcheck disable=SC2016
    echo '=> `nvm` Nodes), you can remove them from the system Node as follows:'
    echo
    echo '     $ nvm use system'
    echo '     $ npm uninstall -g a_module'
    echo
  fi
}

nvm_do_install() {
  if [ -n "${NVM_DIR-}" ] && ! [ -d "${NVM_DIR}" ]; then
    echo >&2 "You have \$NVM_DIR set to \"${NVM_DIR}\", but that directory does not exist. Check your profile files and environment."
    exit 1
  fi
  if [ -z "${METHOD}" ]; then
    # Autodetect install method
    if nvm_has git; then
      install_nvm_from_git
    elif nvm_has nvm_download; then
      install_nvm_as_script
    else
      echo >&2 'You need git, curl, or wget to install nvm'
      exit 1
    fi
  elif [ "${METHOD}" = 'git' ]; then
    if ! nvm_has git; then
      echo >&2 "You need git to install nvm"
      exit 1
    fi
    install_nvm_from_git
  elif [ "${METHOD}" = 'script' ]; then
    if ! nvm_has nvm_download; then
      echo >&2 "You need curl or wget to install nvm"
      exit 1
    fi
    install_nvm_as_script
  fi

  echo

  local NVM_PROFILE
  NVM_PROFILE="$(nvm_detect_profile)"
  local PROFILE_INSTALL_DIR
  PROFILE_INSTALL_DIR="$(nvm_install_dir | command sed "s:^$HOME:\$HOME:")"

  SOURCE_STR="\\nexport NVM_DIR=\"${PROFILE_INSTALL_DIR}\"\\n[ -s \"\$NVM_DIR/nvm.sh\" ] && \\. \"\$NVM_DIR/nvm.sh\"  # This loads nvm\\n"

  # shellcheck disable=SC2016
  COMPLETION_STR='[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion\n'
  BASH_OR_ZSH=false

  if [ -z "${NVM_PROFILE-}" ] ; then
    local TRIED_PROFILE
    if [ -n "${PROFILE}" ]; then
      TRIED_PROFILE="${NVM_PROFILE} (as defined in \$PROFILE), "
    fi
    echo "=> Profile not found. Tried ${TRIED_PROFILE-}~/.bashrc, ~/.bash_profile, ~/.zshrc, and ~/.profile."
    echo "=> Create one of them and run this script again"
    echo "   OR"
    echo "=> Append the following lines to the correct file yourself:"
    command printf "${SOURCE_STR}"
    echo
  else
    if nvm_profile_is_bash_or_zsh "${NVM_PROFILE-}"; then
      BASH_OR_ZSH=true
    fi
    if ! command grep -qc '/nvm.sh' "$NVM_PROFILE"; then
      echo "=> Appending nvm source string to $NVM_PROFILE"
      command printf "${SOURCE_STR}" >> "$NVM_PROFILE"
    else
      echo "=> nvm source string already in ${NVM_PROFILE}"
    fi
    # shellcheck disable=SC2016
    if ${BASH_OR_ZSH} && ! command grep -qc '$NVM_DIR/bash_completion' "$NVM_PROFILE"; then
      echo "=> Appending bash_completion source string to $NVM_PROFILE"
      command printf "$COMPLETION_STR" >> "$NVM_PROFILE"
    else
      echo "=> bash_completion source string already in ${NVM_PROFILE}"
    fi
  fi
  if ${BASH_OR_ZSH} && [ -z "${NVM_PROFILE-}" ] ; then
    echo "=> Please also append the following lines to the if you are using bash/zsh shell:"
    command printf "${COMPLETION_STR}"
  fi

  # Source nvm
  # shellcheck source=/dev/null
  \. "$(nvm_install_dir)/nvm.sh"

  nvm_check_global_modules

  nvm_install_node

  nvm_reset

  echo "=> Close and reopen your terminal to start using nvm or run the following to use it now:"
  command printf "${SOURCE_STR}"
  if ${BASH_OR_ZSH} ; then
    command printf "${COMPLETION_STR}"
  fi
}

#
# Unsets the various functions defined
# during the execution of the install script
#
nvm_reset() {
  unset -f nvm_has nvm_install_dir nvm_latest_version nvm_profile_is_bash_or_zsh \
    nvm_source nvm_node_version nvm_download install_nvm_from_git nvm_install_node \
    install_nvm_as_script nvm_try_profile nvm_detect_profile nvm_check_global_modules \
    nvm_do_install nvm_reset
}

[ "_$NVM_ENV" = "_testing" ] || nvm_do_install

} # this ensures the entire script is downloaded #

пятница, 14 апреля 2017 г.

ssmtp отправка почты с нескольких сайтов на одном хостинге

В примере используется почта для домена от Яндекса.
Для каждого пользователя (сайта) user1.tld и user2.tld настроена своя почта для домена.

Конфигураци SSMTP

Нужно создать несколько конфигов ssmtp для каждого VirtualHost

Конфигурация 1
nano /etc/ssmtp/ssmtp-user1.conf
root=mail@user1.tld
mailhub=smtp.yandex.ru:465
RewriteDomain=user1.tld
Hostname=mail@user1.tld
# Set this to never rewrite the "From:" line (unless not given) and to
# use that address in the "from line" of the envelope.
FromLineOverride=YES
AuthUser=mail@user1.tld
AuthPass=passwd
AuthMethod=LOGIN
UseTLS=YES
TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt
Debug=NO
Конфигурация 2
nano /etc/ssmtp/ssmtp-user2.conf
root=mail@user2.tld
mailhub=smtp.yandex.ru:465
RewriteDomain=user2.tld
Hostname=mail@user2.tld
# Set this to never rewrite the "From:" line (unless not given) and to
# use that address in the "from line" of the envelope.
FromLineOverride=YES
AuthUser=mail@user2.tld
AuthPass=passwd
AuthMethod=LOGIN
UseTLS=YES
TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt
Debug=NO

Вторая конфигурация SSMTP (Revaliases)
nano /etc/ssmtp/revaliases

root:mail@user1.tld:smtp.yandex.ru:465
root:mail@user2.tld:smtp.yandex.ru:465

Что бы письма были отправлены не от пользователя apache (www-data) изменим комментарий пользователю. 
Этот комментарий будет виден в имени отправителя.

chfn -f "Web Email" apache

Конфигурация APACHE 

Для каждой конфигурации сайта (VirtualHost) нужно указать конфигурацию ssmtp.

nano /etc/httpd/conf.d/user1.tld.conf

<VirtualHost *:8080>
ServerName user1.tld#****
</VirtualHost>
<Directory "/home/user1.tld/html">
php_admin_value sendmail_path "/usr/sbin/ssmtp -t -C/etc/ssmtp/ssmtp-user1.conf"
php_admin_value sendmail_from "mail@user1.tld"
#****
</Directory>

nano /etc/httpd/conf.d/user2.tld.conf

<VirtualHost *:8080>
ServerName user2.tld#****
</VirtualHost>
<Directory "/home/user2.tld/html">
php_admin_value sendmail_path "/usr/sbin/ssmtp -t -C/etc/ssmtp/ssmtp-user2.conf"
php_admin_value sendmail_from "mail@user2.tld"
#****
</Directory>

Перезапустить apache и проверить отправку писем
<?
mail('your@email.com', 'Test From Your-Site', 'Test Message from Sendmail by PHP');
?>

Настройка nginx+apache и нескольких VirtualHost


Конфигурация nginx


user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    gzip  on;
    include /etc/nginx/conf.d/*.conf;
}

Конфиг httpd

***
Include conf.d/*.conf
User apache
Group apache
***

Пользователи

Имя пользователя = имя домена

adduser user.tldmkdir /home/user.tld/html
mkdir /home/user.tld/log
chown user.tld /home/user.tld/ -R
chgrp apache /home/user.tld/ -R
chmod 755 /home/user.tld/ -R
sudo usermod -a -G apache user.tldpasswd user.tld
Аналогично создаем пользователя для поддомена, в данном случае sub.user.tld.

этот шаг можно пропустить, если поддомены будут у одного пользователя и создаваться динамически

VirtualHost в httpd


Домен
nano /etc/httpd/conf.d/user.tld
<VirtualHost *:8080>
ServerName user.tld
ServerAlias www.user.tld
ServerAdmin webmaster@user.tld
ErrorLog /home/user.tld/log/error.log
CustomLog /home/user.tld/log/access.log combined
DocumentRoot /home/user.tld/html/
</VirtualHost>
<Directory "/home/user.tld/html">
Order deny,allow
Allow from all
</Directory>
Поддомен (этот шаг тоже пропускаем, если нужны динамические поддомены
в папке основного пользователя)
nano /etc/httpd/conf.d/sub.user.tld
<VirtualHost *:8080>
ServerName sub.user.tld
ServerAlias www.sub.user.tld
ServerAdmin webmaster@user.tld
ErrorLog /home/user.tld/log/error.log
CustomLog /home/user.tld/log/access.log combined
DocumentRoot /home/user.tld/html/sub/
</VirtualHost>
<Directory "/home/user.tld/html/sub/">
Order allow,deny
Allow from all
</Directory>

Домен + поддомен в NGINX

#Домен
server {
    listen       *:80;
    server_name user.tld www.user.tld; ## localhost;
    charset utf8;
    access_log /home/user.tldlog/access.log main;
    location / {
        proxy_pass http://user.tld:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_connect_timeout 120;
        proxy_send_timeout 120;
        proxy_read_timeout 180;
    }
    location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt)$ {
        root /home/user.tld/html/;
        access_log off;
        expires 30d;
    }
error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ /\.ht {
        deny  all;
    }
}

#Поддомен
server {
        listen *:80;
        server_name sub.user.tld www.sub.user.tld;
    location / {
       ## index  index.php index.html index.htm;
        proxy_pass http://sub.user.tld:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_connect_timeout 120;
        proxy_send_timeout 120;
        proxy_read_timeout 180;
    }
    location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt)$ {
        root /home/sub.user.tld/html/;
        access_log off;
        expires 30d;
    }
}


Для динамических поддоменов (в этом случае апач будет искать поддомен в user.tld/sites/)
т.е. в апаче не нужно создавать VirtualHost, но и владелец всех поддоменов будет user.tld
server {
    server_name   ~^(?<dynamic>[a-z0-9\-]+)\.user.tld$;
    location / {
        proxy_pass user.tld:80/sites/$dynamic$uri$is_args$args;
    }
}


В итоге получили два сайта, user.tld и sub.user.tld, управляемых разными пользователями user.tld и sub.user.tld в первом варианте, и одним пользователем - во втором.

четверг, 24 ноября 2016 г.

Регистронезависимое автодополнения команд в терминале Linux

В файл:
 gedit /etc/.inputrc 
Добавить строку:
set completion-ignore-case on 

пятница, 10 июня 2016 г.

Вывод даты в twig русская локаль

{% set vMonth = ['','января','февраля','марта','апреля','мая','июня', 'июля','августа','сентября','октября','ноября','декабря'] %}
{% set vDay = ['','Понедельник','Вторник','Среда','Четверг','Пятница', 'Суббота', 'Воскресенье'] %} {{ var|date("j") }}, {{ vMonth[var|date("n")] }} {{ var|date("Y") }}
{{ var|date("w") }}

В результате получим:
Пятница, 10 июня 2016

четверг, 28 января 2016 г.

Полезные команды мониторинга сети

Монитор arp-запросов c определенного хоста
sudo tcpdump -i eth8 -nnev arp or rarp | grep 192.168.0.9
Таблица маршрутов для хоста
route -nC | grep 192.168.0.97
Проверить кто сменил MAC адрес
#Устанавливаем arpwatch
sudo apt-get install arpwatch
#Сохраняем текущую связку IP+MAC
arp -f /root/ipmac.txt
#Позже смотрим кто сменил MAC
arpwatch -i eth0 -m NOMAIL -f /root/arp.dat -n 192.168.0.0/8
tail -f /var/log/arpwatch.log
Монитор активности сети
iftop -i eth0 

воскресенье, 3 января 2016 г.

Прозрачный Squid c исключениями

Задача

Раздавать интернет для разных подсетей с использованием SQUID и NAT
Для сети inet  192.168.0.0/24  - раздавать интернет nat'ом минуя squid
Для сети mynet 192.168.1.0/24 - дать доступ к интернету только через squid

Решение

Настройка SQUID
acl mynet src 192.168.1.0/24
http_access allow mynet
http_access deny all
icp_access allow mynet
icp_access deny all
http_port 3128 transparent
даем доуступ к squid сети mynet 

пятница, 6 февраля 2015 г.

0Auth авторизация на сайте с помощью VK FB MAIL YANDEX GOOGLE

Общий смысл:

По кнопке социальнй сети, открывается окно с авторизацией выбранной соц. сети.
После входа, окно авторизации закрывается, в поля формы родительского окна передаются данные пользователя.




Список социальных сетей, с помощью которых будем авторизоваться:
 - google
 - yandex
 - mail.ru
 - facebook.com
 - vk.com

суббота, 14 сентября 2013 г.

Управление размерами окон колесиком мыши (в openbox)

Задача:
Зажав клавишу клавиатуры, и крутя колесико мыши нужно изменять размеры окна, только в ширину, только в высоту, и одновременно, изменять по всем направлениям.

Решение:

В файл настроек openbox rc.xml в секцию
<mouse>
<context name="Frame">

Вставить следующее:

Изменения размера окна по ширине и высоте, зажав клавишу win
<mousebind button="W-Up" action="Click">
 <action name="ResizeRelative">
   <top>5</top>
   <bottom>5</bottom>
   <left>5</left>
   <right>5</right>
 </action>
</mousebind>
<mousebind button="W-Down" action="Click">
 <action name="ResizeRelative">
   <top>-5</top>
   <bottom>-5</bottom>
   <left>-5</left>
   <right>-5</right>
 </action>
</mousebind>

Изменения размера окна только по высоте, зажав клавишы Win+Shift
<mousebind button="W-S-Up" action="Click">
 <action name="ResizeRelative">
   <top>5</top>
   <bottom>5</bottom>
   <left>0</left>
   <right>0</right>
 </action>
</mousebind>
<mousebind button="W-S-Down" action="Click">
 <action name="ResizeRelative">
   <top>-5</top>
   <bottom>-5</bottom>
   <left>0</left>
   <right>0</right>
 </action>
</mousebind>
Изменения размера только по ширине, зажав клавишу win+ctrl
<mousebind button="W-C-Up" action="Click">
  <action name="ResizeRelative">
    <top>0</top>
    <bottom>0</bottom>
    <left>5</left>
    <right>5</right>
  </action>
</mousebind>
<mousebind button="W-C-Down" action="Click">
 <action name="ResizeRelative">
   <top>0</top>
   <bottom>0</bottom>
   <left>-5</left>
   <right>-5</right>
 </action>
</mousebind>

понедельник, 1 апреля 2013 г.

Виртуальные рабочие столы на Windows!

Утилита переключение виртуальных рабочих столов в Windows

Подробно тут: http://technet.microsoft.com/en-us/sysinternals/cc817881.aspx

Настройки:


Как это выглядет:


понедельник, 4 марта 2013 г.

div прозрачный для событий

На содержимое страницы нужно наложить полупрозрачный слой, но при этом нужно чтобы возможно было использовать события нижнего слоя.

Для реализации прозрачного для событий слоя есть CSS свойство:
pointer-events: none;
Подробно тут:
https://developer.mozilla.org/en-US/docs/CSS/pointer-events

воскресенье, 17 февраля 2013 г.

Необычная страница авторизации

Страница авторизации, где логин и пароль нужно составлять из элементов.


А реализация простая:

Создаем файл login.php в который добавим поля Логин, Пароль, кнопку "Войти"  и табло с символами:

<div style="position: absolute; left:50%; margin-left:-310px; width:620px; height:400px; top:50%; margin-top:-225px; padding:20px; border-radius: 5px; border:1px solid #cdcdcd">
<center>Составьте логин и пароль, перетаскивая символы в поля <b>Логин</b> и <b>Пароль</b><br>
<div style="width:370px;">
<div style="padding:5px; width:70px; float:left;">Логин </div><div id="login" style=" float:left;margin:5px;width:250px; padding:5px; height:30px; border:1px solid #d0d0d0; background-color: #f6f6f6" class="connectedSortable"></div>
<div style="padding:5px; width:70px; clear:both;  float:left;">Пароль </div><div id="password" style=" float:left;margin:5px;width:250px; padding:5px; height:30px; border:1px solid #d0d0d0; background-color: #f6f6f6" class="connectedSortable"></div>
<div style="padding:5px;clear:both"><input name="submit" type="button" value="Войти" onclick="inlogin()"> </div>
</div>
<div id="connect" style="margin:5px;width:470px; padding:5px; height:180px; border:1px solid #d0d0d0; background-color: #e0e0e0" class="connectedSortable">
<?
$mas = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,!,@,#,$,%,^,&,*,(,),_,-,+,=,~";
$mas = explode(",",$mas);
for($i=0; $i<count($mas); $i++) {
if($i == "13" || $i == "26" || $i == "39") { $cl =  "clear:both;";} else {$cl ="";}
 echo "<div id='".$i."' class='ui-state-default' style='cursor: hand; border-radius:15px; background-color: white; border:1px solid #d0d0d0; width:20px; height:20px; padding:5px; text-align: center; margin: 2px; float:left;'>".$mas[$i]."</div>";
}

?>
</div>
<div id="error"></div>
</center>
</div>

Добавим ему javascript'ов (подключим sortable и функцию обработки кнопки "Войти")


<link rel="stylesheet" href="css/jquery-ui-1.8.13.custom.css" type="text/css" />
<script src="js/jquery-1.5.1.min.js" type="text/javascript"></script>
<script src="js/jquery-ui-1.8.14.custom.js" type="text/javascript"></script>



<script type="text/javascript">
$(function() {
  $(".connectedSortable").sortable({
  connectWith: ".connectedSortable",
  placeholder: "ui-state-highlight",
  helper: "clone",
  cursor: 'move',
 zIndex: 99999,
 update: function() {
imgOrder = $(this).sortable('toArray').toString();
ik = $(this).attr('id');
$.post  ( "rlogin.php",  { c : imgOrder, id: ik }, function(data) {} );
}
 });
});
function inlogin()
{
//$.post  ( "checklogin.php",  { submit : "submit" }, function(data) {} );
$.ajax({
type: "POST",
                    url: "checklogin.php",
                    data: "submit=submit",
                    success: function(html){
   if(html=="ok") {
$("#error").html("Все верно!");
setTimeout( function() { location.href='http://dom.ru/adm/check.php'; }, 1500 );
}
   else {
                        $("#error").html(html);
setTimeout( function() { $("#error").html(""); }, 3000);
}
                    }
                });
}
 </script>

Файл checklogin.php - проверяем составленные Логин и Пароль

<?
session_start();
/* Create by Kostrukov Alexey */
function generateCode($length=6) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
    $code = "";
    $clen = strlen($chars) - 1;
    while (strlen($code) < $length) {
            $code .= $chars[mt_rand(0,$clen)];
    }
    return $code;
}
unset($_SESSION['userid']);
unset($_SESSION['userhash']);
# Соединямся с БД
include("settings.inc");
$dbhandle = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL");
$selected = mysql_select_db($bdname,$dbhandle) or die("Could not select examples");
mysql_set_charset($charset,$dbhandle);
if(isset($_POST['submit']))
{
$ulogin = $_SESSION['rlogin']['login'];
$upaswd = $_SESSION['rlogin']['password'];
$mas = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,!,@,#,$,%,^,&,*,(,),_,-,+,=,~";
$mas = explode(",",$mas);
for($i=0; $i<count($ulogin); $i++) {
$u_login .= $mas[$ulogin[$i]];
}
for($i=0; $i<count($upaswd); $i++) {
$u_paswd .= $mas[$upaswd[$i]];
}
    # Вытаскиваем из БД запись, у которой логин равняеться введенному
    $query = mysql_query("SELECT user_id, user_password FROM ".$_ENGINE['pref']."users WHERE user_login='".mysql_real_escape_string($u_login)."' LIMIT 1");
    $data = mysql_fetch_assoc($query);
   
    # Сравниваем пароли
    if($data['user_password'] === md5(md5($u_paswd)))
    {
        # Генерируем случайное число и шифруем его
        $hash = md5(generateCode(10));
           
        if(!@$_POST['not_attach_ip'])
        {
            # Если пользователя выбрал привязку к IP
            # Переводим IP в строку
            $insip = ", user_ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')";
        }
       
        # Записываем в БД новый хеш авторизации и IP
        mysql_query("UPDATE ".$_ENGINE['pref']."users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'");
       
        # Ставим куки
        setcookie("id", $data['user_id'], time()+60*60*24*30);
        setcookie("hash", $hash, time()+60*60*24*30);
       
        # Переадресовываем браузер на страницу проверки нашего скрипта
        print "ok";
    }
    else
    {
        print "Вы ввели неправильный логин/пароль";
    }
}
?> 

Файл rlogin.php - записывает все изменения, при составлении Логина и Пароля.
<?php
session_start();
/* Create by Kostrukov Alexey */
$arr = explode(',', $_POST['c']);
$id = $_POST['id'];
include("settings.inc");
unset($_SESSION['rlogin'][$id]);
for($i=0; $i<count($arr); $i++) {
$y=$i+1;
$_SESSION['rlogin'][$id][] = $arr[$i];
}
?> 

Дополнительная защита. файл check.php
<?
session_start();
include("settings.inc");
$dbhandle = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL");
$selected = mysql_select_db($bdname,$dbhandle) or die("Could not select examples");
mysql_set_charset($charset,$dbhandle);
if (isset($_COOKIE['id']) and isset($_COOKIE['hash']))
{  
    $query = mysql_query("SELECT *,INET_NTOA(user_ip) FROM users WHERE user_id = '".intval($_COOKIE['id'])."' LIMIT 1");
    $userdata = mysql_fetch_assoc($query);
    if(($userdata['user_hash'] !== $_COOKIE['hash']) || ($userdata['user_id'] !== $_COOKIE['id']) )
    {
        setcookie("id", "", time() - 3600*24*30*12, "/");
        setcookie("hash", "", time() - 3600*24*30*12, "/");
        print "Хм, что-то не получилось";
    }
    else
    {
    unset($_SESSION['rlogin']);
$userid = $_COOKIE['id'];
$userhash = $_COOKIE['hash'];
$username = $userdata['user_login'];
session_register('userid','userhash','username');
header("Location: http://dom.ru/adm/index.php");
    }
}
else
{
    print "Включите куки";
}
?> 

четверг, 24 января 2013 г.

Настройка отправки почты с сайта

Для того что бы с сервера приходили письма не от имени www-data, а например от no-replay@домен.ру, нужно следующее:

в файле
 /etc/php5/apache2/php.ini

находим секцию
sendmail_path = '/usr/sbin/sendmail -t 
и меняем ее на
sendmail_path = '/usr/sbin/sendmail -t -i -fno-reply@my.domain.com -Fno-reply'

Если хотите отправлять почту с использованием exim4, то меняем строку:


sendmail_path = /usr/sbin/exim4 -t -i -fno-reply@my.domain.com -Fno-reply

Как выглядел исходник письмо

ДО изменений:

Delivered-To: alex.kostrukov@gmail.com
Received: by 10.14.95.7 with SMTP id o7csp83458eef;
Thu, 24 Jan 2013 04:07:53 -0800 (PST)
X-Received: by 10.152.144.38 with SMTP id sj6mr1578233lab.48.1359029273462;
Thu, 24 Jan 2013 04:07:53 -0800 (PST)
Return-Path: <www-data@my.domen.com>
Received: from my.domen.com ([144.76.4.246])
by mx.google.com with ESMTPS id l8si26588559eem.225.2013.01.24.04.07.53
(version=TLSv1 cipher=RC4-SHA bits=128/128);
Thu, 24 Jan 2013 04:07:53 -0800 (PST)
Received-SPF: neutral (google.com: 144.76.4.246 is neither permitted nor denied by best guess record for domain of www-data@my.domen.com) client-ip=144.76.4.246;
Authentication-Results: mx.google.com;
spf=neutral (google.com: 144.76.4.246 is neither permitted nor denied by best guess record for domain of www-data@my.domen.com) smtp.mail=www-data@my.domen.com
Received: from www-data by my.domen.com with local (Exim 4.72)
(envelope-from <www-data@my.domen.com>)
id 1TyLav-0004zQ-Ks
for alex.kostrukov@gmail.com; Thu, 24 Jan 2013 16:07:49 +0400
Date: Thu, 24 Jan 2013 16:07:49 +0400
Message-Id: <E1TyLav-0004zQ-Ks@my.domen.com>
To: alex.kostrukov@gmail.com
Subject: тема письма
X-PHP-Originating-Script: 33:mail.php
From: ot.kogo@mail.ru
тело письма

ПОСЛЕ изменений

Delivered-To: alex.kostrukov@gmail.com
Received: by 10.14.95.7 with SMTP id o7csp84047eef;
Thu, 24 Jan 2013 04:20:54 -0800 (PST)
X-Received: by 10.14.184.134 with SMTP id s6mr5724235eem.43.1359030053936;
Thu, 24 Jan 2013 04:20:53 -0800 (PST)
Return-Path: <no-reply@my.domen.com>
Received: from my.domen.com ([144.76.4.246])
by mx.google.com with ESMTPS id n5si41266875eeo.165.2013.01.24.04.20.53
(version=TLSv1 cipher=RC4-SHA bits=128/128);
Thu, 24 Jan 2013 04:20:53 -0800 (PST)
Received-SPF: neutral (google.com: 144.76.4.246 is neither permitted nor denied by best guess record for domain of no-reply@my.domen.com) client-ip=144.76.4.246;
Authentication-Results: mx.google.com;
spf=neutral (google.com: 144.76.4.246 is neither permitted nor denied by best guess record for domain of no-reply@my.domen.com) smtp.mail=no-reply@my.domen.com
Received: from www-data by my.domen.com with local (Exim 4.72)
(envelope-from <no-reply@my.domen.com>)
id 1TyLnZ-00050o-43
for alex.kostrukov@gmail.com; Thu, 24 Jan 2013 16:20:53 +0400
Date: Thu, 24 Jan 2013 16:20:53 +0400
Message-Id: <E1TyLnZ-00050o-43@my.domen.com>
To: alex.kostrukov@gmail.com
Subject: тема письма
X-PHP-Originating-Script: 33:mail.php
From: ot.kogo@mail.ru
тело письма




четверг, 17 января 2013 г.

удаленный запуск команд putty ssh

Для того что бы запустить команду на удаленном сервере ssh использую PUTTY

Создадим файл комманд, назовем command.txt

например нужно перезапустить pppoe соединения:

sudo poff -a
sleep 200
sudo pon dsl-provider
sudo plog
sleep 10

Создаем bat-файл, следующего содержания:
d:\putty\putty.exe -ssh -l LOGIN -pw PASSWD -P 22 -m ПУТЬ\ДО\command.txt АДРЕС_СЕРВЕРА_SHH 

пятница, 11 января 2013 г.

Конвертер офисных документов в jpg

Идея:
создать в сети общую папку, в которую могли бы копировать файлы:
PDF, XLS, ODS, ODT, DOC, DOCX, XLSX, PPT

и тут же получать эти файлы в формате JPG

Решение:

1.Создаем скрипт all2jpg

#!/bin/bash
sstr=`echo $1 | sed 's/\./\_/g'`
DIR=/home/user/share/
{
echo "File: $i"
case "$1" in
*.pdf)
convert "$DIR/$1" "$DIR/$sstr.jpg" >> /dev/null 2>&1
sleep 5
rm "$DIR/$1"
;;
*.doc| *.odt| *.ods| *.xls| *.xlsx| *.doc| *.docx| *.ppt)
libreoffice3.6 --headless --convert-to pdf "$DIR/$1"  --outdir "$DIR"
sleep 6
rm "$DIR/$1"
;;
esac
}

2. Мониторинг появления файлов в директории /home/user/share/Сканы/

Для используется incron
sudo apt-get install incron
Добавляем правило в incron
incrontab -e 
/home/user/share/ IN_CREATE /home/user/scripts/all2jpg #$
Все, теперь при создании файла (указанных в скрипте расширений), скрипт будет запущен, и через некоторое время в место этого файла, появится файл jpg

пятница, 2 ноября 2012 г.

OAuth vk.com API и использование методов


Описание создания авторизации Oauth vk.com api

Файл index.php

<? require_once("config.php");
 if(isset($_SESSION['access_token'])) {
    $uid = $_SESSION['user_id'];
    // получим профиль пользователя
    $resp = file_get_contents('https://api.vkontakte.ru/method/getProfiles?uids='.$uid.'&fields=uid,first_name,last_name,nickname,photo_big,photo_rec,sex&access_token='.$_SESSION['access_token']);
    $data = json_decode($resp, true);
print_r($data);
} else {
    require_once("redirect.php");
}?>

Файл config.php
<?
// id приложения
define("CLIENT_ID", "ID_ПРИЛОЖЕНИЯ");
// защищенный ключ
define("SECRET", "СЕКРЕТНЫЙ_КЛЮЧ");
// куда перенаправим пользователя после авторизации
define("OAUTH_CALLBACK", "callback.php");
// настройки доступа
define("SCOPE", "groups,friends");
// путь к папке со скриптами
define("PATH", "http://ДОМЕН/ПУТЬ/ДО/СКРИТПОВ/");
define("GID", "ID_ПРИЛОЖЕНИЯ");
// включим сессию
session_start();
?> 
Файл login.php
<?require_once("config.php");
$link = 'http://api.vk.com/oauth/authorize?client_id='.CLIENT_ID.'&redirect_uri='.PATH.OAUTH_CALLBACK.'&display=popup&scope='.SCOPE.'&response_type=code';
?>
<button onclick="location.href='<? echo $link ?>';" style="padding:10px; font-size:14pt;">Войти ВКонтакте</button>
<br />
Файл redirect.php
<?
require_once("config.php");
//перенаправляем на авторизацию
//header('Location: http://api.vk.com/oauth/authorize?clien ... type=code');
header('Location: '.PATH.'login.php');
?> 
Файл callback.php
<?
require_once("config.php");
// получили параметр code
if($_REQUEST['code']) {
    // получаем access_token
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_POST, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    curl_setopt($ch, CURLOPT_USERAGENT, "Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.3521/886; U; en) Presto/2.4.15");
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, "https://oauth.vk.com/access_token?client_id=".CLIENT_ID."&code=".$_REQUEST['code']."&client_secret=".SECRET."&redirect_uri=".PATH."callback.php");
    $answer = json_decode(curl_exec($ch), true);
    if (curl_errno($ch) != 0)
        die('curl error:' . curl_error($ch));
    $text_answer = print_r($answer, true);
    /*if (isset($answer['error_description']))
        echo '<p style="color:red;display:inline;">' . $answer['error'] . ': ' . $answer['error_description'] . '</p><br>';
    else
        echo '<p style="color:green;display:inline;">token: ' . $answer['access_token'] . '</p><br>';
    echo "Debug:<br><textarea cols=100 rows=10>" . $text_answer . "</textarea>";
*/
    if($answer['access_token']){
        // запишем данные в сессию
        $_SESSION['access_token'] = $answer['access_token'];
        $_SESSION['user_id'] = $answer['user_id'];
        // переадресуем пользователя на нужную страницу
        header('Location: '.PATH.'index.php');
        exit();
    }
}
?> 

вторник, 19 июня 2012 г.

Добавление принтера из другой подсети

Для добавление принтера из сети 10.0.10.* с ip адресом 10.0.10.10 в сеть 192.168.0.* нужно добавить маршрут:
ROUTE -p ADD 10.0.10.10 192.168.0.1
где 192.168.0.1 - ip адрес шлюза, который видит обе сети

среда, 13 июня 2012 г.

Полный список ошибок BSOD


Синий экран смерти (англ. Blue Screen of Death, BSoD) — название сообщения о критической системной ошибке (стоп-ошибке) в операционных системах Microsoft Windows. Ниже приводится полный список этих ошибок.
0x00000001: APC_INDEX_MISMATCH
Это внутренняя ошибка ядра (kernel). Ошибка может возникнуть из-за несовпадения KeEnterCricticalRegion и KeLeaveCriticalRegion в файловой системе.
0x00000002: DEVICE_QUEUE_NOT_BUSY
0x00000003: INVALID_AFFINITY_SET
0x00000004: INVALID_DATA_ACCESS_TRAP
0x00000005: INVALID_PROCESS_ATTACH_ATTEMPT
Стоп на Win XP SP2 или Server 2003ы
0x00000006: INVALID_PROCESS_DETACH_ATTEMPT
0x00000007: INVALID_SOFTWARE_INTERRUPT
0x00000008: IRQL_NOT_DISPATCH_LEVEL 
0x00000009: IRQL_NOT_GREATER_OR_EQUAL
0x0000000A: IRQL_NOT_LESS_OR_EQUAL
Была сделана попытка затронуть виртуальную память на внутреннем процессе IRQ уровня, который слишком высок. Если kernel debugger доступен, вы можете отследить, где именно система запнулась.
Наиболее частая причина возникновения - драйвер устройства использует неверный адрес.
Параметры:
1 - адрес, по которому выполнено ошибочное обращение
2 - IRQL, который использовалcя для обращения к памяти
3 - тип доступа к памяти: 0 = операция чтения, 1 = операция записи
4 - адрес инструкции, которая затребовала доступ к памяти по адресу
Прим: Имейте ввиду, что эта ошибка возникает в 99% из-за "кривых" драйверов. Некоторые из них в Windows XP вы можете обнаружить используя утилиту verifier.exe: Start (Пуск) -> Run (Выполнить) -> verifier.exe
Больше информации ->
0x0000000B: NO_EXCEPTION_HANDLING_SUPPORT 
0x0000000C: MAXIMUM_WAIT_OBJECTS_EXCEEDED
0x0000000D: MUTEX_LEVEL_NUMBER_VIOLATION
Попытайтесь установить взаимоисключения используя NTOSEXEXLEVELS.H файл заголовков.
Вы должны найти точки взаимодействия и определить, какие из них пытаются получить доступ к этому уровню в неверной последовательности.
Параметры:
1 - настоящая нить уровня взаимодействия
2 - уровень взаимодействия пытающийся получить доступ
0x0000000E: NO_USER_MODE_CONTEXT 
0x0000000F: SPIN_LOCK_ALREADY_OWNED 
0x00000010: 0SPIN_LOCK_NOT_OWNED 
0x00000011: THREAD_NOT_MUTEX_OWNER
0x00000012: TRAP_CAUSE_UNKNOWN
В общем, эта ошибка означает, что причина её не известна. В этом случае, для установления причины попытайтесь заметить при каких обстаятельствах она произошла: что вы в это время делали или пытались сделать, какие изменения в системе произошли и т.д.
0x00000013: EMPTY_THREAD_REAPER_LIST 
0x00000014: CREATE_DELETE_LOCK_NOT_LOCKED 
0x00000015: LAST_CHANCE_CALLED_FROM_KMODE 
0x00000016: CID_HANDLE_CREATION 
0x00000017: CID_HANDLE_DELETION 
0x00000018: REFERENCE_BY_POINTER 
0x00000019: BAD_POOL_HEADER 
0x0000001A: MEMORY_MANAGEMENT 
0x0000001B: PFN_SHARE_COUNT 
0x0000001C: PFN_REFERENCE_COUNT 
0x0000001D: NO_SPIN_LOCK_AVAILABLE
0x0000001E: KMODE_EXCEPTION_NOT_HANDLED
Это очень часто встречающаяся ошибка. Обычно исключённый адрес указывает на драйвер или функцию, которая вызвала стоп-экран. Всегда обращайте внимание не только на указанный драйвер, но и на сам адрес или имидж, содержащий эту ошибку. Обычно это код исключения 0x80000003. Эта ошибка означает, что точка прерывания или суждение было достигнуто при обращении к памяти, но система загрузилась с /NODEBUG ключа. Это ошибка не должна появляться слишком часто. Если ошибка появляется постоянно, убедитесь, что отладчик (debugger) подключён и система загружается с /DEBUG switch.
На неИнтеловских системах, если адресс исключения 0XBFC0304, ошибка появляется вследствие кеширования процессора. Если ошибка будет появляться снова, свяжитесь с производителями.
Как правило, требуется анализ второго параметра этого сообщения, который указывает на адрес драйвера/функции, которая была причиной проблемы.
Параметры:
1 - код исключительной ситуации
2 - адрес, при обработке которого произошел сбой
3 - Parameter 0 of the exception
4 - Parameter 1 of the exception
Больше информации ->
0x0000001F: SHARED_RESOURCE_CONV_ERROR
0x00000020: KERNEL_APC_PENDING_DURING_EXIT
Название ошибки указывает на повреждённый/отключённый APC счётчик. Если счётчик показывает значение не равное нулю, то он и есть источник проблемы. Отрицательное значение указывает на то, что файловая система вызывала FsRtlEnterFileSystem большее количество раз чем FsRtlExitFileSystem. Положительное значение указывает наоборот FsRtlExitFileSystem было вызвано большее количество раз чем FsRtlEnterFileSystem. Если у вас такая ситуация, проверьте все файловые системы установленные на машине. Сторонние перенаправители более всего подозреваются в сбое, так как они не были так тщательно протестированы, как NTFS, FAT, HPFS и RDR.
Текущий IRQL должен быть равен 0. Если нет, то определённый порядок аннулирования драйверов может быть причиной возникновения ошибки, возвращаясь на высоком уровне IRQ. Всегда пытайтесь заметить, что вы делали или какие приложения закрывали, какие драйвера были установлены на момент возникновения синего экрана. Этот симптом указывает на серьёзную проблему в драйверах третьей стороны.
Parameters:
1 - адрес APC, по которому висел (был в ожидании) на момент выхода.
2 - нить APC disable count
3 - текущий IRQ уровень
0x00000021: QUOTA_UNDERFLOW 
0x00000022: FILE_SYSTEM 
0x00000023: FAT_FILE_SYSTEM
Произошла ошибка во время записи или чтения с системного диска на фаловой системе FAT16 или FAT32. Возможна проблема в самом диске или с Interrupt Request Packet (IRP) пакетом.
Так же причиной может быть большая фрагментация диска, проблема в антивирусном програмном обеспечение или в ПО слежения за дисками (drive monitoring).
Больше информации ->
0x00000024: NTFS_FILE_SYSTEM
Проблема с драйвером записи и чтения файловой системы NTFS ( NTFS.SYS ). Возможна проблема в самом диске или с Interrupt Request Packet (IRP) пакетом.
Так же причиной может быть большая фрагментация диска, проблема в антивирусном програмном обеспечение или в ПО слежения за дисками (drive monitoring).
Больше информации ->
0x00000025: NPFS_FILE_SYSTEM 
0x00000026: CDFS_FILE_SYSTEM 
0x00000027: RDR_FILE_SYSTEM 
0x00000028: CORRUPT_ACCESS_TOKEN 
0x00000029: SECURITY_SYSTEM
0x0000002A: INCONSISTENT_IRP
IRP неожиданно был обнаружен на несоответствующем состоянии; это когда поле или несколько полей были несовместимы с сохранившемся состоянием IRP. Например, IRP, который был закончен указывался, как всё ещё ждущий выполнения команд драйвера какого-либо устройства.
Параметры:
1 - адрес на котором IRP был найден в несоответствующем состоянии
0x0000002B: PANIC_STACK_SWITCH
Эта ошибка указывает а то, что область стека ядра переполнена. Это может возникнуть, когда драйвер ядра использует слишком много места в области стека. Это так же может случиться, если серьёзная ошибка в самом ядре.
0x0000002C: PORT_DRIVER_INTERNAL 
0x0000002D: SCSI_DISK_DRIVER_INTERNAL
0x0000002E DATA_BUS_ERROR
Этот стоп чаще всего вызывается ошибкой в памяти системы. Так же это может случиться, когда драйвер обращается к 0x8XXXXXXX адресу памяти, который не существует.
Параметры:
1 - адрес виртуальной памяти, который стал причиной ошибки
2 - физический адрес причины ошибки
3 - регистр статуса процессора (PSR)
4 - регистр инструкции ошибки (FIR)
0x0000002F: INSTRUCTION_BUS_ERROR 
0x00000030: SET_OF_INVALID_CONTEXT
0x00000031: PHASE0_INITIALIZATION_FAILED
Инициализация системы не прошла на ранней стадии. Нужно более детально установить ошибку, так как этот код вам не говорит практический ни о чём.
0x00000032: PHASE1_INITIALIZATION_FAILED
Параметры:
1 - код статуса системы, который описывает почему система решила, что инициализация не прошла
2 - указывает место внутри INIT.C, где ошибка инициализации фазы 1 произошла
0x00000033: UNEXPECTED_INITIALIZATION_CALL 
0x00000034: CACHE_MANAGER
0x00000035: NO_MORE_IRP_STACK_LOCATIONS
Драйвер высшего уровня пытался вызвать драйвер низшего уровня через IoCallDriver() интерфейс, но в запасе не было свободного места в области стека, поэтому драйвер низшего уровня не сможет достичь нужных параметров, так как для него вообще нет никаких параметров. Это гибельная ситуация, так как драйвер высшего уровня считает, что заполнил параметры для драйвера низшего уровня (что-то он должен был сделать, чтобы вызвать драйвер низшего уровня). Тем не менее, так как для последнего драйвера нет свободного места в области стека, составитель аннулировал конец пакета. Это означает, что, скорее всего, какая-то другая память была повреждена.
Параметры:
1 - адрес IRP
0x00000036: DEVICE_REFERENCE_COUNT_NOT_ZERO
Драйвер устройства пытался удалить из системы одно из объектов его устройства, но счётчик обращений этого объекта не был равен 0, означающий что для этого объекта всё ещё были невыполненные задачи (счётчик указывает номер причин, почему данный объект на может быть удалён). Это ошибка вызова драйвера.
Параметры:
1 - адрес объекта
0x00000037: FLOPPY_INTERNAL_ERROR 
0x00000038: SERIAL_DRIVER_INTERNAL 
0x00000039: SYSTEM_EXIT_OWNED_MUTEX 
0x0000003A: SYSTEM_UNWIND_PREVIOUS_USER 
0x0000003B: SYSTEM_SERVICE_EXCEPTION 
0x0000003C: INTERRUPT_UNWIND_ATTEMPTED 
0x0000003D: INTERRUPT_EXCEPTION_NOT_HANDLED
0x0000003E: MULTIPROCESSOR_CONFIGURATION_NOT_SUPPORTED
Мультипроцессорная система не симметрична по отношению друг к другу. Чтобы быть симметричными, процессоры должны быть одного типа и уровня. Например, попытка использовать процессор уровня Pentium и 80486 вызовет ошибку. Кроме того, на х86 системах, возможность вычислений дробей должны быть на обоих процессорах или ни на одном.
0x0000003F: NO_MORE_SYSTEM_PTES
Не хватает РТЕ (page file entries). Обычно причиной является драйвер, который плохо вычищает файл подкачки (swap). Если отладчик ядра (kernel debugger) доступен проследите, где система запнулась и введите следующую команду:
!sysptes 3
0x00000040: TARGET_MDL_TOO_SMALL
Драйвер вызвал функцию IoBuildPartialMdl() и послал ей MDL, чтобы выявить часть источника MDL, но цель MDL не достаточно большая, чтобы отобразить пределы требуемых адресов. Это ошибка драйвера. Источник и цель MDL, так же как длинна линии адресов определения являются аргументами IoBuildPartialMdl() функции:
IoBuildPartialMdl( IN PMDL SourceMdl,
IN OUT PMDL TargetMdl,
IN PVOID VirtualAddress,
IN ULONG Length )
0x00000041: MUST_SUCCEED_POOL_EMPTY
Если отладчик ядра (kernel debugger) доступен, команда Виртуальной Машины (VM) показывает различные величины:
Параметры:
1 - величина запроса, который не может быть удовлетворён
2 - номер страниц, которые были использованы из nonpaged pool.
3 - номер запрашиваемых страниц из nonpaged pool.
4 - номер доступных страниц
0x00000042: ATDISK_DRIVER_INTERNAL 
0x00000043: NO_SUCH_PARTITION
0x00000044: MULTIPLE_IRP_COMPLETE_REQUESTS
Драйвер запросил завершение IRP [IoCompleteRequest()], но пакет был уже завершён. Эту ошибку сложно выявить. Самый простой случай - драйвер пытается завершить одну и ту же операцию дважды, но этот случай бывает очень редко. Так де бывает, что два различных драйвера пытаются завладеть пакетом и завершить его. Первый как правило срабатывает, а второй нет. Отследить, какой именно драйвер вызвал сбой, трудно, так как следы первого драйвера были переписаны вторым. Тем не менее, конфликт может быть выявлен, рассматривая DeviceObject поля, в каждом местоположении стэка.
Параметры:
1 - адрес IRP
0x00000045: INSUFFICIENT_SYSTEM_MAP_REGS 
0x00000046: DEREF_UNKNOWN_LOGON_SESSION 
0x00000047: REF_UNKNOWN_LOGON_SESSION
0x00000048: CANCEL_STATE_IN_COMPLETED_IRP
Это ошибка указывает, что I/O Request Packet (IRP), который должен быть завершён, имеет определенный порядок отмены, а это означает, что пакет в таком положении, что может быть отменен никаким другим способом. Хотя сам пакет уже не относится драйверу, устанавливающему порядок завершения, так как он уже в стадии завершения.
0x00000049: PAGE_FAULT_WITH_INTERRUPTS_OFF
Означает именно то, что пишет: ошибка страницы памяти с выключенным прерыванием. Рассматривайте эту ошибку, так же как 0x0A.
0x0000004A: IRQL_GT_ZERO_AT_SYSTEM_SERVICE 
0x0000004B: STREAMS_INTERNAL_ERROR
0x0000004C: FATAL_UNHANDLED_HARD_ERROR
Если ошибка появиться во время загрузки NT, загрузка прервётся синим экраном.
Наиболее частые причины:
x218 - необходимая библиотека реестра не может быть загружена. Этот файл может отсутствовать или быть повреждённым. Чтобы решить проблему, вам понадобиться спасательная загрузочная дискета.
Драйвер может повреждить ключ реестра во время загрузки в память, или память, в которую происходила загрузка этого ключа, может быть не действительной. Особенно AST EISA машины с 16М и выше памятью должны иметь доступ к памяти выше 16М, т.е. в утилите конфигурации EISA этот параметр должен быть ENABLED (разрешён). Иначе файл, который загрузится в ту память, при чтении покажет - 0xffffffff.
x21A - либо Winlogon либо CSRSS (Windows) внезапно отказали. Выходящий код может сказать больше. Обычно это - c0000005, что говорит о том, что неподдерживаемое исключение вызвало сбой в том или ином процессе. Здесь практически ничего нельзя сделать.
x221 - означает, что драйвер повреждён или системная библиотека была распознана, как повреждённая. NT делает всё, чтобы проверять целостность важных системных файлов. Синий экран показывает имя повреждённого файла. Если такое случилось, загрузитесь в любую другую систему или, если таковых нет, переустановите/отремонтируйте систему... Убедитесь, что версия файла, который был повреждён, совпадает с версией файла в дистрибутиве NT и если так, то просто замените его с диска. Постоянные ошибки с разными именами файлов означают проблемы с железом в I/O пути драйвера.
0x0000004D: NO_PAGES_AVAILABLE
Не хватает свободного места, чтобы закончить операцию. Если отладчик (kernel debugger) доступен, печатайте следующие команды:
!process 0 7
!vm
dd mmpagingfiles
dd @$p
Параметры:
1 - количество использованных страниц
2 - кол-во физических страниц на машине
3 - Extended commit value in pages
4 - Total commit value in pages
0x00000051: REGISTRY_ERROR
Что-то случилось с реестром. Если отладчик (kernel debugger) доступен, отследите ошибку. Если он вам покажет, что вы в ветке системы (CmpWorker будет присутствовать в перечне), введите следующие команды:
dd CmpRegistryMutex+18 L1
!thread
Это выдаст вам ветку и место ошибки в реестре.
Эта ошибка так же может означать, что реестр допустил ошибку I/O, когда пытался прочитать один из его библиотек, отсюда следует, что ошибка могла быть вызвана проблемой с оборудованием или что сама система повреждена. Это так же может означать, что ошибка вызвана операцией обновления, которую использует только система безопасности и это только когда ресурсы на исходе. Если такая ошибка появилась, проверьте, является ли машина PDC или BDC и сколько аккаунтов в базе данных SAM (Менеджер Безопасности Аккаунтов), может ли это быть цель echo и не заполнены ли соответствующие библиотеки почти до конца.
Параметры:
1. значение 1 (указывает, где появилась ошибка)
2. значение 2 (указывает, где появилась ошибка)
3. может указывать на библиотеку
4. может быть возвратным кодом HvCheckHive`а, если какая-либо библиотека повреждена
0x00000052: MAILSLOT_FILE_SYSTEM 
0x00000053: NO_BOOT_DEVICE 
0x00000054: LM_SERVER_INTERNAL_ERROR 
0x00000055: DATA_COHERENCY_EXCEPTION 
0x00000056: INSTRUCTION_COHERENCY_EXCEPTION 
0x00000057: XNS_INTERNAL_ERROR
0x00000058: FTDISK_INTERNAL_ERROR
Система загрузилась с восстановленной первичной партиции, поэтому библиотеки говорят, что зеркало в порядке, но на самом деле это не так. Настоящие образы библиотек оттенены. Вам нужно удостовериться, что загрузка происходит с верной партиции.
0x00000059: PINBALL_FILE_SYSTEM 
0x0000005A: CRITICAL_SERVICE_FAILED 
0x0000005B: SET_ENV_VAR_FAILED 
0x0000005C: HAL_INITIALIZATION_FAILED 
0x0000005D: HEAP_INITIALIZATION_FAILED 
0x0000005E: OBJECT_INITIALIZATION_FAILED 
0x0000005F: SECURITY_INITIALIZATION_FAILED 
0x00000060: PROCESS_INITIALIZATION_FAILED 
0x00000061: HAL1_INITIALIZATION_FAILED 
0x00000062: OBJECT1_INITIALIZATION_FAILED 
0x00000063: SECURITY1_INITIALIZATION_FAILED 
0x00000064: SYMBOLIC_INITIALIZATION_FAILED 
0x00000065: MEMORY1_INITIALIZATION_FAILED 
0x00000066: CACHE_INITIALIZATION_FAILED
0x00000067: CONFIG_INITIALIZATION_FAILED
Это означает, что реестр не может создать место, необходимое для содержания файлов реестра. Это ошибка не должна никогда появляться, так как процесс создания такого места происходит на ранней стадии загрузки системы и поэтому места для создания бассейна должно быть достаточно.
Параметры:
1. 5
2. указывает на NTOSCONFIGCMSYSINI, который потерпел неудачу.
0x00000068: FILE_INITIALIZATION_FAILED
0x00000069: IO1_INITIALIZATION_FAILED
Инициализация I/O системы не удалась по каким-либо причинам. Больше, практически, никакой информации нет. Такое могло случиться, если установка приняла не правильное решение по поводу инсталляции системы, или пользователь переконфигурировал систему. Или пытается установить образ одной системы на совершенно другую.
0x0000006A: LPC_INITIALIZATION_FAILED
0x0000006B: PROCESS1_INITIALIZATION_FAILED
Параметры:
1. указывает на код статуса, который решил, что инициализация NT не прошла успешно.
2. указывает на место в NTOSPSPSINIT.C, где ошибка была обнаружена.
0x0000006C: REFMON_INITIALIZATION_FAILED 
0x0000006D: SESSION1_INITIALIZATION_FAILED 
0x0000006E: SESSION2_INITIALIZATION_FAILED 
0x0000006F: SESSION3_INITIALIZATION_FAILED 
0x00000070: SESSION4_INITIALIZATION_FAILED
0x00000071: SESSION5_INITIALIZATION_FAILED
Это коды кодов (SESSION1 - SESSION5) указывают место в NTOSINITINIT.C, где была допущена ошибка.
Параметры:
1. указывает код статуса, который решил, что инициализация NT не прошла успешно.
Больше информации ->
0x00000072: ASSIGN_DRIVE_LETTERS_FAILED
0x00000073: CONFIG_LIST_FAILED
Указывает, что одна из системных библиотек повреждена или не читаема. Эта библиотека может быть или SOFTWARE, или SECURITY, или SAM (Менеджера Безопасности Аккаунтов).
Параметры:
1. 5
2. 2
3. список библиотек
4. указывает строку (UNICODE_STRING), содержащую имя библиотеки
0x00000074: BAD_SYSTEM_CONFIG_INFO
Эта ошибка может показывать то, что библиотека SYSTEM, загружаемая OSLOADER/NTLDR, повреждена. Тем не менее, это практически невозможно, так как OSLOADER всегда проверяет библиотеки после загрузки и убеждается, что они не повреждены.
Эта ошибка так же может означать, что некоторые требуемые ключи реестра и их параметры отсутствуют. Загрузка в LastKnownGood (Последней хорошей конфигурации) может решить проблему, или вам придётся переустанавливать систему, или воспользуйтесь Emergency Repair Disk.
0x00000075: CANNOT_WRITE_CONFIGURATION
Эта ошибка может появиться, если файлы SYSTEM библиотеки (SYSTEM и SYSTEM.ALT) не могут разместить дополнительную информацию, записанную в библиотеки реестра, между инициализациями реестра и первой фазы (когда файловые системы доступны). Эта ошибка обычно означает, что на диске недостаточно свободного места, так же это может произойти при попытке сохранить реестр на устройстве "только чтение".
0x00000076: PROCESS_HAS_LOCKED_PAGES
эта ошибка может возникнуть по причине драйвера, который не полностью вычищен из памяти после I/O операции.
Параметры:
1. адрес процесса
2. число замкнутых страниц
3. число частных страниц
4. 0
0x00000077: KERNEL_STACK_INPAGE_ERROR
Запрошенная страница памяти ядра не может быть прочитана. Причина ошибки может быть в плохом блоке файла виртуальной памяти или ошибки контролера диска (очень редко, когда причиной может быть нехватка ресурсов, а конкретней, резерв nonpaged pool (незанятого дискового пространства) со статусом c0000009a [STATUS_INSUFFICIENT_RESOURCES]).
Если первый и второй параметры кода ошибки равны 0, означает, что место ошибки в ядре не было найдено. Значит, эта ошибка вызвана плохим оборудованием.
I/O статус c000009c (STATUS_DEVICE_DATA_ERROR) или C000016AL (STATUS_DISK_OPERATION_FAILED) обычно означает, что информация не может быть прочитана из-за плохого блока в памяти. После перезагрузки автоматическая проверка диска попытается определить адрес плохого блока на диске. Если статус будет C0000185
(STATUS_IO_DEVICE_ERROR) и виртуальная память находиться на SCSI диске, то должно быть проверено подключение дисков и их срок годности.
Параметры:
1. 0
2. 0
3. значение PTE на момент ошибки
4. адрес ошибки ядра
1. код статуса
2. I/O код статуса
3. номер страницы виртуальной памяти
4. дополнительное место в файл виртуалки
Больше информации ->
0x00000078: PHASE0_EXCEPTION
0x00000079: MISMATCHED_HAL
Уровень проверки HAL и тип конфигурации HAL не подходят ядру системы или типу машины. Такая ошибка, скорее всего, вызвана тем, что пользователь вручную обновил либо NTOSKRNL.EXE либо HAL.DLL. На машине мультипроцессорный HAL (MP) и унипроцессорное ядро (UP) или наоборот.
Параметры:
1. тип несовпадения (1, 2 или 3):
1. несовпадение уровней выпуска PRCB (несовпадение дат). Если дело в этом, то параметры 2 и 3:
2 - наибольший уровень у NTOSKRNL.EXE
3 - наибольший уровень у HAL.DLL
2. несовпадение версий, в этом случае параметры 2 и 3:
2 - версия NTOSKRNL.EXE
3 - версия HAL.DLL
версии:0 - 1 - 2 -
3. Micro Channel Architecture (MCA) компьютерам требуется специфический MCA HAL, в этом случае параметры 2 и 3:
2 - тип машины, определённый NTDETECT.COM
значение 2 означает, что этот HAL сделан для MCA
3 - тип машин, которые этот HAL поддерживает
0x0000007A: KERNEL_DATA_INPAGE_ERROR
Не может быть прочитана запрашиваемая ядром страница памяти. Ошибка вызвана плохим блоком в памяти или ошибкой контроллера диска. См. так же 0x00000077: KERNEL_STACK_INPAGE_ERROR.
Параметры:
1. тип лока который повис
2. статус ошибки (обычно I/O код статуса)
3. текущий процесс (виртуальный адрес для лока типа 3 или PTE)
4. адрес виртуальной памяти, который не может войти в файл подкачки.
Больше информации ->
0x0000007B: INACCESSIBLE_BOOT_DEVICE
В процессе инсталляции I/O системы, драйвер загрузочного устройства, возможно, не смог инициализировать устройство, с которого система пыталась загрузиться, или файловая система, которая должна была прочитать это устройство, либо не смогла инициализироваться, либо просто не распознала информацию на устройстве, как структуру файловой системы. В случае составителя, первый аргумент - это адрес уникодовой структуры информации, которая является ARC именем устройства, с которого была попытка загрузиться. Во втором случае, первый аргумент - это адрес объекта устройства, которое не может быть смонтировано.
Если эта ошибка возникла при начальной инсталляции системы, то она может означать, что система была установлена на диск или SCSI контроллер, которые ей не поддерживаются. Имейте в виду, что некоторые контроллеры поддерживаются только драйверами из виндовских библиотек (WDL), которые должны быть установлены выборочной установкой.
Эта ошибка так же может произойти после установки нового SCSI адаптера или контроллера или после изменений системной партиции. В этом случае, на x86 системах, нужно отредактировать BOOT.INI; на ARC системах, нужно запустить Setup. Для большей информации, как должен быть изменён BOOT.INI, смотрите Windows NT Advanced Server "Administrator`s Guide".
Если аргумент указывает на ARC имя строки (string), формат первых двух (это только в этом случае) длинных слов будет:
USHORT Length;
USHORT MaximumLength;
PVOID Buffer;
Например, если первое длинное слово содержит что-то типа 00800020, где 20 длина Уникодового стринга (Unicode string), и следующее длинное слово будет содержать адрес буфера.
Если аргумент указывает на объект устройства, формат первого слова будет:USHORT Type;
Значит, первое слово содержит 0003, где Type код всегда будет 0003.
Примечание:
Вы сразу сможете опознать, указывает ли аргумент на ARC имя или на объект устройства, так как Уникодовая строка (Unicode string) никогда не содержит нечётное число байтов, а объект устройства всегда будет содержать тип кода - 3.
Параметры:
1. указатель на объект устройства или Уникодовая строка (Unicode string), или ARC имя.
Больше информации ->
0x0000007C: BUGCODE_PSS_MESSAGE
0x0000007D: INSTALL_MORE_MEMORY
Не хватает памяти, чтобы загрузить Windows NT (необходимо 5 MB).
Параметры:
1. номер найденных физических страниц
2. нижняя физическая страница
3. высшая физическая страница
4. 0
0x4000007E: WINDOWS_NT_BANNER
0x0000007F: UNEXPECTED_KERNEL_MODE_TRAP
Эта ошибка означает, что произошло непредвиденное прерывание в режиме ядра, или вид прерывания, которое ядро не допускает, или захват (a bound trap), или вид прерывания, которое влечёт за собой немедленную смерть (двойная ошибка(double fault)). Первое число в интервалах кода стопа - число прерывания (8 = double fault). Чтобы узнать больше, что это за прерывание, обратитесь к мануалу Intel x86 семьи.
В общем, баг появляется, когда процессор допускает ошибку, с которой ядро не может справиться. Чаще всего возникает из-за плохого RAM, так же из-за разгона процессора.
Попробуйте отменить в BIOS - sync negotiation (синхронная передача данных).
Больше информации ->
0x00000080: NMI_HARDWARE_FAILURE
HAL должен сообщить всю конкретную информацию и предложить пользователю обратиться к его поставщику оборудования за тех.поддержкой.
0x00000081: SPIN_LOCK_INIT_FAILURE
0x00000085: SETUP_FAILURE
(Примечание: текстовая форма setup`a больше не использует проверку багов (bugcheck), чтобы выйти из серьёзных ошибок. Поэтому вы никогда не столкнётесь с 0x85. Все проверки багов были заменены на более дружелюбные и (где возможно) более информативные сообщения об ошибках. Тем не менее, некоторые составители ошибок просто были заменены нашими bugcheck экранами, и код для этих состояний ошибок такой же, как и был. Они приведены ниже.)
1-
0: OEM HAL шрифт - недействительный формат файла *.fon, поэтому установка не смогла отобразить текст. Это означает, что vgaxxx.fon на CD или флоппи повреждён.
1: Не смогло инициализироваться видео. Эта ошибка имеет собственный экран и пользователю предоставляется только 2 варианта.
Это означает, что файл vga.sys (или другой драйвер, в зависимости от машины) повреждён, или то, что данное оборудование не поддерживается.
2 - что дало сбой:
0: NtCreateFile of devicevideo0
1: IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
2: IOCTL_VIDEO_QUERY_AVAIL_MODES
3: Желаемый режим видео не поддерживается. Это означает внутреннюю ошибку установки.
4: IOCTL_VIDEO_SET_CURRENT_MODE (невозможно установить режим видео)
5: IOCTL_VIDEO_MAP_VIDEO_MEMORY
6: IOCTL_VIDEO_LOAD_AND_SET_FONT 3 - код статуса NT API вызова
2: Нехватка памяти. Теперь эта ошибка использует более дружественный экран, в зависимости от того, как далеко зашла установка.
3: Клавиатура не была инициализирована. Теперь используются 2 разных экрана в зависимости от ошибок, которые тут могли появиться. Это может означать, что диск, содержащий драйвера для клавиатуры (i8042prt.sys или kbdclass.sys) повреждён или машина имеет клавиатуру, которая не поддерживается.
Так же это может означать, что dll раскладки клавиатуры не может быть загружен.
2 - что дало сбой:
0: NtCreateFile of deviceKeyboardClass0 .
"Установка не обнаружила клавиатуру, подключённую к вашему компьютеру."
1: Unable to load keyboard layout dll.
"Установка не может загрузить dll раскладки клавиатуры ."
Это значит, что на флоппи или CD нет файла (kbdus.dll для us или других dll).
4: Установка не смогла выяснить путь устройства, с которого началась установка. Это внутренняя ошибка установки.
5: Не прошла проверка на работоспособность партиций. Это означает баг в драйвере диска. Параметры имеют значения только для группы установки.
0x0000008B: MBR_CHECKSUM_MISMATCH
Эта ошибка возникает в процессе загрузки, когда контрольная сумма MBR, которую посчитала система, не совпадает с контрольной суммой загрузчика. Обычно это означает вирус. Некоторые вирусы не могут быть определены/найдены. Загрузитесь с дискеты с вирус-сканером (убедитесь, что дискета защищена от записи!)
KerBugCheckEx
параметры:
1 - Disk Signature from MBR.
2 - MBR checksum calculated by osloader.
3 - MBR checksum calculated by system.
0x0000008E
Применяется к следующим системам:
  1. Microsoft Windows XP Professional
  2. Microsoft Windows XP Home Edition
  3. Microsoft Windows XP Professional SP1
  4. Microsoft Windows XP Home Edition SP1
Больше информации ->

Следующие стопы добавлены в Windows NT версии 3.51 и 4.x:
---------------------------------------------------------------------------------------
0x0000008F: PP0_INITIALIZATION_FAILED
Это сообщение появляется, если инициализация фазы 0 менеджера Plug and Play не прошла на стадии инициализации ядра (kernel-mode Plug and Play Manager failed). Вообще-то нет ничего такого, что бы могло вызвать эту ошибку.
0x00000090: PP1_INITIALIZATION_FAILED
Это сообщение появляется, если инициализация фазы 1 менеджера Plug and Play не прошла на стадии инициализации ядра (kernel-mode Plug and Play Manager failed). Вот здесь происходят практический все инициализации, включая конфигурацию среды (реестр и т.д.) драйверов для вызова I/O впоследствии.
Следующие стопы добавлены в Windows NT версии 4.x:
---------------------------------------------------------------------------------------
0x00000092: UP_DRIVER_ON_MP_SYSTEM
Этот баг появляется только когда UNIPROCESSOR драйвер загружается на систему, в которой больше чем один активный процессор.
KeBugCheckEx
параметры:
1 - адрес базы драйвера.
0x00000093: INVALID_KERNEL_HANDLE
Эта ошибка появляется, когда код ядра (kernel code), такой, как сервер, перенаправитель (redirector), другие драйвера и так далее пытаются закрыть не действительный указатель.
Параметры:
1 - указатель, с которым NtClose был вызван.
2 - 0 означает, что был закрыт защищённый указатель.
1 значит, был закрыт неверный указатель.
0x00000094: KERNEL_STACK_LOCKED_AT_EXIT
Это сообщение появляется, когда нить существует, в то время как её стэк ядра отмечен, как не swapable.
0x00000096: INVALID_WORK_QUEUE_ITEM
Это сообщение появляется, когда KeRemoveQueue удаляет очередь данных, а flink или blink поле равно 0. Это практический всегда вызывается неправильным применением кода работающей нити текущего объекта, но неправильное применение любой очереди может привести к этому. Правило - ввод данных в очередь может быть произведено только однажды. Когда предмет удаляется из очереди, его flink поле равно 0. Этот баг возникает, когда происходит попытка удалить данные, flink или blink поля которых равны 0. Для того, чтобы разрешить этот баг, вам необходимо выяснить очередь, на которую он ссылается. Если эта очередь одна из ЕХ работающих очередей (ExWorkerQueue), тогда объект, который удаляется - WORK_QUEUE_ITEM. Этот баг подразумевает, что это и есть причина. Параметры бага помогают выявить драйвер, который неправильно использует очередь.
0x00000097: BOUND_IMAGE_UNSUPPORTED
MmLoadSystemImage была вызвана, чтобы загрузить bound image. Это не поддерживается ядром. Убедитесь, что bind.exe не был запушен для картинки.KeBugCheckEx
параметры:
1 - Адрес данных в очереди, flink/blink поле которых ноль.
2 - Адрес на ссылающуюся очередь. Обычно это одна из ExWorkerQueues очередей.
3 - Начальный адресс ExWorkerQueue массива. Это поможет выявить, если очередь в вопросе одна из ExWorkerQueue очередей и если так, то офсет из этого параметра выявит очередь.
4 - Если это ExWorkerQueue очередь (как это бывает обычно), это адрес работающей рутины, которая бы вызывалась, если работающий элемент был бы действительным. Это может быть использовано, чтобы выявить драйвер, который неправильно использует рабочую очередь.
0x00000098: END_OF_NT_EVALUATION_PERIOD
Ваша NT система - триал с ограниченной датой, которая подошла к концу. KeBugCheckEx
параметры:
1 - Низкий 32-дитный запрос вашей даты инсталляции.
2 - Высокий 32-дитный запрос вашей даты инсталляции.
3 - Триал период в минутах.
0x00000099: INVALID_REGION_OR_SEGMENT
ExInitializeRegion или ExInterlockedExtendRegion были вызваны с неправильным набором параметров.
0x0000009A SYSTEM_LICENSE_VIOLATION
Нарушился испытательный срок лицензии софта. Это может быть или из-за попытки изменить тип продукта офлайновой системы, или попытки изменить срок триального периода НТ.
0x0000009B: UDFS_FILE_SYSTEM
Смотрите комментарии FAT_FILE_SYSTEM
0x0000009C: MACHINE_CHECK_EXCEPTION
Фатальная ошибка Machine Check Exception (проверка машины).KeBugCheckEx
параметры:
Если процессор имеет ТОЛЬКО MCE функции доступными (например: Intel Pentium), то параметры будут:
1 - Low 32 bits of P5_MC_TYPE MSR
2 -
3 - High 32 bits of P5_MC_ADDR MSR
4 - Low 32 bits of P5_MC_ADDR MSR
Если процессор имеет так же MCA функции доступными (например: Intel Pentium Pro), то параметры будут:1 - Bank number
2 - Address field of MCi_ADDR MSR for the MCA bank that had the error
3 - High 32 bits of MCi_STATUS MSR for the MCA bank that had the error
4 - Low 32 bits of MCi_STATUS MSR for the MCA bank that had the error
Больше информации ->

Следующие СТОПы появились только в Windows XP 2000 (за исключением трёхзначных)
-----------------------------------------------------
0x0000009F: DRIVER_POWER_STATE_FAILURE
Драйвер находиться в несовместимом или неустоичивом состоянии электропитания.В большинстве случаев происходит во время выключения компьютера или выхода из ждущего режима (standby) или сна (hibernate).
Больше информации ->
0x000000A0: INTERNAL_POWER_ERROR
0x000000A1: PCI_BUS_DRIVER_INTERNAL
0x000000A2: MEMORY_IMAGE_CURRUPT
0x000000A3: ACPI_DRIVER_INTERNAL
0x000000A4: CNSS_FILE_SYSTEM_FILTER
0x000000A5: ACPI_BIOS_ERROR
Причина этой ошибки всегда ACPI BIOS. Эта проблема не может быть решена ОС.
0x000000A7: BAD_EXHANDLE
0x000000AB: SESSION_HAS_VALID_POOL_ON_EXIT
0x000000AC: HAL_MEMORY_ALLOCATION
0x000000B4: VIDEO_DRIVER_INIT_FAILURE
Windows не смог перейти в графический режим, потому что ни один видео драйвер не был загружен. Обычно проблема с драйвером или какой-то конфликт видео оборудования с другим оборудованием. Загрузитесь в Safe Mode и посмотрите, если это решит проблему. Если так, то обновите драйвера видео оборудования или откатите на рабочую версию.
0x000000B8: ATTEMPTED_SWITCH_FROM_DPC
0x000000B9: CHIPSET_DETECTED_ERROR
0x000000BA: SESSION_HAS_VALID_VIEWS_ON_EXIT
0x000000BB: NETWORK_BOOT_INITIALIZATION_FAILED
0x000000BC: NETWORK_BOOT_DUPLICATE_ADDRESS
0x000000BE: ATTEMPTED_WRITE_TO_READONLY_MEMORY
Драйвер попытался записать в read-only память. Обычно возникает после установки неисправного драйвера оборудования, системного сервиса, BIOS`a. Если имя драйвера указано в ошибке, попытайтесь исправть проблему отключением, удалением или откаткой драйверов.
Больше информации ->
0x000000BF: MUTEX_ALREADY_OWNED
0x000000C1: SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION
Драйвер пытался записать в недозволенную область памяти. Обновите драйвер.
Больше информации ->
0x000000C2: BAD_POOL_CALLER
Процесс ядра или драйвер попытались неверно произвести операцию с памятью. Обычно причиной являются неисправные драйвера или софт.
0x000000C4: DRIVER_VERIFIER_DETECTED_VIOLATION
Это общий стоп для фатальных ошибок выявленых Driver Verifier (инструмент проверки драйверов). Переметры переданны KeBugCheckEx и отображены на синем экране.
0x000000C5: DRIVER_CORRUPTED_EXPOOL
Почти всегда причиной является неисправный драйвер. Если вы только что установили новое программное обеспечение, потом проверьте обновление драйвером на сайте производителя.
Больше информации ->
0x000000C6: DRIVER_CAUGHT_MODIFYING_FREED_POOL
Драйвер пытался получить доступ к освобождённой памяти.
0x000000C7: TIMER_OR_DPC_INVALID
Указывает, что таймер ядра или DPC был обнаружен в памяти, где его не должно было быть. Такая ситуация обычно возникает, когда драйвер не отменил таймер или the Delayed Procedure Call (DPC) перед тем как освободить память занятую таймером или DPC.
0x000000C8: IRQL_UNEXPECTED_VALUE
0x000000C9: DRIVER_VERIFIER_IOMANAGER_VIOLATION
Нарушение инструмента проверки драйверов.
0x000000CA: PNP_DETECTED_FATAL_ERROR
0x000000CB: DRIVER_LEFT_LOCKED_PAGES_IN_PROCESS
Этот относиться к стопу 0x76. Он может появится вместо 0x76. Означает, что драйвер или система ввода/вывода не освободили IRQ. Имя драйвера может быть указано на синем экране.
0x000000CC: PAGE_FAULT_IN_FREED_SPECIAL_POOL
0x000000CD: PAGE_FAULT_BEYOND_END_OF_ALLOCATION
0x000000CE: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
Драйвер не отменил операцию оживания до выхода. Обычная причина - плохой драйвер или сервис.
0x000000CF: TERMINAL_SERVER_DRIVER_MADE_INCORRECT_MEMORY_REFERENCE
0x000000D0: DRIVER_CORRUPTED_MMPOOL
0x000000D1: DRIVER_IRQL_NOT_LESS_OR_EQUAL
Была сделана попытка затронуть виртуальную память на внутреннем процессе IRQ уровня, который слишком высок.
Причиной могут быть:
неисправный драйвер
неисправный RAM
повреждённый файл виртуальной памяти.
Больше информации ->
0x000000D2: BUGCODE_ID_DRIVER
0x000000D3: DRIVER_PORTION_MUST_BE_NONPAGED
0x000000D4: SYSTEM_SCAN_AT_RAISED_IRQL_CAUGHT_IMPROPER_DRIVER_UNLOAD
0x000000D5: DRIVER_PAGE_FAULT_IN_FREED_SPECIAL_POOL
0x000000D6: DRIVER_PAGE_FAULT_BEYOND_END_OF_ALLOCATION
0x000000D7: DRIVER_UNMAPPING_INVALID_VIEW
0x000000D8: DRIVER_USED_EXCESSIVE_PTES
Обычно возникает при нехватаетке Page Table Entries (PTEs), когда драйвер требует слишком много системной памяти.
0x000000D9: MUTEX_ALREADY_OWNED
0x000000DA: SYSTEM_PTE_MISUSE
0x000000DB: DRIVER_CORRUPTED_SYSPTES
0x000000DC: DRIVER_INVALID_STACK_ACCESS
0x000000DE: POOL_CORRUPTION_IN_FILE_AREA
0x000000DF: IMPERSONATING_WORKER_THREAD
0x000000E0: ACPI_BIOS_FATAL_ERROR
0x000000E1: WORKER_THREAD_RETURNED_AT_BAD_IRQL
0x000000E2: MANUALLY_INITIATED_CRASH 

0x000000E3: RESOURCE_NOT_OWNED
Ошибка вызвана сбоем файловой системы.
Больше информации ->
0x000000E4: WORKER_INVALID
0x000000E6: DRIVER_VERIFIER_DMA_VIOLATION
0x000000E7: INVALID_FLOATING_POINT_STATE
0x000000E8: INVALID_CANCEL_OF_FILE_OPEN
0x000000E9: ACTIVE_EX_WORKER_THREAD_TERMINATION
0x000000EA: THREAD_STUCK_IN_DEVICE_DRIVER
Проблема в драйвером оборудования явилась причиной зависания системы. Обычно драйвер дисплея ожидает, когда оборудование перейдёт в спящий режим. Проблемы могут быть с видео адаптером или его драйвером.
0x000000EB: DIRTY_MAPPED_PAGES_CONGESTION
0x000000EC: SESSION_HAS_VALID_SPECIAL_POOL_ON_EXIT
0x000000ED: UNMOUNTABLE_BOOT_VOLUME
I/O система ядра пыталась смонтировать устройство для загрузки системы, а оно отказалось работать. Такая ошибка может возникнуть во время обновления до Windows XP на систему, где используется высокопроизводительные ATA диски или контроллеры, а подсоединены они низкопропускным кабелем. В некоторых случаях, после перезагрузки, система может продолжать работать без видимых сбоев.
Больше информации ->
0x000000EF: CRITICAL_PROCESS_DIED
0x000000F1: SCSI_VERIFIER_DETECTED_VIOLATION
0x000000F2: HARDWARE_INTERRUPT_STORM
Обычно возникает из-за неисправного драйвера.
0x000000F3: DISORDERLY_SHUTDOWN
Выключение Windows не произошло из-за нехватки памяти. Проверьте свободное место на диске и наличие зависших программ.
0x000000F4: CRITICAL_OBJECT_TERMINATION
0x000000F6: PCI_VERIFIER_DETECTED_VIOLATION
0x000000F7: DRIVER_OVERRAN_STACK_BUFFER
0x000000F8: RAMDISK_BOOT_INITIALIZATION_FAILED
0x000000F9: DRIVER_RETURNED_STATUS_REPARSE_FOR_VOLUME_OPEN
0x1000007E: SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M
Ошибка такая же как 0x7E.
0x1000007F: UNEXPECTED_KERNEL_MODE_TRAP_M
0x1000008E: KERNEL_MODE_EXCEPTION_NOT_HANDLED_M
Ошибка такая же как 0x8E.
0x100000EA: THREAD_STUCK_IN_DEVICE_DRIVER_M
0xC000009A: STATUS_INSUFFICIENT_RESOURCES
Не хватка памяти.
0xC0000135: UNABLE TO LOCATE DLL
Windows попытался загрузить какую-то библиотеку, но возникла ошибка. Эта ошибка могла быть вызвана повреждённым, пропавшим файлом или повреждённым реестром.
0xC0000142: Неуспешная инициализация DLL
Обычно возникает, когда программа не может успешно инициализироваться.
0xC0000218: UNKNOWN_HARD_ERROR
Необходимая библиотека реестра не может быть загружена. Файл может отсутствовать или быть повреждённым. Повреждение могдо быть вызвано неисправным жёстким диском или другим оборудованием. Драйвер мог повредить реестр во время его загрузки, или повреждена память, куда загружался реестр.
0xC000021A: STATUS_SYSTEM_PROCESS_TERMINATED
Такое случается, когда Windows переходит в режим ядра, а пользовательский режим, такой как Winlogon или Client Server Runtime Subsystem (CSRSS) чем-то скомпрометированы и безопасность не может быть гарантирована. Так как Win XP не может работать без Winlogon или CSRSS. Эти ситуации, когда пользовательские подсистемы могут предотвратить или стать причиной не работы самой системы.
Эта же ошибка может появиться когда администратор изменил права доступа и SYSTEM аккаунт не может больше использовать системные файлы и директории.
0xC0000221: STATUS_IMAGE_CHECKSUM_MISMATCH
Указывает на проблемы драйверов, системных файлов, неисправность дисков (такие как - испорченная виртуальная память) или неисправная память оборудования.
0xC0000244
A "Stop 0xc0000244" Error Occurs When You Audit Policy Changes If CrashOnAuditFail Is Turned On {KB 323475} Win XP
0xC000026C
Обычно указывает на проблему драйверов.
Не возможно загрузить драйвер {KB 160495} Win NT, Win 2000, Win XP
0xDEADDEAD: MANUALLY_INITIATED_CRASH1
"It`s dead, Jim!" - "Он мёртв, Джим" =)

источник: http://mistakes.ru/windows_stop_errors